Chromium Code Reviews| 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. Th is is useful for | |
| 117 // callers to determine whether a decoder instantiation failure is due to in sufficient or bad data. | |
|
Peter Kasting
2016/08/19 23:04:58
Nit: Seems like most of this file prefers to wrap
f(malita)
2016/08/22 01:51:16
Done.
| |
| 118 static bool isSufficientData(const SharedBuffer&); | |
|
Peter Kasting
2016/08/19 23:04:58
Nit: I'm not a big fan of this function name. Som
f(malita)
2016/08/22 01:51:16
Changed to hasSufficientDataToSniffImageType().
| |
| 119 | |
| 129 void setData(PassRefPtr<SegmentReader> data, bool allDataReceived) | 120 void setData(PassRefPtr<SegmentReader> data, bool allDataReceived) |
| 130 { | 121 { |
| 131 if (m_failed) | 122 if (m_failed) |
| 132 return; | 123 return; |
| 133 m_data = data; | 124 m_data = data; |
| 134 m_isAllDataReceived = allDataReceived; | 125 m_isAllDataReceived = allDataReceived; |
| 135 onSetData(m_data.get()); | 126 onSetData(m_data.get()); |
| 136 } | 127 } |
| 137 | 128 |
| 138 void setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) | 129 void setData(PassRefPtr<SharedBuffer> data, bool allDataReceived) |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 275 findRequiredPreviousFrame(0, false)); | 266 findRequiredPreviousFrame(0, false)); |
| 276 } | 267 } |
| 277 m_frameBufferCache[0].setMemoryAllocator(allocator); | 268 m_frameBufferCache[0].setMemoryAllocator(allocator); |
| 278 } | 269 } |
| 279 | 270 |
| 280 virtual bool canDecodeToYUV() { return false; } | 271 virtual bool canDecodeToYUV() { return false; } |
| 281 virtual bool decodeToYUV() { return false; } | 272 virtual bool decodeToYUV() { return false; } |
| 282 virtual void setImagePlanes(std::unique_ptr<ImagePlanes>) { } | 273 virtual void setImagePlanes(std::unique_ptr<ImagePlanes>) { } |
| 283 | 274 |
| 284 protected: | 275 protected: |
| 276 ImageDecoder(AlphaOption alphaOption, GammaAndColorProfileOption colorOption s, size_t maxDecodedBytes) | |
| 277 : m_premultiplyAlpha(alphaOption == AlphaPremultiplied) | |
| 278 , m_ignoreGammaAndColorProfile(colorOptions == GammaAndColorProfileIgnor ed) | |
| 279 , m_maxDecodedBytes(maxDecodedBytes) { } | |
| 280 | |
| 285 // Calculates the most recent frame whose image data may be needed in | 281 // Calculates the most recent frame whose image data may be needed in |
| 286 // order to decode frame |frameIndex|, based on frame disposal methods | 282 // order to decode frame |frameIndex|, based on frame disposal methods |
| 287 // and |frameRectIsOpaque|, where |frameRectIsOpaque| signifies whether | 283 // and |frameRectIsOpaque|, where |frameRectIsOpaque| signifies whether |
| 288 // the rectangle of frame at |frameIndex| is known to be opaque. | 284 // the rectangle of frame at |frameIndex| is known to be opaque. |
| 289 // If no previous frame's data is required, returns WTF::kNotFound. | 285 // If no previous frame's data is required, returns WTF::kNotFound. |
| 290 // | 286 // |
| 291 // This function requires that the previous frame's | 287 // This function requires that the previous frame's |
| 292 // |m_requiredPreviousFrameIndex| member has been set correctly. The | 288 // |m_requiredPreviousFrameIndex| member has been set correctly. The |
| 293 // easiest way to ensure this is for subclasses to call this method and | 289 // easiest way to ensure this is for subclasses to call this method and |
| 294 // store the result on the frame via setRequiredPreviousFrameIndex() | 290 // 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; | 323 ImageOrientation m_orientation; |
| 328 | 324 |
| 329 // The maximum amount of memory a decoded image should require. Ideally, | 325 // The maximum amount of memory a decoded image should require. Ideally, |
| 330 // image decoders should downsample large images to fit under this limit | 326 // image decoders should downsample large images to fit under this limit |
| 331 // (and then return the downsampled size from decodedSize()). Ignoring | 327 // (and then return the downsampled size from decodedSize()). Ignoring |
| 332 // this limit can cause excessive memory use or even crashes on low- | 328 // this limit can cause excessive memory use or even crashes on low- |
| 333 // memory devices. | 329 // memory devices. |
| 334 const size_t m_maxDecodedBytes; | 330 const size_t m_maxDecodedBytes; |
| 335 | 331 |
| 336 private: | 332 private: |
| 333 enum class SniffResult { | |
| 334 JPEG, | |
| 335 PNG, | |
| 336 GIF, | |
| 337 WEBP, | |
| 338 ICO, | |
| 339 BMP, | |
| 340 Invalid | |
| 341 }; | |
| 342 | |
| 343 static SniffResult determineImageType(const char* data, size_t length); | |
| 344 | |
| 337 // Some code paths compute the size of the image as "width * height * 4" | 345 // Some code paths compute the size of the image as "width * height * 4" |
| 338 // and return it as a (signed) int. Avoid overflow. | 346 // and return it as a (signed) int. Avoid overflow. |
| 339 static bool sizeCalculationMayOverflow(unsigned width, unsigned height) | 347 static bool sizeCalculationMayOverflow(unsigned width, unsigned height) |
| 340 { | 348 { |
| 341 unsigned long long total_size = static_cast<unsigned long long>(width) | 349 unsigned long long total_size = static_cast<unsigned long long>(width) |
| 342 * static_cast<unsigned long long>(height); | 350 * static_cast<unsigned long long>(height); |
| 343 return total_size > ((1 << 29) - 1); | 351 return total_size > ((1 << 29) - 1); |
| 344 } | 352 } |
| 345 | 353 |
| 346 IntSize m_size; | 354 IntSize m_size; |
| 347 bool m_sizeAvailable = false; | 355 bool m_sizeAvailable = false; |
| 348 bool m_isAllDataReceived = false; | 356 bool m_isAllDataReceived = false; |
| 349 bool m_failed = false; | 357 bool m_failed = false; |
| 350 | 358 |
| 351 bool m_hasColorProfile = false; | 359 bool m_hasColorProfile = false; |
| 352 ImageFrame::ICCProfile m_colorProfile; | 360 ImageFrame::ICCProfile m_colorProfile; |
| 353 | 361 |
| 354 #if USE(QCMSLIB) | 362 #if USE(QCMSLIB) |
| 355 QCMSTransformUniquePtr m_sourceToOutputDeviceColorTransform; | 363 QCMSTransformUniquePtr m_sourceToOutputDeviceColorTransform; |
| 356 #endif | 364 #endif |
| 357 }; | 365 }; |
| 358 | 366 |
| 359 } // namespace blink | 367 } // namespace blink |
| 360 | 368 |
| 361 #endif | 369 #endif |
| OLD | NEW |