Allow creating multiple scanline decoders.
authorscroggo <scroggo@chromium.org>
Fri, 10 Jul 2015 19:07:02 +0000 (12:07 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 10 Jul 2015 19:07:02 +0000 (12:07 -0700)
commit9b2cdbf4811477487f107a78edc130c733b309ea
treee3ba5000eb9c2ce6f2e2c07e2fc76d6178b2a672
parentf9c5db26b401dcff83d39275ba78c36360cd6dc1
Allow 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.

Review URL: https://codereview.chromium.org/1230033004
13 files changed:
bench/nanobench.cpp
bench/subset/SubsetSingleBench.cpp
bench/subset/SubsetTranslateBench.cpp
bench/subset/SubsetZoomBench.cpp
dm/DMSrcSink.cpp
include/codec/SkCodec.h
include/codec/SkScanlineDecoder.h
src/codec/SkCodec.cpp
src/codec/SkCodec_libpng.cpp
src/codec/SkCodec_libpng.h
src/codec/SkJpegCodec.cpp
src/codec/SkJpegCodec.h
tests/CodexTest.cpp