Index: src/codec/SkPngCodec.cpp |
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp |
index 04c88212035664d4e5d15f93d534f98a0faf3467..1e633eaaed3b76b5e9aae380e8a1605b498d84cf 100644 |
--- a/src/codec/SkPngCodec.cpp |
+++ b/src/codec/SkPngCodec.cpp |
@@ -267,11 +267,12 @@ bool SkPngCodec::createColorTable(const SkImageInfo& dstInfo, int* ctableCount) |
// If we are not decoding to F16, we can color xform now and store the results |
// in the color table. |
if (fColorXform && kRGBA_F16_SkColorType != dstInfo.colorType()) { |
- SkColorType xformColorType = is_rgba(dstInfo.colorType()) ? |
- kRGBA_8888_SkColorType : kBGRA_8888_SkColorType; |
- SkAlphaType xformAlphaType = select_alpha_xform(dstInfo.alphaType(), |
+ SkColorSpaceXform::ColorFormat xformColorFormat = is_rgba(dstInfo.colorType()) ? |
+ SkColorSpaceXform::kRGBA_8888_ColorFormat : |
+ SkColorSpaceXform::kBGRA_8888_ColorFormat; |
+ SkAlphaType xformAlphaType = select_xform_alpha(dstInfo.alphaType(), |
this->getInfo().alphaType()); |
- fColorXform->apply(colorTable, colorTable, numColors, xformColorType, xformAlphaType); |
+ fColorXform->apply(colorTable, colorTable, numColors, xformColorFormat, xformAlphaType); |
} |
// Pad the color table with the last color in the table (or black) in the case that |
@@ -492,17 +493,18 @@ void SkPngCodec::allocateStorage(const SkImageInfo& dstInfo) { |
} |
void SkPngCodec::applyXformRow(void* dst, const void* src) { |
- const SkColorType colorType = this->dstInfo().colorType(); |
switch (fXformMode) { |
case kSwizzleOnly_XformMode: |
fSwizzler->swizzle(dst, (const uint8_t*) src); |
break; |
case kColorOnly_XformMode: |
- fColorXform->apply(dst, (const uint32_t*) src, fXformWidth, colorType, fXformAlphaType); |
+ fColorXform->apply(dst, (const uint32_t*) src, fXformWidth, fXformColorFormat, |
+ fXformAlphaType); |
break; |
case kSwizzleColor_XformMode: |
fSwizzler->swizzle(fColorXformSrcRow, (const uint8_t*) src); |
- fColorXform->apply(dst, fColorXformSrcRow, fXformWidth, colorType, fXformAlphaType); |
+ fColorXform->apply(dst, fColorXformSrcRow, fXformWidth, fXformColorFormat, |
+ fXformAlphaType); |
break; |
} |
} |
@@ -1137,9 +1139,23 @@ bool SkPngCodec::initializeXforms(const SkImageInfo& dstInfo, const Options& opt |
return true; |
} |
-void SkPngCodec::initializeXformAlphaAndWidth() { |
- fXformAlphaType = select_alpha_xform(this->dstInfo().alphaType(), this->getInfo().alphaType()); |
- fXformWidth = this->swizzler() ? this->swizzler()->swizzleWidth() : this->dstInfo().width(); |
+void SkPngCodec::initializeXformParams() { |
+ switch (fXformMode) { |
+ case kColorOnly_XformMode: |
+ fXformColorFormat = select_xform_format(this->dstInfo().colorType()); |
+ fXformAlphaType = select_xform_alpha(this->dstInfo().alphaType(), |
+ this->getInfo().alphaType()); |
+ fXformWidth = this->dstInfo().width(); |
+ break; |
+ case kSwizzleColor_XformMode: |
+ fXformColorFormat = select_xform_format(this->dstInfo().colorType()); |
+ fXformAlphaType = select_xform_alpha(this->dstInfo().alphaType(), |
+ this->getInfo().alphaType()); |
+ fXformWidth = this->swizzler()->swizzleWidth(); |
+ break; |
+ default: |
+ break; |
+ } |
} |
static inline bool apply_xform_on_decode(SkColorType dstColorType, SkEncodedInfo::Color srcColor) { |
@@ -1226,7 +1242,7 @@ SkCodec::Result SkPngCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst, |
} |
this->allocateStorage(dstInfo); |
- this->initializeXformAlphaAndWidth(); |
+ this->initializeXformParams(); |
return this->decodeAllRows(dst, rowBytes, rowsDecoded); |
} |
@@ -1261,7 +1277,7 @@ SkCodec::Result SkPngCodec::onStartIncrementalDecode(const SkImageInfo& dstInfo, |
SkCodec::Result SkPngCodec::onIncrementalDecode(int* rowsDecoded) { |
// FIXME: Only necessary on the first call. |
- this->initializeXformAlphaAndWidth(); |
+ this->initializeXformParams(); |
return this->decode(rowsDecoded); |
} |
@@ -1269,7 +1285,7 @@ SkCodec::Result SkPngCodec::onIncrementalDecode(int* rowsDecoded) { |
uint64_t SkPngCodec::onGetFillValue(const SkImageInfo& dstInfo) const { |
const SkPMColor* colorPtr = get_color_ptr(fColorTable.get()); |
if (colorPtr) { |
- SkAlphaType alphaType = select_alpha_xform(dstInfo.alphaType(), |
+ SkAlphaType alphaType = select_xform_alpha(dstInfo.alphaType(), |
this->getInfo().alphaType()); |
return get_color_table_fill_value(dstInfo.colorType(), alphaType, colorPtr, 0, |
fColorXform.get()); |