e09bf8538e03aba50c30d6aecd8cdc8f1ed6b504
[WebKit-https.git] / WebCore / platform / graphics / transforms / TransformationMatrix.h
1 /*
2  * Copyright (C) 2005, 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
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.
24  */
25
26 #ifndef TransformationMatrix_h
27 #define TransformationMatrix_h
28
29 #if PLATFORM(CG)
30 #include <CoreGraphics/CGAffineTransform.h>
31 typedef CGAffineTransform PlatformTransformationMatrix;
32 #elif PLATFORM(QT)
33 #include <QMatrix>
34 typedef QMatrix PlatformTransformationMatrix;
35 #elif PLATFORM(CAIRO)
36 #include <cairo.h>
37 typedef cairo_matrix_t PlatformTransformationMatrix;
38 #elif PLATFORM(SKIA)
39 #include "SkMatrix.h"
40 typedef SkMatrix PlatformTransformationMatrix;
41 #elif PLATFORM(WX) && USE(WXGC)
42 #include <wx/defs.h>
43 #include <wx/graphics.h>
44 typedef wxGraphicsMatrix PlatformTransformationMatrix;
45 #endif
46
47 namespace WebCore {
48
49 class IntPoint;
50 class IntRect;
51 class FloatPoint;
52 class FloatRect;
53 class FloatQuad;
54
55 class TransformationMatrix {
56 public:
57     TransformationMatrix();
58     TransformationMatrix(double a, double b, double c, double d, double e, double f);
59 #if !PLATFORM(WX) || USE(WXGC)
60     TransformationMatrix(const PlatformTransformationMatrix&);
61 #endif
62
63     void setMatrix(double a, double b, double c, double d, double e, double f);
64     void map(double x, double y, double *x2, double *y2) const;
65
66     // Rounds the mapped point to the nearest integer value.
67     IntPoint mapPoint(const IntPoint&) const;
68
69     FloatPoint mapPoint(const FloatPoint&) const;
70
71     // Rounds the resulting mapped rectangle out. This is helpful for bounding
72     // box computations but may not be what is wanted in other contexts.
73     IntRect mapRect(const IntRect&) const;
74
75     FloatRect mapRect(const FloatRect&) const;
76
77     FloatQuad mapQuad(const FloatQuad&) const;
78
79     bool isIdentity() const;
80
81     double a() const;
82     void setA(double a);
83
84     double b() const;
85     void setB(double b);
86
87     double c() const;
88     void setC(double c);
89
90     double d() const;
91     void setD(double d);
92
93     double e() const;
94     void setE(double e);
95
96     double f() const;
97     void setF(double f);
98
99     void reset();
100
101     TransformationMatrix& multiply(const TransformationMatrix&);
102     TransformationMatrix& scale(double);
103     TransformationMatrix& scale(double sx, double sy);
104     TransformationMatrix& scaleNonUniform(double sx, double sy);
105     TransformationMatrix& rotate(double d);
106     TransformationMatrix& rotateFromVector(double x, double y);
107     TransformationMatrix& translate(double tx, double ty);
108     TransformationMatrix& shear(double sx, double sy);
109     TransformationMatrix& flipX();
110     TransformationMatrix& flipY();
111     TransformationMatrix& skew(double angleX, double angleY);
112     TransformationMatrix& skewX(double angle);
113     TransformationMatrix& skewY(double angle);
114
115     double det() const;
116     bool isInvertible() const;
117     TransformationMatrix inverse() const;
118
119     void blend(const TransformationMatrix& from, double progress);
120
121 #if !PLATFORM(WX) || USE(WXGC)
122     operator PlatformTransformationMatrix() const;
123 #endif
124
125     bool operator==(const TransformationMatrix&) const;
126     bool operator!=(const TransformationMatrix& other) const { return !(*this == other); }
127     TransformationMatrix& operator*=(const TransformationMatrix&);
128     TransformationMatrix operator*(const TransformationMatrix&);
129
130 private:
131 #if !PLATFORM(WX) || USE(WXGC)
132     PlatformTransformationMatrix m_transform;
133 #endif
134 };
135
136 TransformationMatrix makeMapBetweenRects(const FloatRect& source, const FloatRect& dest);
137
138 } // namespace WebCore
139
140 #endif // TransformationMatrix_h