Reduce amount of rebuilding when touching networking headers
[WebKit-https.git] / Source / WebCore / platform / graphics / filters / FilterOperation.h
1 /*
2  * Copyright (C) 2011 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef FilterOperation_h
27 #define FilterOperation_h
28
29 #if ENABLE(CSS_FILTERS)
30
31 #include "Color.h"
32 #include "FilterEffect.h"
33 #include "LayoutSize.h"
34 #include "Length.h"
35 #include <wtf/OwnPtr.h>
36 #include <wtf/PassOwnPtr.h>
37 #include <wtf/RefCounted.h>
38 #include <wtf/text/WTFString.h>
39
40 #if PLATFORM(BLACKBERRY)
41 #include <wtf/ThreadSafeRefCounted.h>
42 #endif
43
44 // Annoyingly, wingdi.h #defines this.
45 #ifdef PASSTHROUGH
46 #undef PASSTHROUGH
47 #endif
48
49 namespace WebCore {
50
51 class CachedSVGDocumentReference;
52
53 // CSS Filters
54
55 #if PLATFORM(BLACKBERRY)
56 class FilterOperation : public ThreadSafeRefCounted<FilterOperation> {
57 #else
58 class FilterOperation : public RefCounted<FilterOperation> {
59 #endif
60 public:
61     enum OperationType {
62         REFERENCE, // url(#somefilter)
63         GRAYSCALE,
64         SEPIA,
65         SATURATE,
66         HUE_ROTATE,
67         INVERT,
68         OPACITY,
69         BRIGHTNESS,
70         CONTRAST,
71         BLUR,
72         DROP_SHADOW,
73 #if ENABLE(CSS_SHADERS)
74         CUSTOM,
75         VALIDATED_CUSTOM,
76 #endif
77         PASSTHROUGH,
78         NONE
79     };
80
81     virtual ~FilterOperation() { }
82
83     virtual bool operator==(const FilterOperation&) const = 0;
84     bool operator!=(const FilterOperation& o) const { return !(*this == o); }
85
86     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* /*from*/, double /*progress*/, bool /*blendToPassthrough*/ = false)
87     { 
88         ASSERT(!blendingNeedsRendererSize());
89         return 0; 
90     }
91
92     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* /*from*/, double /*progress*/, const LayoutSize&, bool /*blendToPassthrough*/ = false)
93     { 
94         ASSERT(blendingNeedsRendererSize());
95         return 0; 
96     }
97
98     virtual OperationType getOperationType() const { return m_type; }
99     virtual bool isSameType(const FilterOperation& o) const { return o.getOperationType() == m_type; }
100     
101     virtual bool isDefault() const { return false; }
102
103     // True if the alpha channel of any pixel can change under this operation.
104     virtual bool affectsOpacity() const { return false; }
105     // True if the the value of one pixel can affect the value of another pixel under this operation, such as blur.
106     virtual bool movesPixels() const { return false; }
107     // True if the filter needs the size of the box in order to calculate the animations.
108     virtual bool blendingNeedsRendererSize() const { return false; }
109
110 protected:
111     FilterOperation(OperationType type)
112         : m_type(type)
113     {
114     }
115
116     OperationType m_type;
117 };
118
119 class DefaultFilterOperation : public FilterOperation {
120 public:
121     static PassRefPtr<DefaultFilterOperation> create(OperationType type)
122     {
123         return adoptRef(new DefaultFilterOperation(type));
124     }
125
126 private:
127
128     virtual bool operator==(const FilterOperation& o) const
129     {
130         return isSameType(o);
131     }
132
133     virtual bool isDefault() const { return true; }
134
135     DefaultFilterOperation(OperationType type)
136         : FilterOperation(type)
137     {
138     }
139 };
140
141 class PassthroughFilterOperation : public FilterOperation {
142 public:
143     static PassRefPtr<PassthroughFilterOperation> create()
144     {
145         return adoptRef(new PassthroughFilterOperation());
146     }
147
148 private:
149
150     virtual bool operator==(const FilterOperation& o) const
151     {
152         return isSameType(o);
153     }
154
155     PassthroughFilterOperation()
156         : FilterOperation(PASSTHROUGH)
157     {
158     }
159 };
160
161 class ReferenceFilterOperation : public FilterOperation {
162 public:
163     static PassRefPtr<ReferenceFilterOperation> create(const String& url, const String& fragment, OperationType type)
164     {
165         return adoptRef(new ReferenceFilterOperation(url, fragment, type));
166     }
167
168     virtual bool affectsOpacity() const { return true; }
169     virtual bool movesPixels() const { return true; }
170
171     const String& url() const { return m_url; }
172     const String& fragment() const { return m_fragment; }
173
174 #if ENABLE(SVG)
175     CachedSVGDocumentReference* cachedSVGDocumentReference() const { return m_cachedSVGDocumentReference.get(); }
176     void setCachedSVGDocumentReference(PassOwnPtr<CachedSVGDocumentReference>);
177 #endif
178
179     FilterEffect* filterEffect() const { return m_filterEffect.get(); }
180     void setFilterEffect(PassRefPtr<FilterEffect> filterEffect) { m_filterEffect = filterEffect; }
181
182 private:
183
184     virtual bool operator==(const FilterOperation& o) const
185     {
186         if (!isSameType(o))
187             return false;
188         const ReferenceFilterOperation* other = static_cast<const ReferenceFilterOperation*>(&o);
189         return m_url == other->m_url;
190     }
191
192     ReferenceFilterOperation(const String& url, const String& fragment, OperationType);
193
194     virtual ~ReferenceFilterOperation();
195
196     String m_url;
197     String m_fragment;
198 #if ENABLE(SVG)
199     OwnPtr<CachedSVGDocumentReference> m_cachedSVGDocumentReference;
200 #endif
201     RefPtr<FilterEffect> m_filterEffect;
202 };
203
204 // GRAYSCALE, SEPIA, SATURATE and HUE_ROTATE are variations on a basic color matrix effect.
205 // For HUE_ROTATE, the angle of rotation is stored in m_amount.
206 class BasicColorMatrixFilterOperation : public FilterOperation {
207 public:
208     static PassRefPtr<BasicColorMatrixFilterOperation> create(double amount, OperationType type)
209     {
210         return adoptRef(new BasicColorMatrixFilterOperation(amount, type));
211     }
212
213     double amount() const { return m_amount; }
214
215     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false);
216
217 private:
218     virtual bool operator==(const FilterOperation& o) const
219     {
220         if (!isSameType(o))
221             return false;
222         const BasicColorMatrixFilterOperation* other = static_cast<const BasicColorMatrixFilterOperation*>(&o);
223         return m_amount == other->m_amount;
224     }
225     
226     double passthroughAmount() const;
227     
228     BasicColorMatrixFilterOperation(double amount, OperationType type)
229         : FilterOperation(type)
230         , m_amount(amount)
231     {
232     }
233
234     double m_amount;
235 };
236
237 // INVERT, BRIGHTNESS, CONTRAST and OPACITY are variations on a basic component transfer effect.
238 class BasicComponentTransferFilterOperation : public FilterOperation {
239 public:
240     static PassRefPtr<BasicComponentTransferFilterOperation> create(double amount, OperationType type)
241     {
242         return adoptRef(new BasicComponentTransferFilterOperation(amount, type));
243     }
244
245     double amount() const { return m_amount; }
246
247     virtual bool affectsOpacity() const { return m_type == OPACITY; }
248
249     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false);
250
251 private:
252     virtual bool operator==(const FilterOperation& o) const
253     {
254         if (!isSameType(o))
255             return false;
256         const BasicComponentTransferFilterOperation* other = static_cast<const BasicComponentTransferFilterOperation*>(&o);
257         return m_amount == other->m_amount;
258     }
259
260     double passthroughAmount() const;
261
262     BasicComponentTransferFilterOperation(double amount, OperationType type)
263         : FilterOperation(type)
264         , m_amount(amount)
265     {
266     }
267
268     double m_amount;
269 };
270
271 class GammaFilterOperation : public FilterOperation {
272 public:
273     static PassRefPtr<GammaFilterOperation> create(double amplitude, double exponent, double offset, OperationType type)
274     {
275         return adoptRef(new GammaFilterOperation(amplitude, exponent, offset, type));
276     }
277
278     double amplitude() const { return m_amplitude; }
279     double exponent() const { return m_exponent; }
280     double offset() const { return m_offset; }
281
282     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false);
283
284 private:
285     virtual bool operator==(const FilterOperation& o) const
286     {
287         if (!isSameType(o))
288             return false;
289         const GammaFilterOperation* other = static_cast<const GammaFilterOperation*>(&o);
290         return m_amplitude == other->m_amplitude && m_exponent == other->m_exponent && m_offset == other->m_offset;
291     }
292
293     GammaFilterOperation(double amplitude, double exponent, double offset, OperationType type)
294         : FilterOperation(type)
295         , m_amplitude(amplitude)
296         , m_exponent(exponent)
297         , m_offset(offset)
298     {
299     }
300
301     double m_amplitude;
302     double m_exponent;
303     double m_offset;
304 };
305
306 class BlurFilterOperation : public FilterOperation {
307 public:
308     static PassRefPtr<BlurFilterOperation> create(Length stdDeviation, OperationType type)
309     {
310         return adoptRef(new BlurFilterOperation(stdDeviation, type));
311     }
312
313     Length stdDeviation() const { return m_stdDeviation; }
314
315     virtual bool affectsOpacity() const { return true; }
316     virtual bool movesPixels() const { return true; }
317
318     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false);
319
320 private:
321     virtual bool operator==(const FilterOperation& o) const
322     {
323         if (!isSameType(o))
324             return false;
325         const BlurFilterOperation* other = static_cast<const BlurFilterOperation*>(&o);
326         return m_stdDeviation == other->m_stdDeviation;
327     }
328
329     BlurFilterOperation(Length stdDeviation, OperationType type)
330         : FilterOperation(type)
331         , m_stdDeviation(stdDeviation)
332     {
333     }
334
335     Length m_stdDeviation;
336 };
337
338 class DropShadowFilterOperation : public FilterOperation {
339 public:
340     static PassRefPtr<DropShadowFilterOperation> create(const IntPoint& location, int stdDeviation, Color color, OperationType type)
341     {
342         return adoptRef(new DropShadowFilterOperation(location, stdDeviation, color, type));
343     }
344
345     int x() const { return m_location.x(); }
346     int y() const { return m_location.y(); }
347     IntPoint location() const { return m_location; }
348     int stdDeviation() const { return m_stdDeviation; }
349     Color color() const { return m_color; }
350
351     virtual bool affectsOpacity() const { return true; }
352     virtual bool movesPixels() const { return true; }
353
354     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false);
355
356 private:
357
358     virtual bool operator==(const FilterOperation& o) const
359     {
360         if (!isSameType(o))
361             return false;
362         const DropShadowFilterOperation* other = static_cast<const DropShadowFilterOperation*>(&o);
363         return m_location == other->m_location && m_stdDeviation == other->m_stdDeviation && m_color == other->m_color;
364     }
365
366     DropShadowFilterOperation(const IntPoint& location, int stdDeviation, Color color, OperationType type)
367         : FilterOperation(type)
368         , m_location(location)
369         , m_stdDeviation(stdDeviation)
370         , m_color(color)
371     {
372     }
373
374     IntPoint m_location; // FIXME: should location be in Lengths?
375     int m_stdDeviation;
376     Color m_color;
377 };
378
379 } // namespace WebCore
380
381 #endif // ENABLE(CSS_FILTERS)
382
383 #endif // FilterOperation_h