mirror of
https://github.com/storytold/photocraft.git
synced 2026-11-10 12:22:22 +00:00
PngImport decoded the whole image and then copied it into a second, tile surface (about +400 MB for a 100 MP RGBA8 file, enough to kill a browser tab). A PNG whose rows come in final order now streams: PngDecodeRows::step_stream hands each group of rows on, they become tiles at once (the PngStream the one-shot streamed import also uses) and are dropped, then the prune scan runs in batches. decode_rows is the same step_stream driven to the end, so there is one path. Interlaced, animated and early-eXIf-oriented files are decoded whole as before; a late eXIf sends a streamed import back to a whole decode. The turn upright of an EXIF orientation 2-8 was one whole-buffer pass in the poll of the last rows; OrientSteps (photocraft-codecs) does it in bands of 64 rows through the same band writer as Image::oriented, and PngImport runs it as a stage of its own. Memory-budget errors keep their type and text: the stream is checked as the one-shot streamed import is, and, like the whole-image path, a layer under 32 MiB is not. Docs for the stepped place updated.