aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/codec/SkAndroidCodec.h10
-rw-r--r--src/android/SkBitmapRegionCodec.cpp11
-rw-r--r--src/codec/SkAndroidCodec.cpp14
-rw-r--r--src/codec/SkJpegCodec.cpp2
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;