| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #ifndef CORE_INCLUDE_FXCRT_FX_COORDINATES_H_ | 7 #ifndef CORE_INCLUDE_FXCRT_FX_COORDINATES_H_ |
| 8 #define CORE_INCLUDE_FXCRT_FX_COORDINATES_H_ | 8 #define CORE_INCLUDE_FXCRT_FX_COORDINATES_H_ |
| 9 | 9 |
| 10 #include "fx_basic.h" | 10 #include "fx_basic.h" |
| 11 | 11 |
| 12 template<class baseType> class CFX_PSVTemplate; | 12 template <class baseType> |
| 13 template<class baseType> class CFX_VTemplate; | 13 class CFX_PSVTemplate; |
| 14 template<class baseType> class CFX_PRLTemplate; | 14 template <class baseType> |
| 15 template<class baseType> class CFX_RTemplate; | 15 class CFX_VTemplate; |
| 16 template<class baseType> class CFX_ETemplate; | 16 template <class baseType> |
| 17 template<class baseType> class CFX_ATemplate; | 17 class CFX_PRLTemplate; |
| 18 template<class baseType> class CFX_RRTemplate; | 18 template <class baseType> |
| 19 class CFX_RTemplate; |
| 20 template <class baseType> |
| 21 class CFX_ETemplate; |
| 22 template <class baseType> |
| 23 class CFX_ATemplate; |
| 24 template <class baseType> |
| 25 class CFX_RRTemplate; |
| 19 class CFX_Matrix; | 26 class CFX_Matrix; |
| 20 template<class baseType> | 27 template <class baseType> |
| 21 class CFX_PSVTemplate | 28 class CFX_PSVTemplate { |
| 22 { | 29 public: |
| 23 public: | 30 typedef CFX_PSVTemplate<baseType> FXT_PSV; |
| 24 typedef CFX_PSVTemplate<baseType>» FXT_PSV; | 31 typedef CFX_PSVTemplate<baseType> FXT_POINT; |
| 25 typedef CFX_PSVTemplate<baseType>» FXT_POINT; | 32 typedef CFX_PSVTemplate<baseType> FXT_SIZE; |
| 26 typedef CFX_PSVTemplate<baseType>» FXT_SIZE; | 33 void Set(baseType x, baseType y) { FXT_PSV::x = x, FXT_PSV::y = y; } |
| 27 void» » Set(baseType x, baseType y) | 34 void Set(const FXT_PSV& psv) { FXT_PSV::x = psv.x, FXT_PSV::y = psv.y; } |
| 28 { | 35 void Add(baseType x, baseType y) { FXT_PSV::x += x, FXT_PSV::y += y; } |
| 29 FXT_PSV::x = x, FXT_PSV::y = y; | 36 void Subtract(baseType x, baseType y) { FXT_PSV::x -= x, FXT_PSV::y -= y; } |
| 30 } | 37 void Reset() { FXT_PSV::x = FXT_PSV::y = 0; } |
| 31 void» » Set(const FXT_PSV &psv) | 38 FXT_PSV& operator+=(const FXT_PSV& obj) { |
| 32 { | 39 x += obj.x; |
| 33 FXT_PSV::x = psv.x, FXT_PSV::y = psv.y; | 40 y += obj.y; |
| 34 } | 41 return *this; |
| 35 void» » Add(baseType x, baseType y) | 42 } |
| 36 { | 43 FXT_PSV& operator-=(const FXT_PSV& obj) { |
| 37 FXT_PSV::x += x, FXT_PSV::y += y; | 44 x -= obj.x; |
| 38 } | 45 y -= obj.y; |
| 39 void» » Subtract(baseType x, baseType y) | 46 return *this; |
| 40 { | 47 } |
| 41 FXT_PSV::x -= x, FXT_PSV::y -= y; | 48 FXT_PSV& operator*=(baseType lamda) { |
| 42 } | 49 x *= lamda; |
| 43 void» » Reset() | 50 y *= lamda; |
| 44 { | 51 return *this; |
| 45 FXT_PSV::x = FXT_PSV::y = 0; | 52 } |
| 46 } | 53 FXT_PSV& operator/=(baseType lamda) { |
| 47 FXT_PSV&» operator += (const FXT_PSV &obj) | 54 x /= lamda; |
| 48 { | 55 y /= lamda; |
| 49 x += obj.x; | 56 return *this; |
| 50 y += obj.y; | 57 } |
| 51 return *this; | 58 friend FX_BOOL operator==(const FXT_PSV& obj1, const FXT_PSV& obj2) { |
| 52 } | 59 return obj1.x == obj2.x && obj1.y == obj2.y; |
| 53 FXT_PSV&» operator -= (const FXT_PSV &obj) | 60 } |
| 54 { | 61 friend FX_BOOL operator!=(const FXT_PSV& obj1, const FXT_PSV& obj2) { |
| 55 x -= obj.x; | 62 return obj1.x != obj2.x || obj1.y != obj2.y; |
| 56 y -= obj.y; | 63 } |
| 57 return *this; | 64 friend FXT_PSV operator+(const FXT_PSV& obj1, const FXT_PSV& obj2) { |
| 58 } | 65 CFX_PSVTemplate obj; |
| 59 FXT_PSV&» operator *= (baseType lamda) | 66 obj.x = obj1.x + obj2.x; |
| 60 { | 67 obj.y = obj1.y + obj2.y; |
| 61 x *= lamda; | 68 return obj; |
| 62 y *= lamda; | 69 } |
| 63 return *this; | 70 friend FXT_PSV operator-(const FXT_PSV& obj1, const FXT_PSV& obj2) { |
| 64 } | 71 CFX_PSVTemplate obj; |
| 65 FXT_PSV&» operator /= (baseType lamda) | 72 obj.x = obj1.x - obj2.x; |
| 66 { | 73 obj.y = obj1.y - obj2.y; |
| 67 x /= lamda; | 74 return obj; |
| 68 y /= lamda; | 75 } |
| 69 return *this; | 76 friend FXT_PSV operator*(const FXT_PSV& obj, baseType lamda) { |
| 70 } | 77 CFX_PSVTemplate t; |
| 71 friend» FX_BOOL»» operator == (const FXT_PSV &obj1, const FXT_PSV
&obj2) | 78 t.x = obj.x * lamda; |
| 72 { | 79 t.y = obj.y * lamda; |
| 73 return obj1.x == obj2.x && obj1.y == obj2.y; | 80 return t; |
| 74 } | 81 } |
| 75 friend» FX_BOOL»» operator != (const FXT_PSV &obj1, const FXT_PSV
&obj2) | 82 friend FXT_PSV operator*(baseType lamda, const FXT_PSV& obj) { |
| 76 { | 83 CFX_PSVTemplate t; |
| 77 return obj1.x != obj2.x || obj1.y != obj2.y; | 84 t.x = lamda * obj.x; |
| 78 } | 85 t.y = lamda * obj.y; |
| 79 friend» FXT_PSV»» operator + (const FXT_PSV &obj1, const FXT_PSV &
obj2) | 86 return t; |
| 80 { | 87 } |
| 81 CFX_PSVTemplate obj; | 88 friend FXT_PSV operator/(const FXT_PSV& obj, baseType lamda) { |
| 82 obj.x = obj1.x + obj2.x; | 89 CFX_PSVTemplate t; |
| 83 obj.y = obj1.y + obj2.y; | 90 t.x = obj.x / lamda; |
| 84 return obj; | 91 t.y = obj.y / lamda; |
| 85 } | 92 return t; |
| 86 friend» FXT_PSV»» operator - (const FXT_PSV &obj1, const FXT_PSV &
obj2) | 93 } |
| 87 { | 94 baseType x, y; |
| 88 CFX_PSVTemplate obj; | |
| 89 obj.x = obj1.x - obj2.x; | |
| 90 obj.y = obj1.y - obj2.y; | |
| 91 return obj; | |
| 92 } | |
| 93 friend» FXT_PSV»» operator * (const FXT_PSV &obj, baseType lamda) | |
| 94 { | |
| 95 CFX_PSVTemplate t; | |
| 96 t.x = obj.x * lamda; | |
| 97 t.y = obj.y * lamda; | |
| 98 return t; | |
| 99 } | |
| 100 friend» FXT_PSV»» operator * (baseType lamda, const FXT_PSV &obj) | |
| 101 { | |
| 102 CFX_PSVTemplate t; | |
| 103 t.x = lamda * obj.x; | |
| 104 t.y = lamda * obj.y; | |
| 105 return t; | |
| 106 } | |
| 107 friend» FXT_PSV»» operator / (const FXT_PSV &obj, baseType lamda) | |
| 108 { | |
| 109 CFX_PSVTemplate t; | |
| 110 t.x = obj.x / lamda; | |
| 111 t.y = obj.y / lamda; | |
| 112 return t; | |
| 113 } | |
| 114 baseType x, y; | |
| 115 }; | 95 }; |
| 116 typedef CFX_PSVTemplate<int32_t>» » » CFX_Point; | 96 typedef CFX_PSVTemplate<int32_t> CFX_Point; |
| 117 typedef CFX_PSVTemplate<FX_FLOAT>» » » CFX_PointF; | 97 typedef CFX_PSVTemplate<FX_FLOAT> CFX_PointF; |
| 118 typedef CFX_PSVTemplate<int32_t>» » » CFX_Size; | 98 typedef CFX_PSVTemplate<int32_t> CFX_Size; |
| 119 typedef CFX_PSVTemplate<FX_FLOAT>» » » CFX_SizeF; | 99 typedef CFX_PSVTemplate<FX_FLOAT> CFX_SizeF; |
| 120 typedef CFX_ArrayTemplate<CFX_Point>» » CFX_Points; | 100 typedef CFX_ArrayTemplate<CFX_Point> CFX_Points; |
| 121 typedef CFX_ArrayTemplate<CFX_PointF>» » CFX_PointsF; | 101 typedef CFX_ArrayTemplate<CFX_PointF> CFX_PointsF; |
| 122 typedef CFX_PSVTemplate<int32_t> *» » » FX_LPPOINT; | 102 typedef CFX_PSVTemplate<int32_t>* FX_LPPOINT; |
| 123 typedef CFX_PSVTemplate<FX_FLOAT> *» » » FX_LPPOINTF; | 103 typedef CFX_PSVTemplate<FX_FLOAT>* FX_LPPOINTF; |
| 124 typedef CFX_PSVTemplate<int32_t> const *» FX_LPCPOINT; | 104 typedef CFX_PSVTemplate<int32_t> const* FX_LPCPOINT; |
| 125 typedef CFX_PSVTemplate<FX_FLOAT> const *» FX_LPCPOINTF; | 105 typedef CFX_PSVTemplate<FX_FLOAT> const* FX_LPCPOINTF; |
| 126 #define CFX_FloatPoint» CFX_PointF | 106 #define CFX_FloatPoint CFX_PointF |
| 127 template<class baseType> | 107 template <class baseType> |
| 128 class CFX_VTemplate: public CFX_PSVTemplate<baseType> | 108 class CFX_VTemplate : public CFX_PSVTemplate<baseType> { |
| 129 { | 109 public: |
| 130 public: | 110 typedef CFX_PSVTemplate<baseType> FXT_PSV; |
| 131 typedef CFX_PSVTemplate<baseType>» FXT_PSV; | 111 typedef CFX_PSVTemplate<baseType> FXT_POINT; |
| 132 typedef CFX_PSVTemplate<baseType>» FXT_POINT; | 112 typedef CFX_PSVTemplate<baseType> FXT_SIZE; |
| 133 typedef CFX_PSVTemplate<baseType>» FXT_SIZE; | 113 typedef CFX_VTemplate<baseType> FXT_VECTOR; |
| 134 typedef CFX_VTemplate<baseType>» » FXT_VECTOR; | 114 void Set(baseType newx, baseType newy) { |
| 135 void» » Set(baseType newx, baseType newy) | 115 FXT_PSV::x = newx; |
| 136 { | 116 FXT_PSV::y = newy; |
| 137 FXT_PSV::x = newx; | 117 } |
| 138 FXT_PSV::y = newy; | 118 void Set(const FXT_PSV& psv) { FXT_PSV::x = psv.x, FXT_PSV::y = psv.y; } |
| 139 } | 119 void Set(const FXT_POINT& p1, const FXT_POINT& p2) { |
| 140 void» » Set(const FXT_PSV &psv) | 120 FXT_PSV::x = p2.x - p1.x, FXT_PSV::y = p2.y - p1.y; |
| 141 { | 121 } |
| 142 FXT_PSV::x = psv.x, FXT_PSV::y = psv.y; | 122 void Reset() { FXT_PSV::x = FXT_PSV::y = 0; } |
| 143 } | 123 baseType SquareLength() const { |
| 144 void» » Set(const FXT_POINT &p1, const FXT_POINT &p2) | 124 return FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y; |
| 145 { | 125 } |
| 146 FXT_PSV::x = p2.x - p1.x, FXT_PSV::y = p2.y - p1.y; | 126 baseType Length() const { |
| 147 } | 127 return FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y); |
| 148 void» » Reset() | 128 } |
| 149 { | 129 void Normalize() { |
| 150 FXT_PSV::x = FXT_PSV::y = 0; | 130 FX_FLOAT fLen = |
| 151 } | 131 FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y); |
| 152 baseType» SquareLength() const | 132 if (fLen < 0.0001f) { |
| 153 { | 133 return; |
| 154 return FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y; | 134 } |
| 155 } | 135 FXT_PSV::x = ((baseType)FXT_PSV::x) / fLen; |
| 156 baseType» Length() const | 136 FXT_PSV::y = ((baseType)FXT_PSV::y) / fLen; |
| 157 { | 137 } |
| 158 return FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y); | 138 baseType DotProduct(baseType otherx, baseType othery) const { |
| 159 } | 139 return FXT_PSV::x * otherx + FXT_PSV::y * othery; |
| 160 void» » Normalize() | 140 } |
| 161 { | 141 baseType DotProduct(const FXT_VECTOR& v) const { |
| 162 FX_FLOAT fLen = FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PS
V::y); | 142 return FXT_PSV::x * v.x + FXT_PSV::y * v.y; |
| 163 if (fLen < 0.0001f) { | 143 } |
| 164 return; | 144 FX_BOOL IsParallel(baseType otherx, baseType othery) const { |
| 165 } | 145 baseType t = FXT_PSV::x * othery - FXT_PSV::y * otherx; |
| 166 FXT_PSV::x = ((baseType)FXT_PSV::x) / fLen; | 146 return FXSYS_fabs(t) < 0x0001f; |
| 167 FXT_PSV::y = ((baseType)FXT_PSV::y) / fLen; | 147 } |
| 168 } | 148 FX_BOOL IsParallel(const FXT_VECTOR& v) const { return IsParallel(v.x, v.y); } |
| 169 baseType» DotProduct(baseType otherx, baseType othery) const | 149 FX_BOOL IsPerpendicular(baseType otherx, baseType othery) const { |
| 170 { | 150 baseType t = DotProduct(otherx, othery); |
| 171 return FXT_PSV::x * otherx + FXT_PSV::y * othery; | 151 return FXSYS_fabs(t) < 0x0001f; |
| 172 } | 152 } |
| 173 baseType» DotProduct(const FXT_VECTOR &v) const | 153 FX_BOOL IsPerpendicular(const FXT_VECTOR& v) const { |
| 174 { | 154 return IsPerpendicular(v.x, v.y); |
| 175 return FXT_PSV::x * v.x + FXT_PSV::y * v.y; | 155 } |
| 176 } | 156 void Translate(baseType dx, baseType dy) { |
| 177 FX_BOOL» » IsParallel(baseType otherx, baseType othery) const | 157 FXT_PSV::x += dx, FXT_PSV::y += dy; |
| 178 { | 158 } |
| 179 baseType t = FXT_PSV::x * othery - FXT_PSV::y * otherx; | 159 void Scale(baseType sx, baseType sy) { FXT_PSV::x *= sx, FXT_PSV::y *= sy; } |
| 180 return FXSYS_fabs(t) < 0x0001f; | 160 void Rotate(FX_FLOAT fRadian) { |
| 181 } | 161 FX_FLOAT xx = (FX_FLOAT)FXT_PSV::x; |
| 182 FX_BOOL» » IsParallel(const FXT_VECTOR &v) const | 162 FX_FLOAT yy = (FX_FLOAT)FXT_PSV::y; |
| 183 { | 163 FX_FLOAT cosValue = FXSYS_cos(fRadian); |
| 184 return IsParallel(v.x, v.y); | 164 FX_FLOAT sinValue = FXSYS_sin(fRadian); |
| 185 } | 165 FXT_PSV::x = xx * cosValue - yy * sinValue; |
| 186 FX_BOOL» » IsPerpendicular(baseType otherx, baseType othery) const | 166 FXT_PSV::y = xx * sinValue + yy * cosValue; |
| 187 { | 167 } |
| 188 baseType t = DotProduct(otherx, othery); | 168 friend FX_FLOAT Cosine(const FXT_VECTOR& v1, const FXT_VECTOR& v2) { |
| 189 return FXSYS_fabs(t) < 0x0001f; | 169 FXSYS_assert(v1.SquareLength() != 0 && v2.SquareLength() != 0); |
| 190 } | 170 FX_FLOAT dotProduct = v1.DotProduct(v2); |
| 191 FX_BOOL» » IsPerpendicular(const FXT_VECTOR &v) const | 171 return dotProduct / |
| 192 { | 172 (FX_FLOAT)FXSYS_sqrt(v1.SquareLength() * v2.SquareLength()); |
| 193 return IsPerpendicular(v.x, v.y); | 173 } |
| 194 } | 174 friend FX_FLOAT ArcCosine(const FXT_VECTOR& v1, const FXT_VECTOR& v2) { |
| 195 void» » Translate(baseType dx, baseType dy) | 175 return (FX_FLOAT)FXSYS_acos(Cosine(v1, v2)); |
| 196 { | 176 } |
| 197 FXT_PSV::x += dx, FXT_PSV::y += dy; | 177 friend FX_FLOAT SlopeAngle(const FXT_VECTOR& v) { |
| 198 } | 178 CFX_VTemplate vx; |
| 199 void» » Scale(baseType sx, baseType sy) | 179 vx.Set(1, 0); |
| 200 { | 180 FX_FLOAT fSlope = ArcCosine(v, vx); |
| 201 FXT_PSV::x *= sx, FXT_PSV::y *= sy; | 181 return v.y < 0 ? -fSlope : fSlope; |
| 202 } | 182 } |
| 203 void» » Rotate(FX_FLOAT fRadian) | |
| 204 { | |
| 205 FX_FLOAT xx = (FX_FLOAT)FXT_PSV::x; | |
| 206 FX_FLOAT yy = (FX_FLOAT)FXT_PSV::y; | |
| 207 FX_FLOAT cosValue = FXSYS_cos(fRadian); | |
| 208 FX_FLOAT sinValue = FXSYS_sin(fRadian); | |
| 209 FXT_PSV::x = xx * cosValue - yy * sinValue; | |
| 210 FXT_PSV::y = xx * sinValue + yy * cosValue; | |
| 211 } | |
| 212 friend» FX_FLOAT» Cosine(const FXT_VECTOR &v1, const FXT_VECTOR &v
2) | |
| 213 { | |
| 214 FXSYS_assert(v1.SquareLength() != 0 && v2.SquareLength() != 0); | |
| 215 FX_FLOAT dotProduct = v1.DotProduct(v2); | |
| 216 return dotProduct / (FX_FLOAT)FXSYS_sqrt(v1.SquareLength() * v2.SquareLe
ngth()); | |
| 217 } | |
| 218 friend» FX_FLOAT» ArcCosine(const FXT_VECTOR &v1, const FXT_VECTOR
&v2) | |
| 219 { | |
| 220 return (FX_FLOAT)FXSYS_acos(Cosine(v1, v2)); | |
| 221 } | |
| 222 friend» FX_FLOAT» SlopeAngle(const FXT_VECTOR &v) | |
| 223 { | |
| 224 CFX_VTemplate vx; | |
| 225 vx.Set(1, 0); | |
| 226 FX_FLOAT fSlope = ArcCosine(v, vx); | |
| 227 return v.y < 0 ? -fSlope : fSlope; | |
| 228 } | |
| 229 }; | 183 }; |
| 230 typedef CFX_VTemplate<int32_t> CFX_Vector; | 184 typedef CFX_VTemplate<int32_t> CFX_Vector; |
| 231 typedef CFX_VTemplate<FX_FLOAT> CFX_VectorF; | 185 typedef CFX_VTemplate<FX_FLOAT> CFX_VectorF; |
| 232 template<class baseType> | 186 template <class baseType> |
| 233 class CFX_RTemplate | 187 class CFX_RTemplate { |
| 234 { | 188 public: |
| 235 public: | 189 typedef CFX_PSVTemplate<baseType> FXT_POINT; |
| 236 typedef CFX_PSVTemplate<baseType> FXT_POINT; | 190 typedef CFX_PSVTemplate<baseType> FXT_SIZE; |
| 237 typedef CFX_PSVTemplate<baseType> FXT_SIZE; | 191 typedef CFX_VTemplate<baseType> FXT_VECTOR; |
| 238 typedef CFX_VTemplate<baseType> FXT_VECTOR; | 192 typedef CFX_PRLTemplate<baseType> FXT_PARAL; |
| 239 typedef CFX_PRLTemplate<baseType> FXT_PARAL; | 193 typedef CFX_RTemplate<baseType> FXT_RECT; |
| 240 typedef CFX_RTemplate<baseType> FXT_RECT; | 194 void Set(baseType left, baseType top, baseType width, baseType height) { |
| 241 void Set(baseType left, baseType top, baseType width, baseTyp
e height) | 195 FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::width = width, |
| 242 { | 196 FXT_RECT::height = height; |
| 243 FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::width = width, FXT
_RECT::height = height; | 197 } |
| 244 } | 198 void Set(baseType left, baseType top, const FXT_SIZE& size) { |
| 245 void Set(baseType left, baseType top, const FXT_SIZE &size) | 199 FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::Size(size); |
| 246 { | 200 } |
| 247 FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::Size(size); | 201 void Set(const FXT_POINT& p, baseType width, baseType height) { |
| 248 } | 202 TopLeft(p), FXT_RECT::width = width, FXT_RECT::height = height; |
| 249 void Set(const FXT_POINT &p, baseType width, baseType height) | 203 } |
| 250 { | 204 void Set(const FXT_POINT& p1, const FXT_POINT& p2) { |
| 251 TopLeft(p), FXT_RECT::width = width, FXT_RECT::height = height; | 205 TopLeft(p1), FXT_RECT::width = p2.x - p1.x, FXT_RECT::height = p2.y - p1.y, |
| 252 } | 206 FXT_RECT::Normalize(); |
| 253 void Set(const FXT_POINT &p1, const FXT_POINT &p2) | 207 } |
| 254 { | 208 void Set(const FXT_POINT& p, const FXT_VECTOR& v) { |
| 255 TopLeft(p1), FXT_RECT::width = p2.x - p1.x, FXT_RECT::height = p2.y - p1
.y, FXT_RECT::Normalize(); | 209 TopLeft(p), FXT_RECT::width = v.x, FXT_RECT::height = v.y, |
| 256 } | 210 FXT_RECT::Normalize(); |
| 257 void Set(const FXT_POINT &p, const FXT_VECTOR &v) | 211 } |
| 258 { | 212 void Reset() { |
| 259 TopLeft(p), FXT_RECT::width = v.x, FXT_RECT::height = v.y, FXT_RECT::Nor
malize(); | 213 FXT_RECT::left = FXT_RECT::top = FXT_RECT::width = FXT_RECT::height = 0; |
| 260 } | 214 } |
| 261 void Reset() | 215 FXT_RECT& operator+=(const FXT_POINT& p) { |
| 262 { | 216 left += p.x, top += p.y; |
| 263 FXT_RECT::left = FXT_RECT::top = FXT_RECT::width = FXT_RECT::height = 0; | 217 return *this; |
| 264 } | 218 } |
| 265 FXT_RECT& operator += (const FXT_POINT &p) | 219 FXT_RECT& operator-=(const FXT_POINT& p) { |
| 266 { | 220 left -= p.x, top -= p.y; |
| 267 left += p.x, top += p.y; | 221 return *this; |
| 268 return *this; | 222 } |
| 269 } | 223 baseType right() const { return left + width; } |
| 270 FXT_RECT& operator -= (const FXT_POINT &p) | 224 baseType bottom() const { return top + height; } |
| 271 { | 225 void Normalize() { |
| 272 left -= p.x, top -= p.y; | 226 if (width < 0) { |
| 273 return *this; | 227 left += width; |
| 274 } | 228 width = -width; |
| 275 baseType right() const | 229 } |
| 276 { | 230 if (height < 0) { |
| 277 return left + width; | 231 top += height; |
| 278 } | 232 height = -height; |
| 279 baseType bottom() const | 233 } |
| 280 { | 234 } |
| 281 return top + height; | 235 void Offset(baseType dx, baseType dy) { |
| 282 } | 236 left += dx; |
| 283 void Normalize() | 237 top += dy; |
| 284 { | 238 } |
| 285 if (width < 0) { | 239 void Inflate(baseType x, baseType y) { |
| 286 left += width; | 240 left -= x; |
| 287 width = -width; | 241 width += x * 2; |
| 288 } | 242 top -= y; |
| 289 if (height < 0) { | 243 height += y * 2; |
| 290 top += height; | 244 } |
| 291 height = -height; | 245 void Inflate(const FXT_POINT& p) { Inflate(p.x, p.y); } |
| 292 } | 246 void Inflate(baseType left, baseType top, baseType right, baseType bottom) { |
| 293 } | 247 FXT_RECT::left -= left; |
| 294 void Offset(baseType dx, baseType dy) | 248 FXT_RECT::top -= top; |
| 295 { | 249 FXT_RECT::width += left + right; |
| 296 left += dx; | 250 FXT_RECT::height += top + bottom; |
| 297 top += dy; | 251 } |
| 298 } | 252 void Inflate(const FXT_RECT& rt) { |
| 299 void Inflate(baseType x, baseType y) | 253 Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height); |
| 300 { | 254 } |
| 301 left -= x; | 255 void Deflate(baseType x, baseType y) { |
| 302 width += x * 2; | 256 left += x; |
| 303 top -= y; | 257 width -= x * 2; |
| 304 height += y * 2; | 258 top += y; |
| 305 } | 259 height -= y * 2; |
| 306 void Inflate(const FXT_POINT &p) | 260 } |
| 307 { | 261 void Deflate(const FXT_POINT& p) { Deflate(p.x, p.y); } |
| 308 Inflate(p.x, p.y); | 262 void Deflate(baseType left, baseType top, baseType right, baseType bottom) { |
| 309 } | 263 FXT_RECT::left += left; |
| 310 void Inflate(baseType left, baseType top, baseType right, bas
eType bottom) | 264 FXT_RECT::top += top; |
| 311 { | 265 FXT_RECT::width -= left + right; |
| 312 FXT_RECT::left -= left; | 266 FXT_RECT::height -= top + bottom; |
| 313 FXT_RECT::top -= top; | 267 } |
| 314 FXT_RECT::width += left + right; | 268 void Deflate(const FXT_RECT& rt) { |
| 315 FXT_RECT::height += top + bottom; | 269 Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height); |
| 316 } | 270 } |
| 317 void Inflate(const FXT_RECT &rt) | 271 FX_BOOL IsEmpty() const { return width <= 0 || height <= 0; } |
| 318 { | 272 FX_BOOL IsEmpty(FX_FLOAT fEpsilon) const { |
| 319 Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height); | 273 return width <= fEpsilon || height <= fEpsilon; |
| 320 } | 274 } |
| 321 void Deflate(baseType x, baseType y) | 275 void Empty() { width = height = 0; } |
| 322 { | 276 FX_BOOL Contains(baseType x, baseType y) const { |
| 323 left += x; | 277 return x >= left && x < left + width && y >= top && y < top + height; |
| 324 width -= x * 2; | 278 } |
| 325 top += y; | 279 FX_BOOL Contains(const FXT_POINT& p) const { return Contains(p.x, p.y); } |
| 326 height -= y * 2; | 280 FX_BOOL Contains(const FXT_RECT& rt) const { |
| 327 } | 281 return rt.left >= left && rt.right() <= right() && rt.top >= top && |
| 328 void Deflate(const FXT_POINT &p) | 282 rt.bottom() <= bottom(); |
| 329 { | 283 } |
| 330 Deflate(p.x, p.y); | 284 baseType Width() const { return width; } |
| 331 } | 285 baseType Height() const { return height; } |
| 332 void Deflate(baseType left, baseType top, baseType right, bas
eType bottom) | 286 FXT_SIZE Size() const { |
| 333 { | 287 FXT_SIZE size; |
| 334 FXT_RECT::left += left; | 288 size.Set(width, height); |
| 335 FXT_RECT::top += top; | 289 return size; |
| 336 FXT_RECT::width -= left + right; | 290 } |
| 337 FXT_RECT::height -= top + bottom; | 291 void Size(FXT_SIZE s) { width = s.x, height = s.y; } |
| 338 } | 292 FXT_POINT TopLeft() const { |
| 339 void Deflate(const FXT_RECT &rt) | 293 FXT_POINT p; |
| 340 { | 294 p.x = left; |
| 341 Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height); | 295 p.y = top; |
| 342 } | 296 return p; |
| 343 FX_BOOL IsEmpty() const | 297 } |
| 344 { | 298 FXT_POINT TopRight() const { |
| 345 return width <= 0 || height <= 0; | 299 FXT_POINT p; |
| 346 } | 300 p.x = left + width; |
| 347 FX_BOOL IsEmpty(FX_FLOAT fEpsilon) const | 301 p.y = top; |
| 348 { | 302 return p; |
| 349 return width <= fEpsilon || height <= fEpsilon; | 303 } |
| 350 } | 304 FXT_POINT BottomLeft() const { |
| 351 void Empty() | 305 FXT_POINT p; |
| 352 { | 306 p.x = left; |
| 353 width = height = 0; | 307 p.y = top + height; |
| 354 } | 308 return p; |
| 355 FX_BOOL Contains(baseType x, baseType y) const | 309 } |
| 356 { | 310 FXT_POINT BottomRight() const { |
| 357 return x >= left && x < left + width && y >= top && y < top + height; | 311 FXT_POINT p; |
| 358 } | 312 p.x = left + width; |
| 359 FX_BOOL Contains(const FXT_POINT &p) const | 313 p.y = top + height; |
| 360 { | 314 return p; |
| 361 return Contains(p.x, p.y); | 315 } |
| 362 } | 316 void TopLeft(FXT_POINT tl) { |
| 363 FX_BOOL Contains(const FXT_RECT &rt) const | 317 left = tl.x; |
| 364 { | 318 top = tl.y; |
| 365 return rt.left >= left && rt.right() <= right() && rt.top >= top && rt.b
ottom() <= bottom(); | 319 } |
| 366 } | 320 void TopRight(FXT_POINT tr) { |
| 367 baseType Width() const | 321 width = tr.x - left; |
| 368 { | 322 top = tr.y; |
| 369 return width; | 323 } |
| 370 } | 324 void BottomLeft(FXT_POINT bl) { |
| 371 baseType Height() const | 325 left = bl.x; |
| 372 { | 326 height = bl.y - top; |
| 373 return height; | 327 } |
| 374 } | 328 void BottomRight(FXT_POINT br) { |
| 375 FXT_SIZE Size() const | 329 width = br.x - left; |
| 376 { | 330 height = br.y - top; |
| 377 FXT_SIZE size; | 331 } |
| 378 size.Set(width, height); | 332 FXT_POINT Center() const { |
| 379 return size; | 333 FXT_POINT p; |
| 380 } | 334 p.x = left + width / 2; |
| 381 void Size(FXT_SIZE s) | 335 p.y = top + height / 2; |
| 382 { | 336 return p; |
| 383 width = s.x, height = s.y; | 337 } |
| 384 } | 338 void GetParallelogram(FXT_PARAL& pg) const { |
| 385 FXT_POINT TopLeft() const | 339 pg.x = left, pg.y = top; |
| 386 { | 340 pg.x1 = width, pg.y1 = 0; |
| 387 FXT_POINT p; | 341 pg.x2 = 0, pg.y2 = height; |
| 388 p.x = left; | 342 } |
| 389 p.y = top; | 343 void Union(baseType x, baseType y) { |
| 390 return p; | 344 baseType r = right(), b = bottom(); |
| 391 } | 345 if (left > x) { |
| 392 FXT_POINT TopRight() const | 346 left = x; |
| 393 { | 347 } |
| 394 FXT_POINT p; | 348 if (r < x) { |
| 395 p.x = left + width; | 349 r = x; |
| 396 p.y = top; | 350 } |
| 397 return p; | 351 if (top > y) { |
| 398 } | 352 top = y; |
| 399 FXT_POINT BottomLeft() const | 353 } |
| 400 { | 354 if (b < y) { |
| 401 FXT_POINT p; | 355 b = y; |
| 402 p.x = left; | 356 } |
| 403 p.y = top + height; | 357 width = r - left; |
| 404 return p; | 358 height = b - top; |
| 405 } | 359 } |
| 406 FXT_POINT BottomRight() const | 360 void Union(const FXT_POINT& p) { Union(p.x, p.y); } |
| 407 { | 361 void Union(const FXT_RECT& rt) { |
| 408 FXT_POINT p; | 362 baseType r = right(), b = bottom(); |
| 409 p.x = left + width; | 363 if (left > rt.left) { |
| 410 p.y = top + height; | 364 left = rt.left; |
| 411 return p; | 365 } |
| 412 } | 366 if (r < rt.right()) { |
| 413 void TopLeft(FXT_POINT tl) | 367 r = rt.right(); |
| 414 { | 368 } |
| 415 left = tl.x; | 369 if (top > rt.top) { |
| 416 top = tl.y; | 370 top = rt.top; |
| 417 } | 371 } |
| 418 void TopRight(FXT_POINT tr) | 372 if (b < rt.bottom()) { |
| 419 { | 373 b = rt.bottom(); |
| 420 width = tr.x - left; | 374 } |
| 421 top = tr.y; | 375 width = r - left; |
| 422 } | 376 height = b - top; |
| 423 void BottomLeft(FXT_POINT bl) | 377 } |
| 424 { | 378 void Intersect(const FXT_RECT& rt) { |
| 425 left = bl.x; | 379 baseType r = right(), b = bottom(); |
| 426 height = bl.y - top; | 380 if (left < rt.left) { |
| 427 } | 381 left = rt.left; |
| 428 void BottomRight(FXT_POINT br) | 382 } |
| 429 { | 383 if (r > rt.right()) { |
| 430 width = br.x - left; | 384 r = rt.right(); |
| 431 height = br.y - top; | 385 } |
| 432 } | 386 if (top < rt.top) { |
| 433 FXT_POINT Center() const | 387 top = rt.top; |
| 434 { | 388 } |
| 435 FXT_POINT p; | 389 if (b > rt.bottom()) { |
| 436 p.x = left + width / 2; | 390 b = rt.bottom(); |
| 437 p.y = top + height / 2; | 391 } |
| 438 return p; | 392 width = r - left; |
| 439 } | 393 height = b - top; |
| 440 void GetParallelogram(FXT_PARAL &pg) const | 394 } |
| 441 { | 395 FX_BOOL IntersectWith(const FXT_RECT& rt) const { |
| 442 pg.x = left, pg.y = top; | 396 FXT_RECT rect = rt; |
| 443 pg.x1 = width, pg.y1 = 0; | 397 rect.Intersect(*this); |
| 444 pg.x2 = 0, pg.y2 = height; | 398 return !rect.IsEmpty(); |
| 445 } | 399 } |
| 446 void Union(baseType x, baseType y) | 400 FX_BOOL IntersectWith(const FXT_RECT& rt, FX_FLOAT fEpsilon) const { |
| 447 { | 401 FXT_RECT rect = rt; |
| 448 baseType r = right(), b = bottom(); | 402 rect.Intersect(*this); |
| 449 if (left > x) { | 403 return !rect.IsEmpty(fEpsilon); |
| 450 left = x; | 404 } |
| 451 } | 405 friend FX_BOOL operator==(const FXT_RECT& rc1, const FXT_RECT& rc2) { |
| 452 if (r < x) { | 406 return rc1.left == rc2.left && rc1.top == rc2.top && |
| 453 r = x; | 407 rc1.width == rc2.width && rc1.height == rc2.height; |
| 454 } | 408 } |
| 455 if (top > y) { | 409 friend FX_BOOL operator!=(const FXT_RECT& rc1, const FXT_RECT& rc2) { |
| 456 top = y; | 410 return rc1.left != rc2.left || rc1.top != rc2.top || |
| 457 } | 411 rc1.width != rc2.width || rc1.height != rc2.height; |
| 458 if (b < y) { | 412 } |
| 459 b = y; | 413 baseType left, top; |
| 460 } | 414 baseType width, height; |
| 461 width = r - left; | |
| 462 height = b - top; | |
| 463 } | |
| 464 void Union(const FXT_POINT &p) | |
| 465 { | |
| 466 Union(p.x, p.y); | |
| 467 } | |
| 468 void Union(const FXT_RECT &rt) | |
| 469 { | |
| 470 baseType r = right(), b = bottom(); | |
| 471 if (left > rt.left) { | |
| 472 left = rt.left; | |
| 473 } | |
| 474 if (r < rt.right()) { | |
| 475 r = rt.right(); | |
| 476 } | |
| 477 if (top > rt.top) { | |
| 478 top = rt.top; | |
| 479 } | |
| 480 if (b < rt.bottom()) { | |
| 481 b = rt.bottom(); | |
| 482 } | |
| 483 width = r - left; | |
| 484 height = b - top; | |
| 485 } | |
| 486 void Intersect(const FXT_RECT &rt) | |
| 487 { | |
| 488 baseType r = right(), b = bottom(); | |
| 489 if (left < rt.left) { | |
| 490 left = rt.left; | |
| 491 } | |
| 492 if (r > rt.right()) { | |
| 493 r = rt.right(); | |
| 494 } | |
| 495 if (top < rt.top) { | |
| 496 top = rt.top; | |
| 497 } | |
| 498 if (b > rt.bottom()) { | |
| 499 b = rt.bottom(); | |
| 500 } | |
| 501 width = r - left; | |
| 502 height = b - top; | |
| 503 } | |
| 504 FX_BOOL IntersectWith(const FXT_RECT &rt) const | |
| 505 { | |
| 506 FXT_RECT rect = rt; | |
| 507 rect.Intersect(*this); | |
| 508 return !rect.IsEmpty(); | |
| 509 } | |
| 510 FX_BOOL IntersectWith(const FXT_RECT &rt, FX_FLOAT fEpsilon) con
st | |
| 511 { | |
| 512 FXT_RECT rect = rt; | |
| 513 rect.Intersect(*this); | |
| 514 return !rect.IsEmpty(fEpsilon); | |
| 515 } | |
| 516 friend FX_BOOL operator == (const FXT_RECT &rc1, const FXT_RECT &rc2) | |
| 517 { | |
| 518 return rc1.left == rc2.left && rc1.top == rc2.top && rc1.width == rc2.wi
dth && rc1.height == rc2.height; | |
| 519 } | |
| 520 friend FX_BOOL operator != (const FXT_RECT &rc1, const FXT_RECT &rc2) | |
| 521 { | |
| 522 return rc1.left != rc2.left || rc1.top != rc2.top || rc1.width != rc2.wi
dth || rc1.height != rc2.height; | |
| 523 } | |
| 524 baseType left, top; | |
| 525 baseType width, height; | |
| 526 }; | 415 }; |
| 527 typedef CFX_RTemplate<int32_t>» » » CFX_Rect; | 416 typedef CFX_RTemplate<int32_t> CFX_Rect; |
| 528 typedef CFX_RTemplate<FX_FLOAT>»» » CFX_RectF; | 417 typedef CFX_RTemplate<FX_FLOAT> CFX_RectF; |
| 529 typedef CFX_RTemplate<int32_t> *» » FX_LPRECT; | 418 typedef CFX_RTemplate<int32_t>* FX_LPRECT; |
| 530 typedef CFX_RTemplate<FX_FLOAT> *» » FX_LPRECTF; | 419 typedef CFX_RTemplate<FX_FLOAT>* FX_LPRECTF; |
| 531 typedef CFX_RTemplate<int32_t> const *» FX_LPCRECT; | 420 typedef CFX_RTemplate<int32_t> const* FX_LPCRECT; |
| 532 typedef CFX_RTemplate<FX_FLOAT> const *»FX_LPCRECTF; | 421 typedef CFX_RTemplate<FX_FLOAT> const* FX_LPCRECTF; |
| 533 typedef CFX_ArrayTemplate<CFX_RectF>» CFX_RectFArray; | 422 typedef CFX_ArrayTemplate<CFX_RectF> CFX_RectFArray; |
| 534 struct FX_RECT { | 423 struct FX_RECT { |
| 535 | 424 int left; |
| 536 int»» » left; | 425 |
| 537 | 426 int top; |
| 538 int»» » top; | 427 |
| 539 | 428 int right; |
| 540 int»» » right; | 429 |
| 541 | 430 int bottom; |
| 542 int»» » bottom; | 431 |
| 543 | 432 FX_RECT() : left(0), top(0), right(0), bottom(0) {} |
| 544 FX_RECT(): left(0), top(0), right(0), bottom(0) { } | 433 |
| 545 | 434 FX_RECT(int left1, int top1, int right1, int bottom1) { |
| 546 FX_RECT(int left1, int top1, int right1, int bottom1) | 435 left = left1; |
| 547 { | 436 top = top1; |
| 548 left = left1; | 437 right = right1; |
| 549 top = top1; | 438 bottom = bottom1; |
| 550 right = right1; | 439 } |
| 551 bottom = bottom1; | 440 |
| 552 } | 441 int Width() const { return right - left; } |
| 553 | 442 |
| 554 int»» » Width() const | 443 int Height() const { return bottom - top; } |
| 555 { | 444 |
| 556 return right - left; | 445 FX_BOOL IsEmpty() const { return right <= left || bottom <= top; } |
| 557 } | 446 |
| 558 | 447 void Normalize(); |
| 559 int»» » Height() const | 448 |
| 560 { | 449 void Intersect(const FX_RECT& src); |
| 561 return bottom - top; | 450 |
| 562 } | 451 void Intersect(int left1, int top1, int right1, int bottom1) { |
| 563 | 452 Intersect(FX_RECT(left1, top1, right1, bottom1)); |
| 564 FX_BOOL» » IsEmpty() const | 453 } |
| 565 { | 454 |
| 566 return right <= left || bottom <= top; | 455 void Union(const FX_RECT& other_rect); |
| 567 } | 456 |
| 568 | 457 FX_BOOL operator==(const FX_RECT& src) const { |
| 569 void» » Normalize(); | 458 return left == src.left && right == src.right && top == src.top && |
| 570 | 459 bottom == src.bottom; |
| 571 void» » Intersect(const FX_RECT& src); | 460 } |
| 572 | 461 |
| 573 void» » Intersect(int left1, int top1, int right1, int bottom1) | 462 void Offset(int dx, int dy) { |
| 574 { | 463 left += dx; |
| 575 Intersect(FX_RECT(left1, top1, right1, bottom1)); | 464 right += dx; |
| 576 } | 465 top += dy; |
| 577 | 466 bottom += dy; |
| 578 void» » Union(const FX_RECT& other_rect); | 467 } |
| 579 | 468 |
| 580 FX_BOOL» » operator == (const FX_RECT& src) const | 469 FX_BOOL Contains(const FX_RECT& other_rect) const { |
| 581 { | 470 return other_rect.left >= left && other_rect.right <= right && |
| 582 return left == src.left && right == src.right && top == src.top && botto
m == src.bottom; | 471 other_rect.top >= top && other_rect.bottom <= bottom; |
| 583 } | 472 } |
| 584 | 473 |
| 585 void» » Offset(int dx, int dy) | 474 FX_BOOL Contains(int x, int y) const { |
| 586 { | 475 return x >= left && x < right && y >= top && y < bottom; |
| 587 left += dx; | 476 } |
| 588 right += dx; | |
| 589 top += dy; | |
| 590 bottom += dy; | |
| 591 } | |
| 592 | |
| 593 FX_BOOL» » Contains(const FX_RECT& other_rect) const | |
| 594 { | |
| 595 return other_rect.left >= left && other_rect.right <= right && other_rec
t.top >= top && other_rect.bottom <= bottom; | |
| 596 } | |
| 597 | |
| 598 FX_BOOL» » Contains(int x, int y) const | |
| 599 { | |
| 600 return x >= left && x < right && y >= top && y < bottom; | |
| 601 } | |
| 602 }; | 477 }; |
| 603 struct FX_SMALL_RECT { | 478 struct FX_SMALL_RECT { |
| 604 | 479 int16_t Left; |
| 605 int16_t» Left; | 480 |
| 606 | 481 int16_t Top; |
| 607 int16_t» Top; | 482 |
| 608 | 483 int16_t Right; |
| 609 int16_t» Right; | 484 |
| 610 | 485 int16_t Bottom; |
| 611 int16_t» Bottom; | |
| 612 }; | 486 }; |
| 613 class CFX_FloatRect | 487 class CFX_FloatRect { |
| 614 { | 488 public: |
| 615 public: | 489 CFX_FloatRect() { left = right = bottom = top = 0; } |
| 616 | 490 |
| 617 CFX_FloatRect() | 491 CFX_FloatRect(FX_FLOAT left1, |
| 618 { | 492 FX_FLOAT bottom1, |
| 619 left = right = bottom = top = 0; | 493 FX_FLOAT right1, |
| 620 } | 494 FX_FLOAT top1) { |
| 621 | 495 left = left1; |
| 622 CFX_FloatRect(FX_FLOAT left1, FX_FLOAT bottom1, FX_FLOAT right1, FX_FLOAT to
p1) | 496 bottom = bottom1; |
| 623 { | 497 right = right1; |
| 624 left = left1; | 498 top = top1; |
| 625 bottom = bottom1; | 499 } |
| 626 right = right1; | 500 |
| 627 top = top1; | 501 CFX_FloatRect(const FX_FLOAT* pArray) { |
| 628 } | 502 left = pArray[0]; |
| 629 | 503 bottom = pArray[1]; |
| 630 CFX_FloatRect(const FX_FLOAT* pArray) | 504 right = pArray[2]; |
| 631 { | 505 top = pArray[3]; |
| 632 left = pArray[0]; | 506 } |
| 633 bottom = pArray[1]; | 507 |
| 634 right = pArray[2]; | 508 CFX_FloatRect(const FX_RECT& rect); |
| 635 top = pArray[3]; | 509 |
| 636 } | 510 FX_BOOL IsEmpty() const { return left >= right || bottom >= top; } |
| 637 | 511 |
| 638 CFX_FloatRect(const FX_RECT& rect); | 512 void Normalize(); |
| 639 | 513 |
| 640 FX_BOOL» » » » IsEmpty() const | 514 void Reset() { left = right = bottom = top = 0; } |
| 641 { | 515 |
| 642 return left >= right || bottom >= top; | 516 FX_BOOL Contains(const CFX_FloatRect& other_rect) const; |
| 643 } | 517 |
| 644 | 518 FX_BOOL Contains(FX_FLOAT x, FX_FLOAT y) const; |
| 645 void» » » » Normalize(); | 519 |
| 646 | 520 void Transform(const CFX_Matrix* pMatrix); |
| 647 void» » » » Reset() | 521 |
| 648 { | 522 void Intersect(const CFX_FloatRect& other_rect); |
| 649 left = right = bottom = top = 0; | 523 |
| 650 } | 524 void Union(const CFX_FloatRect& other_rect); |
| 651 | 525 |
| 652 FX_BOOL» » » » Contains(const CFX_FloatRect& other_rect
) const; | 526 FX_RECT GetInnerRect() const; |
| 653 | 527 |
| 654 FX_BOOL» » » » Contains(FX_FLOAT x, FX_FLOAT y) const; | 528 FX_RECT GetOutterRect() const; |
| 655 | 529 |
| 656 void» » » » Transform(const CFX_Matrix* pMatrix); | 530 FX_RECT GetClosestRect() const; |
| 657 | 531 |
| 658 void» » » » Intersect(const CFX_FloatRect& other_rec
t); | 532 int Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects); |
| 659 | 533 |
| 660 void» » » » Union(const CFX_FloatRect& other_rect); | 534 void InitRect(FX_FLOAT x, FX_FLOAT y) { |
| 661 | 535 left = right = x; |
| 662 FX_RECT» » » » GetInnerRect() const; | 536 bottom = top = y; |
| 663 | 537 } |
| 664 FX_RECT» » » » GetOutterRect() const; | 538 |
| 665 | 539 void UpdateRect(FX_FLOAT x, FX_FLOAT y); |
| 666 FX_RECT» » » » GetClosestRect() const; | 540 |
| 667 | 541 FX_FLOAT Width() const { return right - left; } |
| 668 int»» » » » Substract4(CFX_FloatRect& substract_rect
, CFX_FloatRect* pRects); | 542 |
| 669 | 543 FX_FLOAT Height() const { return top - bottom; } |
| 670 void» » » » InitRect(FX_FLOAT x, FX_FLOAT y) | 544 |
| 671 { | 545 void Inflate(FX_FLOAT x, FX_FLOAT y) { |
| 672 left = right = x; | 546 Normalize(); |
| 673 bottom = top = y; | 547 left -= x; |
| 674 } | 548 right += x; |
| 675 | 549 bottom -= y; |
| 676 void» » » » UpdateRect(FX_FLOAT x, FX_FLOAT y); | 550 top += y; |
| 677 | 551 } |
| 678 FX_FLOAT» » » Width() const | 552 |
| 679 { | 553 void Inflate(FX_FLOAT other_left, |
| 680 return right - left; | 554 FX_FLOAT other_bottom, |
| 681 } | 555 FX_FLOAT other_right, |
| 682 | 556 FX_FLOAT other_top) { |
| 683 FX_FLOAT» » » Height() const | 557 Normalize(); |
| 684 { | 558 left -= other_left; |
| 685 return top - bottom; | 559 bottom -= other_bottom; |
| 686 } | 560 right += other_right; |
| 687 | 561 top += other_top; |
| 688 void» » » » Inflate(FX_FLOAT x, FX_FLOAT y) | 562 } |
| 689 { | 563 |
| 690 Normalize(); | 564 void Inflate(const CFX_FloatRect& rt) { |
| 691 left -= x; | 565 Inflate(rt.left, rt.bottom, rt.right, rt.top); |
| 692 right += x; | 566 } |
| 693 bottom -= y; | 567 |
| 694 top += y; | 568 void Deflate(FX_FLOAT x, FX_FLOAT y) { |
| 695 } | 569 Normalize(); |
| 696 | 570 left += x; |
| 697 void Inflate(FX_FLOAT other_left, | 571 right -= x; |
| 698 FX_FLOAT other_bottom, | 572 bottom += y; |
| 699 FX_FLOAT other_right, | 573 top -= y; |
| 700 FX_FLOAT other_top) | 574 } |
| 701 { | 575 |
| 702 Normalize(); | 576 void Deflate(FX_FLOAT other_left, |
| 703 left -= other_left; | 577 FX_FLOAT other_bottom, |
| 704 bottom -= other_bottom; | 578 FX_FLOAT other_right, |
| 705 right += other_right; | 579 FX_FLOAT other_top) { |
| 706 top += other_top; | 580 Normalize(); |
| 707 } | 581 left += other_left; |
| 708 | 582 bottom += other_bottom; |
| 709 void Inflate(const CFX_FloatRect &rt) | 583 right -= other_right; |
| 710 { | 584 top -= other_top; |
| 711 Inflate(rt.left, rt.bottom, rt.right, rt.top); | 585 } |
| 712 } | 586 |
| 713 | 587 void Deflate(const CFX_FloatRect& rt) { |
| 714 void Deflate(FX_FLOAT x, FX_FLOAT y) | 588 Deflate(rt.left, rt.bottom, rt.right, rt.top); |
| 715 { | 589 } |
| 716 Normalize(); | 590 |
| 717 left += x; | 591 void Translate(FX_FLOAT e, FX_FLOAT f) { |
| 718 right -= x; | 592 left += e; |
| 719 bottom += y; | 593 right += e; |
| 720 top -= y; | 594 top += f; |
| 721 } | 595 bottom += f; |
| 722 | 596 } |
| 723 void Deflate(FX_FLOAT other_left, | 597 |
| 724 FX_FLOAT other_bottom, | 598 static CFX_FloatRect GetBBox(const CFX_FloatPoint* pPoints, int nPoints); |
| 725 FX_FLOAT other_right, | 599 |
| 726 FX_FLOAT other_top) | 600 FX_FLOAT left; |
| 727 { | 601 |
| 728 Normalize(); | 602 FX_FLOAT right; |
| 729 left += other_left; | 603 |
| 730 bottom += other_bottom; | 604 FX_FLOAT bottom; |
| 731 right -= other_right; | 605 |
| 732 top -= other_top; | 606 FX_FLOAT top; |
| 733 } | |
| 734 | |
| 735 void Deflate(const CFX_FloatRect &rt) | |
| 736 { | |
| 737 Deflate(rt.left, rt.bottom, rt.right, rt.top); | |
| 738 } | |
| 739 | |
| 740 void Translate(FX_FLOAT e, FX_FLOAT f) | |
| 741 { | |
| 742 left += e; | |
| 743 right += e; | |
| 744 top += f; | |
| 745 bottom += f; | |
| 746 } | |
| 747 | |
| 748 static CFX_FloatRect» GetBBox(const CFX_FloatPoint* pPoints, int nPoin
ts); | |
| 749 | |
| 750 FX_FLOAT» » » left; | |
| 751 | |
| 752 FX_FLOAT» » » right; | |
| 753 | |
| 754 FX_FLOAT» » » bottom; | |
| 755 | |
| 756 FX_FLOAT» » » top; | |
| 757 }; | 607 }; |
| 758 class CFX_Matrix | 608 class CFX_Matrix { |
| 759 { | 609 public: |
| 760 public: | 610 CFX_Matrix() { |
| 761 | 611 a = d = 1; |
| 762 CFX_Matrix() | 612 b = c = e = f = 0; |
| 763 { | 613 } |
| 764 a = d = 1; | 614 |
| 765 b = c = e = f = 0; | 615 CFX_Matrix(FX_FLOAT a1, |
| 766 } | 616 FX_FLOAT b1, |
| 767 | 617 FX_FLOAT c1, |
| 768 CFX_Matrix(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1, FX_FLOAT d1, FX_FLOAT e1,
FX_FLOAT f1) | 618 FX_FLOAT d1, |
| 769 { | 619 FX_FLOAT e1, |
| 770 a = a1; | 620 FX_FLOAT f1) { |
| 771 b = b1; | 621 a = a1; |
| 772 c = c1; | 622 b = b1; |
| 773 d = d1; | 623 c = c1; |
| 774 e = e1; | 624 d = d1; |
| 775 f = f1; | 625 e = e1; |
| 776 } | 626 f = f1; |
| 777 | 627 } |
| 778 void» » » Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT
d, FX_FLOAT e, FX_FLOAT f); | 628 |
| 779 void» » » Set(const FX_FLOAT n[6]); | 629 void Set(FX_FLOAT a, |
| 780 | 630 FX_FLOAT b, |
| 781 void» » » SetIdentity() | 631 FX_FLOAT c, |
| 782 { | 632 FX_FLOAT d, |
| 783 a = d = 1; | 633 FX_FLOAT e, |
| 784 b = c = e = f = 0; | 634 FX_FLOAT f); |
| 785 } | 635 void Set(const FX_FLOAT n[6]); |
| 786 | 636 |
| 787 void» » » SetReverse(const CFX_Matrix &m); | 637 void SetIdentity() { |
| 788 | 638 a = d = 1; |
| 789 void» » » Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FL
OAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended = FALSE); | 639 b = c = e = f = 0; |
| 790 | 640 } |
| 791 void» » » Concat(const CFX_Matrix &m, FX_BOOL bPrepended =
FALSE); | 641 |
| 792 | 642 void SetReverse(const CFX_Matrix& m); |
| 793 void» » » ConcatInverse(const CFX_Matrix& m, FX_BOOL bPrep
ended = FALSE); | 643 |
| 794 void» » » Reset() | 644 void Concat(FX_FLOAT a, |
| 795 { | 645 FX_FLOAT b, |
| 796 SetIdentity(); | 646 FX_FLOAT c, |
| 797 } | 647 FX_FLOAT d, |
| 798 | 648 FX_FLOAT e, |
| 799 void» » » Copy(const CFX_Matrix& m) | 649 FX_FLOAT f, |
| 800 { | 650 FX_BOOL bPrepended = FALSE); |
| 801 *this = m; | 651 |
| 802 } | 652 void Concat(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE); |
| 803 | 653 |
| 804 FX_BOOL» » » IsIdentity() const | 654 void ConcatInverse(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE); |
| 805 { | 655 void Reset() { SetIdentity(); } |
| 806 return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0; | 656 |
| 807 } | 657 void Copy(const CFX_Matrix& m) { *this = m; } |
| 808 FX_BOOL» » » IsInvertible() const; | 658 |
| 809 | 659 FX_BOOL IsIdentity() const { |
| 810 FX_BOOL» » » Is90Rotated() const; | 660 return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0; |
| 811 | 661 } |
| 812 FX_BOOL» » » IsScaled() const; | 662 FX_BOOL IsInvertible() const; |
| 813 | 663 |
| 814 void» » » Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepe
nded = FALSE); | 664 FX_BOOL Is90Rotated() const; |
| 815 | 665 |
| 816 void» » » TranslateI(int32_t x, int32_t y, FX_BOOL bPrepen
ded = FALSE) | 666 FX_BOOL IsScaled() const; |
| 817 { | 667 |
| 818 Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended); | 668 void Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE); |
| 819 } | 669 |
| 820 | 670 void TranslateI(int32_t x, int32_t y, FX_BOOL bPrepended = FALSE) { |
| 821 void» » » Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepend
ed = FALSE); | 671 Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended); |
| 822 | 672 } |
| 823 void» » » Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended = FA
LSE); | 673 |
| 824 | 674 void Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended = FALSE); |
| 825 void» » » RotateAt(FX_FLOAT fRadian, FX_FLOAT x, FX_FLOAT
y, FX_BOOL bPrepended = FALSE); | 675 |
| 826 | 676 void Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended = FALSE); |
| 827 void» » » Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadia
n, FX_BOOL bPrepended = FALSE); | 677 |
| 828 | 678 void RotateAt(FX_FLOAT fRadian, |
| 829 void» » » MatchRect(const CFX_FloatRect &dest, const CFX_F
loatRect &src); | 679 FX_FLOAT x, |
| 830 | 680 FX_FLOAT y, |
| 831 FX_FLOAT» » GetXUnit() const; | 681 FX_BOOL bPrepended = FALSE); |
| 832 | 682 |
| 833 FX_FLOAT» » GetYUnit() const; | 683 void Shear(FX_FLOAT fAlphaRadian, |
| 834 void» » » GetUnitRect(CFX_RectF &rect) const; | 684 FX_FLOAT fBetaRadian, |
| 835 | 685 FX_BOOL bPrepended = FALSE); |
| 836 CFX_FloatRect» GetUnitRect() const; | 686 |
| 837 | 687 void MatchRect(const CFX_FloatRect& dest, const CFX_FloatRect& src); |
| 838 FX_FLOAT» » GetUnitArea() const; | 688 |
| 839 FX_FLOAT» » TransformXDistance(FX_FLOAT dx) const; | 689 FX_FLOAT GetXUnit() const; |
| 840 int32_t» » TransformXDistance(int32_t dx) const; | 690 |
| 841 FX_FLOAT» » TransformYDistance(FX_FLOAT dy) const; | 691 FX_FLOAT GetYUnit() const; |
| 842 int32_t» » TransformYDistance(int32_t dy) const; | 692 void GetUnitRect(CFX_RectF& rect) const; |
| 843 FX_FLOAT» » TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const; | 693 |
| 844 int32_t» » TransformDistance(int32_t dx, int32_t dy) const; | 694 CFX_FloatRect GetUnitRect() const; |
| 845 | 695 |
| 846 FX_FLOAT» » TransformDistance(FX_FLOAT distance) const; | 696 FX_FLOAT GetUnitArea() const; |
| 847 void» » » TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const; | 697 FX_FLOAT TransformXDistance(FX_FLOAT dx) const; |
| 848 void» » » TransformPoint(int32_t &x, int32_t &y) const; | 698 int32_t TransformXDistance(int32_t dx) const; |
| 849 void» » » TransformPoints(CFX_PointF *points, int32_t iCou
nt) const; | 699 FX_FLOAT TransformYDistance(FX_FLOAT dy) const; |
| 850 void» » » TransformPoints(CFX_Point *points, int32_t iCoun
t) const; | 700 int32_t TransformYDistance(int32_t dy) const; |
| 851 | 701 FX_FLOAT TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const; |
| 852 void» » » Transform(FX_FLOAT& x, FX_FLOAT& y) const | 702 int32_t TransformDistance(int32_t dx, int32_t dy) const; |
| 853 { | 703 |
| 854 TransformPoint(x, y); | 704 FX_FLOAT TransformDistance(FX_FLOAT distance) const; |
| 855 } | 705 void TransformPoint(FX_FLOAT& x, FX_FLOAT& y) const; |
| 856 | 706 void TransformPoint(int32_t& x, int32_t& y) const; |
| 857 void» » » Transform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1,
FX_FLOAT& y1) const | 707 void TransformPoints(CFX_PointF* points, int32_t iCount) const; |
| 858 { | 708 void TransformPoints(CFX_Point* points, int32_t iCount) const; |
| 859 x1 = x, y1 = y; | 709 |
| 860 TransformPoint(x1, y1); | 710 void Transform(FX_FLOAT& x, FX_FLOAT& y) const { TransformPoint(x, y); } |
| 861 } | 711 |
| 862 void» » » TransformVector(CFX_VectorF &v) const; | 712 void Transform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1, FX_FLOAT& y1) const { |
| 863 void» » » TransformVector(CFX_Vector &v) const; | 713 x1 = x, y1 = y; |
| 864 void» » » TransformRect(CFX_RectF &rect) const; | 714 TransformPoint(x1, y1); |
| 865 void» » » TransformRect(CFX_Rect &rect) const; | 715 } |
| 866 | 716 void TransformVector(CFX_VectorF& v) const; |
| 867 void» » » TransformRect(FX_FLOAT& left, FX_FLOAT& right, F
X_FLOAT& top, FX_FLOAT& bottom) const; | 717 void TransformVector(CFX_Vector& v) const; |
| 868 | 718 void TransformRect(CFX_RectF& rect) const; |
| 869 void» » » TransformRect(CFX_FloatRect& rect) const | 719 void TransformRect(CFX_Rect& rect) const; |
| 870 { | 720 |
| 871 TransformRect(rect.left, rect.right, rect.top, rect.bottom); | 721 void TransformRect(FX_FLOAT& left, |
| 872 } | 722 FX_FLOAT& right, |
| 873 | 723 FX_FLOAT& top, |
| 874 FX_FLOAT» » GetA() const | 724 FX_FLOAT& bottom) const; |
| 875 { | 725 |
| 876 return a; | 726 void TransformRect(CFX_FloatRect& rect) const { |
| 877 } | 727 TransformRect(rect.left, rect.right, rect.top, rect.bottom); |
| 878 | 728 } |
| 879 FX_FLOAT» » GetB() const | 729 |
| 880 { | 730 FX_FLOAT GetA() const { return a; } |
| 881 return b; | 731 |
| 882 } | 732 FX_FLOAT GetB() const { return b; } |
| 883 | 733 |
| 884 FX_FLOAT» » GetC() const | 734 FX_FLOAT GetC() const { return c; } |
| 885 { | 735 |
| 886 return c; | 736 FX_FLOAT GetD() const { return d; } |
| 887 } | 737 |
| 888 | 738 FX_FLOAT GetE() const { return e; } |
| 889 FX_FLOAT» » GetD() const | 739 |
| 890 { | 740 FX_FLOAT GetF() const { return f; } |
| 891 return d; | 741 |
| 892 } | 742 public: |
| 893 | 743 FX_FLOAT a; |
| 894 FX_FLOAT» » GetE() const | 744 FX_FLOAT b; |
| 895 { | 745 FX_FLOAT c; |
| 896 return e; | 746 FX_FLOAT d; |
| 897 } | 747 FX_FLOAT e; |
| 898 | 748 FX_FLOAT f; |
| 899 FX_FLOAT» » GetF() const | |
| 900 { | |
| 901 return f; | |
| 902 } | |
| 903 public: | |
| 904 FX_FLOAT a; | |
| 905 FX_FLOAT b; | |
| 906 FX_FLOAT c; | |
| 907 FX_FLOAT d; | |
| 908 FX_FLOAT e; | |
| 909 FX_FLOAT f; | |
| 910 }; | 749 }; |
| 911 #define CFX_AffineMatrix» CFX_Matrix | 750 #define CFX_AffineMatrix CFX_Matrix |
| 912 | 751 |
| 913 #endif // CORE_INCLUDE_FXCRT_FX_COORDINATES_H_ | 752 #endif // CORE_INCLUDE_FXCRT_FX_COORDINATES_H_ |
| OLD | NEW |