diff options
author | halcanary <halcanary@google.com> | 2015-12-07 14:07:31 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-07 14:07:32 -0800 |
commit | dfd6c6e3bb8c951fcd2bf85995629f1c8ef76590 (patch) | |
tree | b0f2d50cbac570df60743f6a21f2773e7a6d58c3 /src | |
parent | 987deab2b522ab7c3f402698bb9cfcc0dc4b162f (diff) |
SkPNGImageEncoder encodes all SkColorTypes
Review URL: https://codereview.chromium.org/1506663002
Diffstat (limited to 'src')
-rw-r--r-- | src/images/SkImageDecoder_libpng.cpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp index a03ed10453..fd09ce95b0 100644 --- a/src/images/SkImageDecoder_libpng.cpp +++ b/src/images/SkImageDecoder_libpng.cpp @@ -827,10 +827,28 @@ private: typedef SkImageEncoder INHERITED; }; -bool SkPNGImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bitmap, int /*quality*/) { - SkColorType ct = bitmap.colorType(); +bool SkPNGImageEncoder::onEncode(SkWStream* stream, + const SkBitmap& originalBitmap, + int /*quality*/) { + SkBitmap copy; + const SkBitmap* bitmap = &originalBitmap; + switch (originalBitmap.colorType()) { + case kIndex_8_SkColorType: + case kN32_SkColorType: + case kARGB_4444_SkColorType: + case kRGB_565_SkColorType: + break; + default: + // TODO(scroggo): support 8888-but-not-N32 natively. + // TODO(scroggo): support kGray_8 directly. + // TODO(scroggo): support Alpha_8 as Grayscale(black)+Alpha + if (originalBitmap.copyTo(©, kN32_SkColorType)) { + bitmap = © + } + } + SkColorType ct = bitmap->colorType(); - const bool hasAlpha = !bitmap.isOpaque(); + const bool hasAlpha = !bitmap->isOpaque(); int colorType = PNG_COLOR_MASK_COLOR; int bitDepth = 8; // default for color png_color_8 sig_bit; @@ -870,14 +888,14 @@ bool SkPNGImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bitmap, int sig_bit.alpha = 0; } - SkAutoLockPixels alp(bitmap); + SkAutoLockPixels alp(*bitmap); // readyToDraw checks for pixels (and colortable if that is required) - if (!bitmap.readyToDraw()) { + if (!bitmap->readyToDraw()) { return false; } // we must do this after we have locked the pixels - SkColorTable* ctable = bitmap.getColorTable(); + SkColorTable* ctable = bitmap->getColorTable(); if (ctable) { if (ctable->count() == 0) { return false; @@ -886,7 +904,7 @@ bool SkPNGImageEncoder::onEncode(SkWStream* stream, const SkBitmap& bitmap, int bitDepth = computeBitDepth(ctable->count()); } - return doEncode(stream, bitmap, hasAlpha, colorType, bitDepth, ct, sig_bit); + return doEncode(stream, *bitmap, hasAlpha, colorType, bitDepth, ct, sig_bit); } bool SkPNGImageEncoder::doEncode(SkWStream* stream, const SkBitmap& bitmap, |