| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 2  * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 
| 3  * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved. | 3  * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. 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 13 matching lines...) Expand all  Loading... | 
| 24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
| 25  */ | 25  */ | 
| 26 | 26 | 
| 27 #include "config.h" | 27 #include "config.h" | 
| 28 #include "platform/graphics/BitmapImage.h" | 28 #include "platform/graphics/BitmapImage.h" | 
| 29 | 29 | 
| 30 #include "platform/PlatformInstrumentation.h" | 30 #include "platform/PlatformInstrumentation.h" | 
| 31 #include "platform/Timer.h" | 31 #include "platform/Timer.h" | 
| 32 #include "platform/TraceEvent.h" | 32 #include "platform/TraceEvent.h" | 
| 33 #include "platform/geometry/FloatRect.h" | 33 #include "platform/geometry/FloatRect.h" | 
|  | 34 #include "platform/graphics/ColorSpaceProfile.h" | 
| 34 #include "platform/graphics/DeferredImageDecoder.h" | 35 #include "platform/graphics/DeferredImageDecoder.h" | 
|  | 36 #include "platform/graphics/GraphicsScreen.h" | 
| 35 #include "platform/graphics/ImageObserver.h" | 37 #include "platform/graphics/ImageObserver.h" | 
| 36 #include "platform/graphics/StaticBitmapImage.h" | 38 #include "platform/graphics/StaticBitmapImage.h" | 
| 37 #include "platform/graphics/skia/SkiaUtils.h" | 39 #include "platform/graphics/skia/SkiaUtils.h" | 
| 38 #include "third_party/skia/include/core/SkCanvas.h" | 40 #include "third_party/skia/include/core/SkCanvas.h" | 
| 39 #include "wtf/PassRefPtr.h" | 41 #include "wtf/PassRefPtr.h" | 
|  | 42 #include "wtf/RefPtr.h" | 
| 40 #include "wtf/text/WTFString.h" | 43 #include "wtf/text/WTFString.h" | 
| 41 | 44 | 
| 42 namespace blink { | 45 namespace blink { | 
| 43 | 46 | 
| 44 PassRefPtr<BitmapImage> BitmapImage::createWithOrientationForTesting(const SkBit
     map& bitmap, ImageOrientation orientation) | 47 PassRefPtr<BitmapImage> BitmapImage::createWithOrientationForTesting(const SkBit
     map& bitmap, ImageOrientation orientation) | 
| 45 { | 48 { | 
| 46     if (bitmap.isNull()) { | 49     if (bitmap.isNull()) { | 
| 47         return BitmapImage::create(); | 50         return BitmapImage::create(); | 
| 48     } | 51     } | 
| 49 | 52 | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 63     , m_desiredFrameStartTime(0) | 66     , m_desiredFrameStartTime(0) | 
| 64     , m_frameCount(0) | 67     , m_frameCount(0) | 
| 65     , m_animationPolicy(ImageAnimationPolicyAllowed) | 68     , m_animationPolicy(ImageAnimationPolicyAllowed) | 
| 66     , m_animationFinished(false) | 69     , m_animationFinished(false) | 
| 67     , m_allDataReceived(false) | 70     , m_allDataReceived(false) | 
| 68     , m_haveSize(false) | 71     , m_haveSize(false) | 
| 69     , m_sizeAvailable(false) | 72     , m_sizeAvailable(false) | 
| 70     , m_hasUniformFrameSize(true) | 73     , m_hasUniformFrameSize(true) | 
| 71     , m_haveFrameCount(false) | 74     , m_haveFrameCount(false) | 
| 72 { | 75 { | 
|  | 76     fprintf(stderr, "BitmapImage %p created (page %ld)\n", this, (long int)curre
     ntScreenId()); | 
| 73 } | 77 } | 
| 74 | 78 | 
| 75 BitmapImage::BitmapImage(const SkBitmap& bitmap, ImageObserver* observer) | 79 BitmapImage::BitmapImage(const SkBitmap& bitmap, ImageObserver* observer) | 
| 76     : Image(observer) | 80     : Image(observer) | 
| 77     , m_size(bitmap.width(), bitmap.height()) | 81     , m_size(bitmap.width(), bitmap.height()) | 
| 78     , m_currentFrame(0) | 82     , m_currentFrame(0) | 
| 79     , m_repetitionCount(cAnimationNone) | 83     , m_repetitionCount(cAnimationNone) | 
| 80     , m_repetitionCountStatus(Unknown) | 84     , m_repetitionCountStatus(Unknown) | 
| 81     , m_repetitionsComplete(0) | 85     , m_repetitionsComplete(0) | 
| 82     , m_frameCount(1) | 86     , m_frameCount(1) | 
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 154 } | 158 } | 
| 155 | 159 | 
| 156 void BitmapImage::cacheFrame(size_t index) | 160 void BitmapImage::cacheFrame(size_t index) | 
| 157 { | 161 { | 
| 158     size_t numFrames = frameCount(); | 162     size_t numFrames = frameCount(); | 
| 159     if (m_frames.size() < numFrames) | 163     if (m_frames.size() < numFrames) | 
| 160         m_frames.grow(numFrames); | 164         m_frames.grow(numFrames); | 
| 161 | 165 | 
| 162     int deltaBytes = totalFrameBytes(); | 166     int deltaBytes = totalFrameBytes(); | 
| 163 | 167 | 
|  | 168     fprintf(stderr, "BitmapImage %p cacheframe(index=%d)\n", this, (int)index); | 
| 164 | 169 | 
| 165     // We are caching frame snapshots.  This is OK even for partially decoded fr
     ames, | 170     // We are caching frame snapshots.  This is OK even for partially decoded fr
     ames, | 
| 166     // as they are cleared by dataChanged() when new data arrives. | 171     // as they are cleared by dataChanged() when new data arrives. | 
| 167     m_frames[index].m_frame = m_source.createFrameAtIndex(index); | 172     m_frames[index].m_frame = m_source.createFrameAtIndex(index); | 
| 168 | 173 | 
| 169     m_frames[index].m_orientation = m_source.orientationAtIndex(index); | 174     m_frames[index].m_orientation = m_source.orientationAtIndex(index); | 
| 170     m_frames[index].m_haveMetadata = true; | 175     m_frames[index].m_haveMetadata = true; | 
| 171     m_frames[index].m_isComplete = m_source.frameIsCompleteAtIndex(index); | 176     m_frames[index].m_isComplete = m_source.frameIsCompleteAtIndex(index); | 
| 172     if (repetitionCount(false) != cAnimationNone) | 177     if (repetitionCount(false) != cAnimationNone) | 
| 173         m_frames[index].m_duration = m_source.frameDurationAtIndex(index); | 178         m_frames[index].m_duration = m_source.frameDurationAtIndex(index); | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 262 | 267 | 
| 263 String BitmapImage::filenameExtension() const | 268 String BitmapImage::filenameExtension() const | 
| 264 { | 269 { | 
| 265     return m_source.filenameExtension(); | 270     return m_source.filenameExtension(); | 
| 266 } | 271 } | 
| 267 | 272 | 
| 268 void BitmapImage::draw(SkCanvas* canvas, const SkPaint& paint, const FloatRect& 
     dstRect, const FloatRect& srcRect, RespectImageOrientationEnum shouldRespectImag
     eOrientation, ImageClampingMode clampMode) | 273 void BitmapImage::draw(SkCanvas* canvas, const SkPaint& paint, const FloatRect& 
     dstRect, const FloatRect& srcRect, RespectImageOrientationEnum shouldRespectImag
     eOrientation, ImageClampingMode clampMode) | 
| 269 { | 274 { | 
| 270     TRACE_EVENT0("skia", "BitmapImage::draw"); | 275     TRACE_EVENT0("skia", "BitmapImage::draw"); | 
| 271 | 276 | 
|  | 277     if (imageColorProfilesEnabled() && hasColorProfile()) | 
|  | 278         notifyDeviceProfile(screenColorProfile(currentScreenId()).get()); | 
|  | 279 | 
| 272     RefPtr<SkImage> image = imageForCurrentFrame(); | 280     RefPtr<SkImage> image = imageForCurrentFrame(); | 
| 273     if (!image) | 281     if (!image) | 
| 274         return; // It's too early and we don't have an image yet. | 282         return; // It's too early and we don't have an image yet. | 
| 275 | 283 | 
| 276     FloatRect adjustedSrcRect = srcRect; | 284     FloatRect adjustedSrcRect = srcRect; | 
| 277     adjustedSrcRect.intersect(FloatRect(0, 0, image->width(), image->height())); | 285     adjustedSrcRect.intersect(FloatRect(0, 0, image->width(), image->height())); | 
| 278 | 286 | 
| 279     if (adjustedSrcRect.isEmpty() || dstRect.isEmpty()) | 287     if (adjustedSrcRect.isEmpty() || dstRect.isEmpty()) | 
| 280         return; // Nothing to draw. | 288         return; // Nothing to draw. | 
| 281 | 289 | 
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 663     } | 671     } | 
| 664     destroyDecodedDataIfNecessary(); | 672     destroyDecodedDataIfNecessary(); | 
| 665 | 673 | 
| 666     // We need to draw this frame if we advanced to it while not skipping, or if | 674     // We need to draw this frame if we advanced to it while not skipping, or if | 
| 667     // while trying to skip frames we hit the last frame and thus had to stop. | 675     // while trying to skip frames we hit the last frame and thus had to stop. | 
| 668     if (skippingFrames != advancedAnimation) | 676     if (skippingFrames != advancedAnimation) | 
| 669         imageObserver()->animationAdvanced(this); | 677         imageObserver()->animationAdvanced(this); | 
| 670     return advancedAnimation; | 678     return advancedAnimation; | 
| 671 } | 679 } | 
| 672 | 680 | 
|  | 681 void BitmapImage::notifyDeviceProfile(ColorSpaceProfile* deviceProfile) | 
|  | 682 { | 
|  | 683     RELEASE_ASSERT(imageColorProfilesEnabled() && hasColorProfile()); | 
|  | 684 | 
|  | 685     if (m_source.deviceProfile() == deviceProfile) | 
|  | 686         return; | 
|  | 687 | 
|  | 688     if (!imageObserver()) | 
|  | 689         return; | 
|  | 690 | 
|  | 691     imageObserver()->deviceProfileChanged(this, deviceProfile); | 
|  | 692 } | 
|  | 693 | 
|  | 694 bool BitmapImage::resetDecoder(ColorSpaceProfile* deviceProfile) | 
|  | 695 { | 
|  | 696     RELEASE_ASSERT(imageColorProfilesEnabled() && hasColorProfile()); | 
|  | 697 | 
|  | 698     if (m_source.deviceProfile() == deviceProfile) | 
|  | 699         return false; | 
|  | 700 | 
|  | 701     fprintf(stderr, "BitmapImage %p resetDecoder\n", this); | 
|  | 702     m_source.resetDecoder(); | 
|  | 703     m_source.setDeviceProfile(deviceProfile); | 
|  | 704     return true; | 
|  | 705 } | 
|  | 706 | 
| 673 } // namespace blink | 707 } // namespace blink | 
| OLD | NEW | 
|---|