1 /* 2 Copyright (C) 2008 Alex Mathews <possessedpenguinbob (at) gmail.com> 3 2009 Dirk Schulze <krit (at) webkit.org> 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Library General Public 7 License as published by the Free Software Foundation; either 8 version 2 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Library General Public License for more details. 14 15 You should have received a copy of the GNU Library General Public License 16 aint with this library; see the file COPYING.LIB. If not, write to 17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 Boston, MA 02110-1301, USA. 19 */ 20 21 #ifndef FilterEffect_h 22 #define FilterEffect_h 23 24 #if ENABLE(FILTERS) 25 #include "Filter.h" 26 #include "FloatRect.h" 27 #include "GraphicsContext.h" 28 #include "ImageBuffer.h" 29 #include "TextStream.h" 30 31 #include <wtf/PassOwnPtr.h> 32 #include <wtf/RefCounted.h> 33 #include <wtf/RefPtr.h> 34 35 namespace WebCore { 36 37 class FilterEffect : public RefCounted<FilterEffect> { 38 public: 39 virtual ~FilterEffect(); 40 41 void setUnionOfChildEffectSubregions(const FloatRect& uniteRect) { m_unionOfChildEffectSubregions = uniteRect; } 42 FloatRect unionOfChildEffectSubregions() const { return m_unionOfChildEffectSubregions; } 43 44 FloatRect subRegion() const { return m_subRegion; } 45 void setSubRegion(const FloatRect& subRegion) { m_subRegion = subRegion; } 46 47 FloatRect scaledSubRegion() const { return m_scaledSubRegion; } 48 void setScaledSubRegion(const FloatRect& scaledSubRegion) { m_scaledSubRegion = scaledSubRegion; } 49 50 FloatRect effectBoundaries() const { return m_effectBoundaries; } 51 void setEffectBoundaries(const FloatRect& effectBoundaries) { m_effectBoundaries = effectBoundaries; } 52 53 bool hasX() { return m_hasX; } 54 void setHasX(bool value) { m_hasX = value; } 55 56 bool hasY() { return m_hasY; } 57 void setHasY(bool value) { m_hasY = value; } 58 59 bool hasWidth() { return m_hasWidth; } 60 void setHasWidth(bool value) { m_hasWidth = value; } 61 62 bool hasHeight() { return m_hasHeight; } 63 void setHasHeight(bool value) { m_hasHeight = value; } 64 65 // The result is bounded by the size of the filter primitive to save resources 66 ImageBuffer* resultImage() { return m_effectBuffer.get(); } 67 void setEffectBuffer(PassOwnPtr<ImageBuffer> effectBuffer) { m_effectBuffer = effectBuffer; } 68 69 FloatRect calculateUnionOfChildEffectSubregions(Filter*, FilterEffect*, FilterEffect*); 70 FloatRect calculateUnionOfChildEffectSubregions(Filter*, FilterEffect*); 71 72 GraphicsContext* getEffectContext(); 73 FloatRect calculateDrawingRect(const FloatRect&); 74 IntRect calculateDrawingIntRect(const FloatRect&); 75 76 // black image with different alpha values 77 bool isAlphaImage() { return m_alphaImage; } 78 void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; } 79 80 virtual FloatRect uniteChildEffectSubregions(Filter* filter) { return filter->filterRegion(); } 81 virtual FloatRect calculateEffectRect(Filter*); 82 virtual void apply(Filter*) = 0; 83 virtual void dump() = 0; 84 85 virtual bool isSourceInput() { return false; } 86 87 virtual TextStream& externalRepresentation(TextStream&) const; 88 protected: 89 FilterEffect(); 90 91 private: 92 93 bool m_xBBoxMode : 1; 94 bool m_yBBoxMode : 1; 95 bool m_widthBBoxMode : 1; 96 bool m_heightBBoxMode : 1; 97 98 bool m_hasX : 1; 99 bool m_hasY : 1; 100 bool m_hasWidth : 1; 101 bool m_hasHeight : 1; 102 103 bool m_alphaImage; 104 105 FloatRect m_effectBoundaries; 106 FloatRect m_subRegion; 107 FloatRect m_scaledSubRegion; 108 FloatRect m_unionOfChildEffectSubregions; 109 110 mutable OwnPtr<ImageBuffer> m_effectBuffer; 111 }; 112 113 } // namespace WebCore 114 115 #endif // ENABLE(FILTERS) 116 117 #endif // FilterEffect_h 118