diff options
-rw-r--r-- | include/codec/SkAndroidCodec.h | 10 | ||||
-rw-r--r-- | src/android/SkBitmapRegionCodec.cpp | 11 | ||||
-rw-r--r-- | src/codec/SkAndroidCodec.cpp | 14 | ||||
-rw-r--r-- | src/codec/SkJpegCodec.cpp | 2 |
4 files changed, 28 insertions, 9 deletions
diff --git a/include/codec/SkAndroidCodec.h b/include/codec/SkAndroidCodec.h index a4f46f939f..ecf0a08c15 100644 --- a/include/codec/SkAndroidCodec.h +++ b/include/codec/SkAndroidCodec.h @@ -72,6 +72,16 @@ public: SkAlphaType computeOutputAlphaType(bool requestedUnpremul); /** + * @param outputColorType Color type that the client will decode to + * + * Returns the appropriate color space to decode to. + * + * For now, this just returns a default. This could be updated to take + * requests for wide gamut modes or specific output spaces. + */ + sk_sp<SkColorSpace> computeOutputColorSpace(SkColorType outputColorType); + + /** * Returns the dimensions of the scaled output image, for an input * sampleSize. * diff --git a/src/android/SkBitmapRegionCodec.cpp b/src/android/SkBitmapRegionCodec.cpp index 973e3c9470..ffe7ea81f8 100644 --- a/src/android/SkBitmapRegionCodec.cpp +++ b/src/android/SkBitmapRegionCodec.cpp @@ -52,12 +52,9 @@ bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocat // Create the image info for the decode SkColorType dstColorType = fCodec->computeOutputColorType(prefColorType); SkAlphaType dstAlphaType = fCodec->computeOutputAlphaType(requireUnpremul); - - // Enable legacy behavior to avoid any gamma correction. Android's assets are - // adjusted to expect a non-gamma correct premultiply. - sk_sp<SkColorSpace> colorSpace = nullptr; + sk_sp<SkColorSpace> dstColorSpace = fCodec->computeOutputColorSpace(dstColorType); SkImageInfo decodeInfo = SkImageInfo::Make(scaledSize.width(), scaledSize.height(), - dstColorType, dstAlphaType, colorSpace); + dstColorType, dstAlphaType, dstColorSpace); // Construct a color table for the decode if necessary sk_sp<SkColorTable> colorTable(nullptr); @@ -135,8 +132,6 @@ bool SkBitmapRegionCodec::decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocat } bool SkBitmapRegionCodec::conversionSupported(SkColorType colorType) { - // Enable legacy behavior. - sk_sp<SkColorSpace> colorSpace = nullptr; - SkImageInfo dstInfo = fCodec->getInfo().makeColorType(colorType).makeColorSpace(colorSpace); + SkImageInfo dstInfo = fCodec->getInfo().makeColorType(colorType); return conversion_possible(dstInfo, fCodec->getInfo()); } diff --git a/src/codec/SkAndroidCodec.cpp b/src/codec/SkAndroidCodec.cpp index c315b032fb..5dddfe355e 100644 --- a/src/codec/SkAndroidCodec.cpp +++ b/src/codec/SkAndroidCodec.cpp @@ -114,6 +114,20 @@ SkAlphaType SkAndroidCodec::computeOutputAlphaType(bool requestedUnpremul) { return requestedUnpremul ? kUnpremul_SkAlphaType : kPremul_SkAlphaType; } +sk_sp<SkColorSpace> SkAndroidCodec::computeOutputColorSpace(SkColorType outputColorType) { + switch (outputColorType) { + case kRGBA_8888_SkColorType: + case kBGRA_8888_SkColorType: + case kIndex_8_SkColorType: + return SkColorSpace::MakeNamed(SkColorSpace::kSRGB_Named); + case kRGBA_F16_SkColorType: + return SkColorSpace::MakeNamed(SkColorSpace::kSRGBLinear_Named); + default: + // Color correction not supported for k565 and kGray. + return nullptr; + } +} + SkISize SkAndroidCodec::getSampledDimensions(int sampleSize) const { if (!is_valid_sample_size(sampleSize)) { return SkISize::Make(0, 0); diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp index 7867fd0e8b..ad5ce5834d 100644 --- a/src/codec/SkJpegCodec.cpp +++ b/src/codec/SkJpegCodec.cpp @@ -503,7 +503,7 @@ int SkJpegCodec::readRows(const SkImageInfo& dstInfo, void* dst, size_t rowBytes uint32_t* swizzleDst = (uint32_t*) dst; size_t decodeDstRowBytes = rowBytes; size_t swizzleDstRowBytes = rowBytes; - int dstWidth = dstInfo.width(); + int dstWidth = this->options().fSubset ? this->options().fSubset->width() : dstInfo.width(); if (fSwizzleSrcRow && fColorXformSrcRow) { decodeDst = (JSAMPLE*) fSwizzleSrcRow; swizzleDst = fColorXformSrcRow; |