blob: 68d522a3dcefc5ec319e5553dbb5a82682d21ab9 [file] [log] [blame]
/*
* gdiplustypes.h
*
* GDI+ basic type declarations
*
* This file is part of the w32api package.
*
* Contributors:
* Created by Markus Koenig <markus@stber-koenig.de>
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
* This source code is offered for use in the public domain. You may
* use, modify or distribute it freely.
*
* This code is distributed in the hope that it will be useful but
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
* DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
#ifndef __GDIPLUS_TYPES_H
#define __GDIPLUS_TYPES_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif
#if defined(_ARM_)
#define WINGDIPAPI
#else
#define WINGDIPAPI __stdcall
#endif
#define GDIPCONST const
typedef enum GpStatus {
Ok = 0,
GenericError = 1,
InvalidParameter = 2,
OutOfMemory = 3,
ObjectBusy = 4,
InsufficientBuffer = 5,
NotImplemented = 6,
Win32Error = 7,
WrongState = 8,
Aborted = 9,
FileNotFound = 10,
ValueOverflow = 11,
AccessDenied = 12,
UnknownImageFormat = 13,
FontFamilyNotFound = 14,
FontStyleNotFound = 15,
NotTrueTypeFont = 16,
UnsupportedGdiplusVersion = 17,
GdiplusNotInitialized = 18,
PropertyNotFound = 19,
PropertyNotSupported = 20,
ProfileNotFound = 21
} GpStatus;
#ifdef __cplusplus
typedef GpStatus Status;
#endif
typedef struct Size {
INT Width;
INT Height;
#ifdef __cplusplus
Size(): Width(0), Height(0) {}
Size(INT width, INT height): Width(width), Height(height) {}
Size(const Size& size): Width(size.Width), Height(size.Height) {}
BOOL Empty() const {
return Width == 0 && Height == 0;
}
BOOL Equals(const Size& size) const {
return Width == size.Width && Height == size.Height;
}
Size operator+(const Size& size) const {
return Size(Width + size.Width, Height + size.Height);
}
Size operator-(const Size& size) const {
return Size(Width - size.Width, Height - size.Height);
}
#endif /* __cplusplus */
} Size;
typedef struct SizeF {
REAL Width;
REAL Height;
#ifdef __cplusplus
SizeF(): Width(0.0f), Height(0.0f) {}
SizeF(REAL width, REAL height): Width(width), Height(height) {}
SizeF(const SizeF& size): Width(size.Width), Height(size.Height) {}
BOOL Empty() const {
return Width == 0.0f && Height == 0.0f;
}
BOOL Equals(const SizeF& size) const {
return Width == size.Width && Height == size.Height;
}
SizeF operator+(const SizeF& size) const {
return SizeF(Width + size.Width, Height + size.Height);
}
SizeF operator-(const SizeF& size) const {
return SizeF(Width - size.Width, Height - size.Height);
}
#endif /* __cplusplus */
} SizeF;
typedef struct Point {
INT X;
INT Y;
#ifdef __cplusplus
Point(): X(0), Y(0) {}
Point(INT x, INT y): X(x), Y(y) {}
Point(const Point& point): X(point.X), Y(point.Y) {}
Point(const Size& size): X(size.Width), Y(size.Height) {}
BOOL Equals(const Point& point) const {
return X == point.X && Y == point.Y;
}
Point operator+(const Point& point) const {
return Point(X + point.X, Y + point.Y);
}
Point operator-(const Point& point) const {
return Point(X - point.X, Y - point.Y);
}
#endif /* __cplusplus */
} Point;
typedef struct PointF {
REAL X;
REAL Y;
#ifdef __cplusplus
PointF(): X(0.0f), Y(0.0f) {}
PointF(REAL x, REAL y): X(x), Y(y) {}
PointF(const PointF& point): X(point.X), Y(point.Y) {}
PointF(const SizeF& size): X(size.Width), Y(size.Height) {}
BOOL Equals(const PointF& point) const {
return X == point.X && Y == point.Y;
}
PointF operator+(const PointF& point) const {
return PointF(X + point.X, Y + point.Y);
}
PointF operator-(const PointF& point) const {
return PointF(X - point.X, Y - point.Y);
}
#endif /* __cplusplus */
} PointF;
typedef struct Rect {
INT X;
INT Y;
INT Width;
INT Height;
#ifdef __cplusplus
Rect(): X(0), Y(0), Width(0), Height(0) {}
Rect(const Point& location, const Size& size):
X(location.X), Y(location.Y),
Width(size.Width), Height(size.Height) {}
Rect(INT x, INT y, INT width, INT height):
X(x), Y(y), Width(width), Height(height) {}
Rect* Clone() const {
return new Rect(X, Y, Width, Height);
}
BOOL Contains(INT x, INT y) const {
return X <= x && Y <= y && x < X+Width && y < Y+Height;
}
BOOL Contains(const Point& point) const {
return Contains(point.X, point.Y);
}
BOOL Contains(const Rect& rect) const {
return X <= rect.X && Y <= rect.Y
&& rect.X+rect.Width <= X+Width
&& rect.Y+rect.Height <= Y+Height;
}
BOOL Equals(const Rect& rect) const {
return X == rect.X && Y == rect.Y
&& Width == rect.Width && Height == rect.Height;
}
INT GetBottom() const {
return Y+Height;
}
VOID GetBounds(Rect *rect) const {
if (rect != NULL) {
rect->X = X;
rect->Y = Y;
rect->Width = Width;
rect->Height = Height;
}
}
INT GetLeft() const {
return X;
}
VOID GetLocation(Point *point) const {
if (point != NULL) {
point->X = X;
point->Y = Y;
}
}
INT GetRight() const {
return X+Width;
}
VOID GetSize(Size *size) const {
if (size != NULL) {
size->Width = Width;
size->Height = Height;
}
}
INT GetTop() const {
return Y;
}
BOOL IsEmptyArea() const {
return Width <= 0 || Height <= 0;
}
VOID Inflate(INT dx, INT dy) {
X -= dx;
Y -= dy;
Width += 2*dx;
Height += 2*dy;
}
VOID Inflate(const Point& point) {
Inflate(point.X, point.Y);
}
static BOOL Intersect(Rect& c, const Rect& a, const Rect& b) {
INT intersectLeft = (a.X < b.X) ? b.X : a.X;
INT intersectTop = (a.Y < b.Y) ? b.Y : a.Y;
INT intersectRight = (a.GetRight() < b.GetRight())
? a.GetRight() : b.GetRight();
INT intersectBottom = (a.GetBottom() < b.GetBottom())
? a.GetBottom() : b.GetBottom();
c.X = intersectLeft;
c.Y = intersectTop;
c.Width = intersectRight - intersectLeft;
c.Height = intersectBottom - intersectTop;
return !c.IsEmptyArea();
}
BOOL Intersect(const Rect& rect) {
return Intersect(*this, *this, rect);
}
BOOL IntersectsWith(const Rect& rc) const {
INT intersectLeft = (X < rc.X) ? rc.X : X;
INT intersectTop = (Y < rc.Y) ? rc.Y : Y;
INT intersectRight = (GetRight() < rc.GetRight())
? GetRight() : rc.GetRight();
INT intersectBottom = (GetBottom() < rc.GetBottom())
? GetBottom() : rc.GetBottom();
return intersectLeft < intersectRight
&& intersectTop < intersectBottom;
}
VOID Offset(INT dx, INT dy) {
X += dx;
Y += dy;
}
VOID Offset(const Point& point) {
Offset(point.X, point.Y);
}
static BOOL Union(Rect& c, const Rect& a, const Rect& b) {
INT unionLeft = (a.X < b.X) ? a.X : b.X;
INT unionTop = (a.Y < b.Y) ? a.Y : b.Y;
INT unionRight = (a.GetRight() < b.GetRight())
? b.GetRight() : a.GetRight();
INT unionBottom = (a.GetBottom() < b.GetBottom())
? b.GetBottom() : a.GetBottom();
c.X = unionLeft;
c.Y = unionTop;
c.Width = unionRight - unionLeft;
c.Height = unionBottom - unionTop;
return !c.IsEmptyArea();
}
#endif /* __cplusplus */
} Rect;
typedef struct RectF {
REAL X;
REAL Y;
REAL Width;
REAL Height;
#ifdef __cplusplus
RectF(): X(0.0f), Y(0.0f), Width(0.0f), Height(0.0f) {}
RectF(const PointF& location, const SizeF& size):
X(location.X), Y(location.Y),
Width(size.Width), Height(size.Height) {}
RectF(REAL x, REAL y, REAL width, REAL height):
X(x), Y(y), Width(width), Height(height) {}
RectF* Clone() const {
return new RectF(X, Y, Width, Height);
}
BOOL Contains(REAL x, REAL y) const {
return X <= x && Y <= y && x < X+Width && y < Y+Height;
}
BOOL Contains(const PointF& point) const {
return Contains(point.X, point.Y);
}
BOOL Contains(const RectF& rect) const {
return X <= rect.X && Y <= rect.Y
&& rect.X+rect.Width <= X+Width
&& rect.Y+rect.Height <= Y+Height;
}
BOOL Equals(const RectF& rect) const {
return X == rect.X && Y == rect.Y
&& Width == rect.Width && Height == rect.Height;
}
REAL GetBottom() const {
return Y+Height;
}
VOID GetBounds(RectF *rect) const {
if (rect != NULL) {
rect->X = X;
rect->Y = Y;
rect->Width = Width;
rect->Height = Height;
}
}
REAL GetLeft() const {
return X;
}
VOID GetLocation(PointF *point) const {
if (point != NULL) {
point->X = X;
point->Y = Y;
}
}
REAL GetRight() const {
return X+Width;
}
VOID GetSize(SizeF *size) const {
if (size != NULL) {
size->Width = Width;
size->Height = Height;
}
}
REAL GetTop() const {
return Y;
}
BOOL IsEmptyArea() const {
return Width <= 0.0f || Height <= 0.0f;
}
VOID Inflate(REAL dx, REAL dy) {
X -= dx;
Y -= dy;
Width += 2*dx;
Height += 2*dy;
}
VOID Inflate(const PointF& point) {
Inflate(point.X, point.Y);
}
static BOOL Intersect(RectF& c, const RectF& a, const RectF& b) {
INT intersectLeft = (a.X < b.X) ? b.X : a.X;
INT intersectTop = (a.Y < b.Y) ? b.Y : a.Y;
INT intersectRight = (a.GetRight() < b.GetRight())
? a.GetRight() : b.GetRight();
INT intersectBottom = (a.GetBottom() < b.GetBottom())
? a.GetBottom() : b.GetBottom();
c.X = intersectLeft;
c.Y = intersectTop;
c.Width = intersectRight - intersectLeft;
c.Height = intersectBottom - intersectTop;
return !c.IsEmptyArea();
}
BOOL Intersect(const RectF& rect) {
return Intersect(*this, *this, rect);
}
BOOL IntersectsWith(const RectF& rc) const {
INT intersectLeft = (X < rc.X) ? rc.X : X;
INT intersectTop = (Y < rc.Y) ? rc.Y : Y;
INT intersectRight = (GetRight() < rc.GetRight())
? GetRight() : rc.GetRight();
INT intersectBottom = (GetBottom() < rc.GetBottom())
? GetBottom() : rc.GetBottom();
return intersectLeft < intersectRight
&& intersectTop < intersectBottom;
}
VOID Offset(REAL dx, REAL dy) {
X += dx;
Y += dy;
}
VOID Offset(const PointF& point) {
Offset(point.X, point.Y);
}
static BOOL Union(RectF& c, const RectF& a, const RectF& b) {
INT unionLeft = (a.X < b.X) ? a.X : b.X;
INT unionTop = (a.Y < b.Y) ? a.Y : b.Y;
INT unionRight = (a.GetRight() < b.GetRight())
? b.GetRight() : a.GetRight();
INT unionBottom = (a.GetBottom() < b.GetBottom())
? b.GetBottom() : a.GetBottom();
c.X = unionLeft;
c.Y = unionTop;
c.Width = unionRight - unionLeft;
c.Height = unionBottom - unionTop;
return !c.IsEmptyArea();
}
#endif /* __cplusplus */
} RectF;
/* FIXME: Are descendants of this class, when compiled with g++,
binary compatible with MSVC++ code (especially GDIPLUS.DLL of course)? */
#ifdef __cplusplus
struct GdiplusAbort {
virtual HRESULT __stdcall Abort(void) {}
};
#else
typedef struct GdiplusAbort GdiplusAbort; /* incomplete type */
#endif
typedef struct CharacterRange {
INT First;
INT Length;
#ifdef __cplusplus
CharacterRange(): First(0), Length(0) {}
CharacterRange(INT first, INT length): First(first), Length(length) {}
CharacterRange& operator=(const CharacterRange& rhs) {
/* This gracefully handles self-assignment */
First = rhs.First;
Length = rhs.Length;
return *this;
}
#endif /* __cplusplus */
} CharacterRange;
typedef struct PathData {
INT Count;
PointF *Points;
BYTE *Types;
#ifdef __cplusplus
friend class GraphicsPath;
PathData(): Count(0), Points(NULL), Types(NULL) {}
~PathData() {
FreeArrays();
}
private:
/* used by GraphicsPath::GetPathData, defined in gdipluspath.h */
Status AllocateArrays(INT capacity);
VOID FreeArrays();
#endif /* __cplusplus */
} PathData;
/* Callback function types */
/* FIXME: need a correct definition for these function pointer types */
typedef void *DebugEventProc;
typedef BOOL CALLBACK (*EnumerateMetafileProc)(EmfPlusRecordType,UINT,UINT,const BYTE*,VOID*);
typedef void *DrawImageAbort;
typedef void *GetThumbnailImageAbort;
#endif /* __GDIPLUS_TYPES_H */