Title: [120953] trunk
Revision
120953
Author
[email protected]
Date
2012-06-21 11:37:19 -0700 (Thu, 21 Jun 2012)

Log Message

SVGImageCache isn't invalidated for <img> on dynamic page scale changes
https://bugs.webkit.org/show_bug.cgi?id=89621
<rdar://problem/11714677>

Reviewed by Simon Fraser.

Previously, device and page scale factors were being cached as a part of the SVGImageCache's
size request. However, an <img> never has a reason to update its size request when the page
scale is changed via gesture zooming, as no layout occurs.

Instead, look up the relevant scales when the image is requested (which will occur during every
repaint), allowing page scale changes to take effect without requiring an updated size request.

Test: svg/as-image/image-respects-pageScaleFactor-change.html

* loader/cache/CachedImage.cpp:
(WebCore::CachedImage::lookupOrCreateImageForRenderer):
(WebCore::CachedImage::setContainerSizeForRenderer):
* svg/graphics/SVGImageCache.cpp:
(WebCore::SVGImageCache::lookupOrCreateBitmapImageForRenderer):
* svg/graphics/SVGImageCache.h:
(WebCore::SVGImageCache::SizeAndScales::SizeAndScales):
(SizeAndScales):

Add a test that ensures that dynamic changes to pageScaleFactor are propagated through
to the SVGImageCache.

* platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.png: Added.
* platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.txt: Added.
* svg/as-image/image-respects-pageScaleFactor-change.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (120952 => 120953)


--- trunk/LayoutTests/ChangeLog	2012-06-21 18:35:20 UTC (rev 120952)
+++ trunk/LayoutTests/ChangeLog	2012-06-21 18:37:19 UTC (rev 120953)
@@ -1,3 +1,18 @@
+2012-06-21  Tim Horton  <[email protected]>
+
+        SVGImageCache isn't invalidated for <img> on dynamic page scale changes
+        https://bugs.webkit.org/show_bug.cgi?id=89621
+        <rdar://problem/11714677>
+
+        Reviewed by Simon Fraser.
+
+        Add a test that ensures that dynamic changes to pageScaleFactor are propagated through
+        to the SVGImageCache.
+
+        * platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.png: Added.
+        * platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.txt: Added.
+        * svg/as-image/image-respects-pageScaleFactor-change.html: Added.
+
 2012-06-21  Beth Dakin  <[email protected]>
 
         Skipping this failing test. Filed 

Added: trunk/LayoutTests/platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.png


(Binary files differ)
Property changes on: trunk/LayoutTests/platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.png ___________________________________________________________________

Added: svn:mime-type

Added: trunk/LayoutTests/svg/as-image/image-respects-pageScaleFactor-change-expected.txt (0 => 120953)


--- trunk/LayoutTests/svg/as-image/image-respects-pageScaleFactor-change-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/svg/as-image/image-respects-pageScaleFactor-change-expected.txt	2012-06-21 18:37:19 UTC (rev 120953)
@@ -0,0 +1,4 @@
+ 
+This test passes if both of the circles have sharp edges.
+
+To run manually, use full-page zoom to increase the page scale factor.

Added: trunk/LayoutTests/svg/as-image/image-respects-pageScaleFactor-change.html (0 => 120953)


--- trunk/LayoutTests/svg/as-image/image-respects-pageScaleFactor-change.html	                        (rev 0)
+++ trunk/LayoutTests/svg/as-image/image-respects-pageScaleFactor-change.html	2012-06-21 18:37:19 UTC (rev 120953)
@@ -0,0 +1,32 @@
+<html>
+<head>
+    <script>
+    if (window.layoutTestController) {
+        layoutTestController.dumpAsText(1);
+        layoutTestController.waitUntilDone();
+    }
+    
+    function load() {
+        if (!window.internals)
+            return;
+
+        window.internals.settings.setPageScaleFactor(2, 0, 0);
+        
+        setTimeout(increasePageScale, 0);
+    }
+    
+    function increasePageScale() {
+        window.internals.settings.setPageScaleFactor(4, 0, 0);
+        
+        if (window.layoutTestController)
+            layoutTestController.notifyDone();
+    }
+
+    window._onload_ = load;
+    </script>
+</head>
+<img style="width: 32px;" src=""
+<img style="width: 128px;" src=""
+<p>This test passes if both of the circles have sharp edges.</p>
+<p>To run manually, use full-page zoom to increase the page scale factor.</p>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (120952 => 120953)


--- trunk/Source/WebCore/ChangeLog	2012-06-21 18:35:20 UTC (rev 120952)
+++ trunk/Source/WebCore/ChangeLog	2012-06-21 18:37:19 UTC (rev 120953)
@@ -1,3 +1,29 @@
+2012-06-21  Tim Horton  <[email protected]>
+
+        SVGImageCache isn't invalidated for <img> on dynamic page scale changes
+        https://bugs.webkit.org/show_bug.cgi?id=89621
+        <rdar://problem/11714677>
+
+        Reviewed by Simon Fraser.
+
+        Previously, device and page scale factors were being cached as a part of the SVGImageCache's
+        size request. However, an <img> never has a reason to update its size request when the page
+        scale is changed via gesture zooming, as no layout occurs.
+
+        Instead, look up the relevant scales when the image is requested (which will occur during every
+        repaint), allowing page scale changes to take effect without requiring an updated size request.
+
+        Test: svg/as-image/image-respects-pageScaleFactor-change.html
+
+        * loader/cache/CachedImage.cpp:
+        (WebCore::CachedImage::lookupOrCreateImageForRenderer):
+        (WebCore::CachedImage::setContainerSizeForRenderer):
+        * svg/graphics/SVGImageCache.cpp:
+        (WebCore::SVGImageCache::lookupOrCreateBitmapImageForRenderer):
+        * svg/graphics/SVGImageCache.h:
+        (WebCore::SVGImageCache::SizeAndScales::SizeAndScales):
+        (SizeAndScales):
+
 2012-06-21  Philip Rogers  <[email protected]>
 
         Add pending resource even if others are pending

Modified: trunk/Source/WebCore/loader/cache/CachedImage.cpp (120952 => 120953)


--- trunk/Source/WebCore/loader/cache/CachedImage.cpp	2012-06-21 18:35:20 UTC (rev 120952)
+++ trunk/Source/WebCore/loader/cache/CachedImage.cpp	2012-06-21 18:37:19 UTC (rev 120953)
@@ -151,7 +151,7 @@
         return 0;
     if (!m_image->isSVGImage())
         return m_image.get();
-    Image* useImage = m_svgImageCache->lookupOrCreateBitmapImageForClient(renderer);
+    Image* useImage = m_svgImageCache->lookupOrCreateBitmapImageForRenderer(renderer);
     if (useImage == Image::nullImage())
         return m_image.get();
     return useImage;
@@ -207,10 +207,7 @@
         return;
     }
 
-    // FIXME (85335): This needs to take CSS transform scale into account as well.
-    float containerScale = renderer->document()->page()->deviceScaleFactor() * renderer->document()->page()->pageScaleFactor();
-
-    m_svgImageCache->setRequestedSizeAndScales(renderer, SVGImageCache::SizeAndScales(containerSize, containerZoom, containerScale));
+    m_svgImageCache->setRequestedSizeAndScales(renderer, SVGImageCache::SizeAndScales(containerSize, containerZoom));
 #else
     UNUSED_PARAM(renderer);
     UNUSED_PARAM(containerZoom);

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp (120952 => 120953)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2012-06-21 18:35:20 UTC (rev 120952)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp	2012-06-21 18:37:19 UTC (rev 120953)
@@ -25,6 +25,7 @@
 #include "FrameView.h"
 #include "GraphicsContext.h"
 #include "ImageBuffer.h"
+#include "Page.h"
 #include "RenderSVGRoot.h"
 #include "SVGImage.h"
 
@@ -128,18 +129,25 @@
        redraw();
 }
 
-Image* SVGImageCache::lookupOrCreateBitmapImageForClient(const CachedImageClient* client)
+Image* SVGImageCache::lookupOrCreateBitmapImageForRenderer(const RenderObject* renderer)
 {
-    ASSERT(client);
+    ASSERT(renderer);
+    const CachedImageClient* client = renderer;
 
-    // The cache needs to know the size of the client before querying an image for it.
-    SizeAndScalesMap::iterator sizeIt = m_sizeAndScalesMap.find(client);
+    // The cache needs to know the size of the renderer before querying an image for it.
+    SizeAndScalesMap::iterator sizeIt = m_sizeAndScalesMap.find(renderer);
     if (sizeIt == m_sizeAndScalesMap.end())
         return Image::nullImage();
 
     IntSize size = sizeIt->second.size;
     float zoom = sizeIt->second.zoom;
     float scale = sizeIt->second.scale;
+
+    // FIXME (85335): This needs to take CSS transform scale into account as well.
+    Page* page = renderer->document()->page();
+    if (!scale)
+        scale = page->deviceScaleFactor() * page->pageScaleFactor();
+
     ASSERT(!size.isEmpty());
 
     // Lookup image for client in cache and eventually update it.
@@ -170,7 +178,7 @@
     Image* newImagePtr = newImage.get();
     ASSERT(newImagePtr);
 
-    m_imageDataMap.add(client, ImageData(newBuffer.leakPtr(), newImage.release(), sizeIt->second));
+    m_imageDataMap.add(client, ImageData(newBuffer.leakPtr(), newImage.release(), SizeAndScales(size, zoom, scale)));
     return newImagePtr;
 }
 

Modified: trunk/Source/WebCore/svg/graphics/SVGImageCache.h (120952 => 120953)


--- trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2012-06-21 18:35:20 UTC (rev 120952)
+++ trunk/Source/WebCore/svg/graphics/SVGImageCache.h	2012-06-21 18:37:19 UTC (rev 120953)
@@ -34,6 +34,7 @@
 class CachedImageClient;
 class ImageBuffer;
 class SVGImage;
+class RenderObject;
 
 class SVGImageCache {
 public:
@@ -47,7 +48,7 @@
     struct SizeAndScales {
         SizeAndScales()
             : zoom(1)
-            , scale(1)
+            , scale(0)
         {
         }
 
@@ -58,9 +59,16 @@
         {
         }
 
+        SizeAndScales(const IntSize& newSize, float newZoom)
+            : size(newSize)
+            , zoom(newZoom)
+            , scale(0)
+        {
+        }
+
         IntSize size;
         float zoom;
-        float scale;
+        float scale; // A scale of 0 indicates that the default scale should be used.
     };
 
     void removeClientFromCache(const CachedImageClient*);
@@ -68,7 +76,7 @@
     void setRequestedSizeAndScales(const CachedImageClient*, const SizeAndScales&);
     SizeAndScales requestedSizeAndScales(const CachedImageClient*) const;
 
-    Image* lookupOrCreateBitmapImageForClient(const CachedImageClient*);
+    Image* lookupOrCreateBitmapImageForRenderer(const RenderObject*);
     void imageContentChanged();
 
 private:
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to