diff options
author | scroggo <scroggo@google.com> | 2016-06-01 12:08:23 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-06-01 12:08:23 -0700 |
commit | 26694c32d2a7a511bb2832204bb7759219b9d7bc (patch) | |
tree | e35d1b29ab43ef76315bdb6e9585246cd44b890f /dm | |
parent | edc743a57657107b873ed2fc2efeeff1b1efcd23 (diff) |
Revert of Make SkPngCodec decode progressively. (patchset #24 id:480001 of https://codereview.chromium.org/1997703003/ )
Reason for revert:
Still breaking Google3 e.g.:
https://sponge.corp.google.com/target?id=9261d31b-34fc-4f0f-981e-f92f7c5cea2c&target=//third_party/skia/HEAD:dm#shard=1|run=1|attempt=1|page=-1
https://test.corp.google.com/ui#cl=123773095&flags=CAMQBQ==&id=OCL:123773095:BASE:123773415:1464804876959:b0ea9b1c&t=//third_party/skia/HEAD:dm
Original issue's description:
> Make SkPngCodec decode progressively.
>
> This is a step towards using SkCodec in Chromium, where progressive
> decoding is necessary.
>
> Switch from using png_read_row (which expects all the data to be
> available) to png_process_data, which uses callbacks when rows are
> available.
>
> Create a new API for SkCodec, which supports progressive decoding and
> scanline decoding. Future changes will switch the other clients off of
> startScanlineDecode and get/skip-Scanlines to the new API.
>
> Remove SkCodec::kNone_ScanlineOrder, which was only used for interlaced
> PNG images. In the new API, interlaced PNG fits kTopDown. Also remove
> updateCurrScanline(), which was only used by the old implementation for
> interlaced PNG.
>
> DMSrcSink:
> - In CodecSrc::kScanline_Mode, use the new method for scanline decoding
> for the supported formats (just PNG and PNG-in-ICO for now).
>
> fuzz.cpp:
> - Remove reference to kNone_ScanlineOrder
>
> SkCodec:
> - Add new APIs:
> - startIncrementalDecode
> - incrementalDecode
> - Remove kNone_SkScanlineOrder and updateCurrScanline()
>
> SkPngCodec:
> - Implement new APIs
> - Switch from sk_read_fn/png_read_row etc to png_process_data
> - Expand AutoCleanPng's role to decode the header and create the
> SkPngCodec
> - Make the interlaced PNG decoder report how many lines were
> initialized during an incomplete decode
> - Make initializeSwizzler return a bool instead of an SkCodec::Result
> (It only returned kSuccess or kInvalidInput anyway)
>
> SkIcoCodec:
> - Implement the new APIs; supported for PNG in ICO
>
> SkSampledCodec:
> - Call the new method for decoding scanlines, and fall back to the old
> method if the new version is unimplemented
> - Remove references to kNone_SkScanlineOrder
>
> tests/CodecPartial:
> - Add a test which decodes part of an image, then finishes the decode,
> and compares it to the straightforward method
>
> tests/CodecTest:
> - Add a test which decodes all scanlines using the new method
> - Repurpose the Codec_stripes test to decode using the new method in
> sections rather than all at once
> - In the method check(), add a parameter for whether the image supports
> the new method of scanline decoding, and be explicit about whether an
> image supports incomplete
> - Test incomplete PNG decodes. We should have been doing it anyway for
> non-interlaced (except for an image that is too small - one row), but
> the new method supports interlaced incomplete as well
> - Make test_invalid_parameters test the new method
> - Add a test to ensure that it's safe to fall back to scanline decoding without
> rewinding
>
> BUG=skia:4211
>
> The new version was generally faster than the old version (but not significantly so).
>
> Some raw performance differences can be found at https://docs.google.com/a/google.com/spreadsheets/d/1Gis3aRCEa72qBNDRMgGDg3jD-pMgO-FXldlNF9ejo4o/
>
> Design doc can be found at https://docs.google.com/a/google.com/document/d/11Mn8-ePDKwVEMCjs3nWwSjxcSpJ_Cu8DF57KNtUmgLM/
>
> GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1997703003
>
> Committed: https://skia.googlesource.com/skia/+/a4b09a117d4d1ba5dda372e6a2323e653766539e
>
> Committed: https://skia.googlesource.com/skia/+/30e78c9737ff4861dc4e3fa1e4cd010680ed6965
TBR=reed@google.com,msarett@google.com,scroggo@chromium.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:4211
Review-Url: https://codereview.chromium.org/2026383002
Diffstat (limited to 'dm')
-rw-r--r-- | dm/DMSrcSink.cpp | 68 |
1 files changed, 22 insertions, 46 deletions
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp index 755bae378e..f8c9bc0b58 100644 --- a/dm/DMSrcSink.cpp +++ b/dm/DMSrcSink.cpp @@ -432,55 +432,31 @@ Error CodecSrc::draw(SkCanvas* canvas) const { break; } case kScanline_Mode: { - void* dst = pixels.get(); - uint32_t height = decodeInfo.height(); - const bool png = fPath.endsWith("png"); - const bool ico = fPath.endsWith("ico"); - bool useOldScanlineMethod = !png && !ico; - if (png || ico) { - if (SkCodec::kSuccess == codec->startIncrementalDecode(decodeInfo, dst, - rowBytes, nullptr, colorPtr, &colorCount)) { - int rowsDecoded; - if (SkCodec::kIncompleteInput == codec->incrementalDecode(&rowsDecoded)) { - codec->fillIncompleteImage(decodeInfo, dst, rowBytes, - SkCodec::kNo_ZeroInitialized, height, - rowsDecoded); - } - } else { - if (png) { - // Error: PNG should support incremental decode. - return "Could not start incremental decode"; - } - // Otherwise, this is an ICO. Since incremental failed, it must contain a BMP, - // which should work via startScanlineDecode - useOldScanlineMethod = true; - } + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL, colorPtr, + &colorCount)) { + return "Could not start scanline decoder"; } - if (useOldScanlineMethod) { - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL, colorPtr, - &colorCount)) { - return "Could not start scanline decoder"; - } - - switch (codec->getScanlineOrder()) { - case SkCodec::kTopDown_SkScanlineOrder: - case SkCodec::kBottomUp_SkScanlineOrder: - // We do not need to check the return value. On an incomplete - // image, memory will be filled with a default value. - codec->getScanlines(dst, height, rowBytes); - break; - case SkCodec::kOutOfOrder_SkScanlineOrder: { - for (int y = 0; y < decodeInfo.height(); y++) { - int dstY = codec->outputScanline(y); - void* dstPtr = SkTAddOffset<void>(dst, rowBytes * dstY); - // We complete the loop, even if this call begins to fail - // due to an incomplete image. This ensures any uninitialized - // memory will be filled with the proper value. - codec->getScanlines(dstPtr, 1, rowBytes); - } - break; + void* dst = pixels.get(); + uint32_t height = decodeInfo.height(); + switch (codec->getScanlineOrder()) { + case SkCodec::kTopDown_SkScanlineOrder: + case SkCodec::kBottomUp_SkScanlineOrder: + case SkCodec::kNone_SkScanlineOrder: + // We do not need to check the return value. On an incomplete + // image, memory will be filled with a default value. + codec->getScanlines(dst, height, rowBytes); + break; + case SkCodec::kOutOfOrder_SkScanlineOrder: { + for (int y = 0; y < decodeInfo.height(); y++) { + int dstY = codec->outputScanline(y); + void* dstPtr = SkTAddOffset<void>(dst, rowBytes * dstY); + // We complete the loop, even if this call begins to fail + // due to an incomplete image. This ensures any uninitialized + // memory will be filled with the proper value. + codec->getScanlines(dstPtr, 1, rowBytes); } + break; } } |