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

Side by Side Diff: Source/core/platform/graphics/filters/FilterEffect.h

Issue 99103006: Moving GraphicsContext and dependencies from core to platform. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Final patch - fixes Android Created 7 years 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 /*
2 * Copyright (C) 2008 Alex Mathews <possessedpenguinbob@gmail.com>
3 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
4 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
5 * Copyright (C) 2013 Google Inc. All rights reserved.
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU Library General Public License
18 * along with this library; see the file COPYING.LIB. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
21 */
22
23 #ifndef FilterEffect_h
24 #define FilterEffect_h
25
26 #include "platform/geometry/FloatRect.h"
27 #include "platform/geometry/IntRect.h"
28 #include "platform/graphics/ColorSpace.h"
29
30 #include "third_party/skia/include/core/SkImageFilter.h"
31
32 #include "wtf/PassOwnPtr.h"
33 #include "wtf/RefCounted.h"
34 #include "wtf/RefPtr.h"
35 #include "wtf/Uint8ClampedArray.h"
36 #include "wtf/Vector.h"
37
38 static const float kMaxFilterSize = 5000.0f;
39
40 namespace WebCore {
41
42 class Filter;
43 class FilterEffect;
44 class ImageBuffer;
45 class TextStream;
46
47 class SkiaImageFilterBuilder;
48
49 typedef Vector<RefPtr<FilterEffect> > FilterEffectVector;
50
51 enum FilterEffectType {
52 FilterEffectTypeUnknown,
53 FilterEffectTypeImage,
54 FilterEffectTypeTile,
55 FilterEffectTypeSourceInput
56 };
57
58 enum DetermineSubregionFlag {
59 DetermineSubregionNone = 0,
60 MapRectForward = 1,
61 ClipToFilterRegion = 1 << 1
62 };
63
64 typedef int DetermineSubregionFlags;
65
66 class FilterEffect : public RefCounted<FilterEffect> {
67 public:
68 virtual ~FilterEffect();
69
70 void clearResult();
71 void clearResultsRecursive();
72
73 ImageBuffer* asImageBuffer();
74 PassRefPtr<Uint8ClampedArray> asUnmultipliedImage(const IntRect&);
75 PassRefPtr<Uint8ClampedArray> asPremultipliedImage(const IntRect&);
76 void copyUnmultipliedImage(Uint8ClampedArray* destination, const IntRect&);
77 void copyPremultipliedImage(Uint8ClampedArray* destination, const IntRect&);
78
79 FilterEffectVector& inputEffects() { return m_inputEffects; }
80 FilterEffect* inputEffect(unsigned) const;
81 unsigned numberOfEffectInputs() const { return m_inputEffects.size(); }
82
83 inline bool hasResult() const
84 {
85 // This function needs platform specific checks, if the memory managment is not done by FilterEffect.
86 return m_imageBufferResult
87 || m_unmultipliedImageResult
88 || m_premultipliedImageResult;
89 }
90
91 IntRect drawingRegionOfInputImage(const IntRect&) const;
92 IntRect requestedRegionOfInputImageData(const IntRect&) const;
93
94 // Solid black image with different alpha values.
95 bool isAlphaImage() const { return m_alphaImage; }
96 void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; }
97
98 IntRect absolutePaintRect() const { return m_absolutePaintRect; }
99 void setAbsolutePaintRect(const IntRect& absolutePaintRect) { m_absolutePain tRect = absolutePaintRect; }
100
101 FloatRect maxEffectRect() const { return m_maxEffectRect; }
102 void setMaxEffectRect(const FloatRect& maxEffectRect) { m_maxEffectRect = ma xEffectRect; }
103
104 void apply();
105
106 // Correct any invalid pixels, if necessary, in the result of a filter opera tion.
107 // This method is used to ensure valid pixel values on filter inputs and the final result.
108 // Only the arithmetic composite filter ever needs to perform correction.
109 virtual void correctFilterResultIfNeeded() { }
110
111 virtual PassRefPtr<SkImageFilter> createImageFilter(SkiaImageFilterBuilder*) ;
112
113 virtual void determineAbsolutePaintRect();
114
115 // Mapping a rect forwards determines which which destination pixels a
116 // given source rect would affect. Mapping a rect backwards determines
117 // which pixels from the source rect would be required to fill a given
118 // destination rect. Note that these are not necessarily the inverse of
119 // each other. For example, for FEGaussianBlur, they are the same
120 // transformation.
121 virtual FloatRect mapRect(const FloatRect& rect, bool forward = true) { retu rn rect; }
122 FloatRect mapRectRecursive(const FloatRect&);
123
124 // This is a recursive version of a backwards mapRect(), which also takes
125 // into account the filter primitive subregion of each effect.
126 FloatRect getSourceRect(const FloatRect& destRect, const FloatRect& clipRect );
127
128 virtual FilterEffectType filterEffectType() const { return FilterEffectTypeU nknown; }
129
130 virtual TextStream& externalRepresentation(TextStream&, int indention = 0) c onst;
131
132 // The following functions are SVG specific and will move to RenderSVGResour ceFilterPrimitive.
133 // See bug https://bugs.webkit.org/show_bug.cgi?id=45614.
134 bool hasX() const { return m_hasX; }
135 void setHasX(bool value) { m_hasX = value; }
136
137 bool hasY() const { return m_hasY; }
138 void setHasY(bool value) { m_hasY = value; }
139
140 bool hasWidth() const { return m_hasWidth; }
141 void setHasWidth(bool value) { m_hasWidth = value; }
142
143 bool hasHeight() const { return m_hasHeight; }
144 void setHasHeight(bool value) { m_hasHeight = value; }
145
146 FloatRect filterPrimitiveSubregion() const { return m_filterPrimitiveSubregi on; }
147 void setFilterPrimitiveSubregion(const FloatRect& filterPrimitiveSubregion) { m_filterPrimitiveSubregion = filterPrimitiveSubregion; }
148
149 FloatRect effectBoundaries() const { return m_effectBoundaries; }
150 void setEffectBoundaries(const FloatRect& effectBoundaries) { m_effectBounda ries = effectBoundaries; }
151
152 Filter* filter() { return m_filter; }
153 const Filter* filter() const { return m_filter; }
154
155 bool clipsToBounds() const { return m_clipsToBounds; }
156 void setClipsToBounds(bool value) { m_clipsToBounds = value; }
157
158 ColorSpace operatingColorSpace() const { return m_operatingColorSpace; }
159 virtual void setOperatingColorSpace(ColorSpace colorSpace) { m_operatingColo rSpace = colorSpace; }
160 ColorSpace resultColorSpace() const { return m_resultColorSpace; }
161 virtual void setResultColorSpace(ColorSpace colorSpace) { m_resultColorSpace = colorSpace; }
162
163 virtual void transformResultColorSpace(FilterEffect* in, const int) { in->tr ansformResultColorSpace(m_operatingColorSpace); }
164 void transformResultColorSpace(ColorSpace);
165
166 FloatRect determineFilterPrimitiveSubregion(DetermineSubregionFlags = Determ ineSubregionNone);
167
168 protected:
169 FilterEffect(Filter*);
170
171 ImageBuffer* createImageBufferResult();
172 Uint8ClampedArray* createUnmultipliedImageResult();
173 Uint8ClampedArray* createPremultipliedImageResult();
174
175 // Return true if the filter will only operate correctly on valid RGBA value s, with
176 // alpha in [0,255] and each color component in [0, alpha].
177 virtual bool requiresValidPreMultipliedPixels() { return true; }
178
179 // If a pre-multiplied image, check every pixel for validity and correct if necessary.
180 void forceValidPreMultipliedPixels();
181 SkImageFilter::CropRect getCropRect(const FloatSize& cropOffset) const;
182
183 private:
184 virtual void applySoftware() = 0;
185 virtual bool applySkia() { return false; }
186
187 inline void copyImageBytes(Uint8ClampedArray* source, Uint8ClampedArray* des tination, const IntRect&);
188
189 OwnPtr<ImageBuffer> m_imageBufferResult;
190 RefPtr<Uint8ClampedArray> m_unmultipliedImageResult;
191 RefPtr<Uint8ClampedArray> m_premultipliedImageResult;
192 FilterEffectVector m_inputEffects;
193
194 bool m_alphaImage;
195
196 IntRect m_absolutePaintRect;
197
198 // The maximum size of a filter primitive. In SVG this is the primitive subr egion in absolute coordinate space.
199 // The absolute paint rect should never be bigger than m_maxEffectRect.
200 FloatRect m_maxEffectRect;
201 Filter* m_filter;
202
203 // The following member variables are SVG specific and will move to RenderSV GResourceFilterPrimitive.
204 // See bug https://bugs.webkit.org/show_bug.cgi?id=45614.
205
206 // The subregion of a filter primitive according to the SVG Filter specifica tion in local coordinates.
207 // This is SVG specific and needs to move to RenderSVGResourceFilterPrimitiv e.
208 FloatRect m_filterPrimitiveSubregion;
209
210 // x, y, width and height of the actual SVGFE*Element. Is needed to determin e the subregion of the
211 // filter primitive on a later step.
212 FloatRect m_effectBoundaries;
213 bool m_hasX;
214 bool m_hasY;
215 bool m_hasWidth;
216 bool m_hasHeight;
217
218 // Should the effect clip to its primitive region, or expand to use the comb ined region of its inputs.
219 bool m_clipsToBounds;
220
221 ColorSpace m_operatingColorSpace;
222 ColorSpace m_resultColorSpace;
223 };
224
225 } // namespace WebCore
226
227 #endif // FilterEffect_h
OLDNEW
« no previous file with comments | « Source/core/platform/graphics/filters/Filter.h ('k') | Source/core/platform/graphics/filters/FilterEffect.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698