Changeset 126892 in webkit
- Timestamp:
- Aug 28, 2012, 10:48:38 AM (14 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
-
ChangeLog (modified) (1 diff)
-
platform/graphics/BitmapImage.cpp (modified) (8 diffs)
-
platform/graphics/BitmapImage.h (modified) (3 diffs)
-
platform/graphics/ImageSource.cpp (modified) (1 diff)
-
platform/graphics/ImageSource.h (modified) (1 diff)
-
platform/graphics/cg/ImageSourceCG.cpp (modified) (1 diff)
-
platform/image-decoders/ImageDecoder.cpp (modified) (1 diff)
-
platform/image-decoders/ImageDecoder.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r126891 r126892 1 2012-08-28 Alpha Lam <hclam@chromium.org> 2 3 Report frame bytes by platform ImageDecoder 4 https://bugs.webkit.org/show_bug.cgi?id=94241 5 6 Reviewed by James Robinson. 7 8 Decoded frame bytes should be reported by the platform ImageSource and 9 ImageDecoder. BitmapImage used to guess system memory used by a frame 10 but this is no longer true if a frame is backed by an accelerated 11 surface or defer-decoded. 12 13 Adds ImageSource::frameBytesAtIndex and ImageDecoder::frameBytesAtIndex 14 such that platform can report memory usage correctly. 15 16 No new tests. Refactoring without change of behavior. 17 Tested on Chromium port with pixel tests without any crash or failure. 18 19 * platform/graphics/BitmapImage.cpp: 20 (WebCore::BitmapImage::destroyDecodedData): 21 (WebCore::BitmapImage::destroyDecodedDataIfNecessary): 22 (WebCore::BitmapImage::destroyMetadataAndNotify): 23 (WebCore::BitmapImage::cacheFrame): 24 (WebCore::BitmapImage::dataChanged): 25 * platform/graphics/BitmapImage.h: 26 (WebCore::FrameData::FrameData): 27 (FrameData): 28 (BitmapImage): 29 * platform/graphics/ImageSource.cpp: 30 (WebCore::ImageSource::frameBytesAtIndex): 31 (WebCore): 32 * platform/graphics/ImageSource.h: 33 * platform/graphics/cg/ImageSourceCG.cpp: 34 (WebCore::ImageSource::frameBytesAtIndex): 35 (WebCore): 36 * platform/image-decoders/ImageDecoder.cpp: 37 (WebCore::ImageDecoder::frameBytesAtIndex): 38 (WebCore): 39 * platform/image-decoders/ImageDecoder.h: 40 (ImageDecoder): 41 1 42 2012-08-28 Gustavo Noronha Silva <gns@gnome.org> 2 43 -
trunk/Source/WebCore/platform/graphics/BitmapImage.cpp
r125154 r126892 39 39 namespace WebCore { 40 40 41 static int frameBytes(const IntSize& frameSize)42 {43 return frameSize.width() * frameSize.height() * 4;44 }45 46 41 BitmapImage::BitmapImage(ImageObserver* observer) 47 42 : Image(observer) … … 86 81 void BitmapImage::destroyDecodedData(bool destroyAll) 87 82 { 88 int framesCleared = 0;83 unsigned frameBytesCleared = 0; 89 84 const size_t clearBeforeFrame = destroyAll ? m_frames.size() : m_currentFrame; 90 85 for (size_t i = 0; i < clearBeforeFrame; ++i) { … … 92 87 // save the memory for the framebuffer data), so we don't need to clear 93 88 // the metadata. 89 unsigned frameBytes = m_frames[i].m_frameBytes; 94 90 if (m_frames[i].clear(false)) 95 ++framesCleared;96 } 97 98 destroyMetadataAndNotify(frame sCleared);91 frameBytesCleared += frameBytes; 92 } 93 94 destroyMetadataAndNotify(frameBytesCleared); 99 95 100 96 m_source.clear(destroyAll, clearBeforeFrame, data(), m_allDataReceived); … … 107 103 // to one frame at a time. 108 104 static const unsigned cLargeAnimationCutoff = 5242880; 109 if (m_frames.size() * frameBytes(m_size) > cLargeAnimationCutoff) 105 unsigned allFrameBytes = 0; 106 for (size_t i = 0; i < m_frames.size(); ++i) 107 allFrameBytes += m_frames[i].m_frameBytes; 108 109 if (allFrameBytes > cLargeAnimationCutoff) 110 110 destroyDecodedData(destroyAll); 111 111 } 112 112 113 void BitmapImage::destroyMetadataAndNotify( int framesCleared)113 void BitmapImage::destroyMetadataAndNotify(unsigned frameBytesCleared) 114 114 { 115 115 m_isSolidColor = false; … … 117 117 invalidatePlatformData(); 118 118 119 int deltaBytes = framesCleared * -frameBytes(m_size);120 m_decodedSize += deltaBytes;121 if (frame sCleared > 0) {122 deltaBytes -= m_decodedPropertiesSize;119 ASSERT(m_decodedSize >= frameBytesCleared); 120 m_decodedSize -= frameBytesCleared; 121 if (frameBytesCleared > 0) { 122 frameBytesCleared += m_decodedPropertiesSize; 123 123 m_decodedPropertiesSize = 0; 124 124 } 125 if ( deltaBytes&& imageObserver())126 imageObserver()->decodedSizeChanged(this, deltaBytes);125 if (frameBytesCleared && imageObserver()) 126 imageObserver()->decodedSizeChanged(this, -safeCast<int>(frameBytesCleared)); 127 127 } 128 128 … … 145 145 m_frames[index].m_duration = m_source.frameDurationAtIndex(index); 146 146 m_frames[index].m_hasAlpha = m_source.frameHasAlphaAtIndex(index); 147 m_frames[index].m_frameBytes = m_source.frameBytesAtIndex(index); 147 148 148 149 const IntSize frameSize(index ? m_source.frameSizeAtIndex(index) : m_size); … … 150 151 m_hasUniformFrameSize = false; 151 152 if (m_frames[index].m_frame) { 152 int deltaBytes = frameBytes(frameSize);153 int deltaBytes = safeCast<int>(m_frames[index].m_frameBytes); 153 154 m_decodedSize += deltaBytes; 154 155 // The fully-decoded frame will subsume the partially decoded data used … … 237 238 // frame affected by appending new data here. Thus we have to clear all the 238 239 // incomplete frames to be safe. 239 int framesCleared = 0;240 unsigned frameBytesCleared = 0; 240 241 for (size_t i = 0; i < m_frames.size(); ++i) { 241 242 // NOTE: Don't call frameIsCompleteAtIndex() here, that will try to 242 243 // decode any uncached (i.e. never-decoded or 243 244 // cleared-on-a-previous-pass) frames! 245 unsigned frameBytes = m_frames[i].m_frameBytes; 244 246 if (m_frames[i].m_haveMetadata && !m_frames[i].m_isComplete) 245 frame sCleared += (m_frames[i].clear(true) ? 1: 0);246 } 247 destroyMetadataAndNotify(frame sCleared);247 frameBytesCleared += (m_frames[i].clear(true) ? frameBytes : 0); 248 } 249 destroyMetadataAndNotify(frameBytesCleared); 248 250 249 251 // Feed all the data we've seen so far to the image decoder. -
trunk/Source/WebCore/platform/graphics/BitmapImage.h
r125374 r126892 76 76 , m_isComplete(false) 77 77 , m_hasAlpha(true) 78 , m_frameBytes(0) 78 79 { 79 80 } … … 94 95 bool m_isComplete : 1; 95 96 bool m_hasAlpha : 1; 97 unsigned m_frameBytes; 96 98 }; 97 99 … … 235 237 // Generally called by destroyDecodedData(), destroys whole-image metadata 236 238 // and notifies observers that the memory footprint has (hopefully) 237 // decreased by |frame sCleared| times the size (in bytes) of a frame.238 void destroyMetadataAndNotify( int framesCleared);239 // decreased by |frameBytesCleared|. 240 void destroyMetadataAndNotify(unsigned frameBytesCleared); 239 241 240 242 // Whether or not size is available yet. -
trunk/Source/WebCore/platform/graphics/ImageSource.cpp
r125154 r126892 199 199 } 200 200 201 } 201 unsigned ImageSource::frameBytesAtIndex(size_t index) const 202 { 203 if (!m_decoder) 204 return 0; 205 return m_decoder->frameBytesAtIndex(index); 206 } 207 208 } -
trunk/Source/WebCore/platform/graphics/ImageSource.h
r126477 r126892 147 147 ImageOrientation orientationAtIndex(size_t) const; // EXIF image orientation 148 148 149 // Return the number of bytes in the decoded frame. If the frame is not yet 150 // decoded then return 0. 151 unsigned frameBytesAtIndex(size_t) const; 152 149 153 #if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) 150 154 static unsigned maxPixelsPerDecodedImage() { return s_maxPixelsPerDecodedImage; } -
trunk/Source/WebCore/platform/graphics/cg/ImageSourceCG.cpp
r126477 r126892 385 385 } 386 386 387 unsigned ImageSource::frameBytesAtIndex(size_t index) const 388 { 389 IntSize frameSize = frameSizeAtIndex(index, RespectImageOrientation); 390 return frameSize.width() * frameSize.height() * 4; 391 } 392 387 393 } 388 394 -
trunk/Source/WebCore/platform/image-decoders/ImageDecoder.cpp
r125154 r126892 287 287 } 288 288 289 unsigned ImageDecoder::frameBytesAtIndex(size_t index) const 290 { 291 if (m_frameBufferCache.size() <= index) 292 return 0; 293 // FIXME: Use the dimension of the requested frame. 294 return m_size.area() * sizeof(ImageFrame::PixelData); 295 } 296 289 297 void ImageDecoder::prepareScaleDataIfNecessary() 290 298 { -
trunk/Source/WebCore/platform/image-decoders/ImageDecoder.h
r125154 r126892 280 280 virtual bool frameHasAlphaAtIndex(size_t) const; 281 281 282 // Number of bytes in the decoded frame requested. Return 0 if not yet decoded. 283 virtual unsigned frameBytesAtIndex(size_t) const; 284 282 285 void setIgnoreGammaAndColorProfile(bool flag) { m_ignoreGammaAndColorProfile = flag; } 283 286 bool ignoresGammaAndColorProfile() const { return m_ignoreGammaAndColorProfile; }
Note:
See TracChangeset
for help on using the changeset viewer.