Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(459)

Unified Diff: Source/core/css/CSSCrossfadeValue.cpp

Issue 1308953009: Move Image ownership out of CSSValue (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/CSSCrossfadeValue.h ('k') | Source/core/css/CSSCursorImageValue.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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&)
« no previous file with comments | « Source/core/css/CSSCrossfadeValue.h ('k') | Source/core/css/CSSCursorImageValue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698