Ignore:
Timestamp:
Apr 6, 2012, 1:20:19 PM (13 years ago)
Author:
Beth Dakin
Message:

https://bugs.webkit.org/show_bug.cgi?id=81939
-webkit-image-set should update dynamically when the device scale factor
changes
-and corresponding-
<rdar://problem/11101108>

Reviewed by Darin Adler.

Source/WebCore:

New member variable to keep track of the scale factor.

  • css/CSSImageSetValue.cpp:

(WebCore::CSSImageSetValue::CSSImageSetValue):
(WebCore::CSSImageSetValue::bestImageForScaleFactor):

Merge the two cachedImageSet functions. There was no need for two functions here.

(WebCore::CSSImageSetValue::cachedImageSet):

cachedOrPendingImageSet() now takes a Document as a parameter so that it can
access the deviceScaleFactor. If there is a cached image already and the
Document's deviceScaleFactor doesn't match m_scaleFactor, then m_imageSet is set
to a pending image so that the best fit image will be reassessed and then
loaded.
(WebCore::CSSImageSetValue::cachedOrPendingImageSet):

  • css/CSSImageSetValue.h:

(WebCore):
(CSSImageSetValue):

cachedOrPendingImageSet() now takes a Document.

  • css/CSSStyleSelector.cpp:

(WebCore::CSSStyleSelector::collectMatchingRulesForList):

StyleCachedImageSet should inherit from CachedImageClient just like
StyleCachedImage. It should add and remove itself as a client upon creation
and destruction, respectively.

  • rendering/style/StyleCachedImageSet.cpp:

(WebCore::StyleCachedImageSet::StyleCachedImageSet):
(WebCore):
(WebCore::StyleCachedImageSet::~StyleCachedImageSet):

  • rendering/style/StyleCachedImageSet.h:

(StyleCachedImageSet):

LayoutTests:

  • fast/hidpi/image-set-background-dynamic.html: Added.
  • fast/hidpi/image-set-border-image-dynamic.html: Added.
  • fast/hidpi/image-set-in-content-dynamic.html: Added.
  • platform/mac/fast/hidpi/image-set-background-dynamic-expected.png: Added.
  • platform/mac/fast/hidpi/image-set-background-dynamic-expected.txt: Added.
  • platform/mac/fast/hidpi/image-set-border-image-dynamic-expected.png: Added.
  • platform/mac/fast/hidpi/image-set-border-image-dynamic-expected.txt: Added.
  • platform/mac/fast/hidpi/image-set-in-content-dynamic-expected.png: Added.
  • platform/mac/fast/hidpi/image-set-in-content-dynamic-expected.txt: Added.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/css/CSSImageSetValue.cpp

    r111637 r113490  
    4242    : CSSValueList(ImageSetClass, CommaSeparator)
    4343    , m_accessedBestFitImage(false)
     44    , m_scaleFactor(1)
    4445{
    4546}
     
    7576}
    7677
    77 CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor(float scaleFactor)
     78CSSImageSetValue::ImageWithScale CSSImageSetValue::bestImageForScaleFactor()
    7879{
    7980    ImageWithScale image;
     
    8182    for (size_t i = 0; i < numberOfImages; ++i) {
    8283        image = m_imagesInSet.at(i);
    83         if (image.scaleFactor >= scaleFactor)
     84        if (image.scaleFactor >= m_scaleFactor)
    8485            return image;
    8586    }
     
    8990StyleCachedImageSet* CSSImageSetValue::cachedImageSet(CachedResourceLoader* loader)
    9091{
     92    ASSERT(loader);
     93
    9194    Document* document = loader->document();
    92     float deviceScaleFactor = 1;
    9395    if (Page* page = document->page())
    94         deviceScaleFactor = page->deviceScaleFactor();
     96        m_scaleFactor = page->deviceScaleFactor();
     97    else
     98        m_scaleFactor = 1;
    9599
    96100    if (!m_imagesInSet.size())
    97101        fillImageSet();
    98102
    99     // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here.
    100     // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(),
    101     // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698
    102     return cachedImageSet(loader, bestImageForScaleFactor(deviceScaleFactor));
    103 }
    104 
    105 StyleCachedImageSet* CSSImageSetValue::cachedImageSet(CachedResourceLoader* loader, ImageWithScale image)
    106 {
    107     ASSERT(loader);
    108 
    109103    if (!m_accessedBestFitImage) {
     104        // FIXME: In the future, we want to take much more than deviceScaleFactor into acount here.
     105        // All forms of scale should be included: Page::pageScaleFactor(), Frame::pageZoomFactor(),
     106        // and any CSS transforms. https://bugs.webkit.org/show_bug.cgi?id=81698
     107        ImageWithScale image = bestImageForScaleFactor();
    110108        ResourceRequest request(loader->document()->completeURL(image.imageURL));
    111109        if (CachedImage* cachedImage = loader->requestImage(request)) {
     
    118116}
    119117
    120 StyleImage* CSSImageSetValue::cachedOrPendingImageSet()
     118StyleImage* CSSImageSetValue::cachedOrPendingImageSet(Document* document)
    121119{
    122120    if (!m_imageSet)
    123121        m_imageSet = StylePendingImage::create(this);
     122    else if (document && !m_imageSet->isPendingImage()) {
     123        float deviceScaleFactor = 1;
     124        if (Page* page = document->page())
     125            deviceScaleFactor = page->deviceScaleFactor();
     126
     127        // If the deviceScaleFactor has changed, we may not have the best image loaded, so we have to re-assess.
     128        if (deviceScaleFactor != m_scaleFactor) {
     129            m_accessedBestFitImage = false;
     130            m_imageSet = StylePendingImage::create(this);
     131        }
     132    }
    124133
    125134    return m_imageSet.get();
Note: See TracChangeset for help on using the changeset viewer.