OLD | NEW |
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 enum AlphaOption { | 87 enum AlphaOption { |
88 AlphaPremultiplied, | 88 AlphaPremultiplied, |
89 AlphaNotPremultiplied | 89 AlphaNotPremultiplied |
90 }; | 90 }; |
91 | 91 |
92 enum GammaAndColorProfileOption { | 92 enum GammaAndColorProfileOption { |
93 GammaAndColorProfileApplied, | 93 GammaAndColorProfileApplied, |
94 GammaAndColorProfileIgnored | 94 GammaAndColorProfileIgnored |
95 }; | 95 }; |
96 | 96 |
97 enum class SniffResult { | |
98 JPEG, | |
99 PNG, | |
100 GIF, | |
101 WEBP, | |
102 ICO, | |
103 BMP, | |
104 InsufficientData, | |
105 Invalid | |
106 }; | |
107 | |
108 static SniffResult determineImageType(const char* data, size_t length); | |
109 static SniffResult determineImageType(const SharedBuffer&); | |
110 static SniffResult determineImageType(const SegmentReader&); | |
111 | |
112 ImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOption colorOption
s, size_t maxDecodedBytes) | |
113 : m_premultiplyAlpha(alphaOption == AlphaPremultiplied) | |
114 , m_ignoreGammaAndColorProfile(colorOptions == GammaAndColorProfileIgnor
ed) | |
115 , m_maxDecodedBytes(maxDecodedBytes) { } | |
116 | |
117 virtual ~ImageDecoder() { } | 97 virtual ~ImageDecoder() { } |
118 | 98 |
119 // Returns a caller-owned decoder of the appropriate type. Returns 0 if | 99 // Returns a caller-owned decoder of the appropriate type. Returns nullptr
if |
120 // we can't sniff a supported type from the provided data (possibly | 100 // we can't sniff a supported type from the provided data (possibly |
121 // because there isn't enough data yet). | 101 // because there isn't enough data yet). |
122 // Sets m_maxDecodedBytes to Platform::maxImageDecodedBytes(). | 102 // Sets m_maxDecodedBytes to Platform::maxImageDecodedBytes(). |
123 static std::unique_ptr<ImageDecoder> create(SniffResult, AlphaOption, GammaA
ndColorProfileOption); | 103 static std::unique_ptr<ImageDecoder> create(PassRefPtr<SegmentReader> data,
bool dataComplete, |
| 104 AlphaOption, GammaAndColorProfileOption); |
| 105 static std::unique_ptr<ImageDecoder> create(PassRefPtr<SharedBuffer> data, b
ool dataComplete, |
| 106 AlphaOption alphaoption, GammaAndColorProfileOption colorOptions) |
| 107 { |
| 108 return create(SegmentReader::createFromSharedBuffer(data), dataComplete,
alphaoption, colorOptions); |
| 109 } |
| 110 |
124 | 111 |
125 virtual String filenameExtension() const = 0; | 112 virtual String filenameExtension() const = 0; |
126 | 113 |
127 bool isAllDataReceived() const { return m_isAllDataReceived; } | 114 bool isAllDataReceived() const { return m_isAllDataReceived; } |
128 | 115 |
| 116 // Returns true if the buffer holds enough data to instantiate a decoder. |
| 117 // This is useful for callers to determine whether a decoder instantiation |
| 118 // failure is due to insufficient or bad data. |
| 119 static bool hasSufficientDataToSniffImageType(const SharedBuffer&); |
| 120 |
129 void setData(PassRefPtr<SegmentReader> data, bool allDataReceived) | 121 void setData(PassRefPtr<SegmentReader> data, bool allDataReceived) |
130 { | 122 { |
131 if (m_failed) | 123 if (m_failed) |
132 return; | 124 return; |
133 m_data = data; | 125 m_data = data; |
134 m_isAllDataReceived = allDataReceived; | 126 m_isAllDataReceived = allDataReceived; |
135 onSetData(m_data.get()); | 127 onSetData(m_data.get()); |
136 } | 128 } |
137 | 129 |
138 void setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) | 130 void setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 findRequiredPreviousFrame(0, false)); | 267 findRequiredPreviousFrame(0, false)); |
276 } | 268 } |
277 m_frameBufferCache[0].setMemoryAllocator(allocator); | 269 m_frameBufferCache[0].setMemoryAllocator(allocator); |
278 } | 270 } |
279 | 271 |
280 virtual bool canDecodeToYUV() { return false; } | 272 virtual bool canDecodeToYUV() { return false; } |
281 virtual bool decodeToYUV() { return false; } | 273 virtual bool decodeToYUV() { return false; } |
282 virtual void setImagePlanes(std::unique_ptr<ImagePlanes>) { } | 274 virtual void setImagePlanes(std::unique_ptr<ImagePlanes>) { } |
283 | 275 |
284 protected: | 276 protected: |
| 277 ImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOption colorOption
s, size_t maxDecodedBytes) |
| 278 : m_premultiplyAlpha(alphaOption == AlphaPremultiplied) |
| 279 , m_ignoreGammaAndColorProfile(colorOptions == GammaAndColorProfileIgnor
ed) |
| 280 , m_maxDecodedBytes(maxDecodedBytes) { } |
| 281 |
285 // Calculates the most recent frame whose image data may be needed in | 282 // Calculates the most recent frame whose image data may be needed in |
286 // order to decode frame |frameIndex|, based on frame disposal methods | 283 // order to decode frame |frameIndex|, based on frame disposal methods |
287 // and |frameRectIsOpaque|, where |frameRectIsOpaque| signifies whether | 284 // and |frameRectIsOpaque|, where |frameRectIsOpaque| signifies whether |
288 // the rectangle of frame at |frameIndex| is known to be opaque. | 285 // the rectangle of frame at |frameIndex| is known to be opaque. |
289 // If no previous frame's data is required, returns WTF::kNotFound. | 286 // If no previous frame's data is required, returns WTF::kNotFound. |
290 // | 287 // |
291 // This function requires that the previous frame's | 288 // This function requires that the previous frame's |
292 // |m_requiredPreviousFrameIndex| member has been set correctly. The | 289 // |m_requiredPreviousFrameIndex| member has been set correctly. The |
293 // easiest way to ensure this is for subclasses to call this method and | 290 // easiest way to ensure this is for subclasses to call this method and |
294 // store the result on the frame via setRequiredPreviousFrameIndex() | 291 // store the result on the frame via setRequiredPreviousFrameIndex() |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 ImageOrientation m_orientation; | 324 ImageOrientation m_orientation; |
328 | 325 |
329 // The maximum amount of memory a decoded image should require. Ideally, | 326 // The maximum amount of memory a decoded image should require. Ideally, |
330 // image decoders should downsample large images to fit under this limit | 327 // image decoders should downsample large images to fit under this limit |
331 // (and then return the downsampled size from decodedSize()). Ignoring | 328 // (and then return the downsampled size from decodedSize()). Ignoring |
332 // this limit can cause excessive memory use or even crashes on low- | 329 // this limit can cause excessive memory use or even crashes on low- |
333 // memory devices. | 330 // memory devices. |
334 const size_t m_maxDecodedBytes; | 331 const size_t m_maxDecodedBytes; |
335 | 332 |
336 private: | 333 private: |
| 334 enum class SniffResult { |
| 335 JPEG, |
| 336 PNG, |
| 337 GIF, |
| 338 WEBP, |
| 339 ICO, |
| 340 BMP, |
| 341 Invalid |
| 342 }; |
| 343 |
| 344 static SniffResult determineImageType(const char* data, size_t length); |
| 345 |
337 // Some code paths compute the size of the image as "width * height * 4" | 346 // Some code paths compute the size of the image as "width * height * 4" |
338 // and return it as a (signed) int. Avoid overflow. | 347 // and return it as a (signed) int. Avoid overflow. |
339 static bool sizeCalculationMayOverflow(unsigned width, unsigned height) | 348 static bool sizeCalculationMayOverflow(unsigned width, unsigned height) |
340 { | 349 { |
341 unsigned long long total_size = static_cast<unsigned long long>(width) | 350 unsigned long long total_size = static_cast<unsigned long long>(width) |
342 * static_cast<unsigned long long>(height); | 351 * static_cast<unsigned long long>(height); |
343 return total_size > ((1 << 29) - 1); | 352 return total_size > ((1 << 29) - 1); |
344 } | 353 } |
345 | 354 |
346 IntSize m_size; | 355 IntSize m_size; |
347 bool m_sizeAvailable = false; | 356 bool m_sizeAvailable = false; |
348 bool m_isAllDataReceived = false; | 357 bool m_isAllDataReceived = false; |
349 bool m_failed = false; | 358 bool m_failed = false; |
350 | 359 |
351 bool m_hasColorProfile = false; | 360 bool m_hasColorProfile = false; |
352 ImageFrame::ICCProfile m_colorProfile; | 361 ImageFrame::ICCProfile m_colorProfile; |
353 | 362 |
354 #if USE(QCMSLIB) | 363 #if USE(QCMSLIB) |
355 QCMSTransformUniquePtr m_sourceToOutputDeviceColorTransform; | 364 QCMSTransformUniquePtr m_sourceToOutputDeviceColorTransform; |
356 #endif | 365 #endif |
357 }; | 366 }; |
358 | 367 |
359 } // namespace blink | 368 } // namespace blink |
360 | 369 |
361 #endif | 370 #endif |
OLD | NEW |