Changeset 141303 in webkit
- Timestamp:
- Jan 30, 2013, 1:09:52 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r141299 r141303 1 2013-01-30 Philip Rogers <pdr@google.com> 2 3 Track scale and zoom together when drawing SVG images 4 https://bugs.webkit.org/show_bug.cgi?id=108108 5 6 Reviewed by Tim Horton. 7 8 * platform/chromium/TestExpectations: 9 1 10 2013-01-30 Zan Dobersek <zdobersek@igalia.com> 2 11 -
trunk/LayoutTests/platform/chromium/TestExpectations
r141286 r141303 3654 3654 webkit.org/b/94002 [ Win7 Debug ] inspector/debugger/event-listener-breakpoints.html [ Pass Timeout Failure ] 3655 3655 3656 # Requires a rebasline after webkit.org/b/108108 3657 webkit.org/b/108108 svg/zoom/page/zoom-background-images.html [ ImageOnlyFailure Pass ] 3658 webkit.org/b/108108 svg/zoom/page/zoom-img-preserveAspectRatio-support-1.html [ ImageOnlyFailure Pass ] 3659 webkit.org/b/108108 svg/zoom/page/zoom-svg-as-background-with-relative-size.html [ ImageOnlyFailure Pass ] 3660 webkit.org/b/108108 fast/backgrounds/size/contain-and-cover-zoomed.html [ ImageOnlyFailure Pass ] 3661 3656 3662 # Flaky 3657 3663 webkit.org/b/99389 [ Win ] inspector/debugger/xhr-breakpoints.html [ Pass Failure ] -
trunk/Source/WebCore/ChangeLog
r141300 r141303 1 2013-01-30 Philip Rogers <pdr@google.com> 2 3 Track scale and zoom together when drawing SVG images 4 https://bugs.webkit.org/show_bug.cgi?id=108108 5 6 Reviewed by Tim Horton. 7 8 This patch refactors SVGImage::drawSVGToImageBuffer to take a single zoomAndScale parameter 9 and removes two messy calls to setPageZoomFactor. This patch makes progress towards an 10 SVG image cache keyed on just container size and scale. 11 12 This refactoring is covered by existing tests. 13 14 * loader/cache/CachedImage.cpp: 15 (WebCore::CachedImage::setContainerSizeForRenderer): 16 (WebCore::CachedImage::imageSizeForRenderer): 17 18 This complex logic has been refactored out of CachedImage and into SVGImageCache. 19 In addition to the code move, we no longer divide by the zoom factor because the 20 container size is stored without zoom. 21 22 * svg/graphics/SVGImage.cpp: 23 (WebCore::SVGImage::drawSVGToImageBuffer): 24 25 This method signature has changed to take a FloatSize for the container size and 26 a combined zoom and scale parameter (zoomAndScale). A FloatSize is needed for the 27 container size because we now store the container size unzoomed, and in this process 28 we do not want to lose precision. 29 30 The messy setPageZoomFactor calls have also been removed which cleans this function up. 31 32 * svg/graphics/SVGImage.h: 33 * svg/graphics/SVGImageCache.cpp: 34 (WebCore::SVGImageCache::setContainerSizeForRenderer): 35 36 This function now stores the container size unzoomed. The container size was changed 37 to a FloatSize so that precision is not lost. 38 39 (WebCore::SVGImageCache::imageSizeForRenderer): 40 41 Note that the ImageBuffer size will stay the same. We now store the size as: 42 containerSize (without zoom) * zoom * scale 43 Previously this was: 44 containerSize (with zoom) * scale 45 46 (WebCore::SVGImageCache::redraw): 47 (WebCore::SVGImageCache::lookupOrCreateBitmapImageForRenderer): 48 * svg/graphics/SVGImageCache.h: 49 (WebCore::SVGImageCache::SizeAndScales::SizeAndScales): 50 (SizeAndScales): 51 (SVGImageCache): 52 1 53 2013-01-30 Benjamin Poulain <benjamin@webkit.org> 2 54 -
trunk/Source/WebCore/loader/cache/CachedImage.cpp
r140722 r141303 226 226 } 227 227 228 m_svgImageCache->set RequestedSizeAndScales(renderer, SVGImageCache::SizeAndScales(containerSize, containerZoom));228 m_svgImageCache->setContainerSizeForRenderer(renderer, containerSize, containerZoom); 229 229 #else 230 230 UNUSED_PARAM(containerZoom); … … 268 268 if (m_image->isBitmapImage() && (renderer && renderer->shouldRespectImageOrientation() == RespectImageOrientation)) 269 269 imageSize = static_cast<BitmapImage*>(m_image.get())->sizeRespectingOrientation(); 270 #if ENABLE(SVG) 271 else if (m_image->isSVGImage()) { 272 imageSize = m_svgImageCache->imageSizeForRenderer(renderer); 273 } 274 #endif 270 275 else 271 276 imageSize = m_image->size(); 272 273 #if ENABLE(SVG)274 if (m_image->isSVGImage()) {275 SVGImageCache::SizeAndScales sizeAndScales = m_svgImageCache->requestedSizeAndScales(renderer);276 if (!sizeAndScales.size.isEmpty()) {277 float scale = sizeAndScales.scale;278 if (!scale) {279 Page* page = renderer->document()->page();280 scale = page->deviceScaleFactor() * page->pageScaleFactor();281 }282 283 imageSize.setWidth(scale * sizeAndScales.size.width() / sizeAndScales.zoom);284 imageSize.setHeight(scale * sizeAndScales.size.height() / sizeAndScales.zoom);285 }286 }287 #endif288 277 289 278 if (multiplier == 1.0f) -
trunk/Source/WebCore/svg/graphics/SVGImage.cpp
r137011 r141303 100 100 } 101 101 102 void SVGImage::drawSVGToImageBuffer(ImageBuffer* buffer, const IntSize& size, float zoom, float scale, ShouldClearBuffer shouldClear)102 void SVGImage::drawSVGToImageBuffer(ImageBuffer* buffer, const FloatSize& size, float zoomAndScale, ShouldClearBuffer shouldClear) 103 103 { 104 104 // FIXME: This doesn't work correctly with animations. If an image contains animations, that say run for 2 seconds, … … 131 131 frame->view()->beginDisableRepaints(); 132 132 133 renderer->setContainerSize(size); 133 IntSize containerSize = roundedIntSize(size); 134 renderer->setContainerSize(containerSize); 134 135 frame->view()->resize(this->size()); 135 136 136 if (zoom != 1) 137 frame->setPageZoomFactor(zoom); 138 139 // Eventually clear image buffer. 140 IntRect rect(IntPoint(), size); 141 142 FloatRect scaledRect(rect); 143 scaledRect.scale(scale); 144 137 FloatSize scaledContainerSize(size); 138 scaledContainerSize.scale(zoomAndScale); 139 IntRect destRect = IntRect(IntPoint(), expandedIntSize(scaledContainerSize)); 145 140 if (shouldClear == ClearImageBuffer) 146 buffer->context()->clearRect( enclosingIntRect(scaledRect));141 buffer->context()->clearRect(destRect); 147 142 148 143 // Draw SVG on top of ImageBuffer. 149 draw(buffer->context(), enclosingIntRect(scaledRect), rect, ColorSpaceDeviceRGB, CompositeSourceOver, BlendModeNormal); 150 151 // Reset container size & zoom to initial state. Otherwhise the size() of this 152 // image would return whatever last size was set by drawSVGToImageBuffer(). 153 if (zoom != 1) 154 frame->setPageZoomFactor(1); 155 156 // Renderer may have been recreated by frame->setPageZoomFactor(zoom). So fetch it again. 157 renderer = toRenderSVGRoot(rootElement->renderer()); 158 if (renderer) 159 renderer->setContainerSize(IntSize()); 160 161 frame->view()->resize(this->size()); 144 draw(buffer->context(), destRect, IntRect(IntPoint(), containerSize), ColorSpaceDeviceRGB, CompositeSourceOver, BlendModeNormal); 145 162 146 if (frame->view()->needsLayout()) 163 147 frame->view()->layout(); -
trunk/Source/WebCore/svg/graphics/SVGImage.h
r137011 r141303 52 52 }; 53 53 54 void drawSVGToImageBuffer(ImageBuffer*, const IntSize&, float zoom, float scale, ShouldClearBuffer);54 void drawSVGToImageBuffer(ImageBuffer*, const FloatSize&, float, ShouldClearBuffer); 55 55 RenderBox* embeddedContentBox() const; 56 56 FrameView* frameView() const; -
trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp
r139236 r141303 76 76 } 77 77 78 void SVGImageCache::set RequestedSizeAndScales(const CachedImageClient* client, const SizeAndScales& sizeAndScales)78 void SVGImageCache::setContainerSizeForRenderer(const CachedImageClient* client, const IntSize& containerSize, float containerZoom) 79 79 { 80 80 ASSERT(client); 81 ASSERT(!sizeAndScales.size.isEmpty()); 82 m_sizeAndScalesMap.set(client, sizeAndScales); 83 } 84 85 SVGImageCache::SizeAndScales SVGImageCache::requestedSizeAndScales(const CachedImageClient* client) const 86 { 87 if (!client) 88 return SizeAndScales(); 89 SizeAndScalesMap::const_iterator it = m_sizeAndScalesMap.find(client); 81 ASSERT(!containerSize.isEmpty()); 82 83 FloatSize containerSizeWithoutZoom(containerSize); 84 containerSizeWithoutZoom.scale(1 / containerZoom); 85 m_sizeAndScalesMap.set(client, SizeAndScales(containerSizeWithoutZoom, containerZoom)); 86 } 87 88 IntSize SVGImageCache::imageSizeForRenderer(const RenderObject* renderer) const 89 { 90 IntSize imageSize = m_svgImage->size(); 91 92 if (!renderer) 93 return imageSize; 94 SizeAndScalesMap::const_iterator it = m_sizeAndScalesMap.find(renderer); 90 95 if (it == m_sizeAndScalesMap.end()) 91 return SizeAndScales(); 92 return it->value; 96 return imageSize; 97 98 SizeAndScales sizeAndScales = it->value; 99 if (!sizeAndScales.size.isEmpty()) { 100 float scale = sizeAndScales.scale; 101 if (!scale) { 102 Page* page = renderer->document()->page(); 103 scale = page->deviceScaleFactor() * page->pageScaleFactor(); 104 } 105 106 imageSize.setWidth(scale * sizeAndScales.size.width()); 107 imageSize.setHeight(scale * sizeAndScales.size.height()); 108 } 109 return imageSize; 93 110 } 94 111 … … 114 131 ASSERT(data.buffer); 115 132 ASSERT(data.image); 116 m_svgImage->drawSVGToImageBuffer(data.buffer, data.sizeAndScales.size, data.sizeAndScales.zoom ,data.sizeAndScales.scale, SVGImage::ClearImageBuffer);133 m_svgImage->drawSVGToImageBuffer(data.buffer, data.sizeAndScales.size, data.sizeAndScales.zoom * data.sizeAndScales.scale, SVGImage::ClearImageBuffer); 117 134 data.image = data.buffer->copyImage(CopyBackingStore); 118 135 data.imageNeedsUpdate = false; … … 151 168 return Image::nullImage(); 152 169 153 IntSize size = sizeIt->value.size;170 FloatSize size = sizeIt->value.size; 154 171 float zoom = sizeIt->value.zoom; 155 172 float scale = sizeIt->value.scale; … … 180 197 181 198 FloatSize scaledSize(size); 182 scaledSize.scale(scale );199 scaledSize.scale(scale * zoom); 183 200 184 201 // Create and cache new image and image buffer at requested size. … … 187 204 return Image::nullImage(); 188 205 189 m_svgImage->drawSVGToImageBuffer(newBuffer.get(), size, zoom, scale, SVGImage::DontClearImageBuffer);206 m_svgImage->drawSVGToImageBuffer(newBuffer.get(), size, scale * zoom, SVGImage::DontClearImageBuffer); 190 207 191 208 RefPtr<Image> newImage = newBuffer->copyImage(CopyBackingStore); -
trunk/Source/WebCore/svg/graphics/SVGImageCache.h
r139236 r141303 22 22 23 23 #if ENABLE(SVG) 24 #include "FloatSize.h" 24 25 #include "Image.h" 25 26 #include "IntSize.h" … … 54 55 } 55 56 56 SizeAndScales(const IntSize& newSize, float newZoom, float newScale)57 SizeAndScales(const FloatSize& newSize, float newZoom, float newScale) 57 58 : size(newSize) 58 59 , zoom(newZoom) … … 61 62 } 62 63 63 SizeAndScales(const IntSize& newSize, float newZoom)64 SizeAndScales(const FloatSize& newSize, float newZoom) 64 65 : size(newSize) 65 66 , zoom(newZoom) … … 68 69 } 69 70 70 IntSize size;71 FloatSize size; // This is the container size without zoom. 71 72 float zoom; 72 73 float scale; // A scale of 0 indicates that the default scale should be used. … … 75 76 void removeClientFromCache(const CachedImageClient*); 76 77 77 void set RequestedSizeAndScales(const CachedImageClient*, const SizeAndScales&);78 SizeAndScales requestedSizeAndScales(const CachedImageClient*) const;78 void setContainerSizeForRenderer(const CachedImageClient*, const IntSize&, float); 79 IntSize imageSizeForRenderer(const RenderObject*) const; 79 80 80 81 Image* lookupOrCreateBitmapImageForRenderer(const RenderObject*);
Note:
See TracChangeset
for help on using the changeset viewer.