diff options
Diffstat (limited to 'src/images')
-rw-r--r-- | src/images/SkImageDecoder.cpp | 19 | ||||
-rw-r--r-- | src/images/SkImageDecoder_ktx.cpp | 8 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libbmp.cpp | 11 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libgif.cpp | 6 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libico.cpp | 2 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libjpeg.cpp | 113 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libpng.cpp | 130 | ||||
-rw-r--r-- | src/images/SkImageDecoder_libwebp.cpp | 31 | ||||
-rw-r--r-- | src/images/SkImageDecoder_pkm.cpp | 6 | ||||
-rw-r--r-- | src/images/SkImageDecoder_wbmp.cpp | 4 | ||||
-rw-r--r-- | src/images/SkScaledBitmapSampler.cpp | 10 |
11 files changed, 162 insertions, 178 deletions
diff --git a/src/images/SkImageDecoder.cpp b/src/images/SkImageDecoder.cpp index 491d9aa72f..5d38b40412 100644 --- a/src/images/SkImageDecoder.cpp +++ b/src/images/SkImageDecoder.cpp @@ -124,15 +124,16 @@ void SkImageDecoder::setSampleSize(int size) { fSampleSize = size; } -bool SkImageDecoder::chooseFromOneChoice(SkBitmap::Config config, int width, - int height) const { +// TODO: change Chooser virtual to take colorType, so we can stop calling SkColorTypeToBitmapConfig +// +bool SkImageDecoder::chooseFromOneChoice(SkColorType colorType, int width, int height) const { Chooser* chooser = fChooser; - + if (NULL == chooser) { // no chooser, we just say YES to decoding :) return true; } chooser->begin(1); - chooser->inspect(0, config, width, height); + chooser->inspect(0, SkColorTypeToBitmapConfig(colorType), width, height); return chooser->choose() == 0; } @@ -148,8 +149,10 @@ void SkImageDecoder::setPrefConfigTable(const PrefConfigTable& prefTable) { fPrefTable = prefTable; } -SkBitmap::Config SkImageDecoder::getPrefConfig(SrcDepth srcDepth, - bool srcHasAlpha) const { +// TODO: use colortype in fPrefTable, fDefaultPref and GetDeviceConfig() +// so we can stop using SkBitmapConfigToColorType() +// +SkColorType SkImageDecoder::getPrefColorType(SrcDepth srcDepth, bool srcHasAlpha) const { SkBitmap::Config config = SkBitmap::kNo_Config; if (fUsePrefTable) { @@ -173,7 +176,7 @@ SkBitmap::Config SkImageDecoder::getPrefConfig(SrcDepth srcDepth, if (SkBitmap::kNo_Config == config) { config = SkImageDecoder::GetDeviceConfig(); } - return config; + return SkBitmapConfigToColorType(config); } bool SkImageDecoder::decode(SkStream* stream, SkBitmap* bm, @@ -232,7 +235,7 @@ bool SkImageDecoder::cropBitmap(SkBitmap *dst, SkBitmap *src, int sampleSize, } // if the destination has no pixels then we must allocate them. if (dst->isNull()) { - dst->setConfig(src->config(), w, h, 0, src->alphaType()); + dst->setInfo(src->info().makeWH(w, h)); if (!this->allocPixelRef(dst, NULL)) { SkDEBUGF(("failed to allocate pixels needed to crop the bitmap")); diff --git a/src/images/SkImageDecoder_ktx.cpp b/src/images/SkImageDecoder_ktx.cpp index 6ff2459540..0dd987cef1 100644 --- a/src/images/SkImageDecoder_ktx.cpp +++ b/src/images/SkImageDecoder_ktx.cpp @@ -63,7 +63,7 @@ bool SkKTXImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { const unsigned short height = ktxFile.height(); // should we allow the Chooser (if present) to pick a config for us??? - if (!this->chooseFromOneChoice(SkBitmap::kARGB_8888_Config, width, height)) { + if (!this->chooseFromOneChoice(kN32_SkColorType, width, height)) { return false; } @@ -71,10 +71,8 @@ bool SkKTXImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { SkScaledBitmapSampler sampler(width, height, this->getSampleSize()); // Set the config... - bm->setConfig(SkBitmap::kARGB_8888_Config, - sampler.scaledWidth(), sampler.scaledHeight(), - 0, - ktxFile.isRGBA8()? kPremul_SkAlphaType : kOpaque_SkAlphaType); + bm->setInfo(SkImageInfo::MakeN32(sampler.scaledWidth(), sampler.scaledHeight(), + ktxFile.isRGBA8()? kPremul_SkAlphaType : kOpaque_SkAlphaType)); if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; } diff --git a/src/images/SkImageDecoder_libbmp.cpp b/src/images/SkImageDecoder_libbmp.cpp index 34a88ac6b0..f9dd2472a0 100644 --- a/src/images/SkImageDecoder_libbmp.cpp +++ b/src/images/SkImageDecoder_libbmp.cpp @@ -123,18 +123,17 @@ bool SkBMPImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { int width = callback.width(); int height = callback.height(); - SkBitmap::Config config = this->getPrefConfig(k32Bit_SrcDepth, false); + SkColorType colorType = this->getPrefColorType(k32Bit_SrcDepth, false); // only accept prefConfig if it makes sense for us - if (SkBitmap::kARGB_4444_Config != config && - SkBitmap::kRGB_565_Config != config) { - config = SkBitmap::kARGB_8888_Config; + if (kARGB_4444_SkColorType != colorType && kRGB_565_SkColorType != colorType) { + colorType = kN32_SkColorType; } SkScaledBitmapSampler sampler(width, height, getSampleSize()); - bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0, - kOpaque_SkAlphaType); + bm->setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(), + colorType, kOpaque_SkAlphaType)); if (justBounds) { return true; diff --git a/src/images/SkImageDecoder_libgif.cpp b/src/images/SkImageDecoder_libgif.cpp index a045c27e16..bbcd223169 100644 --- a/src/images/SkImageDecoder_libgif.cpp +++ b/src/images/SkImageDecoder_libgif.cpp @@ -310,14 +310,14 @@ bool SkGIFImageDecoder::onDecode(SkStream* sk_stream, SkBitmap* bm, Mode mode) { } // FIXME: We could give the caller a choice of images or configs. - if (!this->chooseFromOneChoice(SkBitmap::kIndex8_Config, width, height)) { + if (!this->chooseFromOneChoice(kIndex_8_SkColorType, width, height)) { return error_return(*bm, "chooseFromOneChoice"); } SkScaledBitmapSampler sampler(width, height, this->getSampleSize()); - bm->setConfig(SkBitmap::kIndex8_Config, sampler.scaledWidth(), - sampler.scaledHeight()); + bm->setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(), + kIndex_8_SkColorType, kPremul_SkAlphaType)); if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; diff --git a/src/images/SkImageDecoder_libico.cpp b/src/images/SkImageDecoder_libico.cpp index 2b65a36c76..c6dd6f0836 100644 --- a/src/images/SkImageDecoder_libico.cpp +++ b/src/images/SkImageDecoder_libico.cpp @@ -246,7 +246,7 @@ bool SkICOImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) //if the andbitmap (mask) is all zeroes, then we can easily do an index bitmap //however, with small images with large colortables, maybe it's better to still do argb_8888 - bm->setConfig(SkBitmap::kARGB_8888_Config, w, h, calculateRowBytesFor8888(w, bitCount)); + bm->setInfo(SkImageInfo::MakeN32Premul(w, h), calculateRowBytesFor8888(w, bitCount)); if (SkImageDecoder::kDecodeBounds_Mode == mode) { delete[] colors; diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp index b08835b542..befe6dc580 100644 --- a/src/images/SkImageDecoder_libjpeg.cpp +++ b/src/images/SkImageDecoder_libjpeg.cpp @@ -248,12 +248,12 @@ private: #endif /** - * Determine the appropriate bitmap config and out_color_space based on + * Determine the appropriate bitmap colortype and out_color_space based on * both the preference of the caller and the jpeg_color_space on the * jpeg_decompress_struct passed in. * Must be called after jpeg_read_header. */ - SkBitmap::Config getBitmapConfig(jpeg_decompress_struct*); + SkColorType getBitmapColorType(jpeg_decompress_struct*); typedef SkImageDecoder INHERITED; }; @@ -400,7 +400,7 @@ static void set_dct_method(const SkImageDecoder& decoder, jpeg_decompress_struct #endif } -SkBitmap::Config SkJPEGImageDecoder::getBitmapConfig(jpeg_decompress_struct* cinfo) { +SkColorType SkJPEGImageDecoder::getBitmapColorType(jpeg_decompress_struct* cinfo) { SkASSERT(cinfo != NULL); SrcDepth srcDepth = k32Bit_SrcDepth; @@ -408,26 +408,26 @@ SkBitmap::Config SkJPEGImageDecoder::getBitmapConfig(jpeg_decompress_struct* cin srcDepth = k8BitGray_SrcDepth; } - SkBitmap::Config config = this->getPrefConfig(srcDepth, /*hasAlpha*/ false); - switch (config) { - case SkBitmap::kA8_Config: - // Only respect A8 config if the original is grayscale, + SkColorType colorType = this->getPrefColorType(srcDepth, /*hasAlpha*/ false); + switch (colorType) { + case kAlpha_8_SkColorType: + // Only respect A8 colortype if the original is grayscale, // in which case we will treat the grayscale as alpha // values. if (cinfo->jpeg_color_space != JCS_GRAYSCALE) { - config = SkBitmap::kARGB_8888_Config; + colorType = kN32_SkColorType; } break; - case SkBitmap::kARGB_8888_Config: + case kN32_SkColorType: // Fall through. - case SkBitmap::kARGB_4444_Config: + case kARGB_4444_SkColorType: // Fall through. - case SkBitmap::kRGB_565_Config: - // These are acceptable destination configs. + case kRGB_565_SkColorType: + // These are acceptable destination colortypes. break; default: - // Force all other configs to 8888. - config = SkBitmap::kARGB_8888_Config; + // Force all other colortypes to 8888. + colorType = kN32_SkColorType; break; } @@ -441,37 +441,37 @@ SkBitmap::Config SkJPEGImageDecoder::getBitmapConfig(jpeg_decompress_struct* cin cinfo->out_color_space = JCS_CMYK; break; case JCS_GRAYSCALE: - if (SkBitmap::kA8_Config == config) { + if (kAlpha_8_SkColorType == colorType) { cinfo->out_color_space = JCS_GRAYSCALE; break; } // The data is JCS_GRAYSCALE, but the caller wants some sort of RGB - // config. Fall through to set to the default. + // colortype. Fall through to set to the default. default: cinfo->out_color_space = JCS_RGB; break; } - return config; + return colorType; } -#ifdef ANDROID_RGB /** - * Based on the config and dither mode, adjust out_color_space and - * dither_mode of cinfo. + * Based on the colortype and dither mode, adjust out_color_space and + * dither_mode of cinfo. Only does work in ANDROID_RGB */ static void adjust_out_color_space_and_dither(jpeg_decompress_struct* cinfo, - SkBitmap::Config config, + SkColorType colorType, const SkImageDecoder& decoder) { SkASSERT(cinfo != NULL); +#ifdef ANDROID_RGB cinfo->dither_mode = JDITHER_NONE; if (JCS_CMYK == cinfo->out_color_space) { return; } - switch(config) { - case SkBitmap::kARGB_8888_Config: + switch (colorType) { + case kN32_SkColorType: cinfo->out_color_space = JCS_RGBA_8888; break; - case SkBitmap::kRGB_565_Config: + case kRGB_565_SkColorType: cinfo->out_color_space = JCS_RGB_565; if (decoder.getDitherImage()) { cinfo->dither_mode = JDITHER_ORDERED; @@ -480,8 +480,8 @@ static void adjust_out_color_space_and_dither(jpeg_decompress_struct* cinfo, default: break; } -} #endif +} /** @@ -569,20 +569,19 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { turn_off_visual_optimizations(&cinfo); - const SkBitmap::Config config = this->getBitmapConfig(&cinfo); + const SkColorType colorType = this->getBitmapColorType(&cinfo); + const SkAlphaType alphaType = kAlpha_8_SkColorType == colorType ? + kPremul_SkAlphaType : kOpaque_SkAlphaType; -#ifdef ANDROID_RGB - adjust_out_color_space_and_dither(&cinfo, config, *this); -#endif + adjust_out_color_space_and_dither(&cinfo, colorType, *this); if (1 == sampleSize && SkImageDecoder::kDecodeBounds_Mode == mode) { // Assume an A8 bitmap is not opaque to avoid the check of each // individual pixel. It is very unlikely to be opaque, since // an opaque A8 bitmap would not be very interesting. // Otherwise, a jpeg image is opaque. - return bm->setConfig(config, cinfo.image_width, cinfo.image_height, 0, - SkBitmap::kA8_Config == config ? - kPremul_SkAlphaType : kOpaque_SkAlphaType); + return bm->setInfo(SkImageInfo::Make(cinfo.image_width, cinfo.image_height, + colorType, alphaType)); } /* image_width and image_height are the original dimensions, available @@ -606,17 +605,16 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { // individual pixel. It is very unlikely to be opaque, since // an opaque A8 bitmap would not be very interesting. // Otherwise, a jpeg image is opaque. - return bm->setConfig(config, smpl.scaledWidth(), smpl.scaledHeight(), - 0, SkBitmap::kA8_Config == config ? - kPremul_SkAlphaType : kOpaque_SkAlphaType); + return bm->setInfo(SkImageInfo::Make(smpl.scaledWidth(), smpl.scaledHeight(), + colorType, alphaType)); } else { return return_false(cinfo, *bm, "start_decompress"); } } sampleSize = recompute_sampleSize(sampleSize, cinfo); - // should we allow the Chooser (if present) to pick a config for us??? - if (!this->chooseFromOneChoice(config, cinfo.output_width, cinfo.output_height)) { + // should we allow the Chooser (if present) to pick a colortype for us??? + if (!this->chooseFromOneChoice(colorType, cinfo.output_width, cinfo.output_height)) { return return_false(cinfo, *bm, "chooseFromOneChoice"); } @@ -625,8 +623,8 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { // individual pixel. It is very unlikely to be opaque, since // an opaque A8 bitmap would not be very interesting. // Otherwise, a jpeg image is opaque. - bm->setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0, - SkBitmap::kA8_Config != config ? kOpaque_SkAlphaType : kPremul_SkAlphaType); + bm->setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(), + colorType, alphaType)); if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; } @@ -641,10 +639,8 @@ bool SkJPEGImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { a significant performance boost. */ if (sampleSize == 1 && - ((config == SkBitmap::kARGB_8888_Config && - cinfo.out_color_space == JCS_RGBA_8888) || - (config == SkBitmap::kRGB_565_Config && - cinfo.out_color_space == JCS_RGB_565))) + ((kN32_SkColorType == colorType && cinfo.out_color_space == JCS_RGBA_8888) || + (kRGB_565_SkColorType == colorType && cinfo.out_color_space == JCS_RGB_565))) { JSAMPLE* rowptr = (JSAMPLE*)bm->getPixels(); INT32 const bpr = bm->rowBytes(); @@ -764,7 +760,7 @@ bool SkJPEGImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, int *width // based on the config in onDecodeSubset. This should be fine, since // jpeg_init_read_tile_scanline will check out_color_space again after // that change (when it calls jinit_color_deconverter). - (void) this->getBitmapConfig(cinfo); + (void) this->getBitmapColorType(cinfo); turn_off_visual_optimizations(cinfo); @@ -815,10 +811,8 @@ bool SkJPEGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) { set_dct_method(*this, cinfo); - const SkBitmap::Config config = this->getBitmapConfig(cinfo); -#ifdef ANDROID_RGB - adjust_out_color_space_and_dither(cinfo, config, *this); -#endif + const SkColorType colorType = this->getBitmapColorType(cinfo); + adjust_out_color_space_and_dither(cinfo, colorType, *this); int startX = rect.fLeft; int startY = rect.fTop; @@ -833,14 +827,13 @@ bool SkJPEGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) { SkScaledBitmapSampler sampler(width, height, skiaSampleSize); SkBitmap bitmap; - bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight()); // Assume an A8 bitmap is not opaque to avoid the check of each // individual pixel. It is very unlikely to be opaque, since // an opaque A8 bitmap would not be very interesting. // Otherwise, a jpeg image is opaque. - bitmap.setConfig(config, sampler.scaledWidth(), sampler.scaledHeight(), 0, - config == SkBitmap::kA8_Config ? kPremul_SkAlphaType : - kOpaque_SkAlphaType); + bitmap.setInfo(SkImageInfo::Make(sampler.scaledWidth(), sampler.scaledHeight(), colorType, + kAlpha_8_SkColorType == colorType ? + kPremul_SkAlphaType : kOpaque_SkAlphaType)); // Check ahead of time if the swap(dest, src) is possible or not. // If yes, then we will stick to AllocPixelRef since it's cheaper with the @@ -869,10 +862,8 @@ bool SkJPEGImageDecoder::onDecodeSubset(SkBitmap* bm, const SkIRect& region) { a significant performance boost. */ if (skiaSampleSize == 1 && - ((config == SkBitmap::kARGB_8888_Config && - cinfo->out_color_space == JCS_RGBA_8888) || - (config == SkBitmap::kRGB_565_Config && - cinfo->out_color_space == JCS_RGB_565))) + ((kN32_SkColorType == colorType && cinfo->out_color_space == JCS_RGBA_8888) || + (kRGB_565_SkColorType == colorType && cinfo->out_color_space == JCS_RGB_565))) { JSAMPLE* rowptr = (JSAMPLE*)bitmap.getPixels(); INT32 const bpr = bitmap.rowBytes(); @@ -1116,14 +1107,14 @@ static void Write_Index_YUV(uint8_t* SK_RESTRICT dst, } static WriteScanline ChooseWriter(const SkBitmap& bm) { - switch (bm.config()) { - case SkBitmap::kARGB_8888_Config: + switch (bm.colorType()) { + case kN32_SkColorType: return Write_32_YUV; - case SkBitmap::kRGB_565_Config: + case kRGB_565_SkColorType: return Write_16_YUV; - case SkBitmap::kARGB_4444_Config: + case kARGB_4444_SkColorType: return Write_4444_YUV; - case SkBitmap::kIndex8_Config: + case kIndex_8_SkColorType: return Write_Index_YUV; default: return NULL; diff --git a/src/images/SkImageDecoder_libpng.cpp b/src/images/SkImageDecoder_libpng.cpp index cd09f5f980..70cc1b9f75 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 diff --git a/src/images/SkImageDecoder_libwebp.cpp b/src/images/SkImageDecoder_libwebp.cpp index 353eabf015..8baa10c454 100644 --- a/src/images/SkImageDecoder_libwebp.cpp +++ b/src/images/SkImageDecoder_libwebp.cpp @@ -278,40 +278,33 @@ static bool webp_get_config_resize_crop(WebPDecoderConfig* config, return true; } -bool SkWEBPImageDecoder::setDecodeConfig(SkBitmap* decodedBitmap, - int width, int height) { - SkBitmap::Config config = this->getPrefConfig(k32Bit_SrcDepth, SkToBool(fHasAlpha)); +bool SkWEBPImageDecoder::setDecodeConfig(SkBitmap* decodedBitmap, int width, int height) { + SkColorType colorType = this->getPrefColorType(k32Bit_SrcDepth, SkToBool(fHasAlpha)); // YUV converter supports output in RGB565, RGBA4444 and RGBA8888 formats. if (fHasAlpha) { - if (config != SkBitmap::kARGB_4444_Config) { - config = SkBitmap::kARGB_8888_Config; + if (colorType != kARGB_4444_SkColorType) { + colorType = kN32_SkColorType; } } else { - if (config != SkBitmap::kRGB_565_Config && - config != SkBitmap::kARGB_4444_Config) { - config = SkBitmap::kARGB_8888_Config; + if (colorType != kRGB_565_SkColorType && colorType != kARGB_4444_SkColorType) { + colorType = kN32_SkColorType; } } - if (!this->chooseFromOneChoice(config, width, height)) { + if (!this->chooseFromOneChoice(colorType, width, height)) { return false; } - SkImageInfo info; - info.fWidth = width; - info.fHeight = height; - info.fColorType = SkBitmapConfigToColorType(config); + SkAlphaType alphaType = kOpaque_SkAlphaType; if (SkToBool(fHasAlpha)) { if (this->getRequireUnpremultipliedColors()) { - info.fAlphaType = kUnpremul_SkAlphaType; + alphaType = kUnpremul_SkAlphaType; } else { - info.fAlphaType = kPremul_SkAlphaType; + alphaType = kPremul_SkAlphaType; } - } else { - info.fAlphaType = kOpaque_SkAlphaType; } - return decodedBitmap->setInfo(info); + return decodedBitmap->setInfo(SkImageInfo::Make(width, height, colorType, alphaType)); } bool SkWEBPImageDecoder::onBuildTileIndex(SkStreamRewindable* stream, @@ -389,7 +382,7 @@ bool SkWEBPImageDecoder::onDecodeSubset(SkBitmap* decodedBitmap, } else { // This is also called in setDecodeConfig in above block. // i.e., when bitmap->isNull() is true. - if (!chooseFromOneChoice(bitmap->config(), width, height)) { + if (!chooseFromOneChoice(bitmap->colorType(), width, height)) { return false; } } diff --git a/src/images/SkImageDecoder_pkm.cpp b/src/images/SkImageDecoder_pkm.cpp index c299c23548..79da8da51a 100644 --- a/src/images/SkImageDecoder_pkm.cpp +++ b/src/images/SkImageDecoder_pkm.cpp @@ -47,7 +47,7 @@ bool SkPKMImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { const unsigned short height = etc1_pkm_get_height(buf); // should we allow the Chooser (if present) to pick a config for us??? - if (!this->chooseFromOneChoice(SkBitmap::kARGB_8888_Config, width, height)) { + if (!this->chooseFromOneChoice(kN32_SkColorType, width, height)) { return false; } @@ -55,8 +55,8 @@ bool SkPKMImageDecoder::onDecode(SkStream* stream, SkBitmap* bm, Mode mode) { SkScaledBitmapSampler sampler(width, height, this->getSampleSize()); // Set the config... - bm->setConfig(SkBitmap::kARGB_8888_Config, sampler.scaledWidth(), sampler.scaledHeight(), - 0, kOpaque_SkAlphaType); + bm->setInfo(SkImageInfo::MakeN32(sampler.scaledWidth(), sampler.scaledHeight(), + kOpaque_SkAlphaType)); if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; } diff --git a/src/images/SkImageDecoder_wbmp.cpp b/src/images/SkImageDecoder_wbmp.cpp index 8dce62cdf0..0bf138940d 100644 --- a/src/images/SkImageDecoder_wbmp.cpp +++ b/src/images/SkImageDecoder_wbmp.cpp @@ -111,8 +111,8 @@ bool SkWBMPImageDecoder::onDecode(SkStream* stream, SkBitmap* decodedBitmap, int width = head.fWidth; int height = head.fHeight; - decodedBitmap->setConfig(SkBitmap::kIndex8_Config, width, height, 0, - kOpaque_SkAlphaType); + decodedBitmap->setInfo(SkImageInfo::Make(width, height, + kIndex_8_SkColorType, kOpaque_SkAlphaType)); if (SkImageDecoder::kDecodeBounds_Mode == mode) { return true; diff --git a/src/images/SkScaledBitmapSampler.cpp b/src/images/SkScaledBitmapSampler.cpp index ba8ce4614f..7fd8718beb 100644 --- a/src/images/SkScaledBitmapSampler.cpp +++ b/src/images/SkScaledBitmapSampler.cpp @@ -842,17 +842,23 @@ protected: void test_row_proc_choice(); void test_row_proc_choice() { + const SkColorType colorTypes[] = { + kAlpha_8_SkColorType, kIndex_8_SkColorType, kRGB_565_SkColorType, kARGB_4444_SkColorType, + kN32_SkColorType + }; + SkBitmap dummyBitmap; DummyDecoder dummyDecoder; size_t procCounter = 0; for (int sc = SkScaledBitmapSampler::kGray; sc <= SkScaledBitmapSampler::kRGB_565; ++sc) { - for (int c = SkBitmap::kA8_Config; c <= SkBitmap::kARGB_8888_Config; ++c) { + for (size_t c = 0; c < SK_ARRAY_COUNT(colorTypes); ++c) { for (int unpremul = 0; unpremul <= 1; ++unpremul) { for (int dither = 0; dither <= 1; ++dither) { // Arbitrary width/height/sampleSize to allow SkScaledBitmapSampler to // be considered valid. SkScaledBitmapSampler sampler(10, 10, 1); - dummyBitmap.setConfig((SkBitmap::Config) c, 10, 10); + dummyBitmap.setInfo(SkImageInfo::Make(10, 10, + colorTypes[c], kPremul_SkAlphaType)); dummyDecoder.setDitherImage(SkToBool(dither)); dummyDecoder.setRequireUnpremultipliedColors(SkToBool(unpremul)); sampler.begin(&dummyBitmap, (SkScaledBitmapSampler::SrcConfig) sc, |