mirror of
https://github.com/snowie2000/mactype.git
synced 2025-01-05 10:17:02 +08:00
07a1eee62c
Dependency not included. Deps: EasyHook, FreeType
771 lines
16 KiB
C++
771 lines
16 KiB
C++
/**************************************************************************\
|
|
*
|
|
* Copyright (c) 1998-2001, Microsoft Corp. All Rights Reserved.
|
|
*
|
|
* Module Name:
|
|
*
|
|
* GdiplusTypes.h
|
|
*
|
|
* Abstract:
|
|
*
|
|
* GDI+ Types
|
|
*
|
|
\**************************************************************************/
|
|
|
|
#ifndef _GDIPLUSTYPES_H
|
|
#define _GDIPLUSTYPES_H
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Callback functions
|
|
//--------------------------------------------------------------------------
|
|
|
|
extern "C" {
|
|
typedef BOOL (CALLBACK * ImageAbort)(VOID *);
|
|
typedef ImageAbort DrawImageAbort;
|
|
typedef ImageAbort GetThumbnailImageAbort;
|
|
}
|
|
|
|
// Callback for EnumerateMetafile methods. The parameters are:
|
|
|
|
// recordType WMF, EMF, or EMF+ record type
|
|
// flags (always 0 for WMF/EMF records)
|
|
// dataSize size of the record data (in bytes), or 0 if no data
|
|
// data pointer to the record data, or NULL if no data
|
|
// callbackData pointer to callbackData, if any
|
|
|
|
// This method can then call Metafile::PlayRecord to play the
|
|
// record that was just enumerated. If this method returns
|
|
// FALSE, the enumeration process is aborted. Otherwise, it continues.
|
|
|
|
|
|
#if (GDIPVER >= 0x0110)
|
|
// This is the main GDI+ Abort interface
|
|
|
|
struct __declspec(novtable) GdiplusAbort
|
|
{
|
|
virtual HRESULT __stdcall Abort(void) = 0;
|
|
};
|
|
#endif //(GDIPVER >= 0x0110)
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Primitive data types
|
|
//
|
|
// NOTE:
|
|
// Types already defined in standard header files:
|
|
// INT8
|
|
// UINT8
|
|
// INT16
|
|
// UINT16
|
|
// INT32
|
|
// UINT32
|
|
// INT64
|
|
// UINT64
|
|
//
|
|
// Avoid using the following types:
|
|
// LONG - use INT
|
|
// ULONG - use UINT
|
|
// DWORD - use UINT32
|
|
//--------------------------------------------------------------------------
|
|
|
|
typedef float REAL;
|
|
|
|
#define REAL_MAX FLT_MAX
|
|
#define REAL_MIN FLT_MIN
|
|
#define REAL_TOLERANCE (FLT_MIN * 100)
|
|
#define REAL_EPSILON 1.192092896e-07F /* FLT_EPSILON */
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Forward declarations of common classes
|
|
//--------------------------------------------------------------------------
|
|
|
|
class Size;
|
|
class SizeF;
|
|
class Point;
|
|
class PointF;
|
|
class Rect;
|
|
class RectF;
|
|
class CharacterRange;
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Status return values from GDI+ methods
|
|
//--------------------------------------------------------------------------
|
|
|
|
enum Status
|
|
{
|
|
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,
|
|
#if (GDIPVER >= 0x0110)
|
|
ProfileNotFound = 21,
|
|
#endif //(GDIPVER >= 0x0110)
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represents a dimension in a 2D coordinate system (floating-point coordinates)
|
|
//--------------------------------------------------------------------------
|
|
|
|
class SizeF
|
|
{
|
|
public:
|
|
SizeF()
|
|
{
|
|
Width = Height = 0.0f;
|
|
}
|
|
|
|
SizeF(IN const SizeF& size)
|
|
{
|
|
Width = size.Width;
|
|
Height = size.Height;
|
|
}
|
|
|
|
SizeF(IN REAL width,
|
|
IN REAL height)
|
|
{
|
|
Width = width;
|
|
Height = height;
|
|
}
|
|
|
|
SizeF operator+(IN const SizeF& sz) const
|
|
{
|
|
return SizeF(Width + sz.Width,
|
|
Height + sz.Height);
|
|
}
|
|
|
|
SizeF operator-(IN const SizeF& sz) const
|
|
{
|
|
return SizeF(Width - sz.Width,
|
|
Height - sz.Height);
|
|
}
|
|
|
|
BOOL Equals(IN const SizeF& sz) const
|
|
{
|
|
return (Width == sz.Width) && (Height == sz.Height);
|
|
}
|
|
|
|
BOOL Empty() const
|
|
{
|
|
return (Width == 0.0f && Height == 0.0f);
|
|
}
|
|
|
|
public:
|
|
|
|
REAL Width;
|
|
REAL Height;
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represents a dimension in a 2D coordinate system (integer coordinates)
|
|
//--------------------------------------------------------------------------
|
|
|
|
class Size
|
|
{
|
|
public:
|
|
Size()
|
|
{
|
|
Width = Height = 0;
|
|
}
|
|
|
|
Size(IN const Size& size)
|
|
{
|
|
Width = size.Width;
|
|
Height = size.Height;
|
|
}
|
|
|
|
Size(IN INT width,
|
|
IN INT height)
|
|
{
|
|
Width = width;
|
|
Height = height;
|
|
}
|
|
|
|
Size operator+(IN const Size& sz) const
|
|
{
|
|
return Size(Width + sz.Width,
|
|
Height + sz.Height);
|
|
}
|
|
|
|
Size operator-(IN const Size& sz) const
|
|
{
|
|
return Size(Width - sz.Width,
|
|
Height - sz.Height);
|
|
}
|
|
|
|
BOOL Equals(IN const Size& sz) const
|
|
{
|
|
return (Width == sz.Width) && (Height == sz.Height);
|
|
}
|
|
|
|
BOOL Empty() const
|
|
{
|
|
return (Width == 0 && Height == 0);
|
|
}
|
|
|
|
public:
|
|
|
|
INT Width;
|
|
INT Height;
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represents a location in a 2D coordinate system (floating-point coordinates)
|
|
//--------------------------------------------------------------------------
|
|
|
|
class PointF
|
|
{
|
|
public:
|
|
PointF()
|
|
{
|
|
X = Y = 0.0f;
|
|
}
|
|
|
|
PointF(IN const PointF &point)
|
|
{
|
|
X = point.X;
|
|
Y = point.Y;
|
|
}
|
|
|
|
PointF(IN const SizeF &size)
|
|
{
|
|
X = size.Width;
|
|
Y = size.Height;
|
|
}
|
|
|
|
PointF(IN REAL x,
|
|
IN REAL y)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
}
|
|
|
|
PointF operator+(IN const PointF& point) const
|
|
{
|
|
return PointF(X + point.X,
|
|
Y + point.Y);
|
|
}
|
|
|
|
PointF operator-(IN const PointF& point) const
|
|
{
|
|
return PointF(X - point.X,
|
|
Y - point.Y);
|
|
}
|
|
|
|
BOOL Equals(IN const PointF& point)
|
|
{
|
|
return (X == point.X) && (Y == point.Y);
|
|
}
|
|
|
|
public:
|
|
|
|
REAL X;
|
|
REAL Y;
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represents a location in a 2D coordinate system (integer coordinates)
|
|
//--------------------------------------------------------------------------
|
|
|
|
class Point
|
|
{
|
|
public:
|
|
Point()
|
|
{
|
|
X = Y = 0;
|
|
}
|
|
|
|
Point(IN const Point &point)
|
|
{
|
|
X = point.X;
|
|
Y = point.Y;
|
|
}
|
|
|
|
Point(IN const Size &size)
|
|
{
|
|
X = size.Width;
|
|
Y = size.Height;
|
|
}
|
|
|
|
Point(IN INT x,
|
|
IN INT y)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
}
|
|
|
|
Point operator+(IN const Point& point) const
|
|
{
|
|
return Point(X + point.X,
|
|
Y + point.Y);
|
|
}
|
|
|
|
Point operator-(IN const Point& point) const
|
|
{
|
|
return Point(X - point.X,
|
|
Y - point.Y);
|
|
}
|
|
|
|
BOOL Equals(IN const Point& point)
|
|
{
|
|
return (X == point.X) && (Y == point.Y);
|
|
}
|
|
|
|
public:
|
|
|
|
INT X;
|
|
INT Y;
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represents a rectangle in a 2D coordinate system (floating-point coordinates)
|
|
//--------------------------------------------------------------------------
|
|
|
|
class RectF
|
|
{
|
|
public:
|
|
|
|
RectF()
|
|
{
|
|
X = Y = Width = Height = 0.0f;
|
|
}
|
|
|
|
RectF(IN REAL x,
|
|
IN REAL y,
|
|
IN REAL width,
|
|
IN REAL height)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
Width = width;
|
|
Height = height;
|
|
}
|
|
|
|
RectF(IN const PointF& location,
|
|
IN const SizeF& size)
|
|
{
|
|
X = location.X;
|
|
Y = location.Y;
|
|
Width = size.Width;
|
|
Height = size.Height;
|
|
}
|
|
|
|
RectF* Clone() const
|
|
{
|
|
return new RectF(X, Y, Width, Height);
|
|
}
|
|
|
|
VOID GetLocation(OUT PointF* point) const
|
|
{
|
|
point->X = X;
|
|
point->Y = Y;
|
|
}
|
|
|
|
VOID GetSize(OUT SizeF* size) const
|
|
{
|
|
size->Width = Width;
|
|
size->Height = Height;
|
|
}
|
|
|
|
VOID GetBounds(OUT RectF* rect) const
|
|
{
|
|
rect->X = X;
|
|
rect->Y = Y;
|
|
rect->Width = Width;
|
|
rect->Height = Height;
|
|
}
|
|
|
|
REAL GetLeft() const
|
|
{
|
|
return X;
|
|
}
|
|
|
|
REAL GetTop() const
|
|
{
|
|
return Y;
|
|
}
|
|
|
|
REAL GetRight() const
|
|
{
|
|
return X+Width;
|
|
}
|
|
|
|
REAL GetBottom() const
|
|
{
|
|
return Y+Height;
|
|
}
|
|
|
|
BOOL IsEmptyArea() const
|
|
{
|
|
return (Width <= REAL_EPSILON) || (Height <= REAL_EPSILON);
|
|
}
|
|
|
|
BOOL Equals(IN const RectF & rect) const
|
|
{
|
|
return X == rect.X &&
|
|
Y == rect.Y &&
|
|
Width == rect.Width &&
|
|
Height == rect.Height;
|
|
}
|
|
|
|
BOOL Contains(IN REAL x,
|
|
IN REAL y) const
|
|
{
|
|
return x >= X && x < X+Width &&
|
|
y >= Y && y < Y+Height;
|
|
}
|
|
|
|
BOOL Contains(IN const PointF& pt) const
|
|
{
|
|
return Contains(pt.X, pt.Y);
|
|
}
|
|
|
|
BOOL Contains(IN const RectF& rect) const
|
|
{
|
|
return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
|
|
(Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
|
|
}
|
|
|
|
VOID Inflate(IN REAL dx,
|
|
IN REAL dy)
|
|
{
|
|
X -= dx;
|
|
Y -= dy;
|
|
Width += 2*dx;
|
|
Height += 2*dy;
|
|
}
|
|
|
|
VOID Inflate(IN const PointF& point)
|
|
{
|
|
Inflate(point.X, point.Y);
|
|
}
|
|
|
|
BOOL Intersect(IN const RectF& rect)
|
|
{
|
|
return Intersect(*this, *this, rect);
|
|
}
|
|
|
|
static BOOL Intersect(OUT RectF& c,
|
|
IN const RectF& a,
|
|
IN const RectF& b)
|
|
{
|
|
REAL right = min(a.GetRight(), b.GetRight());
|
|
REAL bottom = min(a.GetBottom(), b.GetBottom());
|
|
REAL left = max(a.GetLeft(), b.GetLeft());
|
|
REAL top = max(a.GetTop(), b.GetTop());
|
|
|
|
c.X = left;
|
|
c.Y = top;
|
|
c.Width = right - left;
|
|
c.Height = bottom - top;
|
|
return !c.IsEmptyArea();
|
|
}
|
|
|
|
BOOL IntersectsWith(IN const RectF& rect) const
|
|
{
|
|
return (GetLeft() < rect.GetRight() &&
|
|
GetTop() < rect.GetBottom() &&
|
|
GetRight() > rect.GetLeft() &&
|
|
GetBottom() > rect.GetTop());
|
|
}
|
|
|
|
static BOOL Union(OUT RectF& c,
|
|
IN const RectF& a,
|
|
IN const RectF& b)
|
|
{
|
|
REAL right = max(a.GetRight(), b.GetRight());
|
|
REAL bottom = max(a.GetBottom(), b.GetBottom());
|
|
REAL left = min(a.GetLeft(), b.GetLeft());
|
|
REAL top = min(a.GetTop(), b.GetTop());
|
|
|
|
c.X = left;
|
|
c.Y = top;
|
|
c.Width = right - left;
|
|
c.Height = bottom - top;
|
|
return !c.IsEmptyArea();
|
|
}
|
|
|
|
VOID Offset(IN const PointF& point)
|
|
{
|
|
Offset(point.X, point.Y);
|
|
}
|
|
|
|
VOID Offset(IN REAL dx,
|
|
IN REAL dy)
|
|
{
|
|
X += dx;
|
|
Y += dy;
|
|
}
|
|
|
|
public:
|
|
|
|
REAL X;
|
|
REAL Y;
|
|
REAL Width;
|
|
REAL Height;
|
|
};
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Represents a rectangle in a 2D coordinate system (integer coordinates)
|
|
//--------------------------------------------------------------------------
|
|
|
|
class Rect
|
|
{
|
|
public:
|
|
|
|
Rect()
|
|
{
|
|
X = Y = Width = Height = 0;
|
|
}
|
|
|
|
Rect(IN INT x,
|
|
IN INT y,
|
|
IN INT width,
|
|
IN INT height)
|
|
{
|
|
X = x;
|
|
Y = y;
|
|
Width = width;
|
|
Height = height;
|
|
}
|
|
|
|
Rect(IN const Point& location,
|
|
IN const Size& size)
|
|
{
|
|
X = location.X;
|
|
Y = location.Y;
|
|
Width = size.Width;
|
|
Height = size.Height;
|
|
}
|
|
|
|
Rect* Clone() const
|
|
{
|
|
return new Rect(X, Y, Width, Height);
|
|
}
|
|
|
|
VOID GetLocation(OUT Point* point) const
|
|
{
|
|
point->X = X;
|
|
point->Y = Y;
|
|
}
|
|
|
|
VOID GetSize(OUT Size* size) const
|
|
{
|
|
size->Width = Width;
|
|
size->Height = Height;
|
|
}
|
|
|
|
VOID GetBounds(OUT Rect* rect) const
|
|
{
|
|
rect->X = X;
|
|
rect->Y = Y;
|
|
rect->Width = Width;
|
|
rect->Height = Height;
|
|
}
|
|
|
|
INT GetLeft() const
|
|
{
|
|
return X;
|
|
}
|
|
|
|
INT GetTop() const
|
|
{
|
|
return Y;
|
|
}
|
|
|
|
INT GetRight() const
|
|
{
|
|
return X+Width;
|
|
}
|
|
|
|
INT GetBottom() const
|
|
{
|
|
return Y+Height;
|
|
}
|
|
|
|
BOOL IsEmptyArea() const
|
|
{
|
|
return (Width <= 0) || (Height <= 0);
|
|
}
|
|
|
|
BOOL Equals(IN const Rect & rect) const
|
|
{
|
|
return X == rect.X &&
|
|
Y == rect.Y &&
|
|
Width == rect.Width &&
|
|
Height == rect.Height;
|
|
}
|
|
|
|
BOOL Contains(IN INT x,
|
|
IN INT y) const
|
|
{
|
|
return x >= X && x < X+Width &&
|
|
y >= Y && y < Y+Height;
|
|
}
|
|
|
|
BOOL Contains(IN const Point& pt) const
|
|
{
|
|
return Contains(pt.X, pt.Y);
|
|
}
|
|
|
|
BOOL Contains(IN Rect& rect) const
|
|
{
|
|
return (X <= rect.X) && (rect.GetRight() <= GetRight()) &&
|
|
(Y <= rect.Y) && (rect.GetBottom() <= GetBottom());
|
|
}
|
|
|
|
VOID Inflate(IN INT dx,
|
|
IN INT dy)
|
|
{
|
|
X -= dx;
|
|
Y -= dy;
|
|
Width += 2*dx;
|
|
Height += 2*dy;
|
|
}
|
|
|
|
VOID Inflate(IN const Point& point)
|
|
{
|
|
Inflate(point.X, point.Y);
|
|
}
|
|
|
|
BOOL Intersect(IN const Rect& rect)
|
|
{
|
|
return Intersect(*this, *this, rect);
|
|
}
|
|
|
|
static BOOL Intersect(OUT Rect& c,
|
|
IN const Rect& a,
|
|
IN const Rect& b)
|
|
{
|
|
INT right = min(a.GetRight(), b.GetRight());
|
|
INT bottom = min(a.GetBottom(), b.GetBottom());
|
|
INT left = max(a.GetLeft(), b.GetLeft());
|
|
INT top = max(a.GetTop(), b.GetTop());
|
|
|
|
c.X = left;
|
|
c.Y = top;
|
|
c.Width = right - left;
|
|
c.Height = bottom - top;
|
|
return !c.IsEmptyArea();
|
|
}
|
|
|
|
BOOL IntersectsWith(IN const Rect& rect) const
|
|
{
|
|
return (GetLeft() < rect.GetRight() &&
|
|
GetTop() < rect.GetBottom() &&
|
|
GetRight() > rect.GetLeft() &&
|
|
GetBottom() > rect.GetTop());
|
|
}
|
|
|
|
static BOOL Union(OUT Rect& c,
|
|
IN const Rect& a,
|
|
IN const Rect& b)
|
|
{
|
|
INT right = max(a.GetRight(), b.GetRight());
|
|
INT bottom = max(a.GetBottom(), b.GetBottom());
|
|
INT left = min(a.GetLeft(), b.GetLeft());
|
|
INT top = min(a.GetTop(), b.GetTop());
|
|
|
|
c.X = left;
|
|
c.Y = top;
|
|
c.Width = right - left;
|
|
c.Height = bottom - top;
|
|
return !c.IsEmptyArea();
|
|
}
|
|
|
|
VOID Offset(IN const Point& point)
|
|
{
|
|
Offset(point.X, point.Y);
|
|
}
|
|
|
|
VOID Offset(IN INT dx,
|
|
IN INT dy)
|
|
{
|
|
X += dx;
|
|
Y += dy;
|
|
}
|
|
|
|
public:
|
|
|
|
INT X;
|
|
INT Y;
|
|
INT Width;
|
|
INT Height;
|
|
};
|
|
|
|
class PathData
|
|
{
|
|
public:
|
|
PathData()
|
|
{
|
|
Count = 0;
|
|
Points = NULL;
|
|
Types = NULL;
|
|
}
|
|
|
|
~PathData()
|
|
{
|
|
if (Points != NULL)
|
|
{
|
|
delete [] Points;
|
|
}
|
|
|
|
if (Types != NULL)
|
|
{
|
|
delete [] Types;
|
|
}
|
|
}
|
|
|
|
private:
|
|
PathData(const PathData &);
|
|
PathData& operator=(const PathData &);
|
|
|
|
public:
|
|
INT Count;
|
|
PointF* Points;
|
|
__field_ecount_opt(Count) BYTE* Types;
|
|
};
|
|
|
|
class CharacterRange
|
|
{
|
|
public:
|
|
CharacterRange(
|
|
INT first,
|
|
INT length
|
|
) :
|
|
First (first),
|
|
Length (length)
|
|
{}
|
|
|
|
CharacterRange() : First(0), Length(0)
|
|
{}
|
|
|
|
CharacterRange & operator = (const CharacterRange &rhs)
|
|
{
|
|
First = rhs.First;
|
|
Length = rhs.Length;
|
|
return *this;
|
|
}
|
|
|
|
INT First;
|
|
INT Length;
|
|
};
|
|
|
|
#endif // !_GDIPLUSTYPES_HPP
|
|
|