15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef Filter_h
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define Filter_h
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h"
251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
261e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatSize.h"
27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/ImageBuffer.h"
28f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "third_party/skia/include/core/SkImageFilter.h"
297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/RefCounted.h"
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FilterEffect;
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT Filter : public RefCounted<Filter> {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Filter(const AffineTransform& absoluteTransform)
3807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    : m_absoluteTransform(absoluteTransform)
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    , m_inverseTransform(absoluteTransform.inverse())
4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Filters can only accept scaling and translating transformations, as coordinates
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // in most primitives are given in horizontal and vertical directions.
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(!absoluteTransform.b() && !absoluteTransform.c());
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~Filter() { }
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSourceImage(PassOwnPtr<ImageBuffer> sourceImage) { m_sourceImage = sourceImage; }
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ImageBuffer* sourceImage() { return m_sourceImage.get(); }
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    const AffineTransform& absoluteTransform() const { return m_absoluteTransform; }
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void setAbsoluteTransform(const AffineTransform& absoluteTransform)
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Filters can only accept scaling and translating transformations, as coordinates
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // in most primitives are given in horizontal and vertical directions.
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(!absoluteTransform.b() && !absoluteTransform.c());
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_absoluteTransform = absoluteTransform;
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_inverseTransform = absoluteTransform.inverse();
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_absoluteFilterRegion = m_absoluteTransform.mapRect(m_filterRegion);
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint& point) const { return m_inverseTransform.mapPoint(point); }
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FloatRect mapLocalRectToAbsoluteRect(const FloatRect& rect) const { return m_absoluteTransform.mapRect(rect); }
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FloatRect mapAbsoluteRectToLocalRect(const FloatRect& rect) const { return m_inverseTransform.mapRect(rect); }
6453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
65591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    virtual float applyHorizontalScale(float value) const
66591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return value * m_absoluteTransform.a();
68591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
69591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    virtual float applyVerticalScale(float value) const
70591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return value * m_absoluteTransform.d();
72591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    }
7376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    virtual FloatPoint3D resolve3dPoint(const FloatPoint3D& point) const { return point; }
7402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual IntRect sourceImageRect() const = 0;
76e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
77e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    FloatRect absoluteFilterRegion() const { return m_absoluteFilterRegion; }
78e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
79e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    FloatRect filterRegion() const { return m_filterRegion; }
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void setFilterRegion(const FloatRect& rect)
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_filterRegion = rect;
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_absoluteFilterRegion = m_absoluteTransform.mapRect(m_filterRegion);
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
86d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // The methods enableCache() and disableCache() are temporary, and we
87d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // should address the real issue inside skia, thus simplifying what the
88d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // clients have to know, and can remove these.
89d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // Also note that this cache should no longer be used by Blink once the
90d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    // NON impl-side painting path is removed.
91d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void enableCache()
92f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
93f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (!m_cache)
94f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            m_cache = adoptRef(SkImageFilter::Cache::Create(1));
95f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        SkImageFilter::SetExternalCache(m_cache.get());
96f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
97f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
98d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void disableCache()
99f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
100f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        SkImageFilter::SetExternalCache(0);
101f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
102f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
103f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void removeFromCache(SkImageFilter* filter)
104f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    {
105f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        if (m_cache)
106f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu            m_cache->remove(filter);
107f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    OwnPtr<ImageBuffer> m_sourceImage;
11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    AffineTransform m_absoluteTransform;
11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    AffineTransform m_inverseTransform;
113e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    FloatRect m_absoluteFilterRegion;
114e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    FloatRect m_filterRegion;
115f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RefPtr<SkImageFilter::Cache> m_cache;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // Filter_h
121