1 /*
2 * Copyright (C) 2007 Google (Evan Stade)
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #ifndef _GDIPLUSTYPES_H
20 #define _GDIPLUSTYPES_H
21
22 typedef float REAL;
23
24 enum Status
25 {
26 Ok = 0,
27 GenericError = 1,
28 InvalidParameter = 2,
29 OutOfMemory = 3,
30 ObjectBusy = 4,
31 InsufficientBuffer = 5,
32 NotImplemented = 6,
33 Win32Error = 7,
34 WrongState = 8,
35 Aborted = 9,
36 FileNotFound = 10,
37 ValueOverflow = 11,
38 AccessDenied = 12,
39 UnknownImageFormat = 13,
40 FontFamilyNotFound = 14,
41 FontStyleNotFound = 15,
42 NotTrueTypeFont = 16,
43 UnsupportedGdiplusVersion = 17,
44 GdiplusNotInitialized = 18,
45 PropertyNotFound = 19,
46 PropertyNotSupported = 20,
47 ProfileNotFound = 21
48 };
49
50 #ifdef __cplusplus
51 extern "C"
52 {
53 #endif
54
55 typedef BOOL(CALLBACK *ImageAbort)(VOID *);
56 typedef ImageAbort DrawImageAbort;
57 typedef ImageAbort GetThumbnailImageAbort;
58 typedef struct GdiplusAbort GdiplusAbort;
59
60 typedef BOOL(CALLBACK *EnumerateMetafileProc)(EmfPlusRecordType, UINT, UINT, const BYTE *, VOID *);
61
62 #ifdef __cplusplus
63 }
64 #endif
65
66 #ifdef __cplusplus
67
68 class Size;
69
70 class Point
71 {
72 public:
Point()73 Point()
74 {
75 X = Y = 0;
76 }
77
Point(IN const Point & pt)78 Point(IN const Point &pt)
79 {
80 X = pt.X;
81 Y = pt.Y;
82 }
83
84 Point(const Size &size);
85
Point(IN INT x,IN INT y)86 Point(IN INT x, IN INT y)
87 {
88 X = x;
89 Y = y;
90 }
91
92 Point
93 operator+(IN const Point &pt) const
94 {
95 return Point(X + pt.X, Y + pt.Y);
96 }
97
98 Point
99 operator-(IN const Point &pt) const
100 {
101 return Point(X - pt.X, Y - pt.Y);
102 }
103
104 BOOL
Equals(IN const Point & pt)105 Equals(IN const Point &pt) const
106 {
107 return (X == pt.X) && (Y == pt.Y);
108 }
109
110 public:
111 INT X;
112 INT Y;
113 };
114
115 class SizeF;
116
117 class PointF
118 {
119 public:
PointF()120 PointF()
121 {
122 X = Y = 0.0f;
123 }
124
PointF(IN const PointF & pt)125 PointF(IN const PointF &pt)
126 {
127 X = pt.X;
128 Y = pt.Y;
129 }
130
131 PointF(const SizeF &size);
132
PointF(IN REAL x,IN REAL y)133 PointF(IN REAL x, IN REAL y)
134 {
135 X = x;
136 Y = y;
137 }
138
139 PointF
140 operator+(IN const PointF &pt) const
141 {
142 return PointF(X + pt.X, Y + pt.Y);
143 }
144
145 PointF
146 operator-(IN const PointF &pt) const
147 {
148 return PointF(X - pt.X, Y - pt.Y);
149 }
150
151 BOOL
Equals(IN const PointF & pt)152 Equals(IN const PointF &pt) const
153 {
154 return (X == pt.X) && (Y == pt.Y);
155 }
156
157 public:
158 REAL X;
159 REAL Y;
160 };
161
162 class PathData
163 {
164 public:
PathData()165 PathData()
166 {
167 Count = 0;
168 Points = NULL;
169 Types = NULL;
170 }
171
~PathData()172 ~PathData()
173 {
174 if (Points != NULL)
175 {
176 delete Points;
177 }
178
179 if (Types != NULL)
180 {
181 delete Types;
182 }
183 }
184
185 private:
186 PathData(const PathData &);
187 PathData &
188 operator=(const PathData &);
189
190 public:
191 INT Count;
192 PointF *Points;
193 BYTE *Types;
194 };
195
196 class SizeF
197 {
198 public:
199 REAL Width;
200 REAL Height;
201
SizeF()202 SizeF() : Width(0), Height(0)
203 {
204 }
205
SizeF(const SizeF & size)206 SizeF(const SizeF &size) : Width(size.Width), Height(size.Height)
207 {
208 }
209
SizeF(REAL width,REAL height)210 SizeF(REAL width, REAL height) : Width(width), Height(height)
211 {
212 }
213
214 BOOL
Empty()215 Empty() const
216 {
217 return Width == 0 && Height == 0;
218 }
219
220 BOOL
Equals(const SizeF & sz)221 Equals(const SizeF &sz) const
222 {
223 return Width == sz.Width && Height == sz.Height;
224 }
225
226 SizeF
227 operator+(const SizeF &sz) const
228 {
229 return SizeF(Width + sz.Width, Height + sz.Height);
230 }
231
232 SizeF
233 operator-(const SizeF &sz) const
234 {
235 return SizeF(Width - sz.Width, Height - sz.Height);
236 }
237 };
238
239 #define REAL_EPSILON 1.192092896e-07F /* FLT_EPSILON */
240
241 class RectF
242 {
243 public:
244 REAL X;
245 REAL Y;
246 REAL Width;
247 REAL Height;
248
RectF()249 RectF() : X(0), Y(0), Width(0), Height(0)
250 {
251 }
252
RectF(const PointF & location,const SizeF & size)253 RectF(const PointF &location, const SizeF &size)
254 : X(location.X), Y(location.Y), Width(size.Width), Height(size.Height)
255 {
256 }
257
RectF(REAL x,REAL y,REAL width,REAL height)258 RectF(REAL x, REAL y, REAL width, REAL height) : X(x), Y(y), Width(width), Height(height)
259 {
260 }
261
262 RectF *
Clone()263 Clone() const
264 {
265 return new RectF(X, Y, Width, Height);
266 }
267
268 BOOL
Contains(const PointF & pt)269 Contains(const PointF &pt) const
270 {
271 return Contains(pt.X, pt.Y);
272 }
273
274 BOOL
Contains(const RectF & rect)275 Contains(const RectF &rect) const
276 {
277 return X <= rect.X && rect.GetRight() <= GetRight() && Y <= rect.Y && rect.GetBottom() <= GetBottom();
278 }
279
280 BOOL
Contains(REAL x,REAL y)281 Contains(REAL x, REAL y) const
282 {
283 return X <= x && x < X + Width && Y <= y && y < Y + Height;
284 }
285
286 BOOL
Equals(const RectF & rect)287 Equals(const RectF &rect) const
288 {
289 return X == rect.X && Y == rect.Y && Width == rect.Width && Height == rect.Height;
290 }
291
292 REAL
GetBottom()293 GetBottom() const
294 {
295 return Y + Height;
296 }
297
298 VOID
GetBounds(RectF * rect)299 GetBounds(RectF *rect) const
300 {
301 rect->X = X;
302 rect->Y = Y;
303 rect->Width = Width;
304 rect->Height = Height;
305 }
306
307 REAL
GetLeft()308 GetLeft() const
309 {
310 return X;
311 }
312
313 VOID
GetLocation(PointF * point)314 GetLocation(PointF *point) const
315 {
316 point->X = X;
317 point->Y = Y;
318 }
319
320 REAL
GetRight()321 GetRight() const
322 {
323 return X + Width;
324 }
325
326 VOID
GetSize(SizeF * size)327 GetSize(SizeF *size) const
328 {
329 size->Width = Width;
330 size->Height = Height;
331 }
332
333 REAL
GetTop()334 GetTop() const
335 {
336 return Y;
337 }
338
339 VOID
Inflate(REAL dx,REAL dy)340 Inflate(REAL dx, REAL dy)
341 {
342 X -= dx;
343 Y -= dy;
344 Width += 2 * dx;
345 Height += 2 * dy;
346 }
347
348 VOID
Inflate(const PointF & point)349 Inflate(const PointF &point)
350 {
351 Inflate(point.X, point.Y);
352 }
353
354 static BOOL
Intersect(RectF & c,const RectF & a,const RectF & b)355 Intersect(RectF &c, const RectF &a, const RectF &b)
356 {
357 // FIXME
358 return FALSE;
359 }
360
361 BOOL
Intersect(const RectF & rect)362 Intersect(const RectF &rect)
363 {
364 return Intersect(*this, *this, rect);
365 }
366
367 BOOL
IntersectsWith(const RectF & rect)368 IntersectsWith(const RectF &rect) const
369 {
370 return GetLeft() < rect.GetRight() && GetTop() < rect.GetTop() && GetRight() > rect.GetLeft() &&
371 GetBottom() > rect.GetTop();
372 }
373
374 BOOL
IsEmptyArea()375 IsEmptyArea() const
376 {
377 return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);
378 }
379
380 VOID
Offset(REAL dx,REAL dy)381 Offset(REAL dx, REAL dy)
382 {
383 X += dx;
384 Y += dy;
385 }
386
387 VOID
Offset(const PointF & point)388 Offset(const PointF &point)
389 {
390 Offset(point.X, point.Y);
391 }
392
393 static BOOL
Union(RectF & c,const RectF & a,const RectF & b)394 Union(RectF &c, const RectF &a, const RectF &b)
395 {
396 // FIXME
397 return FALSE;
398 }
399 };
400
401 class Size
402 {
403 public:
404 INT Width;
405 INT Height;
406
Size()407 Size() : Width(0), Height(0)
408 {
409 }
410
Size(const Size & size)411 Size(const Size &size) : Width(size.Width), Height(size.Height)
412 {
413 }
414
Size(INT width,INT height)415 Size(INT width, INT height) : Width(width), Height(height)
416 {
417 }
418
419 BOOL
Empty()420 Empty() const
421 {
422 return Width == 0 && Height == 0;
423 }
424
425 BOOL
Equals(const Size & sz)426 Equals(const Size &sz) const
427 {
428 return Width == sz.Width && Height == sz.Height;
429 }
430
431 Size
432 operator+(const Size &sz) const
433 {
434 return Size(Width + sz.Width, Height + sz.Height);
435 }
436
437 Size
438 operator-(const Size &sz) const
439 {
440 return Size(Width - sz.Width, Height - sz.Height);
441 }
442 };
443
444 class Rect
445 {
446 public:
447 INT X;
448 INT Y;
449 INT Width;
450 INT Height;
451
Rect()452 Rect() : X(0), Y(0), Width(0), Height(0)
453 {
454 }
455
Rect(const Point & location,const Size & size)456 Rect(const Point &location, const Size &size) : X(location.X), Y(location.Y), Width(size.Width), Height(size.Height)
457 {
458 }
459
Rect(INT x,INT y,INT width,INT height)460 Rect(INT x, INT y, INT width, INT height) : X(x), Y(y), Width(width), Height(height)
461 {
462 }
463
464 Rect *
Clone()465 Clone() const
466 {
467 return new Rect(X, Y, Width, Height);
468 }
469
470 BOOL
Contains(const Point & pt)471 Contains(const Point &pt) const
472 {
473 return Contains(pt.X, pt.Y);
474 }
475
476 BOOL
Contains(const Rect & rect)477 Contains(const Rect &rect) const
478 {
479 return X <= rect.X && rect.GetRight() <= GetRight() && Y <= rect.Y && rect.GetBottom() <= GetBottom();
480 }
481
482 BOOL
Contains(INT x,INT y)483 Contains(INT x, INT y) const
484 {
485 return X <= x && x < X + Width && Y <= y && y < Y + Height;
486 }
487
488 BOOL
Equals(const Rect & rect)489 Equals(const Rect &rect) const
490 {
491 return X == rect.X && Y == rect.Y && Width == rect.Width && Height == rect.Height;
492 }
493
494 INT
GetBottom()495 GetBottom() const
496 {
497 return Y + Height;
498 }
499
500 VOID
GetBounds(Rect * rect)501 GetBounds(Rect *rect) const
502 {
503 rect->X = X;
504 rect->Y = Y;
505 rect->Width = Width;
506 rect->Height = Height;
507 }
508
509 INT
GetLeft()510 GetLeft() const
511 {
512 return X;
513 }
514
515 VOID
GetLocation(Point * point)516 GetLocation(Point *point) const
517 {
518 point->X = X;
519 point->Y = Y;
520 }
521
522 INT
GetRight()523 GetRight() const
524 {
525 return X + Width;
526 }
527
528 VOID
GetSize(Size * size)529 GetSize(Size *size) const
530 {
531 size->Width = Width;
532 size->Height = Height;
533 }
534
535 INT
GetTop()536 GetTop() const
537 {
538 return Y;
539 }
540
541 VOID
Inflate(INT dx,INT dy)542 Inflate(INT dx, INT dy)
543 {
544 X -= dx;
545 Y -= dy;
546 Width += 2 * dx;
547 Height += 2 * dy;
548 }
549
550 VOID
Inflate(const Point & point)551 Inflate(const Point &point)
552 {
553 Inflate(point.X, point.Y);
554 }
555
556 static BOOL
Intersect(Rect & c,const Rect & a,const Rect & b)557 Intersect(Rect &c, const Rect &a, const Rect &b)
558 {
559 // FIXME
560 return FALSE;
561 }
562
563 BOOL
Intersect(const Rect & rect)564 Intersect(const Rect &rect)
565 {
566 return Intersect(*this, *this, rect);
567 }
568
569 BOOL
IntersectsWith(const Rect & rect)570 IntersectsWith(const Rect &rect) const
571 {
572 return GetLeft() < rect.GetRight() && GetTop() < rect.GetTop() && GetRight() > rect.GetLeft() &&
573 GetBottom() > rect.GetTop();
574 }
575
576 BOOL
IsEmptyArea()577 IsEmptyArea() const
578 {
579 return Width <= 0 || Height <= 0;
580 }
581
582 VOID
Offset(INT dx,INT dy)583 Offset(INT dx, INT dy)
584 {
585 X += dx;
586 Y += dy;
587 }
588
589 VOID
Offset(const Point & point)590 Offset(const Point &point)
591 {
592 Offset(point.X, point.Y);
593 }
594
595 static BOOL
Union(Rect & c,const Rect & a,const Rect & b)596 Union(Rect &c, const Rect &a, const Rect &b)
597 {
598 // FIXME
599 return FALSE;
600 }
601 };
602
603 class CharacterRange
604 {
605 public:
CharacterRange()606 CharacterRange()
607 {
608 First = Length = 0;
609 }
610
CharacterRange(INT first,INT length)611 CharacterRange(INT first, INT length)
612 {
613 First = first;
614 Length = length;
615 }
616
617 CharacterRange &
618 operator=(const CharacterRange &rhs)
619 {
620 First = rhs.First;
621 Length = rhs.Length;
622 return *this;
623 }
624
625 public:
626 INT First;
627 INT Length;
628 };
629
Point(const Size & size)630 inline Point::Point(const Size &size) : X(size.Width), Y(size.Height)
631 {
632 }
633
PointF(const SizeF & size)634 inline PointF::PointF(const SizeF &size) : X(size.Width), Y(size.Height)
635 {
636 }
637
638 #else /* end of c++ typedefs */
639
640 typedef struct Point
641 {
642 INT X;
643 INT Y;
644 } Point;
645
646 typedef struct PointF
647 {
648 REAL X;
649 REAL Y;
650 } PointF;
651
652 typedef struct PathData
653 {
654 INT Count;
655 PointF *Points;
656 BYTE *Types;
657 } PathData;
658
659 typedef struct RectF
660 {
661 REAL X;
662 REAL Y;
663 REAL Width;
664 REAL Height;
665 } RectF;
666
667 typedef struct Rect
668 {
669 INT X;
670 INT Y;
671 INT Width;
672 INT Height;
673 } Rect;
674
675 typedef struct CharacterRange
676 {
677 INT First;
678 INT Length;
679 } CharacterRange;
680
681 typedef enum Status Status;
682
683 #endif /* end of c typedefs */
684
685 #endif
686