Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / platform / graphics / filters / Filter.h
1 /*
2  * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
3  * Copyright (C) 2013 Google Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #ifndef Filter_h
22 #define Filter_h
23
24 #include "platform/PlatformExport.h"
25 #include "platform/geometry/FloatRect.h"
26 #include "platform/geometry/FloatSize.h"
27 #include "platform/graphics/ImageBuffer.h"
28 #include "wtf/RefCounted.h"
29
30 namespace blink {
31
32 class FilterEffect;
33
34 class PLATFORM_EXPORT Filter : public RefCounted<Filter> {
35 public:
36     Filter(const AffineTransform& absoluteTransform)
37     : m_absoluteTransform(absoluteTransform)
38     , m_inverseTransform(absoluteTransform.inverse())
39     {
40         // Filters can only accept scaling and translating transformations, as coordinates
41         // in most primitives are given in horizontal and vertical directions.
42         ASSERT(!absoluteTransform.b() && !absoluteTransform.c());
43     }
44     virtual ~Filter() { }
45
46     void setSourceImage(PassOwnPtr<ImageBuffer> sourceImage) { m_sourceImage = sourceImage; }
47     ImageBuffer* sourceImage() { return m_sourceImage.get(); }
48
49     const AffineTransform& absoluteTransform() const { return m_absoluteTransform; }
50
51     void setAbsoluteTransform(const AffineTransform& absoluteTransform)
52     {
53         // Filters can only accept scaling and translating transformations, as coordinates
54         // in most primitives are given in horizontal and vertical directions.
55         ASSERT(!absoluteTransform.b() && !absoluteTransform.c());
56         m_absoluteTransform = absoluteTransform;
57         m_inverseTransform = absoluteTransform.inverse();
58         m_absoluteFilterRegion = m_absoluteTransform.mapRect(m_filterRegion);
59     }
60     FloatPoint mapAbsolutePointToLocalPoint(const FloatPoint& point) const { return m_inverseTransform.mapPoint(point); }
61     FloatRect mapLocalRectToAbsoluteRect(const FloatRect& rect) const { return m_absoluteTransform.mapRect(rect); }
62     FloatRect mapAbsoluteRectToLocalRect(const FloatRect& rect) const { return m_inverseTransform.mapRect(rect); }
63
64     virtual float applyHorizontalScale(float value) const
65     {
66         return value * m_absoluteTransform.a();
67     }
68     virtual float applyVerticalScale(float value) const
69     {
70         return value * m_absoluteTransform.d();
71     }
72     virtual FloatPoint3D resolve3dPoint(const FloatPoint3D& point) const { return point; }
73
74     virtual IntRect sourceImageRect() const = 0;
75
76     FloatRect absoluteFilterRegion() const { return m_absoluteFilterRegion; }
77
78     FloatRect filterRegion() const { return m_filterRegion; }
79     void setFilterRegion(const FloatRect& rect)
80     {
81         m_filterRegion = rect;
82         m_absoluteFilterRegion = m_absoluteTransform.mapRect(m_filterRegion);
83     }
84
85 private:
86     OwnPtr<ImageBuffer> m_sourceImage;
87     AffineTransform m_absoluteTransform;
88     AffineTransform m_inverseTransform;
89     FloatRect m_absoluteFilterRegion;
90     FloatRect m_filterRegion;
91 };
92
93 } // namespace blink
94
95 #endif // Filter_h