Home | History | Annotate | Download | only in gdiplus
      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 <markus (at) stber-koenig.de>
     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
     70 	Size(): Width(0), Height(0) {}
     71 	Size(INT width, INT height): Width(width), Height(height) {}
     72 	Size(const Size& size): Width(size.Width), Height(size.Height) {}
     73 
     74 	BOOL Empty() const {
     75 		return Width == 0 && Height == 0;
     76 	}
     77 	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
     94 	SizeF(): Width(0.0f), Height(0.0f) {}
     95 	SizeF(REAL width, REAL height): Width(width), Height(height) {}
     96 	SizeF(const SizeF& size): Width(size.Width), Height(size.Height) {}
     97 
     98 	BOOL Empty() const {
     99 		return Width == 0.0f && Height == 0.0f;
    100 	}
    101 	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
    118 	Point(): X(0), Y(0) {}
    119 	Point(INT x, INT y): X(x), Y(y) {}
    120 	Point(const Point& point): X(point.X), Y(point.Y) {}
    121 	Point(const Size& size): X(size.Width), Y(size.Height) {}
    122 
    123 	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
    140 	PointF(): X(0.0f), Y(0.0f) {}
    141 	PointF(REAL x, REAL y): X(x), Y(y) {}
    142 	PointF(const PointF& point): X(point.X), Y(point.Y) {}
    143 	PointF(const SizeF& size): X(size.Width), Y(size.Height) {}
    144 
    145 	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
    164 	Rect(): X(0), Y(0), Width(0), Height(0) {}
    165 	Rect(const Point& location, const Size& size):
    166 		X(location.X), Y(location.Y),
    167 		Width(size.Width), Height(size.Height) {}
    168 	Rect(INT x, INT y, INT width, INT height):
    169 		X(x), Y(y), Width(width), Height(height) {}
    170 
    171 	Rect* Clone() const {
    172 		return new Rect(X, Y, Width, Height);
    173 	}
    174 	BOOL Contains(INT x, INT y) const {
    175 		return X <= x && Y <= y && x < X+Width && y < Y+Height;
    176 	}
    177 	BOOL Contains(const Point& point) const {
    178 		return Contains(point.X, point.Y);
    179 	}
    180 	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 	}
    185 	BOOL Equals(const Rect& rect) const {
    186 		return X == rect.X && Y == rect.Y
    187 			&& Width == rect.Width && Height == rect.Height;
    188 	}
    189 	INT GetBottom() const {
    190 		return Y+Height;
    191 	}
    192 	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 	}
    200 	INT GetLeft() const {
    201 		return X;
    202 	}
    203 	VOID GetLocation(Point *point) const {
    204 		if (point != NULL) {
    205 			point->X = X;
    206 			point->Y = Y;
    207 		}
    208 	}
    209 	INT GetRight() const {
    210 		return X+Width;
    211 	}
    212 	VOID GetSize(Size *size) const {
    213 		if (size != NULL) {
    214 			size->Width = Width;
    215 			size->Height = Height;
    216 		}
    217 	}
    218 	INT GetTop() const {
    219 		return Y;
    220 	}
    221 	BOOL IsEmptyArea() const {
    222 		return Width <= 0 || Height <= 0;
    223 	}
    224 	VOID Inflate(INT dx, INT dy) {
    225 		X -= dx;
    226 		Y -= dy;
    227 		Width += 2*dx;
    228 		Height += 2*dy;
    229 	}
    230 	VOID Inflate(const Point& point) {
    231 		Inflate(point.X, point.Y);
    232 	}
    233 	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 	}
    246 	BOOL Intersect(const Rect& rect) {
    247 		return Intersect(*this, *this, rect);
    248 	}
    249 	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 	}
    259 	VOID Offset(INT dx, INT dy) {
    260 		X += dx;
    261 		Y += dy;
    262 	}
    263 	VOID Offset(const Point& point) {
    264 		Offset(point.X, point.Y);
    265 	}
    266 	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
    289 	RectF(): X(0.0f), Y(0.0f), Width(0.0f), Height(0.0f) {}
    290 	RectF(const PointF& location, const SizeF& size):
    291 		X(location.X), Y(location.Y),
    292 		Width(size.Width), Height(size.Height) {}
    293 	RectF(REAL x, REAL y, REAL width, REAL height):
    294 		X(x), Y(y), Width(width), Height(height) {}
    295 
    296 	RectF* Clone() const {
    297 		return new RectF(X, Y, Width, Height);
    298 	}
    299 	BOOL Contains(REAL x, REAL y) const {
    300 		return X <= x && Y <= y && x < X+Width && y < Y+Height;
    301 	}
    302 	BOOL Contains(const PointF& point) const {
    303 		return Contains(point.X, point.Y);
    304 	}
    305 	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 	}
    310 	BOOL Equals(const RectF& rect) const {
    311 		return X == rect.X && Y == rect.Y
    312 			&& Width == rect.Width && Height == rect.Height;
    313 	}
    314 	REAL GetBottom() const {
    315 		return Y+Height;
    316 	}
    317 	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 	}
    325 	REAL GetLeft() const {
    326 		return X;
    327 	}
    328 	VOID GetLocation(PointF *point) const {
    329 		if (point != NULL) {
    330 			point->X = X;
    331 			point->Y = Y;
    332 		}
    333 	}
    334 	REAL GetRight() const {
    335 		return X+Width;
    336 	}
    337 	VOID GetSize(SizeF *size) const {
    338 		if (size != NULL) {
    339 			size->Width = Width;
    340 			size->Height = Height;
    341 		}
    342 	}
    343 	REAL GetTop() const {
    344 		return Y;
    345 	}
    346 	BOOL IsEmptyArea() const {
    347 		return Width <= 0.0f || Height <= 0.0f;
    348 	}
    349 	VOID Inflate(REAL dx, REAL dy) {
    350 		X -= dx;
    351 		Y -= dy;
    352 		Width += 2*dx;
    353 		Height += 2*dy;
    354 	}
    355 	VOID Inflate(const PointF& point) {
    356 		Inflate(point.X, point.Y);
    357 	}
    358 	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 	}
    371 	BOOL Intersect(const RectF& rect) {
    372 		return Intersect(*this, *this, rect);
    373 	}
    374 	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 	}
    384 	VOID Offset(REAL dx, REAL dy) {
    385 		X += dx;
    386 		Y += dy;
    387 	}
    388 	VOID Offset(const PointF& point) {
    389 		Offset(point.X, point.Y);
    390 	}
    391 	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 {
    411 	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
    422 	CharacterRange(): First(0), Length(0) {}
    423 	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 
    441 	PathData(): Count(0), Points(NULL), Types(NULL) {}
    442 	~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