| 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 |
| 11 * documentation and/or other materials provided with the distribution. | 11 * documentation and/or other materials provided with the distribution. |
| 12 * | 12 * |
| 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
| 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
| 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 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. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #ifndef FilterOperation_h | 26 #ifndef FilterOperation_h |
| 27 #define FilterOperation_h | 27 #define FilterOperation_h |
| 28 | 28 |
| 29 #include "core/CoreExport.h" |
| 29 #include "platform/Length.h" | 30 #include "platform/Length.h" |
| 30 #include "platform/PlatformExport.h" | |
| 31 #include "platform/graphics/BoxReflection.h" | 31 #include "platform/graphics/BoxReflection.h" |
| 32 #include "platform/graphics/Color.h" | 32 #include "platform/graphics/Color.h" |
| 33 #include "platform/graphics/filters/Filter.h" | 33 #include "platform/graphics/filters/Filter.h" |
| 34 #include "platform/heap/Handle.h" | 34 #include "platform/heap/Handle.h" |
| 35 #include "wtf/Noncopyable.h" | 35 #include "wtf/Noncopyable.h" |
| 36 #include "wtf/text/WTFString.h" | 36 #include "wtf/text/WTFString.h" |
| 37 | 37 |
| 38 namespace blink { | 38 namespace blink { |
| 39 | 39 |
| 40 // CSS Filters | 40 // CSS Filters |
| 41 | 41 |
| 42 class PLATFORM_EXPORT FilterOperation : public GarbageCollectedFinalized<FilterO
peration> { | 42 class CORE_EXPORT FilterOperation : public GarbageCollectedFinalized<FilterOpera
tion> { |
| 43 WTF_MAKE_NONCOPYABLE(FilterOperation); | 43 WTF_MAKE_NONCOPYABLE(FilterOperation); |
| 44 public: | 44 public: |
| 45 enum OperationType { | 45 enum OperationType { |
| 46 REFERENCE, // url(#somefilter) | 46 REFERENCE, // url(#somefilter) |
| 47 GRAYSCALE, | 47 GRAYSCALE, |
| 48 SEPIA, | 48 SEPIA, |
| 49 SATURATE, | 49 SATURATE, |
| 50 HUE_ROTATE, | 50 HUE_ROTATE, |
| 51 INVERT, | 51 INVERT, |
| 52 OPACITY, | 52 OPACITY, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 71 case CONTRAST: | 71 case CONTRAST: |
| 72 case BLUR: | 72 case BLUR: |
| 73 case DROP_SHADOW: | 73 case DROP_SHADOW: |
| 74 return true; | 74 return true; |
| 75 case REFERENCE: | 75 case REFERENCE: |
| 76 case BOX_REFLECT: | 76 case BOX_REFLECT: |
| 77 return false; | 77 return false; |
| 78 case NONE: | 78 case NONE: |
| 79 break; | 79 break; |
| 80 } | 80 } |
| 81 ASSERT_NOT_REACHED(); | 81 NOTREACHED(); |
| 82 return false; | 82 return false; |
| 83 } | 83 } |
| 84 | 84 |
| 85 virtual ~FilterOperation() { } | 85 virtual ~FilterOperation() { } |
| 86 DEFINE_INLINE_VIRTUAL_TRACE() { } | 86 DEFINE_INLINE_VIRTUAL_TRACE() { } |
| 87 | 87 |
| 88 static FilterOperation* blend(const FilterOperation* from, const FilterOpera
tion* to, double progress); | 88 static FilterOperation* blend(const FilterOperation* from, const FilterOpera
tion* to, double progress); |
| 89 virtual bool operator==(const FilterOperation&) const = 0; | 89 virtual bool operator==(const FilterOperation&) const = 0; |
| 90 bool operator!=(const FilterOperation& o) const { return !(*this == o); } | 90 bool operator!=(const FilterOperation& o) const { return !(*this == o); } |
| 91 | 91 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 110 | 110 |
| 111 OperationType m_type; | 111 OperationType m_type; |
| 112 | 112 |
| 113 private: | 113 private: |
| 114 virtual FilterOperation* blend(const FilterOperation* from, double progress)
const = 0; | 114 virtual FilterOperation* blend(const FilterOperation* from, double progress)
const = 0; |
| 115 }; | 115 }; |
| 116 | 116 |
| 117 #define DEFINE_FILTER_OPERATION_TYPE_CASTS(thisType, operationType) \ | 117 #define DEFINE_FILTER_OPERATION_TYPE_CASTS(thisType, operationType) \ |
| 118 DEFINE_TYPE_CASTS(thisType, FilterOperation, op, op->type() == FilterOperati
on::operationType, op.type() == FilterOperation::operationType); | 118 DEFINE_TYPE_CASTS(thisType, FilterOperation, op, op->type() == FilterOperati
on::operationType, op.type() == FilterOperation::operationType); |
| 119 | 119 |
| 120 class PLATFORM_EXPORT ReferenceFilterOperation : public FilterOperation { | 120 class CORE_EXPORT ReferenceFilterOperation : public FilterOperation { |
| 121 public: | 121 public: |
| 122 static ReferenceFilterOperation* create(const String& url, const AtomicStrin
g& fragment) | 122 static ReferenceFilterOperation* create(const String& url, const AtomicStrin
g& fragment) |
| 123 { | 123 { |
| 124 return new ReferenceFilterOperation(url, fragment); | 124 return new ReferenceFilterOperation(url, fragment); |
| 125 } | 125 } |
| 126 | 126 |
| 127 bool affectsOpacity() const override { return true; } | 127 bool affectsOpacity() const override { return true; } |
| 128 bool movesPixels() const override { return true; } | 128 bool movesPixels() const override { return true; } |
| 129 FloatRect mapRect(const FloatRect&) const override; | 129 FloatRect mapRect(const FloatRect&) const override; |
| 130 | 130 |
| 131 const String& url() const { return m_url; } | 131 const String& url() const { return m_url; } |
| 132 const AtomicString& fragment() const { return m_fragment; } | 132 const AtomicString& fragment() const { return m_fragment; } |
| 133 | 133 |
| 134 Filter* getFilter() const { return m_filter.get(); } | 134 Filter* getFilter() const { return m_filter.get(); } |
| 135 void setFilter(Filter* filter) { m_filter = filter; } | 135 void setFilter(Filter* filter) { m_filter = filter; } |
| 136 | 136 |
| 137 DECLARE_VIRTUAL_TRACE(); | 137 DECLARE_VIRTUAL_TRACE(); |
| 138 | 138 |
| 139 private: | 139 private: |
| 140 FilterOperation* blend(const FilterOperation* from, double progress) const o
verride | 140 FilterOperation* blend(const FilterOperation* from, double progress) const o
verride |
| 141 { | 141 { |
| 142 ASSERT_NOT_REACHED(); | 142 NOTREACHED(); |
| 143 return nullptr; | 143 return nullptr; |
| 144 } | 144 } |
| 145 | 145 |
| 146 bool operator==(const FilterOperation& o) const override | 146 bool operator==(const FilterOperation& o) const override |
| 147 { | 147 { |
| 148 if (!isSameType(o)) | 148 if (!isSameType(o)) |
| 149 return false; | 149 return false; |
| 150 const ReferenceFilterOperation* other = static_cast<const ReferenceFilte
rOperation*>(&o); | 150 const ReferenceFilterOperation* other = static_cast<const ReferenceFilte
rOperation*>(&o); |
| 151 return m_url == other->m_url; | 151 return m_url == other->m_url; |
| 152 } | 152 } |
| 153 | 153 |
| 154 ReferenceFilterOperation(const String& url, const AtomicString& fragment) | 154 ReferenceFilterOperation(const String& url, const AtomicString& fragment) |
| 155 : FilterOperation(REFERENCE) | 155 : FilterOperation(REFERENCE) |
| 156 , m_url(url) | 156 , m_url(url) |
| 157 , m_fragment(fragment) | 157 , m_fragment(fragment) |
| 158 { | 158 { |
| 159 } | 159 } |
| 160 | 160 |
| 161 String m_url; | 161 String m_url; |
| 162 AtomicString m_fragment; | 162 AtomicString m_fragment; |
| 163 Member<Filter> m_filter; | 163 Member<Filter> m_filter; |
| 164 }; | 164 }; |
| 165 | 165 |
| 166 DEFINE_FILTER_OPERATION_TYPE_CASTS(ReferenceFilterOperation, REFERENCE); | 166 DEFINE_FILTER_OPERATION_TYPE_CASTS(ReferenceFilterOperation, REFERENCE); |
| 167 | 167 |
| 168 // GRAYSCALE, SEPIA, SATURATE and HUE_ROTATE are variations on a basic color mat
rix effect. | 168 // GRAYSCALE, SEPIA, SATURATE and HUE_ROTATE are variations on a basic color mat
rix effect. |
| 169 // For HUE_ROTATE, the angle of rotation is stored in m_amount. | 169 // For HUE_ROTATE, the angle of rotation is stored in m_amount. |
| 170 class PLATFORM_EXPORT BasicColorMatrixFilterOperation : public FilterOperation { | 170 class CORE_EXPORT BasicColorMatrixFilterOperation : public FilterOperation { |
| 171 public: | 171 public: |
| 172 static BasicColorMatrixFilterOperation* create(double amount, OperationType
type) | 172 static BasicColorMatrixFilterOperation* create(double amount, OperationType
type) |
| 173 { | 173 { |
| 174 return new BasicColorMatrixFilterOperation(amount, type); | 174 return new BasicColorMatrixFilterOperation(amount, type); |
| 175 } | 175 } |
| 176 | 176 |
| 177 double amount() const { return m_amount; } | 177 double amount() const { return m_amount; } |
| 178 | 178 |
| 179 | 179 |
| 180 private: | 180 private: |
| (...skipping 17 matching lines...) Expand all Loading... |
| 198 | 198 |
| 199 inline bool isBasicColorMatrixFilterOperation(const FilterOperation& operation) | 199 inline bool isBasicColorMatrixFilterOperation(const FilterOperation& operation) |
| 200 { | 200 { |
| 201 FilterOperation::OperationType type = operation.type(); | 201 FilterOperation::OperationType type = operation.type(); |
| 202 return type == FilterOperation::GRAYSCALE || type == FilterOperation::SEPIA
|| type == FilterOperation::SATURATE || type == FilterOperation::HUE_ROTATE; | 202 return type == FilterOperation::GRAYSCALE || type == FilterOperation::SEPIA
|| type == FilterOperation::SATURATE || type == FilterOperation::HUE_ROTATE; |
| 203 } | 203 } |
| 204 | 204 |
| 205 DEFINE_TYPE_CASTS(BasicColorMatrixFilterOperation, FilterOperation, op, isBasicC
olorMatrixFilterOperation(*op), isBasicColorMatrixFilterOperation(op)); | 205 DEFINE_TYPE_CASTS(BasicColorMatrixFilterOperation, FilterOperation, op, isBasicC
olorMatrixFilterOperation(*op), isBasicColorMatrixFilterOperation(op)); |
| 206 | 206 |
| 207 // INVERT, BRIGHTNESS, CONTRAST and OPACITY are variations on a basic component
transfer effect. | 207 // INVERT, BRIGHTNESS, CONTRAST and OPACITY are variations on a basic component
transfer effect. |
| 208 class PLATFORM_EXPORT BasicComponentTransferFilterOperation : public FilterOpera
tion { | 208 class CORE_EXPORT BasicComponentTransferFilterOperation : public FilterOperation
{ |
| 209 public: | 209 public: |
| 210 static BasicComponentTransferFilterOperation* create(double amount, Operatio
nType type) | 210 static BasicComponentTransferFilterOperation* create(double amount, Operatio
nType type) |
| 211 { | 211 { |
| 212 return new BasicComponentTransferFilterOperation(amount, type); | 212 return new BasicComponentTransferFilterOperation(amount, type); |
| 213 } | 213 } |
| 214 | 214 |
| 215 double amount() const { return m_amount; } | 215 double amount() const { return m_amount; } |
| 216 | 216 |
| 217 bool affectsOpacity() const override { return m_type == OPACITY; } | 217 bool affectsOpacity() const override { return m_type == OPACITY; } |
| 218 | 218 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 237 }; | 237 }; |
| 238 | 238 |
| 239 inline bool isBasicComponentTransferFilterOperation(const FilterOperation& opera
tion) | 239 inline bool isBasicComponentTransferFilterOperation(const FilterOperation& opera
tion) |
| 240 { | 240 { |
| 241 FilterOperation::OperationType type = operation.type(); | 241 FilterOperation::OperationType type = operation.type(); |
| 242 return type == FilterOperation::INVERT || type == FilterOperation::OPACITY |
| type == FilterOperation::BRIGHTNESS || type == FilterOperation::CONTRAST; | 242 return type == FilterOperation::INVERT || type == FilterOperation::OPACITY |
| type == FilterOperation::BRIGHTNESS || type == FilterOperation::CONTRAST; |
| 243 } | 243 } |
| 244 | 244 |
| 245 DEFINE_TYPE_CASTS(BasicComponentTransferFilterOperation, FilterOperation, op, is
BasicComponentTransferFilterOperation(*op), isBasicComponentTransferFilterOperat
ion(op)); | 245 DEFINE_TYPE_CASTS(BasicComponentTransferFilterOperation, FilterOperation, op, is
BasicComponentTransferFilterOperation(*op), isBasicComponentTransferFilterOperat
ion(op)); |
| 246 | 246 |
| 247 class PLATFORM_EXPORT BlurFilterOperation : public FilterOperation { | 247 class CORE_EXPORT BlurFilterOperation : public FilterOperation { |
| 248 public: | 248 public: |
| 249 static BlurFilterOperation* create(const Length& stdDeviation) | 249 static BlurFilterOperation* create(const Length& stdDeviation) |
| 250 { | 250 { |
| 251 return new BlurFilterOperation(stdDeviation); | 251 return new BlurFilterOperation(stdDeviation); |
| 252 } | 252 } |
| 253 | 253 |
| 254 const Length& stdDeviation() const { return m_stdDeviation; } | 254 const Length& stdDeviation() const { return m_stdDeviation; } |
| 255 | 255 |
| 256 bool affectsOpacity() const override { return true; } | 256 bool affectsOpacity() const override { return true; } |
| 257 bool movesPixels() const override { return true; } | 257 bool movesPixels() const override { return true; } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 271 : FilterOperation(BLUR) | 271 : FilterOperation(BLUR) |
| 272 , m_stdDeviation(stdDeviation) | 272 , m_stdDeviation(stdDeviation) |
| 273 { | 273 { |
| 274 } | 274 } |
| 275 | 275 |
| 276 Length m_stdDeviation; | 276 Length m_stdDeviation; |
| 277 }; | 277 }; |
| 278 | 278 |
| 279 DEFINE_FILTER_OPERATION_TYPE_CASTS(BlurFilterOperation, BLUR); | 279 DEFINE_FILTER_OPERATION_TYPE_CASTS(BlurFilterOperation, BLUR); |
| 280 | 280 |
| 281 class PLATFORM_EXPORT DropShadowFilterOperation : public FilterOperation { | 281 class CORE_EXPORT DropShadowFilterOperation : public FilterOperation { |
| 282 public: | 282 public: |
| 283 static DropShadowFilterOperation* create(const IntPoint& location, int stdDe
viation, Color color) | 283 static DropShadowFilterOperation* create(const IntPoint& location, int stdDe
viation, Color color) |
| 284 { | 284 { |
| 285 return new DropShadowFilterOperation(location, stdDeviation, color); | 285 return new DropShadowFilterOperation(location, stdDeviation, color); |
| 286 } | 286 } |
| 287 | 287 |
| 288 int x() const { return m_location.x(); } | 288 int x() const { return m_location.x(); } |
| 289 int y() const { return m_location.y(); } | 289 int y() const { return m_location.y(); } |
| 290 IntPoint location() const { return m_location; } | 290 IntPoint location() const { return m_location; } |
| 291 int stdDeviation() const { return m_stdDeviation; } | 291 int stdDeviation() const { return m_stdDeviation; } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 313 { | 313 { |
| 314 } | 314 } |
| 315 | 315 |
| 316 IntPoint m_location; // FIXME: should location be in Lengths? | 316 IntPoint m_location; // FIXME: should location be in Lengths? |
| 317 int m_stdDeviation; | 317 int m_stdDeviation; |
| 318 Color m_color; | 318 Color m_color; |
| 319 }; | 319 }; |
| 320 | 320 |
| 321 DEFINE_FILTER_OPERATION_TYPE_CASTS(DropShadowFilterOperation, DROP_SHADOW); | 321 DEFINE_FILTER_OPERATION_TYPE_CASTS(DropShadowFilterOperation, DROP_SHADOW); |
| 322 | 322 |
| 323 class PLATFORM_EXPORT BoxReflectFilterOperation : public FilterOperation { | 323 class CORE_EXPORT BoxReflectFilterOperation : public FilterOperation { |
| 324 public: | 324 public: |
| 325 static BoxReflectFilterOperation* create(const BoxReflection& reflection) | 325 static BoxReflectFilterOperation* create(const BoxReflection& reflection) |
| 326 { | 326 { |
| 327 return new BoxReflectFilterOperation(reflection); | 327 return new BoxReflectFilterOperation(reflection); |
| 328 } | 328 } |
| 329 | 329 |
| 330 const BoxReflection& reflection() const { return m_reflection; } | 330 const BoxReflection& reflection() const { return m_reflection; } |
| 331 | 331 |
| 332 bool affectsOpacity() const override { return true; } | 332 bool affectsOpacity() const override { return true; } |
| 333 bool movesPixels() const override { return true; } | 333 bool movesPixels() const override { return true; } |
| 334 FloatRect mapRect(const FloatRect&) const override; | 334 FloatRect mapRect(const FloatRect&) const override; |
| 335 | 335 |
| 336 private: | 336 private: |
| 337 FilterOperation* blend(const FilterOperation* from, double progress) const o
verride; | 337 FilterOperation* blend(const FilterOperation* from, double progress) const o
verride; |
| 338 bool operator==(const FilterOperation&) const override; | 338 bool operator==(const FilterOperation&) const override; |
| 339 | 339 |
| 340 BoxReflectFilterOperation(const BoxReflection& reflection) | 340 BoxReflectFilterOperation(const BoxReflection& reflection) |
| 341 : FilterOperation(BOX_REFLECT) | 341 : FilterOperation(BOX_REFLECT) |
| 342 , m_reflection(reflection) | 342 , m_reflection(reflection) |
| 343 { | 343 { |
| 344 } | 344 } |
| 345 | 345 |
| 346 BoxReflection m_reflection; | 346 BoxReflection m_reflection; |
| 347 }; | 347 }; |
| 348 DEFINE_FILTER_OPERATION_TYPE_CASTS(BoxReflectFilterOperation, BOX_REFLECT); | 348 DEFINE_FILTER_OPERATION_TYPE_CASTS(BoxReflectFilterOperation, BOX_REFLECT); |
| 349 | 349 |
| 350 } // namespace blink | 350 } // namespace blink |
| 351 | 351 |
| 352 #endif // FilterOperation_h | 352 #endif // FilterOperation_h |
| OLD | NEW |