xref: /aosp_15_r20/frameworks/base/libs/hwui/Vector.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker #ifndef ANDROID_HWUI_VECTOR_H
18*d57664e9SAndroid Build Coastguard Worker #define ANDROID_HWUI_VECTOR_H
19*d57664e9SAndroid Build Coastguard Worker 
20*d57664e9SAndroid Build Coastguard Worker #include <math.h>
21*d57664e9SAndroid Build Coastguard Worker #include <utils/Log.h>
22*d57664e9SAndroid Build Coastguard Worker 
23*d57664e9SAndroid Build Coastguard Worker namespace android {
24*d57664e9SAndroid Build Coastguard Worker namespace uirenderer {
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
27*d57664e9SAndroid Build Coastguard Worker // Classes
28*d57664e9SAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////////////////
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker // MUST BE A POD - this means no ctor or dtor!
31*d57664e9SAndroid Build Coastguard Worker struct Vector2 {
32*d57664e9SAndroid Build Coastguard Worker     float x;
33*d57664e9SAndroid Build Coastguard Worker     float y;
34*d57664e9SAndroid Build Coastguard Worker 
lengthSquaredVector235*d57664e9SAndroid Build Coastguard Worker     float lengthSquared() const { return x * x + y * y; }
36*d57664e9SAndroid Build Coastguard Worker 
lengthVector237*d57664e9SAndroid Build Coastguard Worker     float length() const { return sqrt(x * x + y * y); }
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker     void operator+=(const Vector2& v) {
40*d57664e9SAndroid Build Coastguard Worker         x += v.x;
41*d57664e9SAndroid Build Coastguard Worker         y += v.y;
42*d57664e9SAndroid Build Coastguard Worker     }
43*d57664e9SAndroid Build Coastguard Worker 
44*d57664e9SAndroid Build Coastguard Worker     void operator-=(const Vector2& v) {
45*d57664e9SAndroid Build Coastguard Worker         x -= v.x;
46*d57664e9SAndroid Build Coastguard Worker         y -= v.y;
47*d57664e9SAndroid Build Coastguard Worker     }
48*d57664e9SAndroid Build Coastguard Worker 
49*d57664e9SAndroid Build Coastguard Worker     void operator+=(const float v) {
50*d57664e9SAndroid Build Coastguard Worker         x += v;
51*d57664e9SAndroid Build Coastguard Worker         y += v;
52*d57664e9SAndroid Build Coastguard Worker     }
53*d57664e9SAndroid Build Coastguard Worker 
54*d57664e9SAndroid Build Coastguard Worker     void operator-=(const float v) {
55*d57664e9SAndroid Build Coastguard Worker         x -= v;
56*d57664e9SAndroid Build Coastguard Worker         y -= v;
57*d57664e9SAndroid Build Coastguard Worker     }
58*d57664e9SAndroid Build Coastguard Worker 
59*d57664e9SAndroid Build Coastguard Worker     void operator/=(float s) {
60*d57664e9SAndroid Build Coastguard Worker         x /= s;
61*d57664e9SAndroid Build Coastguard Worker         y /= s;
62*d57664e9SAndroid Build Coastguard Worker     }
63*d57664e9SAndroid Build Coastguard Worker 
64*d57664e9SAndroid Build Coastguard Worker     void operator*=(float s) {
65*d57664e9SAndroid Build Coastguard Worker         x *= s;
66*d57664e9SAndroid Build Coastguard Worker         y *= s;
67*d57664e9SAndroid Build Coastguard Worker     }
68*d57664e9SAndroid Build Coastguard Worker 
69*d57664e9SAndroid Build Coastguard Worker     Vector2 operator+(const Vector2& v) const { return (Vector2){x + v.x, y + v.y}; }
70*d57664e9SAndroid Build Coastguard Worker 
71*d57664e9SAndroid Build Coastguard Worker     Vector2 operator-(const Vector2& v) const { return (Vector2){x - v.x, y - v.y}; }
72*d57664e9SAndroid Build Coastguard Worker 
73*d57664e9SAndroid Build Coastguard Worker     Vector2 operator/(float s) const { return (Vector2){x / s, y / s}; }
74*d57664e9SAndroid Build Coastguard Worker 
75*d57664e9SAndroid Build Coastguard Worker     Vector2 operator*(float s) const { return (Vector2){x * s, y * s}; }
76*d57664e9SAndroid Build Coastguard Worker 
normalizeVector277*d57664e9SAndroid Build Coastguard Worker     void normalize() {
78*d57664e9SAndroid Build Coastguard Worker         float s = 1.0f / length();
79*d57664e9SAndroid Build Coastguard Worker         x *= s;
80*d57664e9SAndroid Build Coastguard Worker         y *= s;
81*d57664e9SAndroid Build Coastguard Worker     }
82*d57664e9SAndroid Build Coastguard Worker 
copyNormalizedVector283*d57664e9SAndroid Build Coastguard Worker     Vector2 copyNormalized() const {
84*d57664e9SAndroid Build Coastguard Worker         Vector2 v = {x, y};
85*d57664e9SAndroid Build Coastguard Worker         v.normalize();
86*d57664e9SAndroid Build Coastguard Worker         return v;
87*d57664e9SAndroid Build Coastguard Worker     }
88*d57664e9SAndroid Build Coastguard Worker 
dotVector289*d57664e9SAndroid Build Coastguard Worker     float dot(const Vector2& v) const { return x * v.x + y * v.y; }
90*d57664e9SAndroid Build Coastguard Worker 
crossVector291*d57664e9SAndroid Build Coastguard Worker     float cross(const Vector2& v) const { return x * v.y - y * v.x; }
92*d57664e9SAndroid Build Coastguard Worker 
dumpVector293*d57664e9SAndroid Build Coastguard Worker     void dump() { ALOGD("Vector2[%.2f, %.2f]", x, y); }
94*d57664e9SAndroid Build Coastguard Worker };  // class Vector2
95*d57664e9SAndroid Build Coastguard Worker 
96*d57664e9SAndroid Build Coastguard Worker // MUST BE A POD - this means no ctor or dtor!
97*d57664e9SAndroid Build Coastguard Worker class Vector3 {
98*d57664e9SAndroid Build Coastguard Worker public:
99*d57664e9SAndroid Build Coastguard Worker     float x;
100*d57664e9SAndroid Build Coastguard Worker     float y;
101*d57664e9SAndroid Build Coastguard Worker     float z;
102*d57664e9SAndroid Build Coastguard Worker 
103*d57664e9SAndroid Build Coastguard Worker     Vector3 operator+(const Vector3& v) const { return (Vector3){x + v.x, y + v.y, z + v.z}; }
104*d57664e9SAndroid Build Coastguard Worker 
105*d57664e9SAndroid Build Coastguard Worker     Vector3 operator-(const Vector3& v) const { return (Vector3){x - v.x, y - v.y, z - v.z}; }
106*d57664e9SAndroid Build Coastguard Worker 
107*d57664e9SAndroid Build Coastguard Worker     Vector3 operator/(float s) const { return (Vector3){x / s, y / s, z / s}; }
108*d57664e9SAndroid Build Coastguard Worker 
109*d57664e9SAndroid Build Coastguard Worker     Vector3 operator*(float s) const { return (Vector3){x * s, y * s, z * s}; }
110*d57664e9SAndroid Build Coastguard Worker 
111*d57664e9SAndroid Build Coastguard Worker     void dump(const char* label = "Vector3") const {
112*d57664e9SAndroid Build Coastguard Worker         ALOGD("%s[%.2f, %.2f, %.2f]", label, x, y, z);
113*d57664e9SAndroid Build Coastguard Worker     }
114*d57664e9SAndroid Build Coastguard Worker };
115*d57664e9SAndroid Build Coastguard Worker 
116*d57664e9SAndroid Build Coastguard Worker }  // namespace uirenderer
117*d57664e9SAndroid Build Coastguard Worker }  // namespace android
118*d57664e9SAndroid Build Coastguard Worker 
119*d57664e9SAndroid Build Coastguard Worker #endif  // ANDROID_HWUI_VECTOR_H
120