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