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