mirror of
https://github.com/QB64-Phoenix-Edition/QB64pe.git
synced 2024-09-07 15:20:18 +00:00
460 lines
12 KiB
C++
460 lines
12 KiB
C++
/*
|
|
* 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 */
|