Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(772)

Unified Diff: third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp

Issue 2523943002: Explicitly specify target color space to ImageDecoder at creation (Closed)
Patch Set: Rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
diff --git a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
index 23dba5bd2ca969bc3e1ff2f368ebb24584eb74b7..40f46315aa450fbcd88d28a7222f61a25765ec53 100644
--- a/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
+++ b/third_party/WebKit/Source/platform/image-decoders/ImageDecoder.cpp
@@ -71,9 +71,16 @@ std::unique_ptr<ImageDecoder> ImageDecoder::create(
PassRefPtr<SegmentReader> passData,
bool dataComplete,
AlphaOption alphaOption,
- ColorSpaceOption colorOptions) {
+ ColorSpaceOption colorOptions,
+ sk_sp<SkColorSpace> targetColorSpace) {
RefPtr<SegmentReader> data = passData;
+ // Ensure that the color space options are consistent.
+ if (colorOptions == ColorSpaceTransformed)
+ DCHECK(targetColorSpace);
+ else
+ DCHECK(!targetColorSpace);
+
// We need at least kLongestSignatureLength bytes to run the signature
// matcher.
if (data->size() < kLongestSignatureLength)
@@ -94,37 +101,41 @@ std::unique_ptr<ImageDecoder> ImageDecoder::create(
std::unique_ptr<ImageDecoder> decoder;
switch (sniffResult) {
case SniffResult::JPEG:
- decoder.reset(
- new JPEGImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
+ decoder.reset(new JPEGImageDecoder(alphaOption, colorOptions,
+ std::move(targetColorSpace),
+ maxDecodedBytes));
break;
case SniffResult::PNG:
- decoder.reset(
- new PNGImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
+ decoder.reset(new PNGImageDecoder(alphaOption, colorOptions,
+ std::move(targetColorSpace),
+ maxDecodedBytes));
break;
case SniffResult::GIF:
- decoder.reset(
- new GIFImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
+ decoder.reset(new GIFImageDecoder(alphaOption, colorOptions,
+ std::move(targetColorSpace),
+ maxDecodedBytes));
break;
case SniffResult::WEBP:
- decoder.reset(
- new WEBPImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
+ decoder.reset(new WEBPImageDecoder(alphaOption, colorOptions,
+ std::move(targetColorSpace),
+ maxDecodedBytes));
break;
case SniffResult::ICO:
- decoder.reset(
- new ICOImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
+ decoder.reset(new ICOImageDecoder(alphaOption, colorOptions,
+ std::move(targetColorSpace),
+ maxDecodedBytes));
break;
case SniffResult::BMP:
- decoder.reset(
- new BMPImageDecoder(alphaOption, colorOptions, maxDecodedBytes));
+ decoder.reset(new BMPImageDecoder(alphaOption, colorOptions,
+ std::move(targetColorSpace),
+ maxDecodedBytes));
break;
case SniffResult::Invalid:
break;
}
- if (decoder) {
+ if (decoder)
decoder->setData(data.release(), dataComplete);
- decoder->m_targetColorSpace = globalTargetColorSpace();
- }
return decoder;
}
@@ -273,7 +284,7 @@ bool ImageDecoder::initFrameBuffer(size_t frameIndex) {
if (requiredPreviousFrameIndex == kNotFound) {
// This frame doesn't rely on any previous data.
if (!buffer->setSizeAndColorSpace(size().width(), size().height(),
- colorSpace())) {
+ colorSpaceForSkImages())) {
return setFailed();
}
} else {
@@ -459,12 +470,13 @@ sk_sp<SkColorSpace> ImageDecoder::globalTargetColorSpace() {
return sk_sp<SkColorSpace>(gTargetColorSpace);
}
-sk_sp<SkColorSpace> ImageDecoder::colorSpace() const {
- // TODO(ccameron): This should always return a non-null SkColorSpace. This is
- // disabled for now because specifying a non-renderable color space results in
- // errors.
- // https://bugs.chromium.org/p/skia/issues/detail?id=5907
- if (!RuntimeEnabledFeatures::colorCorrectRenderingEnabled())
+// static
+sk_sp<SkColorSpace> ImageDecoder::targetColorSpaceForTesting() {
+ return globalTargetColorSpace();
+}
+
+sk_sp<SkColorSpace> ImageDecoder::colorSpaceForSkImages() const {
+ if (m_colorSpaceOption != ColorSpaceTagged)
return nullptr;
if (m_embeddedColorSpace)
@@ -481,7 +493,7 @@ void ImageDecoder::setEmbeddedColorProfile(const char* iccData,
}
void ImageDecoder::setEmbeddedColorSpace(sk_sp<SkColorSpace> colorSpace) {
- DCHECK(!m_ignoreColorSpace);
+ DCHECK(!ignoresColorSpace());
DCHECK(!m_hasHistogrammedColorSpace);
m_embeddedColorSpace = colorSpace;

Powered by Google App Engine
This is Rietveld 408576698