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

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/png/PNGImageDecoder.cpp

Issue 2523943002: Explicitly specify target color space to ImageDecoder at creation (Closed)
Patch Set: Rebase Created 4 years 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006 Apple Computer, Inc. 2 * Copyright (C) 2006 Apple Computer, Inc.
3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
4 * 4 *
5 * Portions are Copyright (C) 2001 mozilla.org 5 * Portions are Copyright (C) 2001 mozilla.org
6 * 6 *
7 * Other contributors: 7 * Other contributors:
8 * Stuart Parmenter <stuart@mozilla.com> 8 * Stuart Parmenter <stuart@mozilla.com>
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 29 matching lines...) Expand all
40 40
41 #include "platform/image-decoders/png/PNGImageReader.h" 41 #include "platform/image-decoders/png/PNGImageReader.h"
42 #include "png.h" 42 #include "png.h"
43 #include "wtf/PtrUtil.h" 43 #include "wtf/PtrUtil.h"
44 #include <memory> 44 #include <memory>
45 45
46 namespace blink { 46 namespace blink {
47 47
48 PNGImageDecoder::PNGImageDecoder(AlphaOption alphaOption, 48 PNGImageDecoder::PNGImageDecoder(AlphaOption alphaOption,
49 ColorSpaceOption colorOptions, 49 ColorSpaceOption colorOptions,
50 sk_sp<SkColorSpace> targetColorSpace,
50 size_t maxDecodedBytes, 51 size_t maxDecodedBytes,
51 size_t offset) 52 size_t offset)
52 : ImageDecoder(alphaOption, colorOptions, maxDecodedBytes), 53 : ImageDecoder(alphaOption,
54 colorOptions,
55 std::move(targetColorSpace),
56 maxDecodedBytes),
53 m_offset(offset) {} 57 m_offset(offset) {}
54 58
55 PNGImageDecoder::~PNGImageDecoder() {} 59 PNGImageDecoder::~PNGImageDecoder() {}
56 60
57 inline float pngFixedToFloat(png_fixed_point x) { 61 inline float pngFixedToFloat(png_fixed_point x) {
58 return ((float)x) * 0.00001f; 62 return ((float)x) * 0.00001f;
59 } 63 }
60 64
61 inline sk_sp<SkColorSpace> readColorSpace(png_structp png, png_infop info) { 65 inline sk_sp<SkColorSpace> readColorSpace(png_structp png, png_infop info) {
62 if (png_get_valid(png, info, PNG_INFO_sRGB)) { 66 if (png_get_valid(png, info, PNG_INFO_sRGB)) {
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 png_set_expand(png); 149 png_set_expand(png);
146 } 150 }
147 151
148 if (bitDepth == 16) 152 if (bitDepth == 16)
149 png_set_strip_16(png); 153 png_set_strip_16(png);
150 154
151 if (colorType == PNG_COLOR_TYPE_GRAY || 155 if (colorType == PNG_COLOR_TYPE_GRAY ||
152 colorType == PNG_COLOR_TYPE_GRAY_ALPHA) 156 colorType == PNG_COLOR_TYPE_GRAY_ALPHA)
153 png_set_gray_to_rgb(png); 157 png_set_gray_to_rgb(png);
154 158
155 if ((colorType & PNG_COLOR_MASK_COLOR) && !m_ignoreColorSpace) { 159 if ((colorType & PNG_COLOR_MASK_COLOR) && !ignoresColorSpace()) {
156 // We only support color profiles for color PALETTE and RGB[A] PNG. 160 // We only support color profiles for color PALETTE and RGB[A] PNG.
157 // Supporting color profiles for gray-scale images is slightly tricky, at 161 // Supporting color profiles for gray-scale images is slightly tricky, at
158 // least using the CoreGraphics ICC library, because we expand gray-scale 162 // least using the CoreGraphics ICC library, because we expand gray-scale
159 // images to RGB but we do not similarly transform the color profile. We'd 163 // images to RGB but we do not similarly transform the color profile. We'd
160 // either need to transform the color profile or we'd need to decode into a 164 // either need to transform the color profile or we'd need to decode into a
161 // gray-scale image buffer and hand that to CoreGraphics. 165 // gray-scale image buffer and hand that to CoreGraphics.
162 sk_sp<SkColorSpace> colorSpace = readColorSpace(png, info); 166 sk_sp<SkColorSpace> colorSpace = readColorSpace(png, info);
163 if (colorSpace) { 167 if (colorSpace) {
164 setEmbeddedColorSpace(colorSpace); 168 setEmbeddedColorSpace(colorSpace);
165 } 169 }
166 } 170 }
167 171
168 if (!hasEmbeddedColorSpace()) { 172 if (!hasEmbeddedColorSpace()) {
169 // TODO (msarett): 173 // TODO (msarett):
170 // Applying the transfer function (gamma) should be handled by 174 // Applying the transfer function (gamma) should be handled by
171 // SkColorSpaceXform. Here we always convert to a transfer function that 175 // SkColorSpaceXform. Here we always convert to a transfer function that
172 // is a 2.2 exponential. This is a little strange given that the dst 176 // is a 2.2 exponential. This is a little strange given that the dst
173 // transfer function is not necessarily a 2.2 exponential. 177 // transfer function is not necessarily a 2.2 exponential.
174 // TODO (msarett): 178 // TODO (msarett):
175 // Often, PNGs that specify their transfer function with the gAMA tag will 179 // Often, PNGs that specify their transfer function with the gAMA tag will
176 // also specify their gamut with the cHRM tag. We should read this tag 180 // also specify their gamut with the cHRM tag. We should read this tag
177 // and do a full color space transformation if it is present. 181 // and do a full color space transformation if it is present.
178 const double inverseGamma = 0.45455; 182 const double inverseGamma = 0.45455;
179 const double defaultGamma = 2.2; 183 const double defaultGamma = 2.2;
180 double gamma; 184 double gamma;
181 if (!m_ignoreColorSpace && png_get_gAMA(png, info, &gamma)) { 185 if (!ignoresColorSpace() && png_get_gAMA(png, info, &gamma)) {
182 const double maxGamma = 21474.83; 186 const double maxGamma = 21474.83;
183 if ((gamma <= 0.0) || (gamma > maxGamma)) { 187 if ((gamma <= 0.0) || (gamma > maxGamma)) {
184 gamma = inverseGamma; 188 gamma = inverseGamma;
185 png_set_gAMA(png, info, gamma); 189 png_set_gAMA(png, info, gamma);
186 } 190 }
187 png_set_gamma(png, defaultGamma, gamma); 191 png_set_gamma(png, defaultGamma, gamma);
188 } else { 192 } else {
189 png_set_gamma(png, defaultGamma, inverseGamma); 193 png_set_gamma(png, defaultGamma, inverseGamma);
190 } 194 }
191 } 195 }
(...skipping 27 matching lines...) Expand all
219 unsigned rowIndex, 223 unsigned rowIndex,
220 int) { 224 int) {
221 if (m_frameBufferCache.isEmpty()) 225 if (m_frameBufferCache.isEmpty())
222 return; 226 return;
223 227
224 // Initialize the framebuffer if needed. 228 // Initialize the framebuffer if needed.
225 ImageFrame& buffer = m_frameBufferCache[0]; 229 ImageFrame& buffer = m_frameBufferCache[0];
226 if (buffer.getStatus() == ImageFrame::FrameEmpty) { 230 if (buffer.getStatus() == ImageFrame::FrameEmpty) {
227 png_structp png = m_reader->pngPtr(); 231 png_structp png = m_reader->pngPtr();
228 if (!buffer.setSizeAndColorSpace(size().width(), size().height(), 232 if (!buffer.setSizeAndColorSpace(size().width(), size().height(),
229 colorSpace())) { 233 colorSpaceForSkImages())) {
230 longjmp(JMPBUF(png), 1); 234 longjmp(JMPBUF(png), 1);
231 return; 235 return;
232 } 236 }
233 237
234 unsigned colorChannels = m_reader->hasAlpha() ? 4 : 3; 238 unsigned colorChannels = m_reader->hasAlpha() ? 4 : 3;
235 if (PNG_INTERLACE_ADAM7 == 239 if (PNG_INTERLACE_ADAM7 ==
236 png_get_interlace_type(png, m_reader->infoPtr())) { 240 png_get_interlace_type(png, m_reader->infoPtr())) {
237 m_reader->createInterlaceBuffer(colorChannels * size().width() * 241 m_reader->createInterlaceBuffer(colorChannels * size().width() *
238 size().height()); 242 size().height());
239 if (!m_reader->interlaceBuffer()) { 243 if (!m_reader->interlaceBuffer()) {
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 // has failed. 385 // has failed.
382 if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived()) 386 if (!m_reader->decode(*m_data, onlySize) && isAllDataReceived())
383 setFailed(); 387 setFailed();
384 388
385 // If decoding is done or failed, we don't need the PNGImageReader anymore. 389 // If decoding is done or failed, we don't need the PNGImageReader anymore.
386 if (isComplete(this) || failed()) 390 if (isComplete(this) || failed())
387 m_reader.reset(); 391 m_reader.reset();
388 } 392 }
389 393
390 } // namespace blink 394 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698