DescriptionAllow creating multiple scanline decoders.
Make getScanlineDecoder return a new object each time, which is
owned by the caller, and independent from any existing scanline
decoders and the SkCodec itself.
Since the SkCodec already contains the entire state machine, and it
is used by the scanline decoders, simply create a new SkCodec which
is now owned by the scanline decoder.
Move code that cleans up after using a scanline decoder into its
destructor
One side effect is that creating the first scanline decoder requires
a duplication of the stream and re-reading the header. (With some
more complexity/changes, we could pass the state machine to the
scanline decoder and make the SkCodec recreate its own state machine
instead.) The typical client of the scanline decoder (region decoder)
uses an SkMemoryStream, so the duplication is cheap, although we
should consider the extra time to reread the header/recreate the state
machine. (If/when we use the scanline decoder for other purposes,
where the stream may not be cheaply duplicated, we should consider
passing the state machine.)
One (intended) result of this change is that a client can create a
new scanline decoder in a new thread, and decode different pieces of
the image simultaneously.
In SkPngCodec::decodePalette, use fBitDepth rather than a parameter.
Committed: https://skia.googlesource.com/skia/+/9b2cdbf4811477487f107a78edc130c733b309ea
Patch Set 1 #Patch Set 2 : Cleanups #
Total comments: 3
Patch Set 3 : Remove outdated comment in SkScanlineDecoder.h #Patch Set 4 : rebase #Patch Set 5 : Use fNumberPasses from the correct SkPngCodec. #
Total comments: 1
Patch Set 6 : Progressive scanline decoder needs to handle rewind on first call. #
Messages
Total messages: 19 (8 generated)
|