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