| Index: src/images/SkPNGImageEncoder.cpp
|
| diff --git a/src/images/SkPNGImageEncoder.cpp b/src/images/SkPNGImageEncoder.cpp
|
| index 1932e66dc6ae33ae968e958647ac037371eb890f..a9c8b3d7857e2dd604fe9a531e3d676b04158c0e 100644
|
| --- a/src/images/SkPNGImageEncoder.cpp
|
| +++ b/src/images/SkPNGImageEncoder.cpp
|
| @@ -76,6 +76,7 @@ static transform_scanline_proc choose_proc(SkColorType ct, bool hasAlpha) {
|
| { kARGB_4444_SkColorType, false, transform_scanline_444 },
|
| { kARGB_4444_SkColorType, true, transform_scanline_4444 },
|
| { kIndex_8_SkColorType, false, transform_scanline_memcpy },
|
| + { kGray_8_SkColorType, false, transform_scanline_memcpy },
|
| };
|
|
|
| for (int i = SK_ARRAY_COUNT(gMap) - 1; i >= 0; --i) {
|
| @@ -178,13 +179,13 @@ bool SkPNGImageEncoder::onEncode(SkWStream* stream,
|
| const SkBitmap* bitmap = &originalBitmap;
|
| switch (originalBitmap.colorType()) {
|
| case kIndex_8_SkColorType:
|
| + case kGray_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 = ©
|
| @@ -193,45 +194,49 @@ bool SkPNGImageEncoder::onEncode(SkWStream* stream,
|
| SkColorType ct = bitmap->colorType();
|
|
|
| const bool hasAlpha = !bitmap->isOpaque();
|
| - int colorType = PNG_COLOR_MASK_COLOR;
|
| int bitDepth = 8; // default for color
|
| png_color_8 sig_bit;
|
| + sk_bzero(&sig_bit, sizeof(png_color_8));
|
|
|
| + int colorType;
|
| switch (ct) {
|
| case kIndex_8_SkColorType:
|
| - colorType |= PNG_COLOR_MASK_PALETTE;
|
| - // fall through to the ARGB_8888 case
|
| + sig_bit.red = 8;
|
| + sig_bit.green = 8;
|
| + sig_bit.blue = 8;
|
| + sig_bit.alpha = 8;
|
| + colorType = PNG_COLOR_TYPE_PALETTE;
|
| + break;
|
| + case kGray_8_SkColorType:
|
| + sig_bit.gray = 8;
|
| + colorType = PNG_COLOR_TYPE_GRAY;
|
| + SkASSERT(!hasAlpha);
|
| + break;
|
| case kN32_SkColorType:
|
| sig_bit.red = 8;
|
| sig_bit.green = 8;
|
| sig_bit.blue = 8;
|
| sig_bit.alpha = 8;
|
| + colorType = hasAlpha ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB;
|
| break;
|
| case kARGB_4444_SkColorType:
|
| sig_bit.red = 4;
|
| sig_bit.green = 4;
|
| sig_bit.blue = 4;
|
| sig_bit.alpha = 4;
|
| + colorType = hasAlpha ? PNG_COLOR_TYPE_RGB_ALPHA : PNG_COLOR_TYPE_RGB;
|
| break;
|
| case kRGB_565_SkColorType:
|
| sig_bit.red = 5;
|
| sig_bit.green = 6;
|
| sig_bit.blue = 5;
|
| - sig_bit.alpha = 0;
|
| + colorType = PNG_COLOR_TYPE_RGB;
|
| + SkASSERT(!hasAlpha);
|
| break;
|
| default:
|
| return false;
|
| }
|
|
|
| - if (hasAlpha) {
|
| - // don't specify alpha if we're a palette, even if our ctable has alpha
|
| - if (!(colorType & PNG_COLOR_MASK_PALETTE)) {
|
| - colorType |= PNG_COLOR_MASK_ALPHA;
|
| - }
|
| - } else {
|
| - sig_bit.alpha = 0;
|
| - }
|
| -
|
| SkAutoLockPixels alp(*bitmap);
|
| // readyToDraw checks for pixels (and colortable if that is required)
|
| if (!bitmap->readyToDraw()) {
|
| @@ -306,9 +311,8 @@ bool SkPNGImageEncoder::doEncode(SkWStream* stream, const SkBitmap& bitmap,
|
| png_set_tRNS(png_ptr, info_ptr, trans, numTrans, nullptr);
|
| }
|
| }
|
| -#ifdef PNG_sBIT_SUPPORTED
|
| +
|
| png_set_sBIT(png_ptr, info_ptr, &sig_bit);
|
| -#endif
|
| png_write_info(png_ptr, info_ptr);
|
|
|
| const char* srcImage = (const char*)bitmap.getPixels();
|
|
|