Implement DOMMatrixReadOnly.transformPoint()
[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 class DOMPoint;
43 struct DOMPointInit;
44
45 class DOMMatrixReadOnly : public ScriptWrappable, public RefCounted<DOMMatrixReadOnly> {
46     WTF_MAKE_FAST_ALLOCATED;
47 public:
48     static ExceptionOr<Ref<DOMMatrixReadOnly>> create(std::optional<Variant<String, Vector<double>>>&& init)
49     {
50         auto matrix = adoptRef(*new DOMMatrixReadOnly);
51         if (!init)
52             return WTFMove(matrix);
53
54         ExceptionOr<void> result = WTF::switchOn(init.value(), [&matrix](const auto& init) {
55             return matrix->setMatrixValue(init);
56         });
57         if (result.hasException())
58             return result.releaseException();
59         return WTFMove(matrix);
60     }
61
62     enum class Is2D { No, Yes };
63     static Ref<DOMMatrixReadOnly> create(const TransformationMatrix& matrix, Is2D is2D)
64     {
65         return adoptRef(*new DOMMatrixReadOnly(matrix, is2D));
66     }
67
68     static ExceptionOr<Ref<DOMMatrixReadOnly>> fromMatrix(DOMMatrixInit&&);
69
70     static ExceptionOr<Ref<DOMMatrixReadOnly>> fromFloat32Array(Ref<Float32Array>&&);
71     static ExceptionOr<Ref<DOMMatrixReadOnly>> fromFloat64Array(Ref<Float64Array>&&);
72
73     double a() const { return m_matrix.a(); }
74     double b() const { return m_matrix.b(); }
75     double c() const { return m_matrix.c(); }
76     double d() const { return m_matrix.d(); }
77     double e() const { return m_matrix.e(); }
78     double f() const { return m_matrix.f(); }
79
80     double m11() const { return m_matrix.m11(); }
81     double m12() const { return m_matrix.m12(); }
82     double m13() const { return m_matrix.m13(); }
83     double m14() const { return m_matrix.m14(); }
84     double m21() const { return m_matrix.m21(); }
85     double m22() const { return m_matrix.m22(); }
86     double m23() const { return m_matrix.m23(); }
87     double m24() const { return m_matrix.m24(); }
88     double m31() const { return m_matrix.m31(); }
89     double m32() const { return m_matrix.m32(); }
90     double m33() const { return m_matrix.m33(); }
91     double m34() const { return m_matrix.m34(); }
92     double m41() const { return m_matrix.m41(); }
93     double m42() const { return m_matrix.m42(); }
94     double m43() const { return m_matrix.m43(); }
95     double m44() const { return m_matrix.m44(); }
96
97     bool is2D() const { return m_is2D; }
98     bool isIdentity() const;
99
100     ExceptionOr<void> setMatrixValue(const String&);
101     ExceptionOr<void> setMatrixValue(const Vector<double>&);
102
103     Ref<DOMMatrix> translate(double tx = 0, double ty = 0, double tz = 0);
104     ExceptionOr<Ref<DOMMatrix>> multiply(DOMMatrixInit&& other) const;
105     Ref<DOMMatrix> flipX();
106     Ref<DOMMatrix> flipY();
107     Ref<DOMMatrix> scale(double scaleX = 1, std::optional<double> scaleY = std::nullopt, double scaleZ = 1, double originX = 0, double originY = 0, double originZ = 0);
108     Ref<DOMMatrix> scale3d(double scale = 1, double originX = 0, double originY = 0, double originZ = 0);
109     Ref<DOMMatrix> rotate(double rotX = 0, std::optional<double> rotY = std::nullopt, std::optional<double> rotZ = std::nullopt); // Angles are in degrees.
110     Ref<DOMMatrix> rotateFromVector(double x = 0, double y = 0);
111     Ref<DOMMatrix> rotateAxisAngle(double x = 0, double y = 0, double z = 0, double angle = 0); // Angle is in degrees.
112     Ref<DOMMatrix> skewX(double sx = 0); // Angle is in degrees.
113     Ref<DOMMatrix> skewY(double sy = 0); // Angle is in degrees.
114     Ref<DOMMatrix> inverse() const;
115
116     Ref<DOMPoint> transformPoint(DOMPointInit&&);
117
118     ExceptionOr<Ref<Float32Array>> toFloat32Array() const;
119     ExceptionOr<Ref<Float64Array>> toFloat64Array() const;
120
121     ExceptionOr<String> toString() const;
122
123     const TransformationMatrix& transformationMatrix() const { return m_matrix; }
124
125 protected:
126     DOMMatrixReadOnly() = default;
127     DOMMatrixReadOnly(const TransformationMatrix&, Is2D);
128
129     Ref<DOMMatrix> cloneAsDOMMatrix() const;
130
131     template <typename T>
132     static ExceptionOr<Ref<T>> fromMatrixHelper(DOMMatrixInit&&);
133
134     static ExceptionOr<void> validateAndFixup(DOMMatrixInit&);
135
136     TransformationMatrix m_matrix;
137     bool m_is2D { true };
138 };
139
140 // https://drafts.fxtf.org/geometry/#create-a-dommatrix-from-the-dictionary
141 template<typename T>
142 inline ExceptionOr<Ref<T>> DOMMatrixReadOnly::fromMatrixHelper(DOMMatrixInit&& init)
143 {
144     auto result = validateAndFixup(init);
145     if (result.hasException())
146         return result.releaseException();
147     if (init.is2D.value())
148         return T::create(TransformationMatrix { init.m11.value(), init.m12.value(), init.m21.value(), init.m22.value(), init.m41.value(), init.m42.value() }, Is2D::Yes);
149     return T::create(TransformationMatrix {
150         init.m11.value(), init.m12.value(), init.m13, init.m14,
151         init.m21.value(), init.m22.value(), init.m23, init.m24,
152         init.m31, init.m32, init.m33, init.m34,
153         init.m41.value(), init.m42.value(), init.m43, init.m44
154     }, Is2D::No);
155 }
156
157 } // namespace WebCore