1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/**************************************************************************\
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov* Copyright (c) 1998-2000, Microsoft Corp.  All Rights Reserved.
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov* Module Name:
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*   GdiplusTypes.h
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov* Abstract:
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*   Basic types used by GDI+
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov\**************************************************************************/
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef _GDIPLUSTYPES_H
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define _GDIPLUSTYPES_H
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifndef DCR_USE_NEW_175866
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// LIB version initialization functions
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef VOID (__cdecl *DEBUGEVENTFUNCTION)(INT level, CHAR *message);
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" BOOL __stdcall InitializeGdiplus(DEBUGEVENTFUNCTION);
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" VOID __stdcall UninitializeGdiplus();
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Callback functions
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" {
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef BOOL (CALLBACK * ImageAbort)(VOID *);
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef ImageAbort DrawImageAbort;
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef ImageAbort GetThumbnailImageAbort;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Callback for EnumerateMetafile methods.  The parameters are:
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      recordType      WMF, EMF, or EMF+ record type
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      flags           (always 0 for WMF/EMF records)
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      dataSize        size of the record data (in bytes), or 0 if no data
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      data            pointer to the record data, or NULL if no data
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      callbackData    pointer to callbackData, if any
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// This method can then call Metafile::PlayRecord to play the
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// record that was just enumerated.  If this method  returns
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// FALSE, the enumeration process is aborted.  Otherwise, it continues.
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovextern "C" {
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef BOOL (CALLBACK * EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Primitive data types
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// NOTE:
61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  Types already defined in standard header files:
62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      INT8
63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      UINT8
64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      INT16
65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      UINT16
66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      INT32
67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      UINT32
68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      INT64
69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      UINT64
70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//
71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  Avoid using the following types:
72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      LONG - use INT
73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      ULONG - use UINT
74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//      DWORD - use UINT32
75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovtypedef float REAL;
78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define REAL_MAX            FLT_MAX
80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define REAL_MIN            FLT_MIN
81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define REAL_TOLERANCE     (FLT_MIN * 100)
82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define REAL_EPSILON        1.192092896e-07F        /* FLT_EPSILON */
83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Forward declarations of various internal classes
86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Size;
89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass SizeF;
90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Point;
91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass PointF;
92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Rect;
93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass RectF;
94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CharacterRange;
95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Return values from any GDI+ API
98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovenum Status
101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Ok = 0,
103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GenericError = 1,
104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    InvalidParameter = 2,
105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    OutOfMemory = 3,
106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ObjectBusy = 4,
107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    InsufficientBuffer = 5,
108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    NotImplemented = 6,
109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Win32Error = 7,
110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    WrongState = 8,
111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Aborted = 9,
112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DCR_USE_NEW_135429
113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FileNotFound = 10,
114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ValueOverflow = 11,
115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    AccessDenied = 12,
116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    UnknownImageFormat = 13,
117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FontFamilyNotFound = 14,
118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    FontStyleNotFound = 15,
119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    NotTrueTypeFont = 16,
120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#else
121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    NotFound = 10,
122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ValueOverflow = 11,
123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    UnsupportedGdiplusVersion = 17,
125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    GdiplusNotInitialized
126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Represents a dimension in a 2D coordinate system
131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  (floating-point coordinates)
132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass SizeF
135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   // Default constructor
139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SizeF()
140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = Height = 0.0f;
142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SizeF(IN const SizeF& size)
145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = size.Width;
147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = size.Height;
148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SizeF(IN REAL width,
151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          IN REAL height)
152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = width;
154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = height;
155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SizeF operator+(IN const SizeF& sz) const
158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SizeF(Width + sz.Width,
160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     Height + sz.Height);
161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    SizeF operator-(IN const SizeF& sz) const
164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return SizeF(Width - sz.Width,
166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     Height - sz.Height);
167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Equals(IN const SizeF& sz) const
170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (Width == sz.Width) && (Height == sz.Height);
172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Empty() const
175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (Width == 0.0f && Height == 0.0f);
177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL Width;
182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL Height;
183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Represents a dimension in a 2D coordinate system
187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  (integer coordinates)
188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Size
191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   // Default constructor
195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Size()
196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = Height = 0;
198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Size(IN const Size& size)
201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = size.Width;
203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = size.Height;
204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Size(IN INT width,
207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         IN INT height)
208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = width;
210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = height;
211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Size operator+(IN const Size& sz) const
214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Size(Width + sz.Width,
216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    Height + sz.Height);
217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Size operator-(IN const Size& sz) const
220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Size(Width - sz.Width,
222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    Height - sz.Height);
223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Equals(IN const Size& sz) const
226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (Width == sz.Width) && (Height == sz.Height);
228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Empty() const
231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (Width == 0 && Height == 0);
233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Width;
238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Height;
239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Represents a location in a 2D coordinate system
243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  (floating-point coordinates)
244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass PointF
247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   PointF()
250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = Y = 0.0f;
252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   PointF(IN const PointF &point)
255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = point.X;
257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       Y = point.Y;
258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   PointF(IN const SizeF &size)
261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = size.Width;
263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       Y = size.Height;
264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   PointF(IN REAL x,
267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          IN REAL y)
268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = x;
270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       Y = y;
271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   PointF operator+(IN const PointF& point) const
274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return PointF(X + point.X,
276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     Y + point.Y);
277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   PointF operator-(IN const PointF& point) const
280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return PointF(X - point.X,
282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                     Y - point.Y);
283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   BOOL Equals(IN const PointF& point)
286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return (X == point.X) && (Y == point.Y);
288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL X;
293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL Y;
294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Represents a location in a 2D coordinate system
298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  (integer coordinates)
299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Point
302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   Point()
305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = Y = 0;
307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   Point(IN const Point &point)
310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = point.X;
312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       Y = point.Y;
313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   Point(IN const Size &size)
316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = size.Width;
318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       Y = size.Height;
319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   Point(IN INT x,
322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         IN INT y)
323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       X = x;
325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       Y = y;
326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   Point operator+(IN const Point& point) const
329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return Point(X + point.X,
331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    Y + point.Y);
332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   Point operator-(IN const Point& point) const
335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return Point(X - point.X,
337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                    Y - point.Y);
338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   BOOL Equals(IN const Point& point)
341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   {
342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov       return (X == point.X) && (Y == point.Y);
343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   }
344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT X;
348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Y;
349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Represents a rectangle in a 2D coordinate system
353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  (floating-point coordinates)
354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass RectF
357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Default constructor
361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    RectF()
363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X = Y = Width = Height = 0.0f;
365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    RectF(IN REAL x,
368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          IN REAL y,
369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          IN REAL width,
370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          IN REAL height)
371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X = x;
373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y = y;
374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = width;
375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = height;
376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    RectF(IN const PointF& location,
379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov          IN const SizeF& size)
380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X = location.X;
382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y = location.Y;
383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = size.Width;
384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = size.Height;
385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    RectF* Clone() const
388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return new RectF(X, Y, Width, Height);
390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID GetLocation(OUT PointF* point) const
393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        point->X = X;
395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        point->Y = Y;
396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID GetSize(OUT SizeF* size) const
399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        size->Width = Width;
401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        size->Height = Height;
402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID GetBounds(OUT RectF* rect) const
405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->X = X;
407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->Y = Y;
408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->Width = Width;
409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->Height = Height;
410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Return the left, top, right, and bottom
413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // coordinates of the rectangle
414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL GetLeft() const
416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return X;
418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL GetTop() const
421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Y;
423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL GetRight() const
426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return X+Width;
428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL GetBottom() const
431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Y+Height;
433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Determine if the rectangle is empty
436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL IsEmptyArea() const
437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);
439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Equals(IN const RectF & rect) const
442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return X == rect.X &&
444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               Y == rect.Y &&
445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               Width == rect.Width &&
446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               Height == rect.Height;
447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Contains(IN REAL x,
450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  IN REAL y) const
451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return x >= X && x < X+Width &&
453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               y >= Y && y < Y+Height;
454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Contains(IN const PointF& pt) const
457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Contains(pt.X, pt.Y);
459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Contains(IN const RectF& rect) const
462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Inflate(IN REAL dx,
468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 IN REAL dy)
469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X -= dx;
471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y -= dy;
472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width += 2*dx;
473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height += 2*dy;
474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Inflate(IN const PointF& point)
477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Inflate(point.X, point.Y);
479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Intersect the current rect with the specified object
482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Intersect(IN const RectF& rect)
484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Intersect(*this, *this, rect);
486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Intersect rect a and b and save the result into c
489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Notice that c may be the same object as a or b.
490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static BOOL Intersect(OUT RectF& c,
492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          IN const RectF& a,
493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          IN const RectF& b)
494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL right = min(a.GetRight(), b.GetRight());
496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL bottom = min(a.GetBottom(), b.GetBottom());
497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL left = max(a.GetLeft(), b.GetLeft());
498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL top = max(a.GetTop(), b.GetTop());
499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.X = left;
501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Y = top;
502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Width = right - left;
503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Height = bottom - top;
504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !c.IsEmptyArea();
505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Determine if the specified rect intersects with the
508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // current rect object.
509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL IntersectsWith(IN const RectF& rect) const
511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (GetLeft() < rect.GetRight() &&
513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetTop() < rect.GetTop() &&
514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetRight() > rect.GetLeft() &&
515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetBottom() > rect.GetTop());
516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static BOOL Union(OUT RectF& c,
519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      IN const RectF& a,
520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      IN const RectF& b)
521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL right = max(a.GetRight(), b.GetRight());
523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL bottom = max(a.GetBottom(), b.GetBottom());
524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL left = min(a.GetLeft(), b.GetLeft());
525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        REAL top = min(a.GetTop(), b.GetTop());
526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.X = left;
528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Y = top;
529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Width = right - left;
530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Height = bottom - top;
531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !c.IsEmptyArea();
532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Offset(IN const PointF& point)
535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Offset(point.X, point.Y);
537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Offset(IN REAL dx,
540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                IN REAL dy)
541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X += dx;
543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y += dy;
544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL X;
549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL Y;
550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL Width;
551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    REAL Height;
552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Represents a rectangle in a 2D coordinate system
556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//  (integer coordinates)
557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//--------------------------------------------------------------------------
558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass Rect
560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Default constructor
564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Rect()
566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X = Y = Width = Height = 0;
568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Rect(IN INT x,
571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         IN INT y,
572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         IN INT width,
573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         IN INT height)
574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X = x;
576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y = y;
577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = width;
578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = height;
579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Rect(IN const Point& location,
582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov         IN const Size& size)
583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X = location.X;
585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y = location.Y;
586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width = size.Width;
587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height = size.Height;
588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Rect* Clone() const
591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return new Rect(X, Y, Width, Height);
593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID GetLocation(OUT Point* point) const
596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        point->X = X;
598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        point->Y = Y;
599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID GetSize(OUT Size* size) const
602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        size->Width = Width;
604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        size->Height = Height;
605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID GetBounds(OUT Rect* rect) const
608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->X = X;
610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->Y = Y;
611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->Width = Width;
612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        rect->Height = Height;
613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Return the left, top, right, and bottom
616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // coordinates of the rectangle
617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT GetLeft() const
619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return X;
621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT GetTop() const
624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Y;
626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT GetRight() const
629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return X+Width;
631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT GetBottom() const
634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Y+Height;
636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Determine if the rectangle is empty
639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL IsEmptyArea() const
640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (Width <= 0) || (Height <= 0);
642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Equals(IN const Rect & rect) const
645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return X == rect.X &&
647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               Y == rect.Y &&
648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               Width == rect.Width &&
649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               Height == rect.Height;
650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Contains(IN INT x,
653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                  IN INT y) const
654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return x >= X && x < X+Width &&
656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               y >= Y && y < Y+Height;
657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Contains(IN const Point& pt) const
660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Contains(pt.X, pt.Y);
662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Contains(IN Rect& rect) const
665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov               (Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Inflate(IN INT dx,
671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                 IN INT dy)
672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X -= dx;
674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y -= dy;
675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Width += 2*dx;
676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Height += 2*dy;
677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Inflate(IN const Point& point)
680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Inflate(point.X, point.Y);
682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Intersect the current rect with the specified object
685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL Intersect(IN const Rect& rect)
687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return Intersect(*this, *this, rect);
689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Intersect rect a and b and save the result into c
692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Notice that c may be the same object as a or b.
693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static BOOL Intersect(OUT Rect& c,
695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          IN const Rect& a,
696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                          IN const Rect& b)
697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT right = min(a.GetRight(), b.GetRight());
699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT bottom = min(a.GetBottom(), b.GetBottom());
700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT left = max(a.GetLeft(), b.GetLeft());
701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT top = max(a.GetTop(), b.GetTop());
702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.X = left;
704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Y = top;
705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Width = right - left;
706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Height = bottom - top;
707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !c.IsEmptyArea();
708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // Determine if the specified rect intersects with the
711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    // current rect object.
712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BOOL IntersectsWith(IN const Rect& rect) const
714ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return (GetLeft() < rect.GetRight() &&
716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetTop() < rect.GetTop() &&
717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetRight() > rect.GetLeft() &&
718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                GetBottom() > rect.GetTop());
719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    static BOOL Union(OUT Rect& c,
722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      IN const Rect& a,
723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                      IN const Rect& b)
724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT right = max(a.GetRight(), b.GetRight());
726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT bottom = max(a.GetBottom(), b.GetBottom());
727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT left = min(a.GetLeft(), b.GetLeft());
728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT top = min(a.GetTop(), b.GetTop());
729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.X = left;
731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Y = top;
732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Width = right - left;
733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        c.Height = bottom - top;
734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return !c.IsEmptyArea();
735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Offset(IN const Point& point)
738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Offset(point.X, point.Y);
740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    VOID Offset(IN INT dx,
743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov                IN INT dy)
744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        X += dx;
746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Y += dy;
747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT X;
752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Y;
753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Width;
754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Height;
755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// A user must mange memory for PathData.
758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
759ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass PathData
760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PathData()
763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Count = 0;
765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Points = NULL;
766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Types = NULL;
767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ~PathData()
770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (Points != NULL)
772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete Points;
774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (Types != NULL)
777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        {
778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            delete Types;
779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        }
780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#ifdef DCR_USE_NEW_250932
783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovprivate:
785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PathData(const PathData &);
786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PathData& operator=(const PathData &);
787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif
789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Count;
792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    PointF* Points;
793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    BYTE* Types;
794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//-----------------------------
798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// text character range
799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov//-----------------------------
800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovclass CharacterRange
802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovpublic:
804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CharacterRange(
805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT first,
806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        INT length
807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    ) :
808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        First   (first),
809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Length  (length)
810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {}
811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CharacterRange() : First(0), Length(0)
813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {}
814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    CharacterRange & operator = (const CharacterRange &rhs)
816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    {
817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        First  = rhs.First;
818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        Length = rhs.Length;
819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return *this;
820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT First;
823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    INT Length;
824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov};
825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#endif // !_GDIPLUSTYPES_HPP
827