diff options
author | msarett <msarett@google.com> | 2016-08-03 12:59:27 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-03 12:59:27 -0700 |
commit | d1ec89b1aca8f37a460a425259a23275f4d9a81d (patch) | |
tree | b6a598424765c1e20121def5d03146c20bd9aee2 /src/codec/SkPngCodec.h | |
parent | f789b3893579b773bb4d7be6c2c65311500b53bb (diff) |
Perform color correction on png decodes
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2184543003
CQ_INCLUDE_TRYBOTS=master.client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot
Review-Url: https://codereview.chromium.org/2184543003
Diffstat (limited to 'src/codec/SkPngCodec.h')
-rw-r--r-- | src/codec/SkPngCodec.h | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/src/codec/SkPngCodec.h b/src/codec/SkPngCodec.h index 0a8878395a..69ecef1313 100644 --- a/src/codec/SkPngCodec.h +++ b/src/codec/SkPngCodec.h @@ -6,6 +6,7 @@ */ #include "SkCodec.h" +#include "SkColorSpaceXform.h" #include "SkColorTable.h" #include "SkPngChunkReader.h" #include "SkEncodedFormat.h" @@ -33,33 +34,38 @@ protected: bool onRewind() override; uint32_t onGetFillValue(SkColorType) const override; - // Helper to set up swizzler and color table. Also calls png_read_update_info. - Result initializeSwizzler(const SkImageInfo& requestedInfo, const Options&, - SkPMColor*, int* ctableCount); + // Helper to set up swizzler, color xforms, and color table. Also calls png_read_update_info. + bool initializeXforms(const SkImageInfo& requestedInfo, const Options&, SkPMColor* colorPtr, + int* colorCount); SkSampler* getSampler(bool createIfNecessary) override { SkASSERT(fSwizzler); return fSwizzler; } + void allocateStorage(const SkImageInfo& dstInfo); + + virtual int readRows(const SkImageInfo& dstInfo, void* dst, size_t rowBytes, int count, + int startRow) = 0; SkPngCodec(int width, int height, const SkEncodedInfo&, SkStream*, SkPngChunkReader*, png_structp, png_infop, int, int, sk_sp<SkColorSpace>); - png_structp png_ptr() { return fPng_ptr; } - SkSwizzler* swizzler() { return fSwizzler; } - int numberPasses() const { return fNumberPasses; } - -private: - SkAutoTUnref<SkPngChunkReader> fPngChunkReader; - png_structp fPng_ptr; - png_infop fInfo_ptr; + SkAutoTUnref<SkPngChunkReader> fPngChunkReader; + png_structp fPng_ptr; + png_infop fInfo_ptr; // These are stored here so they can be used both by normal decoding and scanline decoding. - SkAutoTUnref<SkColorTable> fColorTable; // May be unpremul. - SkAutoTDelete<SkSwizzler> fSwizzler; + SkAutoTUnref<SkColorTable> fColorTable; // May be unpremul. + SkAutoTDelete<SkSwizzler> fSwizzler; + std::unique_ptr<SkColorSpaceXform> fColorXform; + SkAutoTMalloc<uint8_t> fStorage; + uint8_t* fSwizzlerSrcRow; + uint32_t* fColorXformSrcRow; + size_t fSrcRowBytes; - const int fNumberPasses; - int fBitDepth; + const int fNumberPasses; + int fBitDepth; +private: bool createColorTable(SkColorType dstColorType, bool premultiply, int* ctableCount); void destroyReadStruct(); |