15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef FilterOperation_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define FilterOperation_h 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/Length.h" 30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h" 31f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/graphics/Color.h" 32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/Filter.h" 33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/ReferenceFilter.h" 3493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/OwnPtr.h" 3593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/PassOwnPtr.h" 3693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/RefCounted.h" 3793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/text/WTFString.h" 38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// CSS Filters 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 43a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT FilterOperation : public RefCounted<FilterOperation> { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum OperationType { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) REFERENCE, // url(#somefilter) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GRAYSCALE, 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SEPIA, 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SATURATE, 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) HUE_ROTATE, 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) INVERT, 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OPACITY, 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) BRIGHTNESS, 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CONTRAST, 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) BLUR, 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DROP_SHADOW, 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NONE 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 60f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) static bool canInterpolate(FilterOperation::OperationType type) 61f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) { 62f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) switch (type) { 63f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case GRAYSCALE: 64f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case SEPIA: 65f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case SATURATE: 66f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case HUE_ROTATE: 67f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case INVERT: 68f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case OPACITY: 69f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case BRIGHTNESS: 70f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case CONTRAST: 71f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case BLUR: 72f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case DROP_SHADOW: 73f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return true; 74f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case REFERENCE: 75f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return false; 76f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) case NONE: 77f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) break; 78f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 79f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT_NOT_REACHED(); 80f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) return false; 81f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 82f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~FilterOperation() { } 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 85f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) static PassRefPtr<FilterOperation> blend(const FilterOperation* from, const FilterOperation* to, double progress); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool operator==(const FilterOperation&) const = 0; 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool operator!=(const FilterOperation& o) const { return !(*this == o); } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) OperationType type() const { return m_type; } 9051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) virtual bool isSameType(const FilterOperation& o) const { return o.type() == m_type; } 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if the alpha channel of any pixel can change under this operation. 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool affectsOpacity() const { return false; } 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // True if the the value of one pixel can affect the value of another pixel under this operation, such as blur. 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool movesPixels() const { return false; } 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FilterOperation(OperationType type) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_type(type) 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OperationType m_type; 104f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 105f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)private: 106f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress) const = 0; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#define DEFINE_FILTER_OPERATION_TYPE_CASTS(thisType, operationType) \ 11051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) DEFINE_TYPE_CASTS(thisType, FilterOperation, op, op->type() == FilterOperation::operationType, op.type() == FilterOperation::operationType); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 112a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT ReferenceFilterOperation : public FilterOperation { 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) static PassRefPtr<ReferenceFilterOperation> create(const String& url, const AtomicString& fragment) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 11651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return adoptRef(new ReferenceFilterOperation(url, fragment)); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool affectsOpacity() const OVERRIDE { return true; } 12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool movesPixels() const OVERRIDE { return true; } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const String& url() const { return m_url; } 12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const AtomicString& fragment() const { return m_fragment; } 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 125e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ReferenceFilter* filter() const { return m_filter.get(); } 126e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch void setFilter(PassRefPtr<ReferenceFilter> filter) { m_filter = filter; } 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 129f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress) const OVERRIDE 130f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) { 131f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT_NOT_REACHED(); 132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 133f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool operator==(const FilterOperation& o) const OVERRIDE 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSameType(o)) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const ReferenceFilterOperation* other = static_cast<const ReferenceFilterOperation*>(&o); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_url == other->m_url; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ReferenceFilterOperation(const String& url, const AtomicString& fragment) 14451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : FilterOperation(REFERENCE) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_url(url) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_fragment(fragment) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String m_url; 15109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) AtomicString m_fragment; 152e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch RefPtr<ReferenceFilter> m_filter; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DEFINE_FILTER_OPERATION_TYPE_CASTS(ReferenceFilterOperation, REFERENCE); 15651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// GRAYSCALE, SEPIA, SATURATE and HUE_ROTATE are variations on a basic color matrix effect. 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// For HUE_ROTATE, the angle of rotation is stored in m_amount. 159a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT BasicColorMatrixFilterOperation : public FilterOperation { 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<BasicColorMatrixFilterOperation> create(double amount, OperationType type) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new BasicColorMatrixFilterOperation(amount, type)); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double amount() const { return m_amount; } 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 170f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress) const OVERRIDE; 17109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool operator==(const FilterOperation& o) const OVERRIDE 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSameType(o)) 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const BasicColorMatrixFilterOperation* other = static_cast<const BasicColorMatrixFilterOperation*>(&o); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_amount == other->m_amount; 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 17802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) BasicColorMatrixFilterOperation(double amount, OperationType type) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : FilterOperation(type) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_amount(amount) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_amount; 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline bool isBasicColorMatrixFilterOperation(const FilterOperation& operation) 18951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 19051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) FilterOperation::OperationType type = operation.type(); 19151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return type == FilterOperation::GRAYSCALE || type == FilterOperation::SEPIA || type == FilterOperation::SATURATE || type == FilterOperation::HUE_ROTATE; 19251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 19351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 19451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DEFINE_TYPE_CASTS(BasicColorMatrixFilterOperation, FilterOperation, op, isBasicColorMatrixFilterOperation(*op), isBasicColorMatrixFilterOperation(op)); 19551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// INVERT, BRIGHTNESS, CONTRAST and OPACITY are variations on a basic component transfer effect. 197a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT BasicComponentTransferFilterOperation : public FilterOperation { 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static PassRefPtr<BasicComponentTransferFilterOperation> create(double amount, OperationType type) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptRef(new BasicComponentTransferFilterOperation(amount, type)); 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double amount() const { return m_amount; } 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool affectsOpacity() const OVERRIDE { return m_type == OPACITY; } 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 210f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress) const OVERRIDE; 21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool operator==(const FilterOperation& o) const OVERRIDE 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSameType(o)) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const BasicComponentTransferFilterOperation* other = static_cast<const BasicComponentTransferFilterOperation*>(&o); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_amount == other->m_amount; 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) BasicComponentTransferFilterOperation(double amount, OperationType type) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : FilterOperation(type) 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_amount(amount) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) double m_amount; 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 22851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)inline bool isBasicComponentTransferFilterOperation(const FilterOperation& operation) 22951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 23051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) FilterOperation::OperationType type = operation.type(); 23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return type == FilterOperation::INVERT || type == FilterOperation::OPACITY || type == FilterOperation::BRIGHTNESS || type == FilterOperation::CONTRAST; 23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DEFINE_TYPE_CASTS(BasicComponentTransferFilterOperation, FilterOperation, op, isBasicComponentTransferFilterOperation(*op), isBasicComponentTransferFilterOperation(op)); 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 236a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT BlurFilterOperation : public FilterOperation { 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 238f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) static PassRefPtr<BlurFilterOperation> create(const Length& stdDeviation) 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 24051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return adoptRef(new BlurFilterOperation(stdDeviation)); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 243f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) const Length& stdDeviation() const { return m_stdDeviation; } 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 24509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool affectsOpacity() const OVERRIDE { return true; } 24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool movesPixels() const OVERRIDE { return true; } 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 250f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress) const OVERRIDE; 25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool operator==(const FilterOperation& o) const OVERRIDE 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSameType(o)) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const BlurFilterOperation* other = static_cast<const BlurFilterOperation*>(&o); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_stdDeviation == other->m_stdDeviation; 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 259f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) BlurFilterOperation(const Length& stdDeviation) 26051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : FilterOperation(BLUR) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_stdDeviation(stdDeviation) 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Length m_stdDeviation; 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DEFINE_FILTER_OPERATION_TYPE_CASTS(BlurFilterOperation, BLUR); 26951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 270a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT DropShadowFilterOperation : public FilterOperation { 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 27251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) static PassRefPtr<DropShadowFilterOperation> create(const IntPoint& location, int stdDeviation, Color color) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 27451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return adoptRef(new DropShadowFilterOperation(location, stdDeviation, color)); 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int x() const { return m_location.x(); } 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int y() const { return m_location.y(); } 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint location() const { return m_location; } 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int stdDeviation() const { return m_stdDeviation; } 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Color color() const { return m_color; } 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 28309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool affectsOpacity() const OVERRIDE { return true; } 28409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool movesPixels() const OVERRIDE { return true; } 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 288f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) virtual PassRefPtr<FilterOperation> blend(const FilterOperation* from, double progress) const OVERRIDE; 28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) virtual bool operator==(const FilterOperation& o) const OVERRIDE 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isSameType(o)) 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const DropShadowFilterOperation* other = static_cast<const DropShadowFilterOperation*>(&o); 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_location == other->m_location && m_stdDeviation == other->m_stdDeviation && m_color == other->m_color; 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 29751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) DropShadowFilterOperation(const IntPoint& location, int stdDeviation, Color color) 29851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) : FilterOperation(DROP_SHADOW) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_location(location) 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_stdDeviation(stdDeviation) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_color(color) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint m_location; // FIXME: should location be in Lengths? 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_stdDeviation; 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Color m_color; 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 31051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)DEFINE_FILTER_OPERATION_TYPE_CASTS(DropShadowFilterOperation, DROP_SHADOW); 31151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 312c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // FilterOperation_h 316