Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / dom / DOMMatrix.cpp
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "config.h"
6 #include "core/dom/DOMMatrix.h"
7
8 namespace blink {
9
10 DOMMatrix* DOMMatrix::create()
11 {
12     return new DOMMatrix(TransformationMatrix());
13 }
14
15 DOMMatrix* DOMMatrix::create(DOMMatrixReadOnly* other)
16 {
17     return new DOMMatrix(other->matrix(), other->is2D());
18 }
19
20 DOMMatrix::DOMMatrix(const TransformationMatrix& matrix, bool is2D)
21 {
22     m_matrix = matrix;
23     m_is2D = is2D;
24 }
25
26 void DOMMatrix::setIs2D(bool value)
27 {
28     if (m_is2D)
29         m_is2D = value;
30 }
31
32 DOMMatrix* DOMMatrix::multiplySelf(DOMMatrix* other)
33 {
34     if (!other->is2D())
35         m_is2D = false;
36
37     m_matrix = m_matrix * other->matrix();
38
39     return this;
40 }
41
42 DOMMatrix* DOMMatrix::preMultiplySelf(DOMMatrix* other)
43 {
44     if (!other->is2D())
45         m_is2D = false;
46
47     m_matrix = other->matrix() * m_matrix;
48
49     return this;
50 }
51
52 DOMMatrix* DOMMatrix::translateSelf(double tx, double ty, double tz)
53 {
54     if (!tx && !ty && !tz)
55         return this;
56
57     if (tz)
58         m_is2D = false;
59
60     if (m_is2D)
61         m_matrix.translate(tx, ty);
62     else
63         m_matrix.translate3d(tx, ty, tz);
64
65     return this;
66 }
67
68 DOMMatrix* DOMMatrix::scaleSelf(double scale, double ox, double oy)
69 {
70     return scaleNonUniformSelf(scale, scale, 1, ox, oy);
71 }
72
73 DOMMatrix* DOMMatrix::scale3dSelf(double scale, double ox, double oy, double oz)
74 {
75     return scaleNonUniformSelf(scale, scale, scale, ox, oy, oz);
76 }
77
78 DOMMatrix* DOMMatrix::scaleNonUniformSelf(double sx, double sy, double sz,
79     double ox, double oy, double oz)
80 {
81     if (sz != 1 || oz)
82         m_is2D = false;
83
84     if (sx == 1 && sy == 1 && sz == 1)
85         return this;
86
87     bool hasTranslation = (ox || oy || oz);
88
89     if (hasTranslation)
90         translateSelf(ox, oy, oz);
91
92     if (m_is2D)
93         m_matrix.scaleNonUniform(sx, sy);
94     else
95         m_matrix.scale3d(sx, sy, sz);
96
97     if (hasTranslation)
98         translateSelf(-ox, -oy, -oz);
99
100     return this;
101 }
102
103 } // namespace blink