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&) |