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