| Index: src/codec/SkJpegCodec.cpp
|
| diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
|
| index d2f7cdb0fa382db95a0e69c9ca9dea607a691f3b..fcf89d0c1d23b7c3ca6d55ec2674754602778cbb 100644
|
| --- a/src/codec/SkJpegCodec.cpp
|
| +++ b/src/codec/SkJpegCodec.cpp
|
| @@ -357,7 +357,7 @@
|
| * image has been implemented
|
| * Sets the output color space
|
| */
|
| -bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dstInfo) {
|
| +bool SkJpegCodec::setOutputColorSpace(const SkImageInfo& dstInfo, bool needsColorXform) {
|
| if (kUnknown_SkAlphaType == dstInfo.alphaType()) {
|
| return false;
|
| }
|
| @@ -384,7 +384,7 @@
|
| case kBGRA_8888_SkColorType:
|
| if (isCMYK) {
|
| fDecoderMgr->dinfo()->out_color_space = JCS_CMYK;
|
| - } else if (fColorXform) {
|
| + } else if (needsColorXform) {
|
| // Our color transformation code requires RGBA order inputs, but it'll swizzle
|
| // to BGRA for us.
|
| fDecoderMgr->dinfo()->out_color_space = JCS_EXT_RGBA;
|
| @@ -393,7 +393,7 @@
|
| }
|
| return true;
|
| case kRGB_565_SkColorType:
|
| - if (fColorXform) {
|
| + if (needsColorXform) {
|
| return false;
|
| }
|
|
|
| @@ -405,17 +405,14 @@
|
| }
|
| return true;
|
| case kGray_8_SkColorType:
|
| - if (fColorXform || JCS_GRAYSCALE != encodedColorType) {
|
| + if (needsColorXform || JCS_GRAYSCALE != encodedColorType) {
|
| return false;
|
| }
|
|
|
| fDecoderMgr->dinfo()->out_color_space = JCS_GRAYSCALE;
|
| return true;
|
| case kRGBA_F16_SkColorType:
|
| - SkASSERT(fColorXform);
|
| - if (!dstInfo.colorSpace()->gammaIsLinear()) {
|
| - return false;
|
| - }
|
| + SkASSERT(needsColorXform);
|
|
|
| if (isCMYK) {
|
| fDecoderMgr->dinfo()->out_color_space = JCS_CMYK;
|
| @@ -548,11 +545,14 @@
|
| return fDecoderMgr->returnFailure("setjmp", kInvalidInput);
|
| }
|
|
|
| - this->initializeColorXform(dstInfo);
|
| -
|
| // Check if we can decode to the requested destination and set the output color space
|
| - if (!this->setOutputColorSpace(dstInfo)) {
|
| + bool needsColorXform = needs_color_xform(dstInfo, this->getInfo());
|
| + if (!this->setOutputColorSpace(dstInfo, needsColorXform)) {
|
| return fDecoderMgr->returnFailure("setOutputColorSpace", kInvalidConversion);
|
| + }
|
| +
|
| + if (!this->initializeColorXform(dstInfo, needsColorXform)) {
|
| + return fDecoderMgr->returnFailure("initializeColorXform", kInvalidParameters);
|
| }
|
|
|
| if (!jpeg_start_decompress(dinfo)) {
|
| @@ -630,12 +630,16 @@
|
| SkASSERT(fSwizzler);
|
| }
|
|
|
| -void SkJpegCodec::initializeColorXform(const SkImageInfo& dstInfo) {
|
| - if (needs_color_xform(dstInfo, this->getInfo())) {
|
| +bool SkJpegCodec::initializeColorXform(const SkImageInfo& dstInfo, bool needsColorXform) {
|
| + if (needsColorXform) {
|
| fColorXform = SkColorSpaceXform::New(sk_ref_sp(this->getInfo().colorSpace()),
|
| sk_ref_sp(dstInfo.colorSpace()));
|
| - SkASSERT(fColorXform);
|
| - }
|
| + if (!fColorXform && kRGBA_F16_SkColorType == dstInfo.colorType()) {
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + return true;
|
| }
|
|
|
| SkSampler* SkJpegCodec::getSampler(bool createIfNecessary) {
|
| @@ -657,11 +661,14 @@
|
| return kInvalidInput;
|
| }
|
|
|
| - this->initializeColorXform(dstInfo);
|
| -
|
| // Check if we can decode to the requested destination and set the output color space
|
| - if (!this->setOutputColorSpace(dstInfo)) {
|
| - return fDecoderMgr->returnFailure("setOutputColorSpace", kInvalidConversion);
|
| + bool needsColorXform = needs_color_xform(dstInfo, this->getInfo());
|
| + if (!this->setOutputColorSpace(dstInfo, needsColorXform)) {
|
| + return kInvalidConversion;
|
| + }
|
| +
|
| + if (!this->initializeColorXform(dstInfo, needsColorXform)) {
|
| + return fDecoderMgr->returnFailure("initializeColorXform", kInvalidParameters);
|
| }
|
|
|
| if (!jpeg_start_decompress(fDecoderMgr->dinfo())) {
|
|
|