Changeset 101546 in webkit
- Timestamp:
- Nov 30, 2011 1:20:12 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r101545 r101546 1 2011-11-30 Tim Horton <timothy_horton@apple.com> 2 3 Implement CSS3 Images cross-fade() image function 4 https://bugs.webkit.org/show_bug.cgi?id=52162 5 <rdar://problem/10209254> 6 7 Reviewed by Simon Fraser. 8 9 Fix platform layering violation by moving CachedImage invalidation code into 10 CSSCrossfadeValue (instead of CrossfadeGeneratedImage). 11 12 No new tests. 13 14 * css/CSSCrossfadeValue.cpp: 15 (WebCore::loadSubimage): 16 (WebCore::CSSCrossfadeValue::~CSSCrossfadeValue): 17 (WebCore::CSSCrossfadeValue::customCssText): 18 (WebCore::CSSCrossfadeValue::fixedSize): 19 (WebCore::CSSCrossfadeValue::isPending): 20 (WebCore::CSSCrossfadeValue::loadSubimages): 21 (WebCore::CSSCrossfadeValue::image): 22 (WebCore::CSSCrossfadeValue::CrossfadeSubimageObserverProxy::imageChanged): 23 * css/CSSCrossfadeValue.h: 24 (WebCore::CSSCrossfadeValue::create): 25 (WebCore::CSSCrossfadeValue::setPercentage): 26 (WebCore::CSSCrossfadeValue::CSSCrossfadeValue): 27 (WebCore::CSSCrossfadeValue::CrossfadeSubimageObserverProxy::CrossfadeSubimageObserverProxy): 28 (WebCore::CSSCrossfadeValue::CrossfadeSubimageObserverProxy::~CrossfadeSubimageObserverProxy): 29 (WebCore::CSSCrossfadeValue::CrossfadeSubimageObserverProxy::setReady): 30 * platform/graphics/CrossfadeGeneratedImage.cpp: 31 (WebCore::CrossfadeGeneratedImage::CrossfadeGeneratedImage): 32 (WebCore::CrossfadeGeneratedImage::drawCrossfade): 33 (WebCore::CrossfadeGeneratedImage::drawPattern): 34 * platform/graphics/CrossfadeGeneratedImage.h: 35 (WebCore::CrossfadeGeneratedImage::create): 36 1 37 2011-11-30 Vsevolod Vlasov <vsevik@chromium.org> 2 38 -
trunk/Source/WebCore/css/CSSCrossfadeValue.cpp
r100535 r101546 51 51 } 52 52 53 static void loadSubimage(CSSValue* value, CachedResourceLoader* cachedResourceLoader)53 static CachedImage* cachedImageForCSSValue(CSSValue* value, CachedResourceLoader* cachedResourceLoader) 54 54 { 55 55 if (value->isImageValue()) { 56 static_cast<CSSImageValue*>(value)->cachedImage(cachedResourceLoader); 57 return; 56 StyleCachedImage* styleCachedImage = static_cast<CSSImageValue*>(value)->cachedImage(cachedResourceLoader); 57 if (!styleCachedImage) 58 return 0; 59 60 return styleCachedImage->cachedImage(); 58 61 } 59 62 60 63 if (value->isImageGeneratorValue()) { 61 64 static_cast<CSSImageGeneratorValue*>(value)->loadSubimages(cachedResourceLoader); 62 return;63 }64 65 ASSERT_NOT_REACHED();66 }67 68 static CachedImage* cachedImageForCSSValue(CSSValue* value, const RenderObject* renderer)69 {70 CachedResourceLoader* cachedResourceLoader = renderer->document()->cachedResourceLoader();71 72 if (value->isImageValue())73 return static_cast<CSSImageValue*>(value)->cachedImage(cachedResourceLoader)->cachedImage();74 75 if (value->isImageGeneratorValue()) {76 65 // FIXME: Handle CSSImageGeneratorValue (and thus cross-fades with gradients and canvas). 77 66 return 0; … … 83 72 } 84 73 74 CSSCrossfadeValue::~CSSCrossfadeValue() 75 { 76 if (m_cachedFromImage) 77 m_cachedFromImage->removeClient(&m_crossfadeSubimageObserver); 78 if (m_cachedToImage) 79 m_cachedToImage->removeClient(&m_crossfadeSubimageObserver); 80 } 81 85 82 String CSSCrossfadeValue::customCssText() const 86 83 { 87 84 String result = "-webkit-cross-fade("; 88 result += m_from Image->cssText() + ", ";89 result += m_to Image->cssText() + ", ";90 result += m_percentage ->cssText();85 result += m_fromValue->cssText() + ", "; 86 result += m_toValue->cssText() + ", "; 87 result += m_percentageValue->cssText(); 91 88 result += ")"; 92 89 return result; … … 95 92 IntSize CSSCrossfadeValue::fixedSize(const RenderObject* renderer) 96 93 { 97 float percentage = m_percentage ->getFloatValue();94 float percentage = m_percentageValue->getFloatValue(); 98 95 float inversePercentage = 1 - percentage; 99 96 100 CachedImage* fromImage = cachedImageForCSSValue(m_fromImage.get(), renderer); 101 CachedImage* toImage = cachedImageForCSSValue(m_toImage.get(), renderer); 97 CachedResourceLoader* cachedResourceLoader = renderer->document()->cachedResourceLoader(); 98 CachedImage* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), cachedResourceLoader); 99 CachedImage* cachedToImage = cachedImageForCSSValue(m_toValue.get(), cachedResourceLoader); 102 100 103 if (! fromImage || !toImage)101 if (!cachedFromImage || !cachedToImage) 104 102 return IntSize(); 105 103 106 IntSize fromImageSize = fromImage->image()->size();107 IntSize toImageSize = toImage->image()->size();104 IntSize fromImageSize = cachedFromImage->imageForRenderer(renderer)->size(); 105 IntSize toImageSize = cachedToImage->imageForRenderer(renderer)->size(); 108 106 109 107 return IntSize(fromImageSize.width() * inversePercentage + toImageSize.width() * percentage, … … 113 111 bool CSSCrossfadeValue::isPending() const 114 112 { 115 return subimageIsPending(m_from Image.get()) || subimageIsPending(m_toImage.get());113 return subimageIsPending(m_fromValue.get()) || subimageIsPending(m_toValue.get()); 116 114 } 117 115 118 116 void CSSCrossfadeValue::loadSubimages(CachedResourceLoader* cachedResourceLoader) 119 117 { 120 loadSubimage(m_fromImage.get(), cachedResourceLoader); 121 loadSubimage(m_toImage.get(), cachedResourceLoader); 118 m_cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), cachedResourceLoader); 119 m_cachedToImage = cachedImageForCSSValue(m_toValue.get(), cachedResourceLoader); 120 121 if (m_cachedFromImage) 122 m_cachedFromImage->addClient(&m_crossfadeSubimageObserver); 123 if (m_cachedToImage) 124 m_cachedToImage->addClient(&m_crossfadeSubimageObserver); 125 126 m_crossfadeSubimageObserver.setReady(true); 122 127 } 123 128 … … 127 132 return 0; 128 133 129 CachedImage* fromImage = cachedImageForCSSValue(m_fromImage.get(), renderer); 130 CachedImage* toImage = cachedImageForCSSValue(m_toImage.get(), renderer); 134 CachedResourceLoader* cachedResourceLoader = renderer->document()->cachedResourceLoader(); 135 CachedImage* cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), cachedResourceLoader); 136 CachedImage* cachedToImage = cachedImageForCSSValue(m_toValue.get(), cachedResourceLoader); 137 138 if (!cachedFromImage || !cachedToImage) 139 return Image::nullImage(); 140 141 Image* fromImage = cachedFromImage->imageForRenderer(renderer); 142 Image* toImage = cachedToImage->imageForRenderer(renderer); 131 143 132 144 if (!fromImage || !toImage) 133 145 return Image::nullImage(); 134 146 135 m_generatedImage = CrossfadeGeneratedImage::create(fromImage, toImage, m_percentage ->getFloatValue(), &m_crossfadeObserver, fixedSize(renderer), size);147 m_generatedImage = CrossfadeGeneratedImage::create(fromImage, toImage, m_percentageValue->getFloatValue(), fixedSize(renderer), size); 136 148 137 149 return m_generatedImage.get(); 138 150 } 139 151 140 void CSSCrossfadeValue::crossfadeChanged(const IntRect& rect)152 void CSSCrossfadeValue::crossfadeChanged(const IntRect&) 141 153 { 142 UNUSED_PARAM(rect);143 144 154 RenderObjectSizeCountMap::const_iterator end = clients().end(); 145 155 for (RenderObjectSizeCountMap::const_iterator curr = clients().begin(); curr != end; ++curr) { … … 149 159 } 150 160 161 void CSSCrossfadeValue::CrossfadeSubimageObserverProxy::imageChanged(CachedImage*, const IntRect* rect) 162 { 163 if (m_ready) 164 m_ownerValue->crossfadeChanged(*rect); 165 } 166 151 167 } // namespace WebCore -
trunk/Source/WebCore/css/CSSCrossfadeValue.h
r100535 r101546 27 27 #define CSSCrossfadeValue_h 28 28 29 #include "CachedImage.h" 29 30 #include "CSSImageGeneratorValue.h" 30 31 #include "CSSPrimitiveValue.h" … … 35 36 36 37 class CachedImage; 38 class CrossfadeSubimageObserverProxy; 37 39 class RenderObject; 38 40 class Document; 39 41 40 42 class CSSCrossfadeValue : public CSSImageGeneratorValue { 43 friend class CrossfadeSubimageObserverProxy; 41 44 public: 42 static PassRefPtr<CSSCrossfadeValue> create(PassRefPtr<CSSValue> from Image, PassRefPtr<CSSValue> toImage)45 static PassRefPtr<CSSCrossfadeValue> create(PassRefPtr<CSSValue> fromValue, PassRefPtr<CSSValue> toValue) 43 46 { 44 return adoptRef(new CSSCrossfadeValue(from Image, toImage));47 return adoptRef(new CSSCrossfadeValue(fromValue, toValue)); 45 48 } 49 50 ~CSSCrossfadeValue(); 46 51 47 52 String customCssText() const; … … 54 59 void loadSubimages(CachedResourceLoader*); 55 60 56 void setPercentage(PassRefPtr<CSSPrimitiveValue> percentage ) { m_percentage = percentage; }61 void setPercentage(PassRefPtr<CSSPrimitiveValue> percentageValue) { m_percentageValue = percentageValue; } 57 62 58 63 private: 59 CSSCrossfadeValue(PassRefPtr<CSSValue> from Image, PassRefPtr<CSSValue> toImage)64 CSSCrossfadeValue(PassRefPtr<CSSValue> fromValue, PassRefPtr<CSSValue> toValue) 60 65 : CSSImageGeneratorValue(CrossfadeClass) 61 , m_fromImage(fromImage) 62 , m_toImage(toImage) 63 , m_crossfadeObserver(this) { } 66 , m_fromValue(fromValue) 67 , m_toValue(toValue) 68 , m_cachedFromImage(0) 69 , m_cachedToImage(0) 70 , m_crossfadeSubimageObserver(this) { } 64 71 65 class Crossfade ObserverProxy : public ImageObserver{72 class CrossfadeSubimageObserverProxy : public CachedImageClient { 66 73 public: 67 Crossfade ObserverProxy(CSSCrossfadeValue* ownerValue) : m_ownerValue(ownerValue) { }68 virtual ~CrossfadeObserverProxy() { }69 virtual void changedInRect(const Image*, const IntRect& rect) OVERRIDE { m_ownerValue->crossfadeChanged(rect); };70 virtual bool shouldPauseAnimation(const Image*) OVERRIDE { return false; } 71 virtual void didDraw(const Image*) OVERRIDE{ }72 virtual void animationAdvanced(const Image*) OVERRIDE { }73 v irtual void decodedSizeChanged(const Image*, int) OVERRIDE {}74 CrossfadeSubimageObserverProxy(CSSCrossfadeValue* ownerValue) 75 : m_ownerValue(ownerValue) 76 , m_ready(false) { } 77 78 virtual ~CrossfadeSubimageObserverProxy() { } 79 virtual void imageChanged(CachedImage*, const IntRect* = 0) OVERRIDE; 80 void setReady(bool ready) { m_ready = ready; } 74 81 private: 75 82 CSSCrossfadeValue* m_ownerValue; 83 bool m_ready; 76 84 }; 77 85 78 86 void crossfadeChanged(const IntRect&); 79 87 80 RefPtr<CSSValue> m_fromImage; 81 RefPtr<CSSValue> m_toImage; 82 RefPtr<CSSPrimitiveValue> m_percentage; 88 RefPtr<CSSValue> m_fromValue; 89 RefPtr<CSSValue> m_toValue; 90 RefPtr<CSSPrimitiveValue> m_percentageValue; 91 92 CachedImage* m_cachedFromImage; 93 CachedImage* m_cachedToImage; 83 94 84 95 RefPtr<Image> m_generatedImage; 85 96 86 Crossfade ObserverProxy m_crossfadeObserver;97 CrossfadeSubimageObserverProxy m_crossfadeSubimageObserver; 87 98 }; 88 99 -
trunk/Source/WebCore/platform/graphics/CrossfadeGeneratedImage.cpp
r100786 r101546 27 27 #include "CrossfadeGeneratedImage.h" 28 28 29 #include "CSSCrossfadeValue.h"30 29 #include "FloatRect.h" 31 30 #include "GraphicsContext.h" … … 36 35 namespace WebCore { 37 36 38 CrossfadeGeneratedImage::CrossfadeGeneratedImage( CachedImage* fromImage, CachedImage* toImage, float percentage, ImageObserver* observer, IntSize crossfadeSize, const IntSize& size)37 CrossfadeGeneratedImage::CrossfadeGeneratedImage(Image* fromImage, Image* toImage, float percentage, IntSize crossfadeSize, const IntSize& size) 39 38 : m_fromImage(fromImage) 40 39 , m_toImage(toImage) 41 40 , m_percentage(percentage) 42 41 , m_crossfadeSize(crossfadeSize) 43 , m_observer(observer)44 , m_crossfadeSubimageObserver(adoptPtr(new CrossfadeSubimageObserverProxy(this)))45 42 { 46 43 m_size = size; 47 48 m_fromImage->addClient(m_crossfadeSubimageObserver.get());49 m_toImage->addClient(m_crossfadeSubimageObserver.get());50 51 m_crossfadeSubimageObserver->setReady(true);52 }53 54 CrossfadeGeneratedImage::~CrossfadeGeneratedImage()55 {56 m_fromImage->removeClient(m_crossfadeSubimageObserver.get());57 m_toImage->removeClient(m_crossfadeSubimageObserver.get());58 44 } 59 45 … … 62 48 float inversePercentage = 1 - m_percentage; 63 49 64 Image* fromImage = m_fromImage->image(); 65 IntSize fromImageSize = fromImage->size(); 66 Image* toImage = m_toImage->image(); 67 IntSize toImageSize = toImage->size(); 50 IntSize fromImageSize = m_fromImage->size(); 51 IntSize toImageSize = m_toImage->size(); 68 52 69 53 // Draw nothing if either of the images hasn't loaded yet. 70 if ( fromImage == Image::nullImage() ||toImage == Image::nullImage())54 if (m_fromImage == Image::nullImage() || m_toImage == Image::nullImage()) 71 55 return; 72 56 … … 84 68 -srcRect.y() * fromImageSize.height() / static_cast<float>(m_crossfadeSize.height())); 85 69 context->setAlpha(inversePercentage); 86 context->drawImage( fromImage, ColorSpaceDeviceRGB, IntPoint());70 context->drawImage(m_fromImage, ColorSpaceDeviceRGB, IntPoint()); 87 71 context->restore(); 88 72 … … 95 79 -srcRect.y() * toImageSize.height() / static_cast<float>(m_crossfadeSize.height())); 96 80 context->setAlpha(m_percentage); 97 context->drawImage( toImage, ColorSpaceDeviceRGB, IntPoint(), CompositePlusLighter);81 context->drawImage(m_toImage, ColorSpaceDeviceRGB, IntPoint(), CompositePlusLighter); 98 82 context->restore(); 99 83 … … 125 109 imageBuffer->drawPattern(context, srcRect, patternTransform, phase, styleColorSpace, compositeOp, destRect); 126 110 } 127 128 void CrossfadeSubimageObserverProxy::imageChanged(CachedImage* image, const IntRect* rect)129 {130 if (m_ready)131 m_ownerValue->imageChanged(image, rect);132 }133 134 void CrossfadeGeneratedImage::imageChanged(CachedImage* image, const IntRect* rect)135 {136 UNUSED_PARAM(image);137 m_observer->changedInRect(this, *rect);138 }139 111 140 112 } -
trunk/Source/WebCore/platform/graphics/CrossfadeGeneratedImage.h
r100786 r101546 27 27 #define CrossfadeGeneratedImage_h 28 28 29 #include "CachedImage.h"30 29 #include "GeneratedImage.h" 31 30 #include "Image.h" … … 37 36 38 37 class CSSCrossfadeValue; 39 class CrossfadeSubimageObserverProxy;40 38 41 39 class CrossfadeGeneratedImage : public GeneratedImage { 42 friend class CrossfadeSubimageObserverProxy;43 40 public: 44 static PassRefPtr<CrossfadeGeneratedImage> create( CachedImage* fromImage, CachedImage* toImage, float percentage, ImageObserver* observer, IntSize crossfadeSize, const IntSize& size)41 static PassRefPtr<CrossfadeGeneratedImage> create(Image* fromImage, Image* toImage, float percentage, IntSize crossfadeSize, const IntSize& size) 45 42 { 46 return adoptRef(new CrossfadeGeneratedImage(fromImage, toImage, percentage, observer,crossfadeSize, size));43 return adoptRef(new CrossfadeGeneratedImage(fromImage, toImage, percentage, crossfadeSize, size)); 47 44 } 48 virtual ~CrossfadeGeneratedImage();49 45 50 46 protected: … … 52 48 virtual void drawPattern(GraphicsContext*, const FloatRect& srcRect, const AffineTransform& patternTransform, const FloatPoint& phase, ColorSpace styleColorSpace, CompositeOperator, const FloatRect& destRect); 53 49 54 CrossfadeGeneratedImage(CachedImage* fromImage, CachedImage* toImage, float percentage, ImageObserver*, IntSize crossfadeSize, const IntSize&); 55 56 void imageChanged(CachedImage*, const IntRect* = 0); 50 CrossfadeGeneratedImage(Image* fromImage, Image* toImage, float percentage, IntSize crossfadeSize, const IntSize&); 57 51 58 52 private: 59 53 void drawCrossfade(GraphicsContext*, const FloatRect& srcRect); 60 54 61 // These are owned by the CSSCrossfadeValue that owns us. 62 CachedImage* m_fromImage; 63 CachedImage* m_toImage; 55 Image* m_fromImage; 56 Image* m_toImage; 64 57 65 58 float m_percentage; 66 59 IntSize m_crossfadeSize; 67 68 ImageObserver* m_observer;69 OwnPtr<CrossfadeSubimageObserverProxy> m_crossfadeSubimageObserver;70 };71 72 class CrossfadeSubimageObserverProxy : public CachedImageClient {73 public:74 CrossfadeSubimageObserverProxy(CrossfadeGeneratedImage* ownerValue)75 : m_ownerValue(ownerValue)76 , m_ready(false) { }77 78 virtual ~CrossfadeSubimageObserverProxy() { }79 virtual void imageChanged(CachedImage*, const IntRect* = 0) OVERRIDE;80 void setReady(bool ready) { m_ready = ready; }81 private:82 CrossfadeGeneratedImage* m_ownerValue;83 bool m_ready;84 60 }; 85 61
Note: See TracChangeset
for help on using the changeset viewer.