GammaFilterOperation seems to be dead code
[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 // CSS Filters
52
53 #if ENABLE(SVG)
54 class CachedSVGDocumentReference;
55 #endif
56
57 #if PLATFORM(BLACKBERRY)
58 class FilterOperation : public ThreadSafeRefCounted<FilterOperation> {
59 #else
60 class FilterOperation : public RefCounted<FilterOperation> {
61 #endif
62 public:
63     enum OperationType {
64         REFERENCE, // url(#somefilter)
65         GRAYSCALE,
66         SEPIA,
67         SATURATE,
68         HUE_ROTATE,
69         INVERT,
70         OPACITY,
71         BRIGHTNESS,
72         CONTRAST,
73         BLUR,
74         DROP_SHADOW,
75 #if ENABLE(CSS_SHADERS)
76         CUSTOM,
77         VALIDATED_CUSTOM,
78 #endif
79         PASSTHROUGH,
80         NONE
81     };
82
83     virtual ~FilterOperation() { }
84
85     virtual bool operator==(const FilterOperation&) const = 0;
86     bool operator!=(const FilterOperation& o) const { return !(*this == o); }
87
88     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* /*from*/, double /*progress*/, bool /*blendToPassthrough*/ = false)
89     { 
90         ASSERT(!blendingNeedsRendererSize());
91         return 0; 
92     }
93
94     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* /*from*/, double /*progress*/, const LayoutSize&, bool /*blendToPassthrough*/ = false)
95     { 
96         ASSERT(blendingNeedsRendererSize());
97         return 0; 
98     }
99
100     virtual OperationType getOperationType() const { return m_type; }
101     virtual bool isSameType(const FilterOperation& o) const { return o.getOperationType() == m_type; }
102     
103     virtual bool isDefault() const { return false; }
104
105     // True if the alpha channel of any pixel can change under this operation.
106     virtual bool affectsOpacity() const { return false; }
107     // True if the the value of one pixel can affect the value of another pixel under this operation, such as blur.
108     virtual bool movesPixels() const { return false; }
109     // True if the filter needs the size of the box in order to calculate the animations.
110     virtual bool blendingNeedsRendererSize() const { return false; }
111
112 protected:
113     FilterOperation(OperationType type)
114         : m_type(type)
115     {
116     }
117
118     OperationType m_type;
119 };
120
121 class DefaultFilterOperation : public FilterOperation {
122 public:
123     static PassRefPtr<DefaultFilterOperation> create(OperationType type)
124     {
125         return adoptRef(new DefaultFilterOperation(type));
126     }
127
128 private:
129     virtual bool operator==(const FilterOperation& o) const OVERRIDE
130     {
131         return isSameType(o);
132     }
133
134     virtual bool isDefault() const OVERRIDE { return true; }
135
136     DefaultFilterOperation(OperationType type)
137         : FilterOperation(type)
138     {
139     }
140 };
141
142 class PassthroughFilterOperation : public FilterOperation {
143 public:
144     static PassRefPtr<PassthroughFilterOperation> create()
145     {
146         return adoptRef(new PassthroughFilterOperation());
147     }
148
149 private:
150     virtual bool operator==(const FilterOperation& o) const OVERRIDE
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     virtual ~ReferenceFilterOperation();
168
169     virtual bool affectsOpacity() const OVERRIDE { return true; }
170     virtual bool movesPixels() const OVERRIDE { return true; }
171
172     const String& url() const { return m_url; }
173     const String& fragment() const { return m_fragment; }
174
175 #if ENABLE(SVG)
176     CachedSVGDocumentReference* cachedSVGDocumentReference() const { return m_cachedSVGDocumentReference.get(); }
177     void setCachedSVGDocumentReference(PassOwnPtr<CachedSVGDocumentReference>);
178 #endif
179
180     FilterEffect* filterEffect() const { return m_filterEffect.get(); }
181     void setFilterEffect(PassRefPtr<FilterEffect> filterEffect) { m_filterEffect = filterEffect; }
182
183 private:
184     ReferenceFilterOperation(const String& url, const String& fragment, OperationType);
185
186     virtual bool operator==(const FilterOperation& o) const OVERRIDE
187     {
188         if (!isSameType(o))
189             return false;
190         const ReferenceFilterOperation* other = static_cast<const ReferenceFilterOperation*>(&o);
191         return m_url == other->m_url;
192     }
193
194     String m_url;
195     String m_fragment;
196 #if ENABLE(SVG)
197     OwnPtr<CachedSVGDocumentReference> m_cachedSVGDocumentReference;
198 #endif
199     RefPtr<FilterEffect> m_filterEffect;
200 };
201
202 // GRAYSCALE, SEPIA, SATURATE and HUE_ROTATE are variations on a basic color matrix effect.
203 // For HUE_ROTATE, the angle of rotation is stored in m_amount.
204 class BasicColorMatrixFilterOperation : public FilterOperation {
205 public:
206     static PassRefPtr<BasicColorMatrixFilterOperation> create(double amount, OperationType type)
207     {
208         return adoptRef(new BasicColorMatrixFilterOperation(amount, type));
209     }
210
211     double amount() const { return m_amount; }
212
213     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false) OVERRIDE;
214
215 private:
216     virtual bool operator==(const FilterOperation& o) const OVERRIDE
217     {
218         if (!isSameType(o))
219             return false;
220         const BasicColorMatrixFilterOperation* other = static_cast<const BasicColorMatrixFilterOperation*>(&o);
221         return m_amount == other->m_amount;
222     }
223     
224     double passthroughAmount() const;
225     
226     BasicColorMatrixFilterOperation(double amount, OperationType type)
227         : FilterOperation(type)
228         , m_amount(amount)
229     {
230     }
231
232     double m_amount;
233 };
234
235 // INVERT, BRIGHTNESS, CONTRAST and OPACITY are variations on a basic component transfer effect.
236 class BasicComponentTransferFilterOperation : public FilterOperation {
237 public:
238     static PassRefPtr<BasicComponentTransferFilterOperation> create(double amount, OperationType type)
239     {
240         return adoptRef(new BasicComponentTransferFilterOperation(amount, type));
241     }
242
243     double amount() const { return m_amount; }
244
245     virtual bool affectsOpacity() const OVERRIDE { return m_type == OPACITY; }
246
247     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false) OVERRIDE;
248
249 private:
250     virtual bool operator==(const FilterOperation& o) const OVERRIDE
251     {
252         if (!isSameType(o))
253             return false;
254         const BasicComponentTransferFilterOperation* other = static_cast<const BasicComponentTransferFilterOperation*>(&o);
255         return m_amount == other->m_amount;
256     }
257
258     double passthroughAmount() const;
259
260     BasicComponentTransferFilterOperation(double amount, OperationType type)
261         : FilterOperation(type)
262         , m_amount(amount)
263     {
264     }
265
266     double m_amount;
267 };
268
269 class BlurFilterOperation : public FilterOperation {
270 public:
271     static PassRefPtr<BlurFilterOperation> create(Length stdDeviation, OperationType type)
272     {
273         return adoptRef(new BlurFilterOperation(std::move(stdDeviation), type));
274     }
275
276     const Length& stdDeviation() const { return m_stdDeviation; }
277
278     virtual bool affectsOpacity() const OVERRIDE { return true; }
279     virtual bool movesPixels() const OVERRIDE { return true; }
280
281     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false) OVERRIDE;
282
283 private:
284     virtual bool operator==(const FilterOperation& o) const OVERRIDE
285     {
286         if (!isSameType(o))
287             return false;
288         const BlurFilterOperation* other = static_cast<const BlurFilterOperation*>(&o);
289         return m_stdDeviation == other->m_stdDeviation;
290     }
291
292     BlurFilterOperation(Length stdDeviation, OperationType type)
293         : FilterOperation(type)
294         , m_stdDeviation(std::move(stdDeviation))
295     {
296     }
297
298     Length m_stdDeviation;
299 };
300
301 class DropShadowFilterOperation : public FilterOperation {
302 public:
303     static PassRefPtr<DropShadowFilterOperation> create(const IntPoint& location, int stdDeviation, Color color, OperationType type)
304     {
305         return adoptRef(new DropShadowFilterOperation(location, stdDeviation, color, type));
306     }
307
308     int x() const { return m_location.x(); }
309     int y() const { return m_location.y(); }
310     IntPoint location() const { return m_location; }
311     int stdDeviation() const { return m_stdDeviation; }
312     Color color() const { return m_color; }
313
314     virtual bool affectsOpacity() const OVERRIDE { return true; }
315     virtual bool movesPixels() const OVERRIDE { return true; }
316
317     virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress, bool blendToPassthrough = false) OVERRIDE;
318
319 private:
320     virtual bool operator==(const FilterOperation& o) const OVERRIDE
321     {
322         if (!isSameType(o))
323             return false;
324         const DropShadowFilterOperation* other = static_cast<const DropShadowFilterOperation*>(&o);
325         return m_location == other->m_location && m_stdDeviation == other->m_stdDeviation && m_color == other->m_color;
326     }
327
328     DropShadowFilterOperation(const IntPoint& location, int stdDeviation, Color color, OperationType type)
329         : FilterOperation(type)
330         , m_location(location)
331         , m_stdDeviation(stdDeviation)
332         , m_color(color)
333     {
334     }
335
336     IntPoint m_location; // FIXME: should location be in Lengths?
337     int m_stdDeviation;
338     Color m_color;
339 };
340
341 } // namespace WebCore
342
343 #endif // ENABLE(CSS_FILTERS)
344
345 #endif // FilterOperation_h