| 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) 2008-2009 Torch Mobile, Inc. | |
| 4 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. | 3 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved. |
| 5 * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies) | |
| 6 * | 4 * |
| 7 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 8 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 9 * are met: | 7 * are met: |
| 10 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 11 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 12 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| 13 * notice, this list of conditions and the following disclaimer in the | 11 * notice, this list of conditions and the following disclaimer in the |
| 14 * documentation and/or other materials provided with the distribution. | 12 * documentation and/or other materials provided with the distribution. |
| 15 * | 13 * |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 // buffer except for GIF frames whose | 196 // buffer except for GIF frames whose |
| 199 // original rect was smaller than the | 197 // original rect was smaller than the |
| 200 // overall image size. | 198 // overall image size. |
| 201 FrameStatus m_status; | 199 FrameStatus m_status; |
| 202 unsigned m_duration; | 200 unsigned m_duration; |
| 203 FrameDisposalMethod m_disposalMethod; | 201 FrameDisposalMethod m_disposalMethod; |
| 204 bool m_premultiplyAlpha; | 202 bool m_premultiplyAlpha; |
| 205 }; | 203 }; |
| 206 | 204 |
| 207 // ImageDecoder is a base for all format-specific decoders | 205 // ImageDecoder is a base for all format-specific decoders |
| 208 // (e.g. JPEGImageDecoder). This base manages the ImageFrame cache. | 206 // (e.g. JPEGImageDecoder). This base manages the ImageFrame cache. |
| 209 // | |
| 210 // ENABLE(IMAGE_DECODER_DOWN_SAMPLING) allows image decoders to downsample | |
| 211 // at decode time. Image decoders will downsample any images larger than | |
| 212 // |m_maxNumPixels|. FIXME: Not yet supported by all decoders. | |
| 213 class ImageDecoder { | 207 class ImageDecoder { |
| 214 WTF_MAKE_NONCOPYABLE(ImageDecoder); WTF_MAKE_FAST_ALLOCATED; | 208 WTF_MAKE_NONCOPYABLE(ImageDecoder); WTF_MAKE_FAST_ALLOCATED; |
| 215 public: | 209 public: |
| 216 ImageDecoder(ImageSource::AlphaOption alphaOption, ImageSource::GammaAnd
ColorProfileOption gammaAndColorProfileOption) | 210 ImageDecoder(ImageSource::AlphaOption alphaOption, ImageSource::GammaAnd
ColorProfileOption gammaAndColorProfileOption) |
| 217 : m_scaled(false) | 211 : m_premultiplyAlpha(alphaOption == ImageSource::AlphaPremultiplied) |
| 218 , m_premultiplyAlpha(alphaOption == ImageSource::AlphaPremultiplied) | |
| 219 , m_ignoreGammaAndColorProfile(gammaAndColorProfileOption == ImageSo
urce::GammaAndColorProfileIgnored) | 212 , m_ignoreGammaAndColorProfile(gammaAndColorProfileOption == ImageSo
urce::GammaAndColorProfileIgnored) |
| 220 , m_sizeAvailable(false) | 213 , m_sizeAvailable(false) |
| 221 , m_maxNumPixels(-1) | |
| 222 , m_isAllDataReceived(false) | 214 , m_isAllDataReceived(false) |
| 223 , m_failed(false) { } | 215 , m_failed(false) { } |
| 224 | 216 |
| 225 virtual ~ImageDecoder() { } | 217 virtual ~ImageDecoder() { } |
| 226 | 218 |
| 227 // Returns a caller-owned decoder of the appropriate type. Returns 0 if | 219 // Returns a caller-owned decoder of the appropriate type. Returns 0 if |
| 228 // we can't sniff a supported type from the provided data (possibly | 220 // we can't sniff a supported type from the provided data (possibly |
| 229 // because there isn't enough data yet). | 221 // because there isn't enough data yet). |
| 230 static PassOwnPtr<ImageDecoder> create(const SharedBuffer& data, ImageSo
urce::AlphaOption, ImageSource::GammaAndColorProfileOption); | 222 static PassOwnPtr<ImageDecoder> create(const SharedBuffer& data, ImageSo
urce::AlphaOption, ImageSource::GammaAndColorProfileOption); |
| 231 | 223 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 244 // Lazily-decodes enough of the image to get the size (if possible). | 236 // Lazily-decodes enough of the image to get the size (if possible). |
| 245 // FIXME: Right now that has to be done by each subclass; factor the | 237 // FIXME: Right now that has to be done by each subclass; factor the |
| 246 // decode call out and use it here. | 238 // decode call out and use it here. |
| 247 virtual bool isSizeAvailable() | 239 virtual bool isSizeAvailable() |
| 248 { | 240 { |
| 249 return !m_failed && m_sizeAvailable; | 241 return !m_failed && m_sizeAvailable; |
| 250 } | 242 } |
| 251 | 243 |
| 252 virtual IntSize size() const { return m_size; } | 244 virtual IntSize size() const { return m_size; } |
| 253 | 245 |
| 254 IntSize scaledSize() const | |
| 255 { | |
| 256 return m_scaled ? IntSize(m_scaledColumns.size(), m_scaledRows.size(
)) : size(); | |
| 257 } | |
| 258 | |
| 259 // This will only differ from size() for ICO (where each frame is a | 246 // This will only differ from size() for ICO (where each frame is a |
| 260 // different icon) or other formats where different frames are different | 247 // different icon) or other formats where different frames are different |
| 261 // sizes. This does NOT differ from size() for GIF, since decoding GIFs | 248 // sizes. This does NOT differ from size() for GIF, since decoding GIFs |
| 262 // composites any smaller frames against previous frames to create full- | 249 // composites any smaller frames against previous frames to create full- |
| 263 // size frames. | 250 // size frames. |
| 264 virtual IntSize frameSizeAtIndex(size_t) const | 251 virtual IntSize frameSizeAtIndex(size_t) const |
| 265 { | 252 { |
| 266 return size(); | 253 return size(); |
| 267 } | 254 } |
| 268 | 255 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 369 return false; | 356 return false; |
| 370 } | 357 } |
| 371 | 358 |
| 372 bool failed() const { return m_failed; } | 359 bool failed() const { return m_failed; } |
| 373 | 360 |
| 374 // Clears decoded pixel data from before the provided frame unless that | 361 // Clears decoded pixel data from before the provided frame unless that |
| 375 // data may be needed to decode future frames (e.g. due to GIF frame | 362 // data may be needed to decode future frames (e.g. due to GIF frame |
| 376 // compositing). | 363 // compositing). |
| 377 virtual void clearFrameBufferCache(size_t) { } | 364 virtual void clearFrameBufferCache(size_t) { } |
| 378 | 365 |
| 379 #if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) | |
| 380 void setMaxNumPixels(int m) { m_maxNumPixels = m; } | |
| 381 #endif | |
| 382 | |
| 383 // If the image has a cursor hot-spot, stores it in the argument | 366 // If the image has a cursor hot-spot, stores it in the argument |
| 384 // and returns true. Otherwise returns false. | 367 // and returns true. Otherwise returns false. |
| 385 virtual bool hotSpot(IntPoint&) const { return false; } | 368 virtual bool hotSpot(IntPoint&) const { return false; } |
| 386 | 369 |
| 387 virtual void reportMemoryUsage(MemoryObjectInfo*) const; | 370 virtual void reportMemoryUsage(MemoryObjectInfo*) const; |
| 388 | 371 |
| 389 virtual void setMemoryAllocator(SkBitmap::Allocator* allocator) | 372 virtual void setMemoryAllocator(SkBitmap::Allocator* allocator) |
| 390 { | 373 { |
| 391 // FIXME: this doesn't work for images with multiple frames. | 374 // FIXME: this doesn't work for images with multiple frames. |
| 392 if (m_frameBufferCache.isEmpty()) | 375 if (m_frameBufferCache.isEmpty()) |
| 393 m_frameBufferCache.resize(1); | 376 m_frameBufferCache.resize(1); |
| 394 m_frameBufferCache[0].setMemoryAllocator(allocator); | 377 m_frameBufferCache[0].setMemoryAllocator(allocator); |
| 395 } | 378 } |
| 396 | 379 |
| 397 protected: | 380 protected: |
| 398 void prepareScaleDataIfNecessary(); | |
| 399 int upperBoundScaledX(int origX, int searchStart = 0); | |
| 400 int lowerBoundScaledX(int origX, int searchStart = 0); | |
| 401 int upperBoundScaledY(int origY, int searchStart = 0); | |
| 402 int lowerBoundScaledY(int origY, int searchStart = 0); | |
| 403 int scaledY(int origY, int searchStart = 0); | |
| 404 | |
| 405 RefPtr<SharedBuffer> m_data; // The encoded data. | 381 RefPtr<SharedBuffer> m_data; // The encoded data. |
| 406 Vector<ImageFrame, 1> m_frameBufferCache; | 382 Vector<ImageFrame, 1> m_frameBufferCache; |
| 407 bool m_scaled; | |
| 408 Vector<int> m_scaledColumns; | |
| 409 Vector<int> m_scaledRows; | |
| 410 bool m_premultiplyAlpha; | 383 bool m_premultiplyAlpha; |
| 411 bool m_ignoreGammaAndColorProfile; | 384 bool m_ignoreGammaAndColorProfile; |
| 412 ImageOrientation m_orientation; | 385 ImageOrientation m_orientation; |
| 413 | 386 |
| 414 private: | 387 private: |
| 415 // Some code paths compute the size of the image as "width * height * 4" | 388 // Some code paths compute the size of the image as "width * height * 4" |
| 416 // and return it as a (signed) int. Avoid overflow. | 389 // and return it as a (signed) int. Avoid overflow. |
| 417 static bool isOverSize(unsigned width, unsigned height) | 390 static bool isOverSize(unsigned width, unsigned height) |
| 418 { | 391 { |
| 419 unsigned long long total_size = static_cast<unsigned long long>(widt
h) | 392 unsigned long long total_size = static_cast<unsigned long long>(widt
h) |
| 420 * static_cast<unsigned long long>(heig
ht); | 393 * static_cast<unsigned long long>(heig
ht); |
| 421 return total_size > ((1 << 29) - 1); | 394 return total_size > ((1 << 29) - 1); |
| 422 } | 395 } |
| 423 | 396 |
| 424 IntSize m_size; | 397 IntSize m_size; |
| 425 bool m_sizeAvailable; | 398 bool m_sizeAvailable; |
| 426 int m_maxNumPixels; | |
| 427 bool m_isAllDataReceived; | 399 bool m_isAllDataReceived; |
| 428 bool m_failed; | 400 bool m_failed; |
| 429 }; | 401 }; |
| 430 | 402 |
| 431 } // namespace WebCore | 403 } // namespace WebCore |
| 432 | 404 |
| 433 #endif | 405 #endif |
| OLD | NEW |