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

Side by Side Diff: third_party/WebKit/Source/platform/image-decoders/ImageDecoder.h

Issue 2203903002: Color: Read embedded ICC profiles regardless of QCMS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update tests Created 4 years, 4 months 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. All rights reserved. 2 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
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 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 Invalid 105 Invalid
106 }; 106 };
107 107
108 static SniffResult determineImageType(const char* data, size_t length); 108 static SniffResult determineImageType(const char* data, size_t length);
109 static SniffResult determineImageType(const SharedBuffer&); 109 static SniffResult determineImageType(const SharedBuffer&);
110 static SniffResult determineImageType(const SegmentReader&); 110 static SniffResult determineImageType(const SegmentReader&);
111 111
112 ImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOption colorOption s, size_t maxDecodedBytes) 112 ImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOption colorOption s, size_t maxDecodedBytes)
113 : m_premultiplyAlpha(alphaOption == AlphaPremultiplied) 113 : m_premultiplyAlpha(alphaOption == AlphaPremultiplied)
114 , m_ignoreGammaAndColorProfile(colorOptions == GammaAndColorProfileIgnor ed) 114 , m_ignoreGammaAndColorProfile(colorOptions == GammaAndColorProfileIgnor ed)
115 , m_maxDecodedBytes(maxDecodedBytes) 115 , m_maxDecodedBytes(maxDecodedBytes) { }
116 , m_sizeAvailable(false)
117 , m_isAllDataReceived(false)
118 , m_failed(false) { }
119 116
120 virtual ~ImageDecoder() { } 117 virtual ~ImageDecoder() { }
121 118
122 // Returns a caller-owned decoder of the appropriate type. Returns 0 if 119 // Returns a caller-owned decoder of the appropriate type. Returns 0 if
123 // we can't sniff a supported type from the provided data (possibly 120 // we can't sniff a supported type from the provided data (possibly
124 // because there isn't enough data yet). 121 // because there isn't enough data yet).
125 // Sets m_maxDecodedBytes to Platform::maxImageDecodedBytes(). 122 // Sets m_maxDecodedBytes to Platform::maxImageDecodedBytes().
126 static std::unique_ptr<ImageDecoder> create(SniffResult, AlphaOption, GammaA ndColorProfileOption); 123 static std::unique_ptr<ImageDecoder> create(SniffResult, AlphaOption, GammaA ndColorProfileOption);
127 124
128 virtual String filenameExtension() const = 0; 125 virtual String filenameExtension() const = 0;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 // animated images. 221 // animated images.
225 virtual float frameDurationAtIndex(size_t) const { return 0; } 222 virtual float frameDurationAtIndex(size_t) const { return 0; }
226 223
227 // Number of bytes in the decoded frame. Returns 0 if the decoder doesn't 224 // Number of bytes in the decoded frame. Returns 0 if the decoder doesn't
228 // have this frame cached (either because it hasn't been decoded, or because 225 // have this frame cached (either because it hasn't been decoded, or because
229 // it has been cleared). 226 // it has been cleared).
230 virtual size_t frameBytesAtIndex(size_t) const; 227 virtual size_t frameBytesAtIndex(size_t) const;
231 228
232 ImageOrientation orientation() const { return m_orientation; } 229 ImageOrientation orientation() const { return m_orientation; }
233 230
234 void setIgnoreGammaAndColorProfile(bool flag) { m_ignoreGammaAndColorProfile = flag; }
235 bool ignoresGammaAndColorProfile() const { return m_ignoreGammaAndColorProfi le; } 231 bool ignoresGammaAndColorProfile() const { return m_ignoreGammaAndColorProfi le; }
232 static void setTargetColorProfile(const WebVector<char>&);
236 233
237 static void setTargetColorProfile(const WebVector<char>&); 234
238 bool hasColorProfile() const; 235 // Note that hasColorProfile refers to the existence of a not-ignored
236 // embedded color profile, and is independent of whether or not that
237 // profile's transform has been baked into the pixel values.
238 bool hasColorProfile() const { return m_hasColorProfile; }
239 void setColorProfileAndComputeTransform(const char* iccData, unsigned iccLen gth, bool hasAlpha, bool useSRGB);
239 240
240 #if USE(QCMSLIB) 241 #if USE(QCMSLIB)
241 void setColorProfileAndTransform(const char* iccData, unsigned iccLength, bo ol hasAlpha, bool useSRGB); 242 // In contrast with hasColorProfile, this refers to the transform that has
243 // been baked into the pixels.
242 qcms_transform* colorTransform() { return m_sourceToOutputDeviceColorTransfo rm.get(); } 244 qcms_transform* colorTransform() { return m_sourceToOutputDeviceColorTransfo rm.get(); }
243 #endif 245 #endif
244 246
245 // Sets the "decode failure" flag. For caller convenience (since so 247 // Sets the "decode failure" flag. For caller convenience (since so
246 // many callers want to return false after calling this), returns false 248 // many callers want to return false after calling this), returns false
247 // to enable easy tailcalling. Subclasses may override this to also 249 // to enable easy tailcalling. Subclasses may override this to also
248 // clean up any local data. 250 // clean up any local data.
249 virtual bool setFailed() 251 virtual bool setFailed()
250 { 252 {
251 m_failed = true; 253 m_failed = true;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 // returns that number. 310 // returns that number.
309 virtual size_t decodeFrameCount() { return 1; } 311 virtual size_t decodeFrameCount() { return 1; }
310 312
311 // Performs any additional setup of the requested frame after it has been 313 // Performs any additional setup of the requested frame after it has been
312 // initially created, e.g. setting a duration or disposal method. 314 // initially created, e.g. setting a duration or disposal method.
313 virtual void initializeNewFrame(size_t) { } 315 virtual void initializeNewFrame(size_t) { }
314 316
315 // Decodes the requested frame. 317 // Decodes the requested frame.
316 virtual void decode(size_t) = 0; 318 virtual void decode(size_t) = 0;
317 319
320 // Returns the embedded image color profile.
321 const ImageFrame::ICCProfile& colorProfile() const { return m_colorProfile; }
322
318 RefPtr<SegmentReader> m_data; // The encoded data. 323 RefPtr<SegmentReader> m_data; // The encoded data.
319 Vector<ImageFrame, 1> m_frameBufferCache; 324 Vector<ImageFrame, 1> m_frameBufferCache;
320 bool m_premultiplyAlpha; 325 const bool m_premultiplyAlpha;
321 bool m_ignoreGammaAndColorProfile; 326 const bool m_ignoreGammaAndColorProfile;
322 ImageOrientation m_orientation; 327 ImageOrientation m_orientation;
323 328
324 // The maximum amount of memory a decoded image should require. Ideally, 329 // The maximum amount of memory a decoded image should require. Ideally,
325 // image decoders should downsample large images to fit under this limit 330 // image decoders should downsample large images to fit under this limit
326 // (and then return the downsampled size from decodedSize()). Ignoring 331 // (and then return the downsampled size from decodedSize()). Ignoring
327 // this limit can cause excessive memory use or even crashes on low- 332 // this limit can cause excessive memory use or even crashes on low-
328 // memory devices. 333 // memory devices.
329 size_t m_maxDecodedBytes; 334 const size_t m_maxDecodedBytes;
330 335
331 private: 336 private:
332 // Some code paths compute the size of the image as "width * height * 4" 337 // Some code paths compute the size of the image as "width * height * 4"
333 // and return it as a (signed) int. Avoid overflow. 338 // and return it as a (signed) int. Avoid overflow.
334 static bool sizeCalculationMayOverflow(unsigned width, unsigned height) 339 static bool sizeCalculationMayOverflow(unsigned width, unsigned height)
335 { 340 {
336 unsigned long long total_size = static_cast<unsigned long long>(width) 341 unsigned long long total_size = static_cast<unsigned long long>(width)
337 * static_cast<unsigned long long>(height); 342 * static_cast<unsigned long long>(height);
338 return total_size > ((1 << 29) - 1); 343 return total_size > ((1 << 29) - 1);
339 } 344 }
340 345
341 IntSize m_size; 346 IntSize m_size;
342 bool m_sizeAvailable; 347 bool m_sizeAvailable = false;
343 bool m_isAllDataReceived; 348 bool m_isAllDataReceived = false;
344 bool m_failed; 349 bool m_failed = false;
350
351 bool m_hasColorProfile = false;
352 ImageFrame::ICCProfile m_colorProfile;
345 353
346 #if USE(QCMSLIB) 354 #if USE(QCMSLIB)
347 QCMSTransformUniquePtr m_sourceToOutputDeviceColorTransform; 355 QCMSTransformUniquePtr m_sourceToOutputDeviceColorTransform;
348 #endif 356 #endif
349 }; 357 };
350 358
351 } // namespace blink 359 } // namespace blink
352 360
353 #endif 361 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698