1 /*
2  * gdiplustypes.h
3  *
4  * GDI+ basic type declarations
5  *
6  * This file is part of the w32api package.
7  *
8  * Contributors:
9  *   Created by Markus Koenig <[email protected]>
10  *
11  * THIS SOFTWARE IS NOT COPYRIGHTED
12  *
13  * This source code is offered for use in the public domain. You may
14  * use, modify or distribute it freely.
15  *
16  * This code is distributed in the hope that it will be useful but
17  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18  * DISCLAIMED. This includes but is not limited to warranties of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20  *
21  */
22 
23 #ifndef __GDIPLUS_TYPES_H
24 #define __GDIPLUS_TYPES_H
25 #if __GNUC__ >=3
26 #pragma GCC system_header
27 #endif
28 
29 #if defined(_ARM_)
30 #define WINGDIPAPI
31 #else
32 #define WINGDIPAPI __stdcall
33 #endif
34 #define GDIPCONST const
35 
36 typedef enum GpStatus {
37 	Ok = 0,
38 	GenericError = 1,
39 	InvalidParameter = 2,
40 	OutOfMemory = 3,
41 	ObjectBusy = 4,
42 	InsufficientBuffer = 5,
43 	NotImplemented = 6,
44 	Win32Error = 7,
45 	WrongState = 8,
46 	Aborted = 9,
47 	FileNotFound = 10,
48 	ValueOverflow = 11,
49 	AccessDenied = 12,
50 	UnknownImageFormat = 13,
51 	FontFamilyNotFound = 14,
52 	FontStyleNotFound = 15,
53 	NotTrueTypeFont = 16,
54 	UnsupportedGdiplusVersion = 17,
55 	GdiplusNotInitialized = 18,
56 	PropertyNotFound = 19,
57 	PropertyNotSupported = 20,
58 	ProfileNotFound = 21
59 } GpStatus;
60 
61 #ifdef __cplusplus
62 typedef GpStatus Status;
63 #endif
64 
65 typedef struct Size {
66 	INT Width;
67 	INT Height;
68 
69 	#ifdef __cplusplus
SizeSize70 	Size(): Width(0), Height(0) {}
SizeSize71 	Size(INT width, INT height): Width(width), Height(height) {}
SizeSize72 	Size(const Size& size): Width(size.Width), Height(size.Height) {}
73 
EmptySize74 	BOOL Empty() const {
75 		return Width == 0 && Height == 0;
76 	}
EqualsSize77 	BOOL Equals(const Size& size) const {
78 		return Width == size.Width && Height == size.Height;
79 	}
80 	Size operator+(const Size& size) const {
81 		return Size(Width + size.Width, Height + size.Height);
82 	}
83 	Size operator-(const Size& size) const {
84 		return Size(Width - size.Width, Height - size.Height);
85 	}
86 	#endif /* __cplusplus */
87 } Size;
88 
89 typedef struct SizeF {
90 	REAL Width;
91 	REAL Height;
92 
93 	#ifdef __cplusplus
SizeFSizeF94 	SizeF(): Width(0.0f), Height(0.0f) {}
SizeFSizeF95 	SizeF(REAL width, REAL height): Width(width), Height(height) {}
SizeFSizeF96 	SizeF(const SizeF& size): Width(size.Width), Height(size.Height) {}
97 
EmptySizeF98 	BOOL Empty() const {
99 		return Width == 0.0f && Height == 0.0f;
100 	}
EqualsSizeF101 	BOOL Equals(const SizeF& size) const {
102 		return Width == size.Width && Height == size.Height;
103 	}
104 	SizeF operator+(const SizeF& size) const {
105 		return SizeF(Width + size.Width, Height + size.Height);
106 	}
107 	SizeF operator-(const SizeF& size) const {
108 		return SizeF(Width - size.Width, Height - size.Height);
109 	}
110 	#endif /* __cplusplus */
111 } SizeF;
112 
113 typedef struct Point {
114 	INT X;
115 	INT Y;
116 
117 	#ifdef __cplusplus
PointPoint118 	Point(): X(0), Y(0) {}
PointPoint119 	Point(INT x, INT y): X(x), Y(y) {}
PointPoint120 	Point(const Point& point): X(point.X), Y(point.Y) {}
PointPoint121 	Point(const Size& size): X(size.Width), Y(size.Height) {}
122 
EqualsPoint123 	BOOL Equals(const Point& point) const {
124 		return X == point.X && Y == point.Y;
125 	}
126 	Point operator+(const Point& point) const {
127 		return Point(X + point.X, Y + point.Y);
128 	}
129 	Point operator-(const Point& point) const {
130 		return Point(X - point.X, Y - point.Y);
131 	}
132 	#endif /* __cplusplus */
133 } Point;
134 
135 typedef struct PointF {
136 	REAL X;
137 	REAL Y;
138 
139 	#ifdef __cplusplus
PointFPointF140 	PointF(): X(0.0f), Y(0.0f) {}
PointFPointF141 	PointF(REAL x, REAL y): X(x), Y(y) {}
PointFPointF142 	PointF(const PointF& point): X(point.X), Y(point.Y) {}
PointFPointF143 	PointF(const SizeF& size): X(size.Width), Y(size.Height) {}
144 
EqualsPointF145 	BOOL Equals(const PointF& point) const {
146 		return X == point.X && Y == point.Y;
147 	}
148 	PointF operator+(const PointF& point) const {
149 		return PointF(X + point.X, Y + point.Y);
150 	}
151 	PointF operator-(const PointF& point) const {
152 		return PointF(X - point.X, Y - point.Y);
153 	}
154 	#endif /* __cplusplus */
155 } PointF;
156 
157 typedef struct Rect {
158 	INT X;
159 	INT Y;
160 	INT Width;
161 	INT Height;
162 
163 	#ifdef __cplusplus
RectRect164 	Rect(): X(0), Y(0), Width(0), Height(0) {}
RectRect165 	Rect(const Point& location, const Size& size):
166 		X(location.X), Y(location.Y),
167 		Width(size.Width), Height(size.Height) {}
RectRect168 	Rect(INT x, INT y, INT width, INT height):
169 		X(x), Y(y), Width(width), Height(height) {}
170 
CloneRect171 	Rect* Clone() const {
172 		return new Rect(X, Y, Width, Height);
173 	}
ContainsRect174 	BOOL Contains(INT x, INT y) const {
175 		return X <= x && Y <= y && x < X+Width && y < Y+Height;
176 	}
ContainsRect177 	BOOL Contains(const Point& point) const {
178 		return Contains(point.X, point.Y);
179 	}
ContainsRect180 	BOOL Contains(const Rect& rect) const {
181 		return X <= rect.X && Y <= rect.Y
182 			&& rect.X+rect.Width <= X+Width
183 			&& rect.Y+rect.Height <= Y+Height;
184 	}
EqualsRect185 	BOOL Equals(const Rect& rect) const {
186 		return X == rect.X && Y == rect.Y
187 			&& Width == rect.Width && Height == rect.Height;
188 	}
GetBottomRect189 	INT GetBottom() const {
190 		return Y+Height;
191 	}
GetBoundsRect192 	VOID GetBounds(Rect *rect) const {
193 		if (rect != NULL) {
194 			rect->X = X;
195 			rect->Y = Y;
196 			rect->Width = Width;
197 			rect->Height = Height;
198 		}
199 	}
GetLeftRect200 	INT GetLeft() const {
201 		return X;
202 	}
GetLocationRect203 	VOID GetLocation(Point *point) const {
204 		if (point != NULL) {
205 			point->X = X;
206 			point->Y = Y;
207 		}
208 	}
GetRightRect209 	INT GetRight() const {
210 		return X+Width;
211 	}
GetSizeRect212 	VOID GetSize(Size *size) const {
213 		if (size != NULL) {
214 			size->Width = Width;
215 			size->Height = Height;
216 		}
217 	}
GetTopRect218 	INT GetTop() const {
219 		return Y;
220 	}
IsEmptyAreaRect221 	BOOL IsEmptyArea() const {
222 		return Width <= 0 || Height <= 0;
223 	}
InflateRect224 	VOID Inflate(INT dx, INT dy) {
225 		X -= dx;
226 		Y -= dy;
227 		Width += 2*dx;
228 		Height += 2*dy;
229 	}
InflateRect230 	VOID Inflate(const Point& point) {
231 		Inflate(point.X, point.Y);
232 	}
IntersectRect233 	static BOOL Intersect(Rect& c, const Rect& a, const Rect& b) {
234 		INT intersectLeft   = (a.X < b.X) ? b.X : a.X;
235 		INT intersectTop    = (a.Y < b.Y) ? b.Y : a.Y;
236 		INT intersectRight  = (a.GetRight() < b.GetRight())
237 					? a.GetRight() : b.GetRight();
238 		INT intersectBottom = (a.GetBottom() < b.GetBottom())
239 					? a.GetBottom() : b.GetBottom();
240 		c.X = intersectLeft;
241 		c.Y = intersectTop;
242 		c.Width = intersectRight - intersectLeft;
243 		c.Height = intersectBottom - intersectTop;
244 		return !c.IsEmptyArea();
245 	}
IntersectRect246 	BOOL Intersect(const Rect& rect) {
247 		return Intersect(*this, *this, rect);
248 	}
IntersectsWithRect249 	BOOL IntersectsWith(const Rect& rc) const {
250 		INT intersectLeft   = (X < rc.X) ? rc.X : X;
251 		INT intersectTop    = (Y < rc.Y) ? rc.Y : Y;
252 		INT intersectRight  = (GetRight() < rc.GetRight())
253 					? GetRight() : rc.GetRight();
254 		INT intersectBottom = (GetBottom() < rc.GetBottom())
255 					? GetBottom() : rc.GetBottom();
256 		return intersectLeft < intersectRight
257 			&& intersectTop < intersectBottom;
258 	}
OffsetRect259 	VOID Offset(INT dx, INT dy) {
260 		X += dx;
261 		Y += dy;
262 	}
OffsetRect263 	VOID Offset(const Point& point) {
264 		Offset(point.X, point.Y);
265 	}
UnionRect266 	static BOOL Union(Rect& c, const Rect& a, const Rect& b) {
267 		INT unionLeft   = (a.X < b.X) ? a.X : b.X;
268 		INT unionTop    = (a.Y < b.Y) ? a.Y : b.Y;
269 		INT unionRight  = (a.GetRight() < b.GetRight())
270 					? b.GetRight() : a.GetRight();
271 		INT unionBottom = (a.GetBottom() < b.GetBottom())
272 					? b.GetBottom() : a.GetBottom();
273 		c.X = unionLeft;
274 		c.Y = unionTop;
275 		c.Width = unionRight - unionLeft;
276 		c.Height = unionBottom - unionTop;
277 		return !c.IsEmptyArea();
278 	}
279 	#endif /* __cplusplus */
280 } Rect;
281 
282 typedef struct RectF {
283 	REAL X;
284 	REAL Y;
285 	REAL Width;
286 	REAL Height;
287 
288 	#ifdef __cplusplus
RectFRectF289 	RectF(): X(0.0f), Y(0.0f), Width(0.0f), Height(0.0f) {}
RectFRectF290 	RectF(const PointF& location, const SizeF& size):
291 		X(location.X), Y(location.Y),
292 		Width(size.Width), Height(size.Height) {}
RectFRectF293 	RectF(REAL x, REAL y, REAL width, REAL height):
294 		X(x), Y(y), Width(width), Height(height) {}
295 
CloneRectF296 	RectF* Clone() const {
297 		return new RectF(X, Y, Width, Height);
298 	}
ContainsRectF299 	BOOL Contains(REAL x, REAL y) const {
300 		return X <= x && Y <= y && x < X+Width && y < Y+Height;
301 	}
ContainsRectF302 	BOOL Contains(const PointF& point) const {
303 		return Contains(point.X, point.Y);
304 	}
ContainsRectF305 	BOOL Contains(const RectF& rect) const {
306 		return X <= rect.X && Y <= rect.Y
307 			&& rect.X+rect.Width <= X+Width
308 			&& rect.Y+rect.Height <= Y+Height;
309 	}
EqualsRectF310 	BOOL Equals(const RectF& rect) const {
311 		return X == rect.X && Y == rect.Y
312 			&& Width == rect.Width && Height == rect.Height;
313 	}
GetBottomRectF314 	REAL GetBottom() const {
315 		return Y+Height;
316 	}
GetBoundsRectF317 	VOID GetBounds(RectF *rect) const {
318 		if (rect != NULL) {
319 			rect->X = X;
320 			rect->Y = Y;
321 			rect->Width = Width;
322 			rect->Height = Height;
323 		}
324 	}
GetLeftRectF325 	REAL GetLeft() const {
326 		return X;
327 	}
GetLocationRectF328 	VOID GetLocation(PointF *point) const {
329 		if (point != NULL) {
330 			point->X = X;
331 			point->Y = Y;
332 		}
333 	}
GetRightRectF334 	REAL GetRight() const {
335 		return X+Width;
336 	}
GetSizeRectF337 	VOID GetSize(SizeF *size) const {
338 		if (size != NULL) {
339 			size->Width = Width;
340 			size->Height = Height;
341 		}
342 	}
GetTopRectF343 	REAL GetTop() const {
344 		return Y;
345 	}
IsEmptyAreaRectF346 	BOOL IsEmptyArea() const {
347 		return Width <= 0.0f || Height <= 0.0f;
348 	}
InflateRectF349 	VOID Inflate(REAL dx, REAL dy) {
350 		X -= dx;
351 		Y -= dy;
352 		Width += 2*dx;
353 		Height += 2*dy;
354 	}
InflateRectF355 	VOID Inflate(const PointF& point) {
356 		Inflate(point.X, point.Y);
357 	}
IntersectRectF358 	static BOOL Intersect(RectF& c, const RectF& a, const RectF& b) {
359 		INT intersectLeft   = (a.X < b.X) ? b.X : a.X;
360 		INT intersectTop    = (a.Y < b.Y) ? b.Y : a.Y;
361 		INT intersectRight  = (a.GetRight() < b.GetRight())
362 					? a.GetRight() : b.GetRight();
363 		INT intersectBottom = (a.GetBottom() < b.GetBottom())
364 					? a.GetBottom() : b.GetBottom();
365 		c.X = intersectLeft;
366 		c.Y = intersectTop;
367 		c.Width = intersectRight - intersectLeft;
368 		c.Height = intersectBottom - intersectTop;
369 		return !c.IsEmptyArea();
370 	}
IntersectRectF371 	BOOL Intersect(const RectF& rect) {
372 		return Intersect(*this, *this, rect);
373 	}
IntersectsWithRectF374 	BOOL IntersectsWith(const RectF& rc) const {
375 		INT intersectLeft   = (X < rc.X) ? rc.X : X;
376 		INT intersectTop    = (Y < rc.Y) ? rc.Y : Y;
377 		INT intersectRight  = (GetRight() < rc.GetRight())
378 					? GetRight() : rc.GetRight();
379 		INT intersectBottom = (GetBottom() < rc.GetBottom())
380 					? GetBottom() : rc.GetBottom();
381 		return intersectLeft < intersectRight
382 			&& intersectTop < intersectBottom;
383 	}
OffsetRectF384 	VOID Offset(REAL dx, REAL dy) {
385 		X += dx;
386 		Y += dy;
387 	}
OffsetRectF388 	VOID Offset(const PointF& point) {
389 		Offset(point.X, point.Y);
390 	}
UnionRectF391 	static BOOL Union(RectF& c, const RectF& a, const RectF& b) {
392 		INT unionLeft   = (a.X < b.X) ? a.X : b.X;
393 		INT unionTop    = (a.Y < b.Y) ? a.Y : b.Y;
394 		INT unionRight  = (a.GetRight() < b.GetRight())
395 					? b.GetRight() : a.GetRight();
396 		INT unionBottom = (a.GetBottom() < b.GetBottom())
397 					? b.GetBottom() : a.GetBottom();
398 		c.X = unionLeft;
399 		c.Y = unionTop;
400 		c.Width = unionRight - unionLeft;
401 		c.Height = unionBottom - unionTop;
402 		return !c.IsEmptyArea();
403 	}
404 	#endif /* __cplusplus */
405 } RectF;
406 
407 /* FIXME: Are descendants of this class, when compiled with g++,
408    binary compatible with MSVC++ code (especially GDIPLUS.DLL of course)? */
409 #ifdef __cplusplus
410 struct GdiplusAbort {
AbortGdiplusAbort411 	virtual HRESULT __stdcall Abort(void) {}
412 };
413 #else
414 typedef struct GdiplusAbort GdiplusAbort;  /* incomplete type */
415 #endif
416 
417 typedef struct CharacterRange {
418 	INT First;
419 	INT Length;
420 
421 	#ifdef __cplusplus
CharacterRangeCharacterRange422 	CharacterRange(): First(0), Length(0) {}
CharacterRangeCharacterRange423 	CharacterRange(INT first, INT length): First(first), Length(length) {}
424 	CharacterRange& operator=(const CharacterRange& rhs) {
425 		/* This gracefully handles self-assignment */
426 		First = rhs.First;
427 		Length = rhs.Length;
428 		return *this;
429 	}
430 	#endif /* __cplusplus */
431 } CharacterRange;
432 
433 typedef struct PathData {
434 	INT Count;
435 	PointF *Points;
436 	BYTE *Types;
437 
438 	#ifdef __cplusplus
439 	friend class GraphicsPath;
440 
PathDataPathData441 	PathData(): Count(0), Points(NULL), Types(NULL) {}
~PathDataPathData442 	~PathData() {
443 		FreeArrays();
444 	}
445 private:
446 	/* used by GraphicsPath::GetPathData, defined in gdipluspath.h */
447 	Status AllocateArrays(INT capacity);
448 	VOID FreeArrays();
449 	#endif /* __cplusplus */
450 } PathData;
451 
452 /* Callback function types */
453 /* FIXME: need a correct definition for these function pointer types */
454 typedef void *DebugEventProc;
455 typedef BOOL CALLBACK (*EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
456 typedef void *DrawImageAbort;
457 typedef void *GetThumbnailImageAbort;
458 
459 
460 #endif /* __GDIPLUS_TYPES_H */
461