OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Alex Mathews <possessedpenguinbob@gmail.com> | 2 * Copyright (C) 2008 Alex Mathews <possessedpenguinbob@gmail.com> |
3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
4 * Copyright (C) Research In Motion Limited 2010. All rights reserved. | 4 * Copyright (C) Research In Motion Limited 2010. All rights reserved. |
5 * Copyright (C) 2013 Google Inc. All rights reserved. | 5 * Copyright (C) 2013 Google Inc. All rights reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 }; | 59 }; |
60 | 60 |
61 typedef int DetermineSubregionFlags; | 61 typedef int DetermineSubregionFlags; |
62 | 62 |
63 class PLATFORM_EXPORT FilterEffect : public RefCountedWillBeGarbageCollectedFina
lized<FilterEffect> { | 63 class PLATFORM_EXPORT FilterEffect : public RefCountedWillBeGarbageCollectedFina
lized<FilterEffect> { |
64 public: | 64 public: |
65 virtual ~FilterEffect(); | 65 virtual ~FilterEffect(); |
66 DECLARE_VIRTUAL_TRACE(); | 66 DECLARE_VIRTUAL_TRACE(); |
67 | 67 |
68 void clearResult(); | 68 void clearResult(); |
69 void clearResultsRecursive(); | |
70 | 69 |
71 FilterEffectVector& inputEffects() { return m_inputEffects; } | 70 FilterEffectVector& inputEffects() { return m_inputEffects; } |
72 FilterEffect* inputEffect(unsigned) const; | 71 FilterEffect* inputEffect(unsigned) const; |
73 unsigned numberOfEffectInputs() const { return m_inputEffects.size(); } | 72 unsigned numberOfEffectInputs() const { return m_inputEffects.size(); } |
74 | 73 |
75 inline bool hasImageFilter() const | 74 inline bool hasImageFilter() const |
76 { | 75 { |
77 return m_imageFilters[0] || m_imageFilters[1] || m_imageFilters[2] || m_
imageFilters[3]; | 76 return m_imageFilters[0] || m_imageFilters[1] || m_imageFilters[2] || m_
imageFilters[3]; |
78 } | 77 } |
79 | 78 |
80 // Solid black image with different alpha values. | |
81 bool isAlphaImage() const { return m_alphaImage; } | |
82 void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; } | |
83 | |
84 IntRect absolutePaintRect() const { return m_absolutePaintRect; } | 79 IntRect absolutePaintRect() const { return m_absolutePaintRect; } |
85 | 80 |
86 FloatRect maxEffectRect() const { return m_maxEffectRect; } | 81 FloatRect maxEffectRect() const { return m_maxEffectRect; } |
87 void setMaxEffectRect(const FloatRect& maxEffectRect) { m_maxEffectRect = ma
xEffectRect; } | 82 void setMaxEffectRect(const FloatRect& maxEffectRect) { m_maxEffectRect = ma
xEffectRect; } |
88 | 83 |
89 virtual PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder*)
; | 84 virtual PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder*)
; |
90 virtual PassRefPtr<SkImageFilter> createImageFilterWithoutValidation(SkiaIma
geFilterBuilder*); | 85 virtual PassRefPtr<SkImageFilter> createImageFilterWithoutValidation(SkiaIma
geFilterBuilder*); |
91 | 86 |
92 // Mapping a rect forwards determines which which destination pixels a | 87 // Mapping a rect forwards determines which which destination pixels a |
93 // given source rect would affect. Mapping a rect backwards determines | 88 // given source rect would affect. Mapping a rect backwards determines |
94 // which pixels from the source rect would be required to fill a given | 89 // which pixels from the source rect would be required to fill a given |
95 // destination rect. Note that these are not necessarily the inverse of | 90 // destination rect. Note that these are not necessarily the inverse of |
96 // each other. For example, for FEGaussianBlur, they are the same | 91 // each other. For example, for FEGaussianBlur, they are the same |
97 // transformation. | 92 // transformation. |
98 virtual FloatRect mapRect(const FloatRect& rect, bool forward = true) { retu
rn rect; } | 93 virtual FloatRect mapRect(const FloatRect& rect, bool forward = true) { retu
rn rect; } |
99 // A version of the above that is used for calculating paint rects. We can't | 94 // A version of the above that is used for calculating paint rects. We can't |
100 // use mapRect above for that, because that is also used for calculating eff
ect | 95 // use mapRect above for that, because that is also used for calculating eff
ect |
101 // regions for CSS filters and has undesirable effects for tile and | 96 // regions for CSS filters and has undesirable effects for tile and |
102 // displacement map. | 97 // displacement map. |
103 virtual FloatRect mapPaintRect(const FloatRect& rect, bool forward) | 98 virtual FloatRect mapPaintRect(const FloatRect& rect, bool forward) |
104 { | 99 { |
105 return mapRect(rect, forward); | 100 return mapRect(rect, forward); |
106 } | 101 } |
107 FloatRect mapRectRecursive(const FloatRect&); | 102 FloatRect mapRectRecursive(const FloatRect&); |
108 | 103 |
109 // This is a recursive version of a backwards mapRect(), which also takes | |
110 // into account the filter primitive subregion of each effect. | |
111 // Note: This works in absolute coordinates! | |
112 FloatRect getSourceRect(const FloatRect& destRect, const FloatRect& clipRect
); | |
113 | |
114 virtual FilterEffectType filterEffectType() const { return FilterEffectTypeU
nknown; } | 104 virtual FilterEffectType filterEffectType() const { return FilterEffectTypeU
nknown; } |
115 | 105 |
116 virtual TextStream& externalRepresentation(TextStream&, int indention = 0) c
onst; | 106 virtual TextStream& externalRepresentation(TextStream&, int indention = 0) c
onst; |
117 | 107 |
118 // The following functions are SVG specific and will move to LayoutSVGResour
ceFilterPrimitive. | 108 // The following functions are SVG specific and will move to LayoutSVGResour
ceFilterPrimitive. |
119 // See bug https://bugs.webkit.org/show_bug.cgi?id=45614. | 109 // See bug https://bugs.webkit.org/show_bug.cgi?id=45614. |
120 bool hasX() const { return m_hasX; } | 110 bool hasX() const { return m_hasX; } |
121 void setHasX(bool value) { m_hasX = value; } | 111 void setHasX(bool value) { m_hasX = value; } |
122 | 112 |
123 bool hasY() const { return m_hasY; } | 113 bool hasY() const { return m_hasY; } |
(...skipping 12 matching lines...) Expand all Loading... |
136 void setEffectBoundaries(const FloatRect& effectBoundaries) { m_effectBounda
ries = effectBoundaries; } | 126 void setEffectBoundaries(const FloatRect& effectBoundaries) { m_effectBounda
ries = effectBoundaries; } |
137 | 127 |
138 Filter* filter() { return m_filter; } | 128 Filter* filter() { return m_filter; } |
139 const Filter* filter() const { return m_filter; } | 129 const Filter* filter() const { return m_filter; } |
140 | 130 |
141 bool clipsToBounds() const { return m_clipsToBounds; } | 131 bool clipsToBounds() const { return m_clipsToBounds; } |
142 void setClipsToBounds(bool value) { m_clipsToBounds = value; } | 132 void setClipsToBounds(bool value) { m_clipsToBounds = value; } |
143 | 133 |
144 ColorSpace operatingColorSpace() const { return m_operatingColorSpace; } | 134 ColorSpace operatingColorSpace() const { return m_operatingColorSpace; } |
145 virtual void setOperatingColorSpace(ColorSpace colorSpace) { m_operatingColo
rSpace = colorSpace; } | 135 virtual void setOperatingColorSpace(ColorSpace colorSpace) { m_operatingColo
rSpace = colorSpace; } |
146 ColorSpace resultColorSpace() const { return m_resultColorSpace; } | |
147 virtual void setResultColorSpace(ColorSpace colorSpace) { m_resultColorSpace
= colorSpace; } | |
148 | 136 |
149 FloatRect determineFilterPrimitiveSubregion(DetermineSubregionFlags = Determ
ineSubregionNone); | 137 FloatRect determineFilterPrimitiveSubregion(DetermineSubregionFlags = Determ
ineSubregionNone); |
150 void determineAllAbsolutePaintRects(); | |
151 | 138 |
152 virtual FloatRect determineAbsolutePaintRect(const FloatRect& requestedAbsol
uteRect); | 139 virtual FloatRect determineAbsolutePaintRect(const FloatRect& requestedAbsol
uteRect); |
153 virtual bool affectsTransparentPixels() { return false; } | 140 virtual bool affectsTransparentPixels() { return false; } |
154 | 141 |
155 // Return false if the filter will only operate correctly on valid RGBA valu
es, with | 142 // Return false if the filter will only operate correctly on valid RGBA valu
es, with |
156 // alpha in [0,255] and each color component in [0, alpha]. | 143 // alpha in [0,255] and each color component in [0, alpha]. |
157 virtual bool mayProduceInvalidPreMultipliedPixels() { return false; } | 144 virtual bool mayProduceInvalidPreMultipliedPixels() { return false; } |
158 | 145 |
159 SkImageFilter* getImageFilter(ColorSpace, bool requiresPMColorValidation) co
nst; | 146 SkImageFilter* getImageFilter(ColorSpace, bool requiresPMColorValidation) co
nst; |
160 void setImageFilter(ColorSpace, bool requiresPMColorValidation, PassRefPtr<S
kImageFilter>); | 147 void setImageFilter(ColorSpace, bool requiresPMColorValidation, PassRefPtr<S
kImageFilter>); |
161 | 148 |
162 protected: | 149 protected: |
163 FilterEffect(Filter*); | 150 FilterEffect(Filter*); |
164 | 151 |
165 Color adaptColorToOperatingColorSpace(const Color& deviceColor); | 152 Color adaptColorToOperatingColorSpace(const Color& deviceColor); |
166 | 153 |
167 SkImageFilter::CropRect getCropRect(const FloatSize& cropOffset) const; | 154 SkImageFilter::CropRect getCropRect(const FloatSize& cropOffset) const; |
168 | 155 |
169 void addAbsolutePaintRect(const FloatRect& absolutePaintRect); | 156 void addAbsolutePaintRect(const FloatRect& absolutePaintRect); |
170 | 157 |
171 private: | 158 private: |
172 FilterEffectVector m_inputEffects; | 159 FilterEffectVector m_inputEffects; |
173 | 160 |
174 bool m_alphaImage; | |
175 | |
176 IntRect m_absolutePaintRect; | 161 IntRect m_absolutePaintRect; |
177 | 162 |
178 // The maximum size of a filter primitive. In SVG this is the primitive subr
egion in absolute coordinate space. | 163 // The maximum size of a filter primitive. In SVG this is the primitive subr
egion in absolute coordinate space. |
179 // The absolute paint rect should never be bigger than m_maxEffectRect. | 164 // The absolute paint rect should never be bigger than m_maxEffectRect. |
180 FloatRect m_maxEffectRect; | 165 FloatRect m_maxEffectRect; |
181 RawPtrWillBeMember<Filter> m_filter; | 166 RawPtrWillBeMember<Filter> m_filter; |
182 | 167 |
183 // The following member variables are SVG specific and will move to LayoutSV
GResourceFilterPrimitive. | 168 // The following member variables are SVG specific and will move to LayoutSV
GResourceFilterPrimitive. |
184 // See bug https://bugs.webkit.org/show_bug.cgi?id=45614. | 169 // See bug https://bugs.webkit.org/show_bug.cgi?id=45614. |
185 | 170 |
186 // The subregion of a filter primitive according to the SVG Filter specifica
tion in local coordinates. | 171 // The subregion of a filter primitive according to the SVG Filter specifica
tion in local coordinates. |
187 // This is SVG specific and needs to move to LayoutSVGResourceFilterPrimitiv
e. | 172 // This is SVG specific and needs to move to LayoutSVGResourceFilterPrimitiv
e. |
188 FloatRect m_filterPrimitiveSubregion; | 173 FloatRect m_filterPrimitiveSubregion; |
189 | 174 |
190 // x, y, width and height of the actual SVGFE*Element. Is needed to determin
e the subregion of the | 175 // x, y, width and height of the actual SVGFE*Element. Is needed to determin
e the subregion of the |
191 // filter primitive on a later step. | 176 // filter primitive on a later step. |
192 FloatRect m_effectBoundaries; | 177 FloatRect m_effectBoundaries; |
193 bool m_hasX; | 178 bool m_hasX; |
194 bool m_hasY; | 179 bool m_hasY; |
195 bool m_hasWidth; | 180 bool m_hasWidth; |
196 bool m_hasHeight; | 181 bool m_hasHeight; |
197 | 182 |
198 // Should the effect clip to its primitive region, or expand to use the comb
ined region of its inputs. | 183 // Should the effect clip to its primitive region, or expand to use the comb
ined region of its inputs. |
199 bool m_clipsToBounds; | 184 bool m_clipsToBounds; |
200 | 185 |
201 ColorSpace m_operatingColorSpace; | 186 ColorSpace m_operatingColorSpace; |
202 ColorSpace m_resultColorSpace; | |
203 | 187 |
204 RefPtr<SkImageFilter> m_imageFilters[4]; | 188 RefPtr<SkImageFilter> m_imageFilters[4]; |
205 }; | 189 }; |
206 | 190 |
207 } // namespace blink | 191 } // namespace blink |
208 | 192 |
209 #endif // FilterEffect_h | 193 #endif // FilterEffect_h |
OLD | NEW |