OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 13 matching lines...) Expand all Loading... |
24 */ | 24 */ |
25 | 25 |
26 #ifndef FilterOperation_h | 26 #ifndef FilterOperation_h |
27 #define FilterOperation_h | 27 #define FilterOperation_h |
28 | 28 |
29 #include "platform/Length.h" | 29 #include "platform/Length.h" |
30 #include "platform/PlatformExport.h" | 30 #include "platform/PlatformExport.h" |
31 #include "platform/graphics/Color.h" | 31 #include "platform/graphics/Color.h" |
32 #include "platform/graphics/filters/Filter.h" | 32 #include "platform/graphics/filters/Filter.h" |
33 #include "platform/graphics/filters/ReferenceFilter.h" | 33 #include "platform/graphics/filters/ReferenceFilter.h" |
| 34 #include "platform/heap/Handle.h" |
34 #include "wtf/OwnPtr.h" | 35 #include "wtf/OwnPtr.h" |
35 #include "wtf/PassOwnPtr.h" | 36 #include "wtf/PassOwnPtr.h" |
36 #include "wtf/RefCounted.h" | 37 #include "wtf/RefCounted.h" |
37 #include "wtf/text/WTFString.h" | 38 #include "wtf/text/WTFString.h" |
38 | 39 |
39 namespace blink { | 40 namespace blink { |
40 | 41 |
41 // CSS Filters | 42 // CSS Filters |
42 | 43 |
43 class PLATFORM_EXPORT FilterOperation : public RefCounted<FilterOperation> { | 44 class PLATFORM_EXPORT FilterOperation : public RefCountedWillBeGarbageCollectedF
inalized<FilterOperation> { |
44 public: | 45 public: |
45 enum OperationType { | 46 enum OperationType { |
46 REFERENCE, // url(#somefilter) | 47 REFERENCE, // url(#somefilter) |
47 GRAYSCALE, | 48 GRAYSCALE, |
48 SEPIA, | 49 SEPIA, |
49 SATURATE, | 50 SATURATE, |
50 HUE_ROTATE, | 51 HUE_ROTATE, |
51 INVERT, | 52 INVERT, |
52 OPACITY, | 53 OPACITY, |
53 BRIGHTNESS, | 54 BRIGHTNESS, |
(...skipping 20 matching lines...) Expand all Loading... |
74 case REFERENCE: | 75 case REFERENCE: |
75 return false; | 76 return false; |
76 case NONE: | 77 case NONE: |
77 break; | 78 break; |
78 } | 79 } |
79 ASSERT_NOT_REACHED(); | 80 ASSERT_NOT_REACHED(); |
80 return false; | 81 return false; |
81 } | 82 } |
82 | 83 |
83 virtual ~FilterOperation() { } | 84 virtual ~FilterOperation() { } |
| 85 virtual void trace(Visitor*) { } |
84 | 86 |
85 static PassRefPtr<FilterOperation> blend(const FilterOperation* from, const
FilterOperation* to, double progress); | 87 static PassRefPtrWillBeRawPtr<FilterOperation> blend(const FilterOperation*
from, const FilterOperation* to, double progress); |
86 virtual bool operator==(const FilterOperation&) const = 0; | 88 virtual bool operator==(const FilterOperation&) const = 0; |
87 bool operator!=(const FilterOperation& o) const { return !(*this == o); } | 89 bool operator!=(const FilterOperation& o) const { return !(*this == o); } |
88 | 90 |
89 OperationType type() const { return m_type; } | 91 OperationType type() const { return m_type; } |
90 virtual bool isSameType(const FilterOperation& o) const { return o.type() ==
m_type; } | 92 virtual bool isSameType(const FilterOperation& o) const { return o.type() ==
m_type; } |
91 | 93 |
92 // True if the alpha channel of any pixel can change under this operation. | 94 // True if the alpha channel of any pixel can change under this operation. |
93 virtual bool affectsOpacity() const { return false; } | 95 virtual bool affectsOpacity() const { return false; } |
94 // True if the the value of one pixel can affect the value of another pixel
under this operation, such as blur. | 96 // True if the the value of one pixel can affect the value of another pixel
under this operation, such as blur. |
95 virtual bool movesPixels() const { return false; } | 97 virtual bool movesPixels() const { return false; } |
96 | 98 |
97 protected: | 99 protected: |
98 FilterOperation(OperationType type) | 100 FilterOperation(OperationType type) |
99 : m_type(type) | 101 : m_type(type) |
100 { | 102 { |
101 } | 103 } |
102 | 104 |
103 OperationType m_type; | 105 OperationType m_type; |
104 | 106 |
105 private: | 107 private: |
106 virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, doubl
e progress) const = 0; | 108 virtual PassRefPtrWillBeRawPtr<FilterOperation> blend(const FilterOperation*
from, double progress) const = 0; |
107 }; | 109 }; |
108 | 110 |
109 #define DEFINE_FILTER_OPERATION_TYPE_CASTS(thisType, operationType) \ | 111 #define DEFINE_FILTER_OPERATION_TYPE_CASTS(thisType, operationType) \ |
110 DEFINE_TYPE_CASTS(thisType, FilterOperation, op, op->type() == FilterOperati
on::operationType, op.type() == FilterOperation::operationType); | 112 DEFINE_TYPE_CASTS(thisType, FilterOperation, op, op->type() == FilterOperati
on::operationType, op.type() == FilterOperation::operationType); |
111 | 113 |
112 class PLATFORM_EXPORT ReferenceFilterOperation : public FilterOperation { | 114 class PLATFORM_EXPORT ReferenceFilterOperation : public FilterOperation { |
113 public: | 115 public: |
114 static PassRefPtr<ReferenceFilterOperation> create(const String& url, const
AtomicString& fragment) | 116 static PassRefPtrWillBeRawPtr<ReferenceFilterOperation> create(const String&
url, const AtomicString& fragment) |
115 { | 117 { |
116 return adoptRef(new ReferenceFilterOperation(url, fragment)); | 118 return adoptRefWillBeNoop(new ReferenceFilterOperation(url, fragment)); |
117 } | 119 } |
118 | 120 |
119 virtual bool affectsOpacity() const override { return true; } | 121 virtual bool affectsOpacity() const override { return true; } |
120 virtual bool movesPixels() const override { return true; } | 122 virtual bool movesPixels() const override { return true; } |
121 | 123 |
122 const String& url() const { return m_url; } | 124 const String& url() const { return m_url; } |
123 const AtomicString& fragment() const { return m_fragment; } | 125 const AtomicString& fragment() const { return m_fragment; } |
124 | 126 |
125 ReferenceFilter* filter() const { return m_filter.get(); } | 127 ReferenceFilter* filter() const { return m_filter.get(); } |
126 void setFilter(PassRefPtr<ReferenceFilter> filter) { m_filter = filter; } | 128 void setFilter(PassRefPtrWillBeRawPtr<ReferenceFilter> filter) { m_filter =
filter; } |
| 129 |
| 130 virtual void trace(Visitor*) override; |
127 | 131 |
128 private: | 132 private: |
129 virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, doubl
e progress) const override | 133 virtual PassRefPtrWillBeRawPtr<FilterOperation> blend(const FilterOperation*
from, double progress) const override |
130 { | 134 { |
131 ASSERT_NOT_REACHED(); | 135 ASSERT_NOT_REACHED(); |
132 return nullptr; | 136 return nullptr; |
133 } | 137 } |
134 | 138 |
135 virtual bool operator==(const FilterOperation& o) const override | 139 virtual bool operator==(const FilterOperation& o) const override |
136 { | 140 { |
137 if (!isSameType(o)) | 141 if (!isSameType(o)) |
138 return false; | 142 return false; |
139 const ReferenceFilterOperation* other = static_cast<const ReferenceFilte
rOperation*>(&o); | 143 const ReferenceFilterOperation* other = static_cast<const ReferenceFilte
rOperation*>(&o); |
140 return m_url == other->m_url; | 144 return m_url == other->m_url; |
141 } | 145 } |
142 | 146 |
143 ReferenceFilterOperation(const String& url, const AtomicString& fragment) | 147 ReferenceFilterOperation(const String& url, const AtomicString& fragment) |
144 : FilterOperation(REFERENCE) | 148 : FilterOperation(REFERENCE) |
145 , m_url(url) | 149 , m_url(url) |
146 , m_fragment(fragment) | 150 , m_fragment(fragment) |
147 { | 151 { |
148 } | 152 } |
149 | 153 |
150 String m_url; | 154 String m_url; |
151 AtomicString m_fragment; | 155 AtomicString m_fragment; |
152 RefPtr<ReferenceFilter> m_filter; | 156 RefPtrWillBeMember<ReferenceFilter> m_filter; |
153 }; | 157 }; |
154 | 158 |
155 DEFINE_FILTER_OPERATION_TYPE_CASTS(ReferenceFilterOperation, REFERENCE); | 159 DEFINE_FILTER_OPERATION_TYPE_CASTS(ReferenceFilterOperation, REFERENCE); |
156 | 160 |
157 // GRAYSCALE, SEPIA, SATURATE and HUE_ROTATE are variations on a basic color mat
rix effect. | 161 // GRAYSCALE, SEPIA, SATURATE and HUE_ROTATE are variations on a basic color mat
rix effect. |
158 // For HUE_ROTATE, the angle of rotation is stored in m_amount. | 162 // For HUE_ROTATE, the angle of rotation is stored in m_amount. |
159 class PLATFORM_EXPORT BasicColorMatrixFilterOperation : public FilterOperation { | 163 class PLATFORM_EXPORT BasicColorMatrixFilterOperation : public FilterOperation { |
160 public: | 164 public: |
161 static PassRefPtr<BasicColorMatrixFilterOperation> create(double amount, Ope
rationType type) | 165 static PassRefPtrWillBeRawPtr<BasicColorMatrixFilterOperation> create(double
amount, OperationType type) |
162 { | 166 { |
163 return adoptRef(new BasicColorMatrixFilterOperation(amount, type)); | 167 return adoptRefWillBeNoop(new BasicColorMatrixFilterOperation(amount, ty
pe)); |
164 } | 168 } |
165 | 169 |
166 double amount() const { return m_amount; } | 170 double amount() const { return m_amount; } |
167 | 171 |
168 | 172 |
169 private: | 173 private: |
170 virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, doubl
e progress) const override; | 174 virtual PassRefPtrWillBeRawPtr<FilterOperation> blend(const FilterOperation*
from, double progress) const override; |
171 virtual bool operator==(const FilterOperation& o) const override | 175 virtual bool operator==(const FilterOperation& o) const override |
172 { | 176 { |
173 if (!isSameType(o)) | 177 if (!isSameType(o)) |
174 return false; | 178 return false; |
175 const BasicColorMatrixFilterOperation* other = static_cast<const BasicCo
lorMatrixFilterOperation*>(&o); | 179 const BasicColorMatrixFilterOperation* other = static_cast<const BasicCo
lorMatrixFilterOperation*>(&o); |
176 return m_amount == other->m_amount; | 180 return m_amount == other->m_amount; |
177 } | 181 } |
178 | 182 |
179 BasicColorMatrixFilterOperation(double amount, OperationType type) | 183 BasicColorMatrixFilterOperation(double amount, OperationType type) |
180 : FilterOperation(type) | 184 : FilterOperation(type) |
181 , m_amount(amount) | 185 , m_amount(amount) |
182 { | 186 { |
183 } | 187 } |
184 | 188 |
185 double m_amount; | 189 double m_amount; |
186 }; | 190 }; |
187 | 191 |
188 inline bool isBasicColorMatrixFilterOperation(const FilterOperation& operation) | 192 inline bool isBasicColorMatrixFilterOperation(const FilterOperation& operation) |
189 { | 193 { |
190 FilterOperation::OperationType type = operation.type(); | 194 FilterOperation::OperationType type = operation.type(); |
191 return type == FilterOperation::GRAYSCALE || type == FilterOperation::SEPIA
|| type == FilterOperation::SATURATE || type == FilterOperation::HUE_ROTATE; | 195 return type == FilterOperation::GRAYSCALE || type == FilterOperation::SEPIA
|| type == FilterOperation::SATURATE || type == FilterOperation::HUE_ROTATE; |
192 } | 196 } |
193 | 197 |
194 DEFINE_TYPE_CASTS(BasicColorMatrixFilterOperation, FilterOperation, op, isBasicC
olorMatrixFilterOperation(*op), isBasicColorMatrixFilterOperation(op)); | 198 DEFINE_TYPE_CASTS(BasicColorMatrixFilterOperation, FilterOperation, op, isBasicC
olorMatrixFilterOperation(*op), isBasicColorMatrixFilterOperation(op)); |
195 | 199 |
196 // INVERT, BRIGHTNESS, CONTRAST and OPACITY are variations on a basic component
transfer effect. | 200 // INVERT, BRIGHTNESS, CONTRAST and OPACITY are variations on a basic component
transfer effect. |
197 class PLATFORM_EXPORT BasicComponentTransferFilterOperation : public FilterOpera
tion { | 201 class PLATFORM_EXPORT BasicComponentTransferFilterOperation : public FilterOpera
tion { |
198 public: | 202 public: |
199 static PassRefPtr<BasicComponentTransferFilterOperation> create(double amoun
t, OperationType type) | 203 static PassRefPtrWillBeRawPtr<BasicComponentTransferFilterOperation> create(
double amount, OperationType type) |
200 { | 204 { |
201 return adoptRef(new BasicComponentTransferFilterOperation(amount, type))
; | 205 return adoptRefWillBeNoop(new BasicComponentTransferFilterOperation(amou
nt, type)); |
202 } | 206 } |
203 | 207 |
204 double amount() const { return m_amount; } | 208 double amount() const { return m_amount; } |
205 | 209 |
206 virtual bool affectsOpacity() const override { return m_type == OPACITY; } | 210 virtual bool affectsOpacity() const override { return m_type == OPACITY; } |
207 | 211 |
208 | 212 |
209 private: | 213 private: |
210 virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, doubl
e progress) const override; | 214 virtual PassRefPtrWillBeRawPtr<FilterOperation> blend(const FilterOperation*
from, double progress) const override; |
211 virtual bool operator==(const FilterOperation& o) const override | 215 virtual bool operator==(const FilterOperation& o) const override |
212 { | 216 { |
213 if (!isSameType(o)) | 217 if (!isSameType(o)) |
214 return false; | 218 return false; |
215 const BasicComponentTransferFilterOperation* other = static_cast<const B
asicComponentTransferFilterOperation*>(&o); | 219 const BasicComponentTransferFilterOperation* other = static_cast<const B
asicComponentTransferFilterOperation*>(&o); |
216 return m_amount == other->m_amount; | 220 return m_amount == other->m_amount; |
217 } | 221 } |
218 | 222 |
219 BasicComponentTransferFilterOperation(double amount, OperationType type) | 223 BasicComponentTransferFilterOperation(double amount, OperationType type) |
220 : FilterOperation(type) | 224 : FilterOperation(type) |
221 , m_amount(amount) | 225 , m_amount(amount) |
222 { | 226 { |
223 } | 227 } |
224 | 228 |
225 double m_amount; | 229 double m_amount; |
226 }; | 230 }; |
227 | 231 |
228 inline bool isBasicComponentTransferFilterOperation(const FilterOperation& opera
tion) | 232 inline bool isBasicComponentTransferFilterOperation(const FilterOperation& opera
tion) |
229 { | 233 { |
230 FilterOperation::OperationType type = operation.type(); | 234 FilterOperation::OperationType type = operation.type(); |
231 return type == FilterOperation::INVERT || type == FilterOperation::OPACITY |
| type == FilterOperation::BRIGHTNESS || type == FilterOperation::CONTRAST; | 235 return type == FilterOperation::INVERT || type == FilterOperation::OPACITY |
| type == FilterOperation::BRIGHTNESS || type == FilterOperation::CONTRAST; |
232 } | 236 } |
233 | 237 |
234 DEFINE_TYPE_CASTS(BasicComponentTransferFilterOperation, FilterOperation, op, is
BasicComponentTransferFilterOperation(*op), isBasicComponentTransferFilterOperat
ion(op)); | 238 DEFINE_TYPE_CASTS(BasicComponentTransferFilterOperation, FilterOperation, op, is
BasicComponentTransferFilterOperation(*op), isBasicComponentTransferFilterOperat
ion(op)); |
235 | 239 |
236 class PLATFORM_EXPORT BlurFilterOperation : public FilterOperation { | 240 class PLATFORM_EXPORT BlurFilterOperation : public FilterOperation { |
237 public: | 241 public: |
238 static PassRefPtr<BlurFilterOperation> create(const Length& stdDeviation) | 242 static PassRefPtrWillBeRawPtr<BlurFilterOperation> create(const Length& stdD
eviation) |
239 { | 243 { |
240 return adoptRef(new BlurFilterOperation(stdDeviation)); | 244 return adoptRefWillBeNoop(new BlurFilterOperation(stdDeviation)); |
241 } | 245 } |
242 | 246 |
243 const Length& stdDeviation() const { return m_stdDeviation; } | 247 const Length& stdDeviation() const { return m_stdDeviation; } |
244 | 248 |
245 virtual bool affectsOpacity() const override { return true; } | 249 virtual bool affectsOpacity() const override { return true; } |
246 virtual bool movesPixels() const override { return true; } | 250 virtual bool movesPixels() const override { return true; } |
247 | 251 |
248 | 252 |
249 private: | 253 private: |
250 virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, doubl
e progress) const override; | 254 virtual PassRefPtrWillBeRawPtr<FilterOperation> blend(const FilterOperation*
from, double progress) const override; |
251 virtual bool operator==(const FilterOperation& o) const override | 255 virtual bool operator==(const FilterOperation& o) const override |
252 { | 256 { |
253 if (!isSameType(o)) | 257 if (!isSameType(o)) |
254 return false; | 258 return false; |
255 const BlurFilterOperation* other = static_cast<const BlurFilterOperation
*>(&o); | 259 const BlurFilterOperation* other = static_cast<const BlurFilterOperation
*>(&o); |
256 return m_stdDeviation == other->m_stdDeviation; | 260 return m_stdDeviation == other->m_stdDeviation; |
257 } | 261 } |
258 | 262 |
259 BlurFilterOperation(const Length& stdDeviation) | 263 BlurFilterOperation(const Length& stdDeviation) |
260 : FilterOperation(BLUR) | 264 : FilterOperation(BLUR) |
261 , m_stdDeviation(stdDeviation) | 265 , m_stdDeviation(stdDeviation) |
262 { | 266 { |
263 } | 267 } |
264 | 268 |
265 Length m_stdDeviation; | 269 Length m_stdDeviation; |
266 }; | 270 }; |
267 | 271 |
268 DEFINE_FILTER_OPERATION_TYPE_CASTS(BlurFilterOperation, BLUR); | 272 DEFINE_FILTER_OPERATION_TYPE_CASTS(BlurFilterOperation, BLUR); |
269 | 273 |
270 class PLATFORM_EXPORT DropShadowFilterOperation : public FilterOperation { | 274 class PLATFORM_EXPORT DropShadowFilterOperation : public FilterOperation { |
271 public: | 275 public: |
272 static PassRefPtr<DropShadowFilterOperation> create(const IntPoint& location
, int stdDeviation, Color color) | 276 static PassRefPtrWillBeRawPtr<DropShadowFilterOperation> create(const IntPoi
nt& location, int stdDeviation, Color color) |
273 { | 277 { |
274 return adoptRef(new DropShadowFilterOperation(location, stdDeviation, co
lor)); | 278 return adoptRefWillBeNoop(new DropShadowFilterOperation(location, stdDev
iation, color)); |
275 } | 279 } |
276 | 280 |
277 int x() const { return m_location.x(); } | 281 int x() const { return m_location.x(); } |
278 int y() const { return m_location.y(); } | 282 int y() const { return m_location.y(); } |
279 IntPoint location() const { return m_location; } | 283 IntPoint location() const { return m_location; } |
280 int stdDeviation() const { return m_stdDeviation; } | 284 int stdDeviation() const { return m_stdDeviation; } |
281 Color color() const { return m_color; } | 285 Color color() const { return m_color; } |
282 | 286 |
283 virtual bool affectsOpacity() const override { return true; } | 287 virtual bool affectsOpacity() const override { return true; } |
284 virtual bool movesPixels() const override { return true; } | 288 virtual bool movesPixels() const override { return true; } |
285 | 289 |
286 | 290 |
287 private: | 291 private: |
288 virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, doubl
e progress) const override; | 292 virtual PassRefPtrWillBeRawPtr<FilterOperation> blend(const FilterOperation*
from, double progress) const override; |
289 virtual bool operator==(const FilterOperation& o) const override | 293 virtual bool operator==(const FilterOperation& o) const override |
290 { | 294 { |
291 if (!isSameType(o)) | 295 if (!isSameType(o)) |
292 return false; | 296 return false; |
293 const DropShadowFilterOperation* other = static_cast<const DropShadowFil
terOperation*>(&o); | 297 const DropShadowFilterOperation* other = static_cast<const DropShadowFil
terOperation*>(&o); |
294 return m_location == other->m_location && m_stdDeviation == other->m_std
Deviation && m_color == other->m_color; | 298 return m_location == other->m_location && m_stdDeviation == other->m_std
Deviation && m_color == other->m_color; |
295 } | 299 } |
296 | 300 |
297 DropShadowFilterOperation(const IntPoint& location, int stdDeviation, Color
color) | 301 DropShadowFilterOperation(const IntPoint& location, int stdDeviation, Color
color) |
298 : FilterOperation(DROP_SHADOW) | 302 : FilterOperation(DROP_SHADOW) |
299 , m_location(location) | 303 , m_location(location) |
300 , m_stdDeviation(stdDeviation) | 304 , m_stdDeviation(stdDeviation) |
301 , m_color(color) | 305 , m_color(color) |
302 { | 306 { |
303 } | 307 } |
304 | 308 |
305 IntPoint m_location; // FIXME: should location be in Lengths? | 309 IntPoint m_location; // FIXME: should location be in Lengths? |
306 int m_stdDeviation; | 310 int m_stdDeviation; |
307 Color m_color; | 311 Color m_color; |
308 }; | 312 }; |
309 | 313 |
310 DEFINE_FILTER_OPERATION_TYPE_CASTS(DropShadowFilterOperation, DROP_SHADOW); | 314 DEFINE_FILTER_OPERATION_TYPE_CASTS(DropShadowFilterOperation, DROP_SHADOW); |
311 | 315 |
312 } // namespace blink | 316 } // namespace blink |
313 | 317 |
314 | 318 |
315 #endif // FilterOperation_h | 319 #endif // FilterOperation_h |
OLD | NEW |