582 lines
17 KiB
C++
Executable File
582 lines
17 KiB
C++
Executable File
/*
|
|
* gdiplusheaders.h
|
|
*
|
|
* GDI+ Bitmap, CachedBitmap, CustomLineCap, Font, FontCollection,
|
|
* FontFamily, Image, InstalledFontCollection, PrivateFontCollection,
|
|
* Region class definitions.
|
|
* Implementation of these classes is in gdiplusimpl.h.
|
|
*
|
|
* 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_HEADERS_H
|
|
#define __GDIPLUS_HEADERS_H
|
|
#if __GNUC__ >=3
|
|
#pragma GCC system_header
|
|
#endif
|
|
|
|
#ifndef __cplusplus
|
|
#error "A C++ compiler is required to include gdiplusheaders.h."
|
|
#endif
|
|
|
|
/*
|
|
* Note: Virtual inline functions (dtors, Clone()) are implemented here: If
|
|
* these were defined outside class scope, the compiler would always generate
|
|
* code for them (and the vtable), even if these classes were never used.
|
|
*/
|
|
|
|
class Bitmap;
|
|
class Effect;
|
|
class FontCollection;
|
|
class FontFamily;
|
|
class Graphics;
|
|
class GraphicsPath;
|
|
class Matrix;
|
|
class Pen;
|
|
|
|
class Image: public GdiplusBase
|
|
{
|
|
friend class Bitmap;
|
|
friend class Metafile;
|
|
friend class CachedBitmap;
|
|
friend class Graphics;
|
|
friend class TextureBrush;
|
|
|
|
public:
|
|
static Image* FromFile(const WCHAR *filename,
|
|
BOOL useEmbeddedColorManagement = FALSE);
|
|
static Image* FromStream(IStream *stream,
|
|
BOOL useEmbeddedColorManagement = FALSE);
|
|
|
|
Image(const WCHAR *filename, BOOL useEmbeddedColorManagement = FALSE);
|
|
Image(IStream *stream, BOOL useEmbeddedColorManagement = FALSE);
|
|
|
|
virtual ~Image()
|
|
{
|
|
DllExports::GdipDisposeImage(nativeImage);
|
|
}
|
|
virtual Image* Clone() const
|
|
{
|
|
GpImage *cloneImage = NULL;
|
|
Status status = updateStatus(DllExports::GdipCloneImage(
|
|
nativeImage, &cloneImage));
|
|
if (status == Ok) {
|
|
Image *result = new Image(cloneImage, lastStatus);
|
|
if (!result) {
|
|
DllExports::GdipDisposeImage(cloneImage);
|
|
lastStatus = OutOfMemory;
|
|
}
|
|
return result;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
Status FindFirstItem(ImageItemData *item);
|
|
Status FindNextItem(ImageItemData *item);
|
|
Status GetAllPropertyItems(UINT totalBufferSize,
|
|
UINT numProperties, PropertyItem *allItems);
|
|
Status GetBounds(RectF *srcRect, Unit *srcUnit);
|
|
Status GetEncoderParameterList(const CLSID *clsidEncoder,
|
|
UINT size, EncoderParameters *buffer);
|
|
UINT GetEncoderParameterListSize(const CLSID *clsidEncoder);
|
|
UINT GetFlags();
|
|
UINT GetFrameCount(const GUID *dimensionID);
|
|
UINT GetFrameDimensionsCount();
|
|
Status GetFrameDimensionsList(GUID *dimensionIDs, UINT count);
|
|
UINT GetHeight();
|
|
REAL GetHorizontalResolution();
|
|
Status GetItemData(ImageItemData *item);
|
|
Status GetPalette(ColorPalette *palette, INT size);
|
|
INT GetPaletteSize();
|
|
Status GetPhysicalDimension(SizeF *size);
|
|
PixelFormat GetPixelFormat();
|
|
UINT GetPropertyCount();
|
|
Status GetPropertyIdList(UINT numOfProperty, PROPID *list);
|
|
Status GetPropertyItem(PROPID propId, UINT propSize,
|
|
PropertyItem *buffer);
|
|
UINT GetPropertyItemSize(PROPID propId);
|
|
Status GetPropertySize(UINT *totalBufferSize, UINT *numProperties);
|
|
Status GetRawFormat(GUID *format);
|
|
Image* GetThumbnailImage(UINT thumbWidth, UINT thumbHeight,
|
|
GetThumbnailImageAbort callback, VOID *callbackData);
|
|
ImageType GetType() const;
|
|
REAL GetVerticalResolution();
|
|
UINT GetWidth();
|
|
Status RemovePropertyItem(PROPID propId);
|
|
Status RotateFlip(RotateFlipType rotateFlipType);
|
|
Status Save(IStream *stream, const CLSID *clsidEncoder,
|
|
const EncoderParameters *encoderParams);
|
|
Status Save(const WCHAR *filename, const CLSID *clsidEncoder,
|
|
const EncoderParameters *encoderParams);
|
|
Status SaveAdd(const EncoderParameters *encoderParams);
|
|
Status SaveAdd(Image *newImage, const EncoderParameters *encoderParams);
|
|
Status SelectActiveFrame(const GUID *dimensionID, UINT frameIndex);
|
|
Status SetAbort(GdiplusAbort *pIAbort);
|
|
Status SetPalette(const ColorPalette *palette);
|
|
Status SetPropertyItem(const PropertyItem *item);
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
Status result = lastStatus;
|
|
lastStatus = Ok;
|
|
return result;
|
|
}
|
|
|
|
private:
|
|
Image(GpImage *image, Status status):
|
|
nativeImage(image), lastStatus(status) {}
|
|
Image(const Image&);
|
|
Image& operator=(const Image&);
|
|
|
|
Status updateStatus(Status newStatus) const
|
|
{
|
|
if (newStatus != Ok) lastStatus = newStatus;
|
|
return newStatus;
|
|
}
|
|
|
|
GpImage *nativeImage;
|
|
mutable Status lastStatus;
|
|
};
|
|
|
|
class Bitmap: public Image
|
|
{
|
|
public:
|
|
static Bitmap* FromBITMAPINFO(const BITMAPINFO *gdiBitmapInfo,
|
|
VOID *gdiBitmapData);
|
|
static Bitmap* FromDirectDrawSurface7(IDirectDrawSurface7 *surface);
|
|
static Bitmap* FromFile(const WCHAR *filename,
|
|
BOOL useEmbeddedColorManagement = FALSE);
|
|
static Bitmap* FromHBITMAP(HBITMAP hbm, HPALETTE hpal);
|
|
static Bitmap* FromHICON(HICON icon);
|
|
static Bitmap* FromResource(HINSTANCE hInstance,
|
|
const WCHAR *bitmapName);
|
|
static Bitmap* FromStream(IStream *stream,
|
|
BOOL useEmbeddedColorManagement = FALSE);
|
|
static Status ApplyEffect(Bitmap **inputs, INT numInputs,
|
|
Effect *effect, RECT *ROI,
|
|
RECT *outputRect, Bitmap **output);
|
|
static Status InitializePalette(ColorPalette *palette,
|
|
PaletteType paletteType, INT optimalColors,
|
|
BOOL useTransparentColor, Bitmap *bitmap);
|
|
|
|
Bitmap(const BITMAPINFO *gdiBitmapInfo, VOID *gdiBitmapData);
|
|
Bitmap(IDirectDrawSurface7 *surface);
|
|
Bitmap(const WCHAR *filename, BOOL useEmbeddedColorManagement = FALSE);
|
|
Bitmap(HBITMAP hbm, HPALETTE hpal);
|
|
Bitmap(HICON hicon);
|
|
Bitmap(HINSTANCE hInstance, const WCHAR *bitmapName);
|
|
Bitmap(IStream *stream, BOOL useEmbeddedColorManagement = FALSE);
|
|
Bitmap(INT width, INT height, Graphics *target);
|
|
Bitmap(INT width, INT height, PixelFormat format = PixelFormat32bppARGB);
|
|
Bitmap(INT width, INT height, INT stride, PixelFormat format, BYTE *scan0);
|
|
|
|
virtual ~Bitmap()
|
|
{
|
|
}
|
|
virtual Bitmap* Clone() const
|
|
{
|
|
GpImage *cloneImage = NULL;
|
|
Status status = updateStatus(DllExports::GdipCloneImage(
|
|
nativeImage, &cloneImage));
|
|
if (status == Ok) {
|
|
Bitmap *result = new Bitmap(cloneImage, lastStatus);
|
|
if (!result) {
|
|
DllExports::GdipDisposeImage(cloneImage);
|
|
lastStatus = OutOfMemory;
|
|
}
|
|
return result;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
Bitmap* Clone(const RectF& rect, PixelFormat format) const;
|
|
Bitmap* Clone(const Rect& rect, PixelFormat format) const;
|
|
Bitmap* Clone(REAL x, REAL y, REAL width, REAL height,
|
|
PixelFormat format) const;
|
|
Bitmap* Clone(INT x, INT y, INT width, INT height,
|
|
PixelFormat format) const;
|
|
|
|
Status ApplyEffect(Effect *effect, RECT *ROI);
|
|
Status ConvertFormat(PixelFormat format, DitherType ditherType,
|
|
PaletteType paletteType, ColorPalette *palette,
|
|
REAL alphaThresholdPercent);
|
|
Status GetHBITMAP(const Color& colorBackground, HBITMAP *hbmReturn) const;
|
|
Status GetHICON(HICON *icon) const;
|
|
Status GetHistogram(HistogramFormat format, UINT numberOfEntries,
|
|
UINT *channel0, UINT *channel1,
|
|
UINT *channel2, UINT *channel3) const;
|
|
Status GetHistogramSize(HistogramFormat format,
|
|
UINT *numberOfEntries) const;
|
|
Status GetPixel(INT x, INT y, Color *color) const;
|
|
Status LockBits(const Rect *rect, UINT flags, PixelFormat format,
|
|
BitmapData *lockedBitmapData);
|
|
Status SetPixel(INT x, INT y, const Color& color);
|
|
Status SetResolution(REAL xdpi, REAL ydpi);
|
|
Status UnlockBits(BitmapData *lcokedBitmapData);
|
|
|
|
private:
|
|
Bitmap(GpImage *image, Status status): Image(image, status) {}
|
|
Bitmap(const Bitmap&);
|
|
Bitmap& operator=(const Bitmap&);
|
|
};
|
|
|
|
class CachedBitmap: public GdiplusBase
|
|
{
|
|
friend class Graphics;
|
|
|
|
public:
|
|
CachedBitmap(Bitmap *bitmap, Graphics *graphics);
|
|
~CachedBitmap();
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
return lastStatus;
|
|
}
|
|
|
|
private:
|
|
CachedBitmap(const CachedBitmap&);
|
|
CachedBitmap& operator=(const CachedBitmap&);
|
|
|
|
GpCachedBitmap *nativeCachedBitmap;
|
|
Status lastStatus;
|
|
};
|
|
|
|
class CustomLineCap: public GdiplusBase
|
|
{
|
|
friend class AdjustableArrowCap;
|
|
friend class Pen;
|
|
|
|
public:
|
|
CustomLineCap(const GraphicsPath *fillPath,
|
|
const GraphicsPath *strokePath,
|
|
LineCap baseCap = LineCapFlat,
|
|
REAL baseInset = 0.0f);
|
|
|
|
virtual ~CustomLineCap()
|
|
{
|
|
DllExports::GdipDeleteCustomLineCap(nativeCustomLineCap);
|
|
}
|
|
virtual CustomLineCap* Clone() const
|
|
{
|
|
GpCustomLineCap *cloneCustomLineCap = NULL;
|
|
Status status = updateStatus(DllExports::GdipCloneCustomLineCap(
|
|
nativeCustomLineCap, &cloneCustomLineCap));
|
|
if (status == Ok) {
|
|
CustomLineCap *result = new CustomLineCap(
|
|
cloneCustomLineCap, lastStatus);
|
|
if (!result) {
|
|
DllExports::GdipDeleteCustomLineCap(cloneCustomLineCap);
|
|
lastStatus = OutOfMemory;
|
|
}
|
|
return result;
|
|
} else {
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
LineCap GetBaseCap() const;
|
|
REAL GetBaseInset() const;
|
|
Status GetStrokeCaps(LineCap *startCap, LineCap *endCap) const;
|
|
LineJoin GetStrokeJoin() const;
|
|
REAL GetWidthScale() const;
|
|
Status SetBaseCap(LineCap baseCap);
|
|
Status SetBaseInset(REAL inset);
|
|
Status SetStrokeCap(LineCap strokeCap);
|
|
Status SetStrokeCaps(LineCap startCap, LineCap endCap);
|
|
Status SetStrokeJoin(LineJoin lineJoin);
|
|
Status SetWidthScale(REAL widthScale);
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
Status result = lastStatus;
|
|
lastStatus = Ok;
|
|
return result;
|
|
}
|
|
|
|
private:
|
|
CustomLineCap(GpCustomLineCap *customLineCap, Status status):
|
|
nativeCustomLineCap(customLineCap), lastStatus(status) {}
|
|
CustomLineCap(const CustomLineCap&);
|
|
CustomLineCap& operator=(const CustomLineCap&);
|
|
|
|
Status updateStatus(Status newStatus) const
|
|
{
|
|
if (newStatus != Ok) lastStatus = newStatus;
|
|
return newStatus;
|
|
}
|
|
|
|
GpCustomLineCap *nativeCustomLineCap;
|
|
mutable Status lastStatus;
|
|
};
|
|
|
|
class Font: public GdiplusBase
|
|
{
|
|
friend class Graphics;
|
|
|
|
public:
|
|
Font(const FontFamily *family, REAL emSize,
|
|
INT style = FontStyleRegular,
|
|
Unit unit = UnitPoint);
|
|
Font(HDC hdc, HFONT hfont);
|
|
Font(HDC hdc, const LOGFONTA *logfont);
|
|
Font(HDC hdc, const LOGFONTW *logfont);
|
|
Font(HDC hdc);
|
|
Font(const WCHAR *familyName, REAL emSize,
|
|
INT style = FontStyleRegular,
|
|
Unit unit = UnitPoint,
|
|
const FontCollection *fontCollection = NULL);
|
|
~Font();
|
|
Font* Clone() const;
|
|
|
|
Status GetFamily(FontFamily *family) const;
|
|
REAL GetHeight(const Graphics *graphics) const;
|
|
REAL GetHeight(REAL dpi) const;
|
|
Status GetLogFontA(const Graphics *graphics, LOGFONTA *logfontA) const;
|
|
Status GetLogFontW(const Graphics *graphics, LOGFONTW *logfontW) const;
|
|
REAL GetSize() const;
|
|
INT GetStyle() const;
|
|
Unit GetUnit() const;
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
return lastStatus;
|
|
}
|
|
BOOL IsAvailable() const
|
|
{
|
|
return nativeFont != NULL;
|
|
}
|
|
|
|
private:
|
|
Font(GpFont *font, Status status):
|
|
nativeFont(font), lastStatus(status) {}
|
|
Font(const Font&);
|
|
Font& operator=(const Font&);
|
|
|
|
Status updateStatus(Status newStatus) const
|
|
{
|
|
if (newStatus != Ok) lastStatus = newStatus;
|
|
return newStatus;
|
|
}
|
|
|
|
GpFont *nativeFont;
|
|
mutable Status lastStatus;
|
|
};
|
|
|
|
class FontCollection: public GdiplusBase
|
|
{
|
|
friend class InstalledFontCollection;
|
|
friend class PrivateFontCollection;
|
|
friend class Font;
|
|
friend class FontFamily;
|
|
|
|
public:
|
|
FontCollection();
|
|
virtual ~FontCollection() {}
|
|
|
|
Status GetFamilies(INT numSought, FontFamily *families,
|
|
INT *numFound) const;
|
|
INT GetFamilyCount() const;
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
return lastStatus;
|
|
}
|
|
|
|
private:
|
|
FontCollection(const FontCollection&);
|
|
FontCollection& operator=(const FontCollection&);
|
|
|
|
Status updateStatus(Status newStatus) const
|
|
{
|
|
return lastStatus = newStatus;
|
|
}
|
|
|
|
GpFontCollection *nativeFontCollection;
|
|
mutable Status lastStatus;
|
|
};
|
|
|
|
class FontFamily: public GdiplusBase
|
|
{
|
|
friend class Font;
|
|
friend class FontCollection;
|
|
friend class GraphicsPath;
|
|
|
|
public:
|
|
static const FontFamily* GenericMonospace();
|
|
static const FontFamily* GenericSansSerif();
|
|
static const FontFamily* GenericSerif();
|
|
|
|
FontFamily();
|
|
FontFamily(const WCHAR *name,
|
|
const FontCollection *fontCollection = NULL);
|
|
~FontFamily();
|
|
FontFamily* Clone() const;
|
|
|
|
UINT16 GetCellAscent(INT style) const;
|
|
UINT16 GetCellDescent(INT style) const;
|
|
UINT16 GetEmHeight(INT style) const;
|
|
Status GetFamilyName(WCHAR name[LF_FACESIZE],
|
|
LANGID language = LANG_NEUTRAL) const;
|
|
UINT16 GetLineSpacing(INT style) const;
|
|
BOOL IsStyleAvailable(INT style) const;
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
Status result = lastStatus;
|
|
lastStatus = Ok;
|
|
return result;
|
|
}
|
|
BOOL IsAvailable() const
|
|
{
|
|
return nativeFontFamily != NULL;
|
|
}
|
|
|
|
private:
|
|
FontFamily(GpFontFamily *fontFamily, Status status):
|
|
nativeFontFamily(fontFamily), lastStatus(status) {}
|
|
FontFamily(const FontFamily&);
|
|
FontFamily& operator=(const FontFamily&);
|
|
|
|
Status updateStatus(Status newStatus) const
|
|
{
|
|
if (newStatus != Ok) lastStatus = newStatus;
|
|
return newStatus;
|
|
}
|
|
|
|
GpFontFamily *nativeFontFamily;
|
|
mutable Status lastStatus;
|
|
};
|
|
|
|
class InstalledFontCollection: public FontCollection
|
|
{
|
|
public:
|
|
InstalledFontCollection();
|
|
virtual ~InstalledFontCollection() {}
|
|
};
|
|
|
|
class PrivateFontCollection: public FontCollection
|
|
{
|
|
public:
|
|
PrivateFontCollection();
|
|
|
|
virtual ~PrivateFontCollection()
|
|
{
|
|
DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);
|
|
}
|
|
|
|
Status AddFontFile(const WCHAR *filename);
|
|
Status AddMemoryFont(const VOID *memory, INT length);
|
|
};
|
|
|
|
class Region: public GdiplusBase
|
|
{
|
|
friend class Graphics;
|
|
|
|
public:
|
|
static Region* FromHRGN(HRGN hrgn);
|
|
|
|
Region();
|
|
Region(const RectF& rect);
|
|
Region(const Rect& rect);
|
|
Region(const GraphicsPath *path);
|
|
Region(const BYTE *regionData, INT size);
|
|
Region(HRGN hrgn);
|
|
~Region();
|
|
Region* Clone() const;
|
|
|
|
Status Complement(const RectF& rect);
|
|
Status Complement(const Rect& rect);
|
|
Status Complement(const Region *region);
|
|
Status Complement(const GraphicsPath *path);
|
|
BOOL Equals(const Region *region, const Graphics *graphics) const;
|
|
Status Exclude(const RectF& rect);
|
|
Status Exclude(const Rect& rect);
|
|
Status Exclude(const Region *region);
|
|
Status Exclude(const GraphicsPath *path);
|
|
Status GetBounds(RectF *rect, const Graphics *graphics) const;
|
|
Status GetBounds(Rect *rect, const Graphics *graphics) const;
|
|
Status GetData(BYTE *buffer, UINT bufferSize, UINT *sizeFilled) const;
|
|
UINT GetDataSize() const;
|
|
HRGN GetHRGN(const Graphics *graphics) const;
|
|
Status GetRegionScans(const Matrix *matrix,
|
|
RectF *rects, INT *count) const;
|
|
Status GetRegionScans(const Matrix *matrix,
|
|
Rect *rects, INT *count) const;
|
|
UINT GetRegionScansCount(const Matrix *matrix) const;
|
|
Status Intersect(const RectF& rect);
|
|
Status Intersect(const Rect& rect);
|
|
Status Intersect(const Region *region);
|
|
Status Intersect(const GraphicsPath *path);
|
|
BOOL IsEmpty(const Graphics *graphics) const;
|
|
BOOL IsInfinite(const Graphics *graphics) const;
|
|
BOOL IsVisible(REAL x, REAL y,
|
|
const Graphics *graphics = NULL) const;
|
|
BOOL IsVisible(INT x, INT y,
|
|
const Graphics *graphics = NULL) const;
|
|
BOOL IsVisible(const PointF& point,
|
|
const Graphics *graphics = NULL) const;
|
|
BOOL IsVisible(const Point& point,
|
|
const Graphics *graphics = NULL) const;
|
|
BOOL IsVisible(REAL x, REAL y, REAL width, REAL height,
|
|
const Graphics *graphics = NULL) const;
|
|
BOOL IsVisible(INT x, INT y, INT width, INT height,
|
|
const Graphics *graphics = NULL) const;
|
|
BOOL IsVisible(const RectF& rect,
|
|
const Graphics *graphics = NULL) const;
|
|
BOOL IsVisible(const Rect& rect,
|
|
const Graphics *graphics = NULL) const;
|
|
Status MakeEmpty();
|
|
Status MakeInfinite();
|
|
Status Transform(const Matrix *matrix);
|
|
Status Translate(REAL dx, REAL dy);
|
|
Status Translate(INT dx, INT dy);
|
|
Status Union(const RectF& rect);
|
|
Status Union(const Rect& rect);
|
|
Status Union(const Region *region);
|
|
Status Union(const GraphicsPath *path);
|
|
Status Xor(const RectF& rect);
|
|
Status Xor(const Rect& rect);
|
|
Status Xor(const Region *region);
|
|
Status Xor(const GraphicsPath *path);
|
|
|
|
Status GetLastStatus() const
|
|
{
|
|
Status result = lastStatus;
|
|
lastStatus = Ok;
|
|
return result;
|
|
}
|
|
|
|
private:
|
|
Region(GpRegion *region, Status status):
|
|
nativeRegion(region), lastStatus(status) {}
|
|
Region(const Region&);
|
|
Region& operator=(const Region&);
|
|
|
|
Status updateStatus(Status newStatus) const
|
|
{
|
|
if (newStatus != Ok) lastStatus = newStatus;
|
|
return newStatus;
|
|
}
|
|
|
|
GpRegion *nativeRegion;
|
|
mutable Status lastStatus;
|
|
};
|
|
|
|
#endif /* __GDIPLUS_HEADERS_H */
|