| Index: Source/core/css/CSSCrossfadeValue.cpp
|
| diff --git a/Source/core/css/CSSCrossfadeValue.cpp b/Source/core/css/CSSCrossfadeValue.cpp
|
| index 5afe76a4aa1152e353b0b620208c8ca86e232214..f9a007e37cb0ab2cb7eadeba2cd8418210115e25 100644
|
| --- a/Source/core/css/CSSCrossfadeValue.cpp
|
| +++ b/Source/core/css/CSSCrossfadeValue.cpp
|
| @@ -34,13 +34,13 @@
|
|
|
| namespace blink {
|
|
|
| -static bool subimageIsPending(CSSValue* value)
|
| +static bool subimageIsPending(CSSStyleImageMap& imageMap, CSSValue* value)
|
| {
|
| if (value->isImageValue())
|
| - return toCSSImageValue(value)->cachedOrPendingImage()->isPendingImage();
|
| + return toCSSImageValue(value)->cachedOrPendingImage(imageMap)->isPendingImage();
|
|
|
| if (value->isImageGeneratorValue())
|
| - return toCSSImageGeneratorValue(value)->isPending();
|
| + return toCSSImageGeneratorValue(value)->isPending(imageMap);
|
|
|
| ASSERT_NOT_REACHED();
|
|
|
| @@ -60,13 +60,13 @@ static bool subimageKnownToBeOpaque(CSSValue* value, const LayoutObject* layoutO
|
| return false;
|
| }
|
|
|
| -static ImageResource* cachedImageForCSSValue(CSSValue* value, Document* document)
|
| +static ImageResource* cachedImageForCSSValue(CSSValue* value, Document* document, CSSStyleImageMap& imageMap)
|
| {
|
| if (!value)
|
| return 0;
|
|
|
| if (value->isImageValue()) {
|
| - StyleFetchedImage* styleImageResource = toCSSImageValue(value)->cachedImage(document);
|
| + StyleFetchedImage* styleImageResource = toCSSImageValue(value)->cachedImage(document, imageMap);
|
| if (!styleImageResource)
|
| return 0;
|
|
|
| @@ -74,7 +74,7 @@ static ImageResource* cachedImageForCSSValue(CSSValue* value, Document* document
|
| }
|
|
|
| if (value->isImageGeneratorValue()) {
|
| - toCSSImageGeneratorValue(value)->loadSubimages(document);
|
| + toCSSImageGeneratorValue(value)->loadSubimages(document, imageMap);
|
| // FIXME: Handle CSSImageGeneratorValue (and thus cross-fades with gradients and canvas).
|
| return 0;
|
| }
|
| @@ -111,8 +111,8 @@ IntSize CSSCrossfadeValue::fixedSize(const LayoutObject* layoutObject)
|
| float inversePercentage = 1 - percentage;
|
|
|
| Document* document = &layoutObject->document();
|
| - ImageResource* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document);
|
| - ImageResource* cachedToImage = cachedImageForCSSValue(m_toValue.get(), document);
|
| + ImageResource* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document, layoutObject->mutableStyle()->mutableCssImages());
|
| + ImageResource* cachedToImage = cachedImageForCSSValue(m_toValue.get(), document, layoutObject->mutableStyle()->mutableCssImages());
|
|
|
| if (!cachedFromImage || !cachedToImage)
|
| return IntSize();
|
| @@ -129,9 +129,9 @@ IntSize CSSCrossfadeValue::fixedSize(const LayoutObject* layoutObject)
|
| fromImageSize.height() * inversePercentage + toImageSize.height() * percentage);
|
| }
|
|
|
| -bool CSSCrossfadeValue::isPending() const
|
| +bool CSSCrossfadeValue::isPending(CSSStyleImageMap& imageMap) const
|
| {
|
| - return subimageIsPending(m_fromValue.get()) || subimageIsPending(m_toValue.get());
|
| + return subimageIsPending(imageMap, m_fromValue.get()) || subimageIsPending(imageMap, m_toValue.get());
|
| }
|
|
|
| bool CSSCrossfadeValue::knownToBeOpaque(const LayoutObject* layoutObject) const
|
| @@ -139,28 +139,31 @@ bool CSSCrossfadeValue::knownToBeOpaque(const LayoutObject* layoutObject) const
|
| return subimageKnownToBeOpaque(m_fromValue.get(), layoutObject) && subimageKnownToBeOpaque(m_toValue.get(), layoutObject);
|
| }
|
|
|
| -void CSSCrossfadeValue::loadSubimages(Document* document)
|
| +void CSSCrossfadeValue::loadSubimages(Document* document, CSSStyleImageMap& imageMap)
|
| {
|
| - ResourcePtr<ImageResource> oldCachedFromImage = m_cachedFromImage;
|
| - ResourcePtr<ImageResource> oldCachedToImage = m_cachedToImage;
|
| + ResourcePtr<ImageResource>& oldCachedFromImage = imageMap.getImageResourceEntry(this).storedValue->value;
|
| + ResourcePtr<ImageResource>& oldCachedToImage = imageMap.getImageResourceEntry(reinterpret_cast<CSSCrossfadeValue*>(reinterpret_cast<uintptr_t>(this) & 1)).storedValue->value;
|
|
|
| - m_cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document);
|
| - m_cachedToImage = cachedImageForCSSValue(m_toValue.get(), document);
|
| + ResourcePtr<ImageResource> cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document, imageMap);
|
| + ResourcePtr<ImageResource> cachedToImage = cachedImageForCSSValue(m_toValue.get(), document, imageMap);
|
|
|
| - if (m_cachedFromImage != oldCachedFromImage) {
|
| + if (cachedFromImage != oldCachedFromImage) {
|
| if (oldCachedFromImage)
|
| oldCachedFromImage->removeClient(&m_crossfadeSubimageObserver);
|
| - if (m_cachedFromImage)
|
| - m_cachedFromImage->addClient(&m_crossfadeSubimageObserver);
|
| + if (cachedFromImage)
|
| + cachedFromImage->addClient(&m_crossfadeSubimageObserver);
|
| }
|
|
|
| - if (m_cachedToImage != oldCachedToImage) {
|
| + if (cachedToImage != oldCachedToImage) {
|
| if (oldCachedToImage)
|
| oldCachedToImage->removeClient(&m_crossfadeSubimageObserver);
|
| - if (m_cachedToImage)
|
| - m_cachedToImage->addClient(&m_crossfadeSubimageObserver);
|
| + if (cachedToImage)
|
| + cachedToImage->addClient(&m_crossfadeSubimageObserver);
|
| }
|
|
|
| + oldCachedFromImage = cachedFromImage;
|
| + oldCachedToImage = cachedToImage;
|
| +
|
| m_crossfadeSubimageObserver.setReady(true);
|
| }
|
|
|
| @@ -170,8 +173,8 @@ PassRefPtr<Image> CSSCrossfadeValue::image(LayoutObject* layoutObject, const Int
|
| return nullptr;
|
|
|
| Document* document = &layoutObject->document();
|
| - ImageResource* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document);
|
| - ImageResource* cachedToImage = cachedImageForCSSValue(m_toValue.get(), document);
|
| + ImageResource* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document, layoutObject->mutableStyle()->mutableCssImages());
|
| + ImageResource* cachedToImage = cachedImageForCSSValue(m_toValue.get(), document, layoutObject->mutableStyle()->mutableCssImages());
|
|
|
| if (!cachedFromImage || !cachedToImage)
|
| return Image::nullImage();
|
| @@ -182,9 +185,10 @@ PassRefPtr<Image> CSSCrossfadeValue::image(LayoutObject* layoutObject, const Int
|
| if (!fromImage || !toImage)
|
| return Image::nullImage();
|
|
|
| - m_generatedImage = CrossfadeGeneratedImage::create(fromImage, toImage, m_percentageValue->getFloatValue(), fixedSize(layoutObject), size);
|
| + RefPtr<Image>& generatedImage = layoutObject->mutableStyle()->mutableCssImages().getImageEntry(this).storedValue->value;
|
| + generatedImage = CrossfadeGeneratedImage::create(fromImage, toImage, m_percentageValue->getFloatValue(), fixedSize(layoutObject), size);
|
|
|
| - return m_generatedImage.release();
|
| + return generatedImage.release();
|
| }
|
|
|
| void CSSCrossfadeValue::crossfadeChanged(const IntRect&)
|
|
|