Changeset 120953 in webkit


Ignore:
Timestamp:
Jun 21, 2012 11:37:19 AM (12 years ago)
Author:
timothy_horton@apple.com
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.
Location:
trunk
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r120952 r120953  
     12012-06-21  Tim Horton  <timothy_horton@apple.com>
     2
     3        SVGImageCache isn't invalidated for <img> on dynamic page scale changes
     4        https://bugs.webkit.org/show_bug.cgi?id=89621
     5        <rdar://problem/11714677>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Add a test that ensures that dynamic changes to pageScaleFactor are propagated through
     10        to the SVGImageCache.
     11
     12        * platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.png: Added.
     13        * platform/mac/svg/as-image/image-respects-pageScaleFactor-change-expected.txt: Added.
     14        * svg/as-image/image-respects-pageScaleFactor-change.html: Added.
     15
    1162012-06-21  Beth Dakin  <bdakin@apple.com>
    217
  • trunk/Source/WebCore/ChangeLog

    r120951 r120953  
     12012-06-21  Tim Horton  <timothy_horton@apple.com>
     2
     3        SVGImageCache isn't invalidated for <img> on dynamic page scale changes
     4        https://bugs.webkit.org/show_bug.cgi?id=89621
     5        <rdar://problem/11714677>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Previously, device and page scale factors were being cached as a part of the SVGImageCache's
     10        size request. However, an <img> never has a reason to update its size request when the page
     11        scale is changed via gesture zooming, as no layout occurs.
     12
     13        Instead, look up the relevant scales when the image is requested (which will occur during every
     14        repaint), allowing page scale changes to take effect without requiring an updated size request.
     15
     16        Test: svg/as-image/image-respects-pageScaleFactor-change.html
     17
     18        * loader/cache/CachedImage.cpp:
     19        (WebCore::CachedImage::lookupOrCreateImageForRenderer):
     20        (WebCore::CachedImage::setContainerSizeForRenderer):
     21        * svg/graphics/SVGImageCache.cpp:
     22        (WebCore::SVGImageCache::lookupOrCreateBitmapImageForRenderer):
     23        * svg/graphics/SVGImageCache.h:
     24        (WebCore::SVGImageCache::SizeAndScales::SizeAndScales):
     25        (SizeAndScales):
     26
    1272012-06-21  Philip Rogers  <pdr@google.com>
    228
  • trunk/Source/WebCore/loader/cache/CachedImage.cpp

    r120000 r120953  
    152152    if (!m_image->isSVGImage())
    153153        return m_image.get();
    154     Image* useImage = m_svgImageCache->lookupOrCreateBitmapImageForClient(renderer);
     154    Image* useImage = m_svgImageCache->lookupOrCreateBitmapImageForRenderer(renderer);
    155155    if (useImage == Image::nullImage())
    156156        return m_image.get();
     
    208208    }
    209209
    210     // FIXME (85335): This needs to take CSS transform scale into account as well.
    211     float containerScale = renderer->document()->page()->deviceScaleFactor() * renderer->document()->page()->pageScaleFactor();
    212 
    213     m_svgImageCache->setRequestedSizeAndScales(renderer, SVGImageCache::SizeAndScales(containerSize, containerZoom, containerScale));
     210    m_svgImageCache->setRequestedSizeAndScales(renderer, SVGImageCache::SizeAndScales(containerSize, containerZoom));
    214211#else
    215212    UNUSED_PARAM(renderer);
  • trunk/Source/WebCore/svg/graphics/SVGImageCache.cpp

    r120000 r120953  
    2626#include "GraphicsContext.h"
    2727#include "ImageBuffer.h"
     28#include "Page.h"
    2829#include "RenderSVGRoot.h"
    2930#include "SVGImage.h"
     
    129130}
    130131
    131 Image* SVGImageCache::lookupOrCreateBitmapImageForClient(const CachedImageClient* client)
     132Image* SVGImageCache::lookupOrCreateBitmapImageForRenderer(const RenderObject* renderer)
    132133{
    133     ASSERT(client);
     134    ASSERT(renderer);
     135    const CachedImageClient* client = renderer;
    134136
    135     // The cache needs to know the size of the client before querying an image for it.
    136     SizeAndScalesMap::iterator sizeIt = m_sizeAndScalesMap.find(client);
     137    // The cache needs to know the size of the renderer before querying an image for it.
     138    SizeAndScalesMap::iterator sizeIt = m_sizeAndScalesMap.find(renderer);
    137139    if (sizeIt == m_sizeAndScalesMap.end())
    138140        return Image::nullImage();
     
    141143    float zoom = sizeIt->second.zoom;
    142144    float scale = sizeIt->second.scale;
     145
     146    // FIXME (85335): This needs to take CSS transform scale into account as well.
     147    Page* page = renderer->document()->page();
     148    if (!scale)
     149        scale = page->deviceScaleFactor() * page->pageScaleFactor();
     150
    143151    ASSERT(!size.isEmpty());
    144152
     
    171179    ASSERT(newImagePtr);
    172180
    173     m_imageDataMap.add(client, ImageData(newBuffer.leakPtr(), newImage.release(), sizeIt->second));
     181    m_imageDataMap.add(client, ImageData(newBuffer.leakPtr(), newImage.release(), SizeAndScales(size, zoom, scale)));
    174182    return newImagePtr;
    175183}
  • trunk/Source/WebCore/svg/graphics/SVGImageCache.h

    r120000 r120953  
    3535class ImageBuffer;
    3636class SVGImage;
     37class RenderObject;
    3738
    3839class SVGImageCache {
     
    4849        SizeAndScales()
    4950            : zoom(1)
    50             , scale(1)
     51            , scale(0)
    5152        {
    5253        }
     
    5960        }
    6061
     62        SizeAndScales(const IntSize& newSize, float newZoom)
     63            : size(newSize)
     64            , zoom(newZoom)
     65            , scale(0)
     66        {
     67        }
     68
    6169        IntSize size;
    6270        float zoom;
    63         float scale;
     71        float scale; // A scale of 0 indicates that the default scale should be used.
    6472    };
    6573
     
    6977    SizeAndScales requestedSizeAndScales(const CachedImageClient*) const;
    7078
    71     Image* lookupOrCreateBitmapImageForClient(const CachedImageClient*);
     79    Image* lookupOrCreateBitmapImageForRenderer(const RenderObject*);
    7280    void imageContentChanged();
    7381
Note: See TracChangeset for help on using the changeset viewer.