Decode to sRGB on Android

I want to land this so we can start testing color space aware
decoding on Android.  In particular, it will be interesting to
see how linear premultiplication will affect existing content.

This will only modify BitmapRegionDecoder behavior.  I'll
follow up with a similar change to BitmapFactory.cpp in Android.

This will cause image diffs on Gold.

BUG=skia:

Change-Id: Iffda5f035447f2608ce26945570b503f8971b735
Reviewed-on: https://skia-review.googlesource.com/5698
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Reviewed-by: Leon Scroggins <scroggo@google.com>
This commit is contained in:
Matt Sarett 2016-12-12 16:30:13 -05:00 committed by Skia Commit-Bot
parent 131c1fb963
commit 966bb348a5
4 changed files with 28 additions and 9 deletions

View File

@ -71,6 +71,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.

View File

@ -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());
}

View File

@ -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);

View File

@ -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;