aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkPngCodec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec/SkPngCodec.cpp')
-rw-r--r--src/codec/SkPngCodec.cpp42
1 files changed, 29 insertions, 13 deletions
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
index 04c8821203..1e633eaaed 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());