| Index: src/codec/SkPngCodec.cpp
|
| diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
|
| index bfa695773d22baa6793014b4c1bd013b29eb0526..ac7238d3e904f284ac182fc769a90c1166946b6f 100644
|
| --- a/src/codec/SkPngCodec.cpp
|
| +++ b/src/codec/SkPngCodec.cpp
|
| @@ -355,6 +355,25 @@
|
| // Note that we will have to change this implementation if we start
|
| // supporting outputs from libpng that are less than 8-bits per component.
|
| 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) {
|
| @@ -403,7 +422,7 @@
|
|
|
| Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options,
|
| SkPMColor ctable[], int* ctableCount) override {
|
| - if (!conversion_possible(dstInfo, this->getInfo()) ||
|
| + if (!png_conversion_possible(dstInfo, this->getInfo()) ||
|
| !this->initializeXforms(dstInfo, options, ctable, ctableCount))
|
| {
|
| return kInvalidConversion;
|
| @@ -470,7 +489,7 @@
|
|
|
| Result onStartScanlineDecode(const SkImageInfo& dstInfo, const Options& options,
|
| SkPMColor ctable[], int* ctableCount) override {
|
| - if (!conversion_possible(dstInfo, this->getInfo()) ||
|
| + if (!png_conversion_possible(dstInfo, this->getInfo()) ||
|
| !this->initializeXforms(dstInfo, options, ctable, ctableCount))
|
| {
|
| return kInvalidConversion;
|
| @@ -788,10 +807,20 @@
|
| fSwizzler.reset(nullptr);
|
| fColorXform = nullptr;
|
|
|
| - if (needs_color_xform(dstInfo, this->getInfo())) {
|
| + bool needsColorXform = needs_color_xform(dstInfo, this->getInfo());
|
| + if (needsColorXform) {
|
| + if (kGray_8_SkColorType == dstInfo.colorType() ||
|
| + kRGB_565_SkColorType == dstInfo.colorType())
|
| + {
|
| + return false;
|
| + }
|
| +
|
| fColorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpace()),
|
| sk_ref_sp(dstInfo.colorSpace()));
|
| - SkASSERT(fColorXform);
|
| +
|
| + if (!fColorXform && kRGBA_F16_SkColorType == dstInfo.colorType()) {
|
| + return false;
|
| + }
|
| }
|
|
|
| // If the image is RGBA and we have a color xform, we can skip the swizzler.
|
| @@ -878,7 +907,7 @@
|
| size_t rowBytes, const Options& options,
|
| SkPMColor ctable[], int* ctableCount,
|
| int* rowsDecoded) {
|
| - if (!conversion_possible(dstInfo, this->getInfo()) ||
|
| + if (!png_conversion_possible(dstInfo, this->getInfo()) ||
|
| !this->initializeXforms(dstInfo, options, ctable, ctableCount))
|
| {
|
| return kInvalidConversion;
|
|
|