Stop using PassRefPtr in platform/graphics
[WebKit-https.git] / Source / WebCore / platform / graphics / filters / FilterEffect.h
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  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #ifndef FilterEffect_h
23 #define FilterEffect_h
24
25 #include "ColorSpace.h"
26 #include "FloatRect.h"
27 #include "IntRect.h"
28 #include <runtime/Uint8ClampedArray.h>
29 #include <wtf/MathExtras.h>
30 #include <wtf/RefCounted.h>
31 #include <wtf/RefPtr.h>
32 #include <wtf/Vector.h>
33
34 namespace WebCore {
35
36 class Filter;
37 class FilterEffect;
38 class ImageBuffer;
39 class TextStream;
40
41 typedef Vector<RefPtr<FilterEffect>> FilterEffectVector;
42
43 enum FilterEffectType {
44     FilterEffectTypeUnknown,
45     FilterEffectTypeImage,
46     FilterEffectTypeTile,
47     FilterEffectTypeSourceInput
48 };
49
50 class FilterEffect : public RefCounted<FilterEffect> {
51 public:
52     virtual ~FilterEffect();
53
54     void clearResult();
55     void clearResultsRecursive();
56
57     ImageBuffer* asImageBuffer();
58     RefPtr<Uint8ClampedArray> asUnmultipliedImage(const IntRect&);
59     RefPtr<Uint8ClampedArray> asPremultipliedImage(const IntRect&);
60     void copyUnmultipliedImage(Uint8ClampedArray* destination, const IntRect&);
61     void copyPremultipliedImage(Uint8ClampedArray* destination, const IntRect&);
62
63 #if ENABLE(OPENCL)
64     OpenCLHandle openCLImage() { return m_openCLImageResult; }
65     void setOpenCLImage(OpenCLHandle openCLImage) { m_openCLImageResult = openCLImage; }
66     ImageBuffer* openCLImageToImageBuffer();
67 #endif
68
69     FilterEffectVector& inputEffects() { return m_inputEffects; }
70     FilterEffect* inputEffect(unsigned) const;
71     unsigned numberOfEffectInputs() const { return m_inputEffects.size(); }
72     unsigned totalNumberOfEffectInputs() const;
73     
74     inline bool hasResult() const
75     {
76         // This function needs platform specific checks, if the memory managment is not done by FilterEffect.
77         return m_imageBufferResult
78 #if ENABLE(OPENCL)
79             || m_openCLImageResult
80 #endif
81             || m_unmultipliedImageResult
82             || m_premultipliedImageResult;
83     }
84
85     FloatRect drawingRegionOfInputImage(const IntRect&) const;
86     IntRect requestedRegionOfInputImageData(const IntRect&) const;
87
88     // Solid black image with different alpha values.
89     bool isAlphaImage() const { return m_alphaImage; }
90     void setIsAlphaImage(bool alphaImage) { m_alphaImage = alphaImage; }
91
92     IntRect absolutePaintRect() const { return m_absolutePaintRect; }
93     void setAbsolutePaintRect(const IntRect& absolutePaintRect) { m_absolutePaintRect = absolutePaintRect; }
94
95     FloatRect maxEffectRect() const { return m_maxEffectRect; }
96     void setMaxEffectRect(const FloatRect& maxEffectRect) { m_maxEffectRect = maxEffectRect; } 
97
98     void apply();
99 #if ENABLE(OPENCL)
100     void applyAll();
101 #else
102     inline void applyAll() { apply(); }
103 #endif
104
105     // Correct any invalid pixels, if necessary, in the result of a filter operation.
106     // This method is used to ensure valid pixel values on filter inputs and the final result.
107     // Only the arithmetic composite filter ever needs to perform correction.
108     virtual void correctFilterResultIfNeeded() { }
109
110     virtual void platformApplySoftware() = 0;
111 #if ENABLE(OPENCL)
112     virtual bool platformApplyOpenCL();
113 #endif
114     virtual void dump() = 0;
115
116     virtual void determineAbsolutePaintRect();
117
118     virtual FilterEffectType filterEffectType() const { return FilterEffectTypeUnknown; }
119
120     virtual TextStream& externalRepresentation(TextStream&, int indention = 0) const;
121
122 public:
123     // The following functions are SVG specific and will move to RenderSVGResourceFilterPrimitive.
124     // See bug https://bugs.webkit.org/show_bug.cgi?id=45614.
125     bool hasX() const { return m_hasX; }
126     void setHasX(bool value) { m_hasX = value; }
127
128     bool hasY() const { return m_hasY; }
129     void setHasY(bool value) { m_hasY = value; }
130
131     bool hasWidth() const { return m_hasWidth; }
132     void setHasWidth(bool value) { m_hasWidth = value; }
133
134     bool hasHeight() const { return m_hasHeight; }
135     void setHasHeight(bool value) { m_hasHeight = value; }
136
137     FloatRect filterPrimitiveSubregion() const { return m_filterPrimitiveSubregion; }
138     void setFilterPrimitiveSubregion(const FloatRect& filterPrimitiveSubregion) { m_filterPrimitiveSubregion = filterPrimitiveSubregion; }
139
140     FloatRect effectBoundaries() const { return m_effectBoundaries; }
141     void setEffectBoundaries(const FloatRect& effectBoundaries) { m_effectBoundaries = effectBoundaries; }
142
143     Filter& filter() { return m_filter; }
144
145     bool clipsToBounds() const { return m_clipsToBounds; }
146     void setClipsToBounds(bool value) { m_clipsToBounds = value; }
147
148     ColorSpace operatingColorSpace() const { return m_operatingColorSpace; }
149     virtual void setOperatingColorSpace(ColorSpace colorSpace) { m_operatingColorSpace = colorSpace; }
150     ColorSpace resultColorSpace() const { return m_resultColorSpace; }
151     virtual void setResultColorSpace(ColorSpace colorSpace) { m_resultColorSpace = colorSpace; }
152
153     virtual void transformResultColorSpace(FilterEffect* in, const int) { in->transformResultColorSpace(m_operatingColorSpace); }
154     void transformResultColorSpace(ColorSpace);
155
156 protected:
157     FilterEffect(Filter&);
158
159     ImageBuffer* createImageBufferResult();
160     Uint8ClampedArray* createUnmultipliedImageResult();
161     Uint8ClampedArray* createPremultipliedImageResult();
162 #if ENABLE(OPENCL)
163     OpenCLHandle createOpenCLImageResult(uint8_t* = 0);
164 #endif
165
166     // Return true if the filter will only operate correctly on valid RGBA values, with
167     // alpha in [0,255] and each color component in [0, alpha].
168     virtual bool requiresValidPreMultipliedPixels() { return true; }
169
170     // If a pre-multiplied image, check every pixel for validity and correct if necessary.
171     void forceValidPreMultipliedPixels();
172
173     void clipAbsolutePaintRect();
174     
175     static Vector<float> normalizedFloats(const Vector<float>& values)
176     {
177         Vector<float> normalizedValues(values.size());
178         for (size_t i = 0; i < values.size(); ++i)
179             normalizedValues[i] = normalizedFloat(values[i]);
180         return normalizedValues;
181     }
182
183 private:
184     std::unique_ptr<ImageBuffer> m_imageBufferResult;
185     RefPtr<Uint8ClampedArray> m_unmultipliedImageResult;
186     RefPtr<Uint8ClampedArray> m_premultipliedImageResult;
187     FilterEffectVector m_inputEffects;
188 #if ENABLE(OPENCL)
189     OpenCLHandle m_openCLImageResult;
190 #endif
191
192     bool m_alphaImage;
193
194     IntRect m_absolutePaintRect;
195     
196     // The maximum size of a filter primitive. In SVG this is the primitive subregion in absolute coordinate space.
197     // The absolute paint rect should never be bigger than m_maxEffectRect.
198     FloatRect m_maxEffectRect;
199     Filter& m_filter;
200     
201 private:
202     inline void copyImageBytes(Uint8ClampedArray* source, Uint8ClampedArray* destination, const IntRect&);
203
204     // The following member variables are SVG specific and will move to RenderSVGResourceFilterPrimitive.
205     // See bug https://bugs.webkit.org/show_bug.cgi?id=45614.
206
207     // The subregion of a filter primitive according to the SVG Filter specification in local coordinates.
208     // This is SVG specific and needs to move to RenderSVGResourceFilterPrimitive.
209     FloatRect m_filterPrimitiveSubregion;
210
211     // x, y, width and height of the actual SVGFE*Element. Is needed to determine the subregion of the
212     // filter primitive on a later step.
213     FloatRect m_effectBoundaries;
214     bool m_hasX;
215     bool m_hasY;
216     bool m_hasWidth;
217     bool m_hasHeight;
218
219     // Should the effect clip to its primitive region, or expand to use the combined region of its inputs.
220     bool m_clipsToBounds;
221
222     ColorSpace m_operatingColorSpace;
223     ColorSpace m_resultColorSpace;
224 };
225
226 } // namespace WebCore
227
228 #endif // FilterEffect_h