7a10b238bedf44d31445e951ea181ab2b7c1e19c
[WebKit-https.git] / Source / WebCore / css / DOMMatrixReadOnly.h
1 /*
2  * Copyright (C) 2017 Apple 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 INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "DOMMatrixInit.h"
29 #include "ExceptionOr.h"
30 #include "ScriptWrappable.h"
31 #include "TransformationMatrix.h"
32 #include <runtime/Float32Array.h>
33 #include <runtime/Float64Array.h>
34 #include <wtf/RefCounted.h>
35 #include <wtf/Variant.h>
36 #include <wtf/Vector.h>
37 #include <wtf/text/WTFString.h>
38
39 namespace WebCore {
40
41 class DOMMatrix;
42
43 class DOMMatrixReadOnly : public ScriptWrappable, public RefCounted<DOMMatrixReadOnly> {
44     WTF_MAKE_FAST_ALLOCATED;
45 public:
46     static ExceptionOr<Ref<DOMMatrixReadOnly>> create(std::optional<Variant<String, Vector<double>>>&& init)
47     {
48         auto matrix = adoptRef(*new DOMMatrixReadOnly);
49         if (!init)
50             return WTFMove(matrix);
51
52         ExceptionOr<void> result = WTF::switchOn(init.value(), [&matrix](const auto& init) {
53             return matrix->setMatrixValue(init);
54         });
55         if (result.hasException())
56             return result.releaseException();
57         return WTFMove(matrix);
58     }
59
60     enum class Is2D { No, Yes };
61     static Ref<DOMMatrixReadOnly> create(const TransformationMatrix& matrix, Is2D is2D)
62     {
63         return adoptRef(*new DOMMatrixReadOnly(matrix, is2D));
64     }
65
66     static ExceptionOr<Ref<DOMMatrixReadOnly>> fromMatrix(DOMMatrixInit&&);
67
68     static ExceptionOr<Ref<DOMMatrixReadOnly>> fromFloat32Array(Ref<Float32Array>&&);
69     static ExceptionOr<Ref<DOMMatrixReadOnly>> fromFloat64Array(Ref<Float64Array>&&);
70
71     double a() const { return m_matrix.a(); }
72     double b() const { return m_matrix.b(); }
73     double c() const { return m_matrix.c(); }
74     double d() const { return m_matrix.d(); }
75     double e() const { return m_matrix.e(); }
76     double f() const { return m_matrix.f(); }
77
78     double m11() const { return m_matrix.m11(); }
79     double m12() const { return m_matrix.m12(); }
80     double m13() const { return m_matrix.m13(); }
81     double m14() const { return m_matrix.m14(); }
82     double m21() const { return m_matrix.m21(); }
83     double m22() const { return m_matrix.m22(); }
84     double m23() const { return m_matrix.m23(); }
85     double m24() const { return m_matrix.m24(); }
86     double m31() const { return m_matrix.m31(); }
87     double m32() const { return m_matrix.m32(); }
88     double m33() const { return m_matrix.m33(); }
89     double m34() const { return m_matrix.m34(); }
90     double m41() const { return m_matrix.m41(); }
91     double m42() const { return m_matrix.m42(); }
92     double m43() const { return m_matrix.m43(); }
93     double m44() const { return m_matrix.m44(); }
94
95     bool is2D() const { return m_is2D; }
96     bool isIdentity() const;
97
98     ExceptionOr<void> setMatrixValue(const String&);
99     ExceptionOr<void> setMatrixValue(const Vector<double>&);
100
101     Ref<DOMMatrix> translate(double tx = 0, double ty = 0, double tz = 0);
102     ExceptionOr<Ref<DOMMatrix>> multiply(DOMMatrixInit&& other) const;
103     Ref<DOMMatrix> flipX();
104     Ref<DOMMatrix> flipY();
105     Ref<DOMMatrix> scale(double scaleX = 1, std::optional<double> scaleY = std::nullopt, double scaleZ = 1, double originX = 0, double originY = 0, double originZ = 0);
106     Ref<DOMMatrix> scale3d(double scale = 1, double originX = 0, double originY = 0, double originZ = 0);
107     Ref<DOMMatrix> rotate(double rotX = 0, std::optional<double> rotY = std::nullopt, std::optional<double> rotZ = std::nullopt); // Angles are in degrees.
108     Ref<DOMMatrix> rotateFromVector(double x = 0, double y = 0);
109     Ref<DOMMatrix> rotateAxisAngle(double x = 0, double y = 0, double z = 0, double angle = 0); // Angle is in degrees.
110     Ref<DOMMatrix> skewX(double sx = 0); // Angle is in degrees.
111     Ref<DOMMatrix> skewY(double sy = 0); // Angle is in degrees.
112     Ref<DOMMatrix> inverse() const;
113
114     ExceptionOr<Ref<Float32Array>> toFloat32Array() const;
115     ExceptionOr<Ref<Float64Array>> toFloat64Array() const;
116
117     ExceptionOr<String> toString() const;
118
119     const TransformationMatrix& transformationMatrix() const { return m_matrix; }
120
121 protected:
122     DOMMatrixReadOnly() = default;
123     DOMMatrixReadOnly(const TransformationMatrix&, Is2D);
124
125     Ref<DOMMatrix> cloneAsDOMMatrix() const;
126
127     template <typename T>
128     static ExceptionOr<Ref<T>> fromMatrixHelper(DOMMatrixInit&&);
129
130     static ExceptionOr<void> validateAndFixup(DOMMatrixInit&);
131
132     TransformationMatrix m_matrix;
133     bool m_is2D { true };
134 };
135
136 // https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary
137 template<typename T>
138 inline ExceptionOr<Ref<T>> DOMMatrixReadOnly::fromMatrixHelper(DOMMatrixInit&& init)
139 {
140     auto result = validateAndFixup(init);
141     if (result.hasException())
142         return result.releaseException();
143     if (init.is2D.value())
144         return T::create(TransformationMatrix { init.m11.value(), init.m12.value(), init.m21.value(), init.m22.value(), init.m41.value(), init.m42.value() }, Is2D::Yes);
145     return T::create(TransformationMatrix {
146         init.m11.value(), init.m12.value(), init.m13, init.m14,
147         init.m21.value(), init.m22.value(), init.m23, init.m24,
148         init.m31, init.m32, init.m33, init.m34,
149         init.m41.value(), init.m42.value(), init.m43, init.m44
150     }, Is2D::No);
151 }
152
153 } // namespace WebCore