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