diff options
author | 2016-09-08 10:14:04 -0700 | |
---|---|---|
committer | 2016-09-08 10:14:05 -0700 | |
commit | 7a9900d6d34e437bb24beb5524a1f6488ae138c9 (patch) | |
tree | 3b81bb6369d1cb9a6d9bbf2282f730cdf8482bff /src/codec/SkPngCodec.cpp | |
parent | 971cd496b9e25f87f3a75a0015c203322907136a (diff) |
Checking for valid colorType, alphaType, colorSpace in SkCodec
* Refactor to share code between SkPngCodec and SkWebpCodec
* Didn't end up sharing with SkJpegCodec but did refactor
that code a bit
* Disallow conversions to F16 with non-linear color spaces
* Fail to decode if we fail to create a SkColorSpaceXform
(should be an assert soon). We used to fallback on a
legacy decode if we failed to create the transform.
* A bunch of name changes
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2319293003
Review-Url: https://codereview.chromium.org/2319293003
Diffstat (limited to 'src/codec/SkPngCodec.cpp')
-rw-r--r-- | src/codec/SkPngCodec.cpp | 39 |
1 files changed, 5 insertions, 34 deletions
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp index 34e6f91131..36ec21f0b8 100644 --- a/src/codec/SkPngCodec.cpp +++ b/src/codec/SkPngCodec.cpp @@ -357,25 +357,6 @@ static int bytes_per_pixel(int bitsPerPixel) { return bitsPerPixel / 8; } -static bool png_conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) { - // Ensure the alpha type is valid - if (!valid_alpha(dst.alphaType(), src.alphaType())) { - return false; - } - - // Check for supported color types - switch (dst.colorType()) { - case kRGBA_8888_SkColorType: - case kBGRA_8888_SkColorType: - case kRGBA_F16_SkColorType: - return true; - case kRGB_565_SkColorType: - return kOpaque_SkAlphaType == src.alphaType(); - default: - return dst.colorType() == src.colorType(); - } -} - void SkPngCodec::allocateStorage(const SkImageInfo& dstInfo) { switch (fXformMode) { case kSwizzleOnly_XformMode: @@ -422,7 +403,7 @@ public: Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options, SkPMColor ctable[], int* ctableCount) override { - if (!png_conversion_possible(dstInfo, this->getInfo()) || + if (!conversion_possible(dstInfo, this->getInfo()) || !this->initializeXforms(dstInfo, options, ctable, ctableCount)) { return kInvalidConversion; @@ -489,7 +470,7 @@ public: Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options, SkPMColor ctable[], int* ctableCount) override { - if (!png_conversion_possible(dstInfo, this->getInfo()) || + if (!conversion_possible(dstInfo, this->getInfo()) || !this->initializeXforms(dstInfo, options, ctable, ctableCount)) { return kInvalidConversion; @@ -807,20 +788,10 @@ bool SkPngCodec::initializeXforms(const SkImageInfo& dstInfo, const Options& opt fSwizzler.reset(nullptr); fColorXform = nullptr; - bool needsColorXform = needs_color_xform(dstInfo, this->getInfo()); - if (needsColorXform) { - if (kGray_8_SkColorType == dstInfo.colorType() || - kRGB_565_SkColorType == dstInfo.colorType()) - { - return false; - } - + if (needs_color_xform(dstInfo, this->getInfo())) { fColorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpace()), sk_ref_sp(dstInfo.colorSpace())); - - if (!fColorXform && kRGBA_F16_SkColorType == dstInfo.colorType()) { - return false; - } + SkASSERT(fColorXform); } // If the image is RGBA and we have a color xform, we can skip the swizzler. @@ -907,7 +878,7 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, size_t rowBytes, const Options& options, SkPMColor ctable[], int* ctableCount, int* rowsDecoded) { - if (!png_conversion_possible(dstInfo, this->getInfo()) || + if (!conversion_possible(dstInfo, this->getInfo()) || !this->initializeXforms(dstInfo, options, ctable, ctableCount)) { return kInvalidConversion; |