Implement CSS3 Images cross-fade() image function
https://bugs.webkit.org/show_bug.cgi?id=52162
<rdar://problem/10209254>
Reviewed by Simon Fraser.
Render -webkit-cross-fade. Only cross-fades entirely composed of images will render for now,
cross-fades involving generated images are not yet implemented.
Reorganize GeneratedImage to be the base class for GeneratorGeneratedImage and CrossfadeGeneratedImage.
Add a pending state to CSSImageGeneratorValue, which is used to enable the pending-images loading
mechanism for -webkit-cross-fade's sub-images. Rework the logic in CSSStyleSelector to support pending
generated images.
Support parsing fractional values for the cross-fade amount (for example, 0.5 = 50%). Clamp cross-fade
amount to 0-1 range.
Tests: css3/images/cross-fade-invalidation.html
css3/images/cross-fade-simple.html
css3/images/cross-fade-sizing.html
css3/images/cross-fade-tiled.html
* CMakeLists.txt:
* GNUmakefile.list.am:
* Target.pri:
* WebCore.gypi:
* WebCore.xcodeproj/project.pbxproj:
* css/CSSCanvasValue.h:
(WebCore::CSSCanvasValue::isPending):
(WebCore::CSSCanvasValue::loadSubimages):
* css/CSSCrossfadeValue.cpp:
(WebCore::CSSCrossfadeValue::isPending):
(WebCore::CSSCrossfadeValue::loadSubimages):
(WebCore::subimageIsPending):
(WebCore::loadSubimage):
(WebCore::cachedImageForCSSValue):
(WebCore::CSSCrossfadeValue::image):
(WebCore::CSSCrossfadeValue::crossfadeChanged):
* css/CSSCrossfadeValue.h:
(WebCore::CSSCrossfadeValue::create):
(WebCore::CSSCrossfadeValue::~CSSCrossfadeValue):
(WebCore::CSSCrossfadeValue::fixedSize):
(WebCore::CSSCrossfadeValue::CSSCrossfadeValue):
(WebCore::CSSCrossfadeValue::CrossfadeObserverProxy::CrossfadeObserverProxy):
* css/CSSGradientValue.cpp:
(WebCore::CSSGradientValue::image):
* css/CSSGradientValue.h:
(WebCore::CSSGradientValue::isPending):
(WebCore::CSSGradientValue::loadSubimages):
* css/CSSImageGeneratorValue.cpp:
(WebCore::CSSImageGeneratorValue::generatedOrPendingImage):
(WebCore::CSSImageGeneratorValue::generatedImage):
(WebCore::CSSImageGeneratorValue::isPending):
(WebCore::CSSImageGeneratorValue::loadSubimages):
* css/CSSImageGeneratorValue.h:
* css/CSSParser.cpp:
(WebCore::CSSParser::parseCrossfade):
* css/CSSStyleSelector.cpp:
(WebCore::CSSStyleSelector::styleImage):
(WebCore::CSSStyleSelector::generatedOrPendingFromValue):
(WebCore::CSSStyleSelector::loadPendingImage):
(WebCore::CSSStyleSelector::loadPendingImages):
* css/CSSStyleSelector.h:
* platform/graphics/BitmapImage.h:
* platform/graphics/CrossfadeGeneratedImage.cpp: Added.
(WebCore::CrossfadeGeneratedImage::CrossfadeGeneratedImage):
(WebCore::CrossfadeGeneratedImage::~CrossfadeGeneratedImage):
(WebCore::CrossfadeGeneratedImage::drawCrossfade):
(WebCore::CrossfadeGeneratedImage::draw):
(WebCore::CrossfadeGeneratedImage::drawPattern):
(WebCore::CrossfadeGeneratedImage::imageChanged):
* platform/graphics/CrossfadeGeneratedImage.h: Added.
(WebCore::CrossfadeGeneratedImage::create):
(WebCore::CrossfadeSubimageObserverProxy::CrossfadeSubimageObserverProxy):
(WebCore::CrossfadeSubimageObserverProxy::setReady):
* platform/graphics/GeneratedImage.h:
(WebCore::GeneratedImage::GeneratedImage):
* platform/graphics/GeneratorGeneratedImage.cpp: Renamed from Source/WebCore/platform/graphics/GeneratedImage.cpp.
(WebCore::GeneratorGeneratedImage::draw):
(WebCore::GeneratorGeneratedImage::drawPattern):
(WebCore::GeneratedImage::computeIntrinsicDimensions):
* platform/graphics/GeneratorGeneratedImage.h: Copied from Source/WebCore/platform/graphics/GeneratedImage.h.
(WebCore::GeneratorGeneratedImage::create):
(WebCore::GeneratorGeneratedImage::~GeneratorGeneratedImage):
(WebCore::GeneratorGeneratedImage::GeneratorGeneratedImage):
* platform/graphics/Image.h:
* platform/graphics/ImageBuffer.h:
* rendering/style/StylePendingImage.h:
(WebCore::StylePendingImage::create):
(WebCore::StylePendingImage::data):
(WebCore::StylePendingImage::cssImageValue):
(WebCore::StylePendingImage::cssImageGeneratorValue):
(WebCore::StylePendingImage::StylePendingImage):
Add tests of -webkit-cross-fade, ensuring that simple cross-fades between
two images work correctly.
Adjust fast/css/getComputedStyle/computed-style-cross-fade.html to test
fractional and out-of-range cross-fade percentage values.
* css3/images/cross-fade-invalidation.html: Added.
* css3/images/cross-fade-simple.html: Added.
* css3/images/cross-fade-sizing.html: Added.
* css3/images/cross-fade-tiled.html: Added.
* css3/images/resources/blue-10.png: Added.
* css3/images/resources/blue-100.png: Added.
* css3/images/resources/green-10.png: Added.
* css3/images/resources/green-100.png: Added.
* css3/images/resources/green-circle.svg: Added.
* css3/images/resources/red-10.png: Added.
* css3/images/resources/red-100.png: Added.
* fast/css/getComputedStyle/computed-style-cross-fade-expected.txt:
* fast/css/getComputedStyle/computed-style-cross-fade.html:
* platform/mac/css3/images/cross-fade-invalidation-expected.png: Added.
* platform/mac/css3/images/cross-fade-invalidation-expected.txt: Added.
* platform/mac/css3/images/cross-fade-simple-expected.png: Added.
* platform/mac/css3/images/cross-fade-simple-expected.txt: Added.
* platform/mac/css3/images/cross-fade-sizing-expected.png: Added.
* platform/mac/css3/images/cross-fade-sizing-expected.txt: Added.
* platform/mac/css3/images/cross-fade-tiled-expected.png: Added.
* platform/mac/css3/images/cross-fade-tiled-expected.txt: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@100535 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/css/CSSImageGeneratorValue.h b/Source/WebCore/css/CSSImageGeneratorValue.h
index d0eb65b..1ab4474 100644
--- a/Source/WebCore/css/CSSImageGeneratorValue.h
+++ b/Source/WebCore/css/CSSImageGeneratorValue.h
@@ -33,9 +33,11 @@
namespace WebCore {
+class CachedResourceLoader;
class Image;
class RenderObject;
class StyleGeneratedImage;
+class StyleImage;
struct SizeAndCount {
SizeAndCount(IntSize newSize = IntSize(), int newCount = 0)
@@ -58,11 +60,16 @@
void removeClient(RenderObject*);
PassRefPtr<Image> image(RenderObject*, const IntSize&);
+ StyleImage* generatedOrPendingImage();
StyleGeneratedImage* generatedImage();
bool isFixedSize() const;
IntSize fixedSize(const RenderObject*);
+ bool isPending() const;
+
+ void loadSubimages(CachedResourceLoader*);
+
protected:
CSSImageGeneratorValue(ClassType);
@@ -70,7 +77,7 @@
void putImage(const IntSize&, PassRefPtr<Image>);
const RenderObjectSizeCountMap& clients() const { return m_clients; }
- RefPtr<StyleGeneratedImage> m_image;
+ RefPtr<StyleImage> m_image;
bool m_accessedImage;
HashCountedSet<IntSize> m_sizes; // A count of how many times a given image size is in use.