| Index: src/images/SkImageDecoder_libpng.cpp
|
| diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp
|
| index cd09f5f980d42e0769131f8d716297a244207228..70cc1b9f759ea59d8947c910d8bbf54b21f6805e 100644
|
| --- a/src/images/SkImageDecoder_libpng.cpp
|
| +++ b/src/images/SkImageDecoder_libpng.cpp
|
| @@ -1,4 +1,3 @@
|
| -
|
| /*
|
| * Copyright 2006 The Android Open Source Project
|
| *
|
| @@ -6,7 +5,6 @@
|
| * found in the LICENSE file.
|
| */
|
|
|
| -
|
| #include "SkImageDecoder.h"
|
| #include "SkImageEncoder.h"
|
| #include "SkColor.h"
|
| @@ -59,7 +57,7 @@ public:
|
| : fStream(stream)
|
| , fPng_ptr(png_ptr)
|
| , fInfo_ptr(info_ptr)
|
| - , fConfig(SkBitmap::kNo_Config) {
|
| + , fColorType(kUnknown_SkColorType) {
|
| SkASSERT(stream != NULL);
|
| stream->ref();
|
| }
|
| @@ -72,7 +70,7 @@ public:
|
| SkAutoTUnref<SkStreamRewindable> fStream;
|
| png_structp fPng_ptr;
|
| png_infop fInfo_ptr;
|
| - SkBitmap::Config fConfig;
|
| + SkColorType fColorType;
|
| };
|
|
|
| class SkPNGImageDecoder : public SkImageDecoder {
|
| @@ -102,9 +100,8 @@ private:
|
| bool decodePalette(png_structp png_ptr, png_infop info_ptr,
|
| bool * SK_RESTRICT hasAlphap, bool *reallyHasAlphap,
|
| SkColorTable **colorTablep);
|
| - bool getBitmapConfig(png_structp png_ptr, png_infop info_ptr,
|
| - SkBitmap::Config *config, bool *hasAlpha,
|
| - SkPMColor *theTranspColor);
|
| + bool getBitmapConfig(png_structp, png_infop, SkColorType*, bool* hasAlpha,
|
| + SkPMColor* theTranspColor);
|
|
|
| typedef SkImageDecoder INHERITED;
|
| };
|
| @@ -186,13 +183,12 @@ static bool substituteTranspColor(SkBitmap* bm, SkPMColor match) {
|
| return reallyHasAlpha;
|
| }
|
|
|
| -static bool canUpscalePaletteToConfig(SkBitmap::Config dstConfig,
|
| - bool srcHasAlpha) {
|
| - switch (dstConfig) {
|
| - case SkBitmap::kARGB_8888_Config:
|
| - case SkBitmap::kARGB_4444_Config:
|
| +static bool canUpscalePaletteToConfig(SkColorType dstColorType, bool srcHasAlpha) {
|
| + switch (dstColorType) {
|
| + case kN32_SkColorType:
|
| + case kARGB_4444_SkColorType:
|
| return true;
|
| - case SkBitmap::kRGB_565_Config:
|
| + case kRGB_565_SkColorType:
|
| // only return true if the src is opaque (since 565 is opaque)
|
| return !srcHasAlpha;
|
| default:
|
| @@ -317,26 +313,24 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
|
| }
|
|
|
| png_uint_32 origWidth, origHeight;
|
| - int bitDepth, colorType, interlaceType;
|
| + int bitDepth, pngColorType, interlaceType;
|
| png_get_IHDR(png_ptr, info_ptr, &origWidth, &origHeight, &bitDepth,
|
| - &colorType, &interlaceType, int_p_NULL, int_p_NULL);
|
| + &pngColorType, &interlaceType, int_p_NULL, int_p_NULL);
|
|
|
| - SkBitmap::Config config;
|
| + SkColorType colorType;
|
| bool hasAlpha = false;
|
| SkPMColor theTranspColor = 0; // 0 tells us not to try to match
|
|
|
| - if (!this->getBitmapConfig(png_ptr, info_ptr, &config, &hasAlpha, &theTranspColor)) {
|
| + if (!this->getBitmapConfig(png_ptr, info_ptr, &colorType, &hasAlpha, &theTranspColor)) {
|
| return false;
|
| }
|
|
|
| + SkAlphaType alphaType = this->getRequireUnpremultipliedColors() ?
|
| + kUnpremul_SkAlphaType : kPremul_SkAlphaType;
|
| const int sampleSize = this->getSampleSize();
|
| SkScaledBitmapSampler sampler(origWidth, origHeight, sampleSize);
|
| - decodedBitmap->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight());
|
| -
|
| - // we should communicate alphaType, even if we early-return in bounds-only-mode.
|
| - if (this->getRequireUnpremultipliedColors()) {
|
| - decodedBitmap->setAlphaType(kUnpremul_SkAlphaType);
|
| - }
|
| + decodedBitmap->setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(),
|
| + colorType, alphaType));
|
|
|
| if (SkImageDecoder::kDecodeBounds_Mode == mode) {
|
| return true;
|
| @@ -350,14 +344,14 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
|
| bool reallyHasAlpha = false;
|
| SkColorTable* colorTable = NULL;
|
|
|
| - if (colorType == PNG_COLOR_TYPE_PALETTE) {
|
| + if (pngColorType == PNG_COLOR_TYPE_PALETTE) {
|
| decodePalette(png_ptr, info_ptr, &hasAlpha, &reallyHasAlpha, &colorTable);
|
| }
|
|
|
| SkAutoUnref aur(colorTable);
|
|
|
| if (!this->allocPixelRef(decodedBitmap,
|
| - SkBitmap::kIndex8_Config == config ? colorTable : NULL)) {
|
| + kIndex_8_SkColorType == colorType ? colorTable : NULL)) {
|
| return false;
|
| }
|
|
|
| @@ -376,15 +370,15 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
|
| */
|
| png_read_update_info(png_ptr, info_ptr);
|
|
|
| - if ((SkBitmap::kA8_Config == config || SkBitmap::kIndex8_Config == config)
|
| - && 1 == sampleSize) {
|
| - if (SkBitmap::kA8_Config == config) {
|
| + if ((kAlpha_8_SkColorType == colorType || kIndex_8_SkColorType == colorType) &&
|
| + 1 == sampleSize) {
|
| + if (kAlpha_8_SkColorType == colorType) {
|
| // For an A8 bitmap, we assume there is an alpha for speed. It is
|
| // possible the bitmap is opaque, but that is an unlikely use case
|
| // since it would not be very interesting.
|
| reallyHasAlpha = true;
|
| // A8 is only allowed if the original was GRAY.
|
| - SkASSERT(PNG_COLOR_TYPE_GRAY == colorType);
|
| + SkASSERT(PNG_COLOR_TYPE_GRAY == pngColorType);
|
| }
|
| for (int i = 0; i < number_passes; i++) {
|
| for (png_uint_32 y = 0; y < origHeight; y++) {
|
| @@ -399,9 +393,9 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
|
| if (colorTable != NULL) {
|
| sc = SkScaledBitmapSampler::kIndex;
|
| srcBytesPerPixel = 1;
|
| - } else if (SkBitmap::kA8_Config == config) {
|
| + } else if (kAlpha_8_SkColorType == colorType) {
|
| // A8 is only allowed if the original was GRAY.
|
| - SkASSERT(PNG_COLOR_TYPE_GRAY == colorType);
|
| + SkASSERT(PNG_COLOR_TYPE_GRAY == pngColorType);
|
| sc = SkScaledBitmapSampler::kGray;
|
| srcBytesPerPixel = 1;
|
| } else if (hasAlpha) {
|
| @@ -492,8 +486,8 @@ bool SkPNGImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* decodedBitmap,
|
|
|
|
|
| bool SkPNGImageDecoder::getBitmapConfig(png_structp png_ptr, png_infop info_ptr,
|
| - SkBitmap::Config* SK_RESTRICT configp,
|
| - bool* SK_RESTRICT hasAlphap,
|
| + SkColorType* colorTypep,
|
| + bool* hasAlphap,
|
| SkPMColor* SK_RESTRICT theTranspColorp) {
|
| png_uint_32 origWidth, origHeight;
|
| int bitDepth, colorType;
|
| @@ -518,10 +512,10 @@ bool SkPNGImageDecoder::getBitmapConfig(png_structp png_ptr, png_infop info_ptr,
|
|
|
| if (colorType == PNG_COLOR_TYPE_PALETTE) {
|
| bool paletteHasAlpha = hasTransparencyInPalette(png_ptr, info_ptr);
|
| - *configp = this->getPrefConfig(kIndex_SrcDepth, paletteHasAlpha);
|
| + *colorTypep = this->getPrefColorType(kIndex_SrcDepth, paletteHasAlpha);
|
| // now see if we can upscale to their requested config
|
| - if (!canUpscalePaletteToConfig(*configp, paletteHasAlpha)) {
|
| - *configp = SkBitmap::kIndex8_Config;
|
| + if (!canUpscalePaletteToConfig(*colorTypep, paletteHasAlpha)) {
|
| + *colorTypep = kIndex_8_SkColorType;
|
| }
|
| } else {
|
| png_color_16p transpColor = NULL;
|
| @@ -585,21 +579,21 @@ bool SkPNGImageDecoder::getBitmapConfig(png_structp png_ptr, png_infop info_ptr,
|
| //SkASSERT(!*hasAlphap);
|
| }
|
|
|
| - *configp = this->getPrefConfig(srcDepth, *hasAlphap);
|
| + *colorTypep = this->getPrefColorType(srcDepth, *hasAlphap);
|
| // now match the request against our capabilities
|
| if (*hasAlphap) {
|
| - if (*configp != SkBitmap::kARGB_4444_Config) {
|
| - *configp = SkBitmap::kARGB_8888_Config;
|
| + if (*colorTypep != kARGB_4444_SkColorType) {
|
| + *colorTypep = kN32_SkColorType;
|
| }
|
| } else {
|
| - if (SkBitmap::kA8_Config == *configp) {
|
| + if (kAlpha_8_SkColorType == *colorTypep) {
|
| if (k8BitGray_SrcDepth != srcDepth) {
|
| // Converting a non grayscale image to A8 is not currently supported.
|
| - *configp = SkBitmap::kARGB_8888_Config;
|
| + *colorTypep = kN32_SkColorType;
|
| }
|
| - } else if (*configp != SkBitmap::kRGB_565_Config &&
|
| - *configp != SkBitmap::kARGB_4444_Config) {
|
| - *configp = SkBitmap::kARGB_8888_Config;
|
| + } else if (*colorTypep != kRGB_565_SkColorType &&
|
| + *colorTypep != kARGB_4444_SkColorType) {
|
| + *colorTypep = kN32_SkColorType;
|
| }
|
| }
|
| }
|
| @@ -613,30 +607,29 @@ bool SkPNGImageDecoder::getBitmapConfig(png_structp png_ptr, png_infop info_ptr,
|
| }
|
| }
|
|
|
| - if (!this->chooseFromOneChoice(*configp, origWidth, origHeight)) {
|
| + if (!this->chooseFromOneChoice(*colorTypep, origWidth, origHeight)) {
|
| return false;
|
| }
|
|
|
| // If the image has alpha and the decoder wants unpremultiplied
|
| // colors, the only supported config is 8888.
|
| if (this->getRequireUnpremultipliedColors() && *hasAlphap) {
|
| - *configp = SkBitmap::kARGB_8888_Config;
|
| + *colorTypep = kN32_SkColorType;
|
| }
|
|
|
| if (fImageIndex != NULL) {
|
| - if (SkBitmap::kNo_Config == fImageIndex->fConfig) {
|
| + if (kUnknown_SkColorType == fImageIndex->fColorType) {
|
| // This is the first time for this subset decode. From now on,
|
| // all decodes must be in the same config.
|
| - fImageIndex->fConfig = *configp;
|
| - } else if (fImageIndex->fConfig != *configp) {
|
| - // Requesting a different config for a subsequent decode is not
|
| + fImageIndex->fColorType = *colorTypep;
|
| + } else if (fImageIndex->fColorType != *colorTypep) {
|
| + // Requesting a different colortype for a subsequent decode is not
|
| // supported. Report failure before we make changes to png_ptr.
|
| return false;
|
| }
|
| }
|
|
|
| - bool convertGrayToRGB = PNG_COLOR_TYPE_GRAY == colorType
|
| - && *configp != SkBitmap::kA8_Config;
|
| + bool convertGrayToRGB = PNG_COLOR_TYPE_GRAY == colorType && *colorTypep != kAlpha_8_SkColorType;
|
|
|
| // Unless the user is requesting A8, convert a grayscale image into RGB.
|
| // GRAY_ALPHA will always be converted to RGB
|
| @@ -774,9 +767,9 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
| }
|
|
|
| png_uint_32 origWidth, origHeight;
|
| - int bitDepth, colorType, interlaceType;
|
| + int bitDepth, pngColorType, interlaceType;
|
| png_get_IHDR(png_ptr, info_ptr, &origWidth, &origHeight, &bitDepth,
|
| - &colorType, &interlaceType, int_p_NULL, int_p_NULL);
|
| + &pngColorType, &interlaceType, int_p_NULL, int_p_NULL);
|
|
|
| SkIRect rect = SkIRect::MakeWH(origWidth, origHeight);
|
|
|
| @@ -786,11 +779,11 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
| return false;
|
| }
|
|
|
| - SkBitmap::Config config;
|
| + SkColorType colorType;
|
| bool hasAlpha = false;
|
| SkPMColor theTranspColor = 0; // 0 tells us not to try to match
|
|
|
| - if (!this->getBitmapConfig(png_ptr, info_ptr, &config, &hasAlpha, &theTranspColor)) {
|
| + if (!this->getBitmapConfig(png_ptr, info_ptr, &colorType, &hasAlpha, &theTranspColor)) {
|
| return false;
|
| }
|
|
|
| @@ -798,7 +791,8 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
| SkScaledBitmapSampler sampler(origWidth, rect.height(), sampleSize);
|
|
|
| SkBitmap decodedBitmap;
|
| - decodedBitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight());
|
| + decodedBitmap.setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(),
|
| + colorType, kPremul_SkAlphaType));
|
|
|
| // from here down we are concerned with colortables and pixels
|
|
|
| @@ -808,7 +802,7 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
| bool reallyHasAlpha = false;
|
| SkColorTable* colorTable = NULL;
|
|
|
| - if (colorType == PNG_COLOR_TYPE_PALETTE) {
|
| + if (pngColorType == PNG_COLOR_TYPE_PALETTE) {
|
| decodePalette(png_ptr, info_ptr, &hasAlpha, &reallyHasAlpha, &colorTable);
|
| }
|
|
|
| @@ -821,7 +815,7 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
| int h = rect.height() / sampleSize;
|
| const bool swapOnly = (rect == region) && (w == decodedBitmap.width()) &&
|
| (h == decodedBitmap.height()) && bm->isNull();
|
| - const bool needColorTable = SkBitmap::kIndex8_Config == config;
|
| + const bool needColorTable = kIndex_8_SkColorType == colorType;
|
| if (swapOnly) {
|
| if (!this->allocPixelRef(&decodedBitmap, needColorTable ? colorTable : NULL)) {
|
| return false;
|
| @@ -856,15 +850,15 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
|
|
| int actualTop = rect.fTop;
|
|
|
| - if ((SkBitmap::kA8_Config == config || SkBitmap::kIndex8_Config == config)
|
| + if ((kAlpha_8_SkColorType == colorType || kIndex_8_SkColorType == colorType)
|
| && 1 == sampleSize) {
|
| - if (SkBitmap::kA8_Config == config) {
|
| + if (kAlpha_8_SkColorType == colorType) {
|
| // For an A8 bitmap, we assume there is an alpha for speed. It is
|
| // possible the bitmap is opaque, but that is an unlikely use case
|
| // since it would not be very interesting.
|
| reallyHasAlpha = true;
|
| // A8 is only allowed if the original was GRAY.
|
| - SkASSERT(PNG_COLOR_TYPE_GRAY == colorType);
|
| + SkASSERT(PNG_COLOR_TYPE_GRAY == pngColorType);
|
| }
|
|
|
| for (int i = 0; i < number_passes; i++) {
|
| @@ -886,9 +880,9 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
| if (colorTable != NULL) {
|
| sc = SkScaledBitmapSampler::kIndex;
|
| srcBytesPerPixel = 1;
|
| - } else if (SkBitmap::kA8_Config == config) {
|
| + } else if (kAlpha_8_SkColorType == colorType) {
|
| // A8 is only allowed if the original was GRAY.
|
| - SkASSERT(PNG_COLOR_TYPE_GRAY == colorType);
|
| + SkASSERT(PNG_COLOR_TYPE_GRAY == pngColorType);
|
| sc = SkScaledBitmapSampler::kGray;
|
| srcBytesPerPixel = 1;
|
| } else if (hasAlpha) {
|
| @@ -957,11 +951,11 @@ bool SkPNGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) {
|
| reallyHasAlpha |= substituteTranspColor(&decodedBitmap, theTranspColor);
|
| }
|
| if (reallyHasAlpha && this->getRequireUnpremultipliedColors()) {
|
| - switch (decodedBitmap.config()) {
|
| - case SkBitmap::kIndex8_Config:
|
| + switch (decodedBitmap.colorType()) {
|
| + case kIndex_8_SkColorType:
|
| // Fall through.
|
| - case SkBitmap::kARGB_4444_Config:
|
| - // We have chosen not to support unpremul for these configs.
|
| + case kARGB_4444_SkColorType:
|
| + // We have chosen not to support unpremul for these colortypess.
|
| return false;
|
| default: {
|
| // Fall through to finish the decode. This config either
|
|
|