Home | History | Annotate | Download | only in gdiplus
      1 /*
      2  * gdiplusheaders.h
      3  *
      4  * GDI+ Bitmap, CachedBitmap, CustomLineCap, Font, FontCollection,
      5  *      FontFamily, Image, InstalledFontCollection, PrivateFontCollection,
      6  *      Region class definitions.
      7  *      Implementation of these classes is in gdiplusimpl.h.
      8  *
      9  * This file is part of the w32api package.
     10  *
     11  * Contributors:
     12  *   Created by Markus Koenig <markus (at) stber-koenig.de>
     13  *
     14  * THIS SOFTWARE IS NOT COPYRIGHTED
     15  *
     16  * This source code is offered for use in the public domain. You may
     17  * use, modify or distribute it freely.
     18  *
     19  * This code is distributed in the hope that it will be useful but
     20  * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
     21  * DISCLAIMED. This includes but is not limited to warranties of
     22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     23  *
     24  */
     25 
     26 #ifndef __GDIPLUS_HEADERS_H
     27 #define __GDIPLUS_HEADERS_H
     28 #if __GNUC__ >=3
     29 #pragma GCC system_header
     30 #endif
     31 
     32 #ifndef __cplusplus
     33 #error "A C++ compiler is required to include gdiplusheaders.h."
     34 #endif
     35 
     36 /*
     37  * Note: Virtual inline functions (dtors, Clone()) are implemented here: If
     38  * these were defined outside class scope, the compiler would always generate
     39  * code for them (and the vtable), even if these classes were never used.
     40  */
     41 
     42 class Bitmap;
     43 class Effect;
     44 class FontCollection;
     45 class FontFamily;
     46 class Graphics;
     47 class GraphicsPath;
     48 class Matrix;
     49 class Pen;
     50 
     51 class Image: public GdiplusBase
     52 {
     53 	friend class Bitmap;
     54 	friend class Metafile;
     55 	friend class CachedBitmap;
     56 	friend class Graphics;
     57 	friend class TextureBrush;
     58 
     59 public:
     60 	static Image* FromFile(const WCHAR *filename,
     61 			BOOL useEmbeddedColorManagement = FALSE);
     62 	static Image* FromStream(IStream *stream,
     63 			BOOL useEmbeddedColorManagement = FALSE);
     64 
     65 	Image(const WCHAR *filename, BOOL useEmbeddedColorManagement = FALSE);
     66 	Image(IStream *stream, BOOL useEmbeddedColorManagement = FALSE);
     67 
     68 	virtual ~Image()
     69 	{
     70 		DllExports::GdipDisposeImage(nativeImage);
     71 	}
     72 	virtual Image* Clone() const
     73 	{
     74 		GpImage *cloneImage = NULL;
     75 		Status status = updateStatus(DllExports::GdipCloneImage(
     76 				nativeImage, &cloneImage));
     77 		if (status == Ok) {
     78 			Image *result = new Image(cloneImage, lastStatus);
     79 			if (!result) {
     80 				DllExports::GdipDisposeImage(cloneImage);
     81 				lastStatus = OutOfMemory;
     82 			}
     83 			return result;
     84 		} else {
     85 			return NULL;
     86 		}
     87 	}
     88 
     89 	Status FindFirstItem(ImageItemData *item);
     90 	Status FindNextItem(ImageItemData *item);
     91 	Status GetAllPropertyItems(UINT totalBufferSize,
     92 			UINT numProperties, PropertyItem *allItems);
     93 	Status GetBounds(RectF *srcRect, Unit *srcUnit);
     94 	Status GetEncoderParameterList(const CLSID *clsidEncoder,
     95 			UINT size, EncoderParameters *buffer);
     96 	UINT GetEncoderParameterListSize(const CLSID *clsidEncoder);
     97 	UINT GetFlags();
     98 	UINT GetFrameCount(const GUID *dimensionID);
     99 	UINT GetFrameDimensionsCount();
    100 	Status GetFrameDimensionsList(GUID *dimensionIDs, UINT count);
    101 	UINT GetHeight();
    102 	REAL GetHorizontalResolution();
    103 	Status GetItemData(ImageItemData *item);
    104 	Status GetPalette(ColorPalette *palette, INT size);
    105 	INT GetPaletteSize();
    106 	Status GetPhysicalDimension(SizeF *size);
    107 	PixelFormat GetPixelFormat();
    108 	UINT GetPropertyCount();
    109 	Status GetPropertyIdList(UINT numOfProperty, PROPID *list);
    110 	Status GetPropertyItem(PROPID propId, UINT propSize,
    111 			PropertyItem *buffer);
    112 	UINT GetPropertyItemSize(PROPID propId);
    113 	Status GetPropertySize(UINT *totalBufferSize, UINT *numProperties);
    114 	Status GetRawFormat(GUID *format);
    115 	Image* GetThumbnailImage(UINT thumbWidth, UINT thumbHeight,
    116 			GetThumbnailImageAbort callback, VOID *callbackData);
    117 	ImageType GetType() const;
    118 	REAL GetVerticalResolution();
    119 	UINT GetWidth();
    120 	Status RemovePropertyItem(PROPID propId);
    121 	Status RotateFlip(RotateFlipType rotateFlipType);
    122 	Status Save(IStream *stream, const CLSID *clsidEncoder,
    123 			const EncoderParameters *encoderParams);
    124 	Status Save(const WCHAR *filename, const CLSID *clsidEncoder,
    125 			const EncoderParameters *encoderParams);
    126 	Status SaveAdd(const EncoderParameters *encoderParams);
    127 	Status SaveAdd(Image *newImage, const EncoderParameters *encoderParams);
    128 	Status SelectActiveFrame(const GUID *dimensionID, UINT frameIndex);
    129 	Status SetAbort(GdiplusAbort *pIAbort);
    130 	Status SetPalette(const ColorPalette *palette);
    131 	Status SetPropertyItem(const PropertyItem *item);
    132 
    133 	Status GetLastStatus() const
    134 	{
    135 		Status result = lastStatus;
    136 		lastStatus = Ok;
    137 		return result;
    138 	}
    139 
    140 private:
    141 	Image(GpImage *image, Status status):
    142 		nativeImage(image), lastStatus(status) {}
    143 	Image(const Image&);
    144 	Image& operator=(const Image&);
    145 
    146 	Status updateStatus(Status newStatus) const
    147 	{
    148 		if (newStatus != Ok) lastStatus = newStatus;
    149 		return newStatus;
    150 	}
    151 
    152 	GpImage *nativeImage;
    153 	mutable Status lastStatus;
    154 };
    155 
    156 class Bitmap: public Image
    157 {
    158 public:
    159 	static Bitmap* FromBITMAPINFO(const BITMAPINFO *gdiBitmapInfo,
    160 			VOID *gdiBitmapData);
    161 	static Bitmap* FromDirectDrawSurface7(IDirectDrawSurface7 *surface);
    162 	static Bitmap* FromFile(const WCHAR *filename,
    163 			BOOL useEmbeddedColorManagement = FALSE);
    164 	static Bitmap* FromHBITMAP(HBITMAP hbm, HPALETTE hpal);
    165 	static Bitmap* FromHICON(HICON icon);
    166 	static Bitmap* FromResource(HINSTANCE hInstance,
    167 			const WCHAR *bitmapName);
    168 	static Bitmap* FromStream(IStream *stream,
    169 			BOOL useEmbeddedColorManagement = FALSE);
    170 	static Status ApplyEffect(Bitmap **inputs, INT numInputs,
    171 			Effect *effect, RECT *ROI,
    172 			RECT *outputRect, Bitmap **output);
    173 	static Status InitializePalette(ColorPalette *palette,
    174 			PaletteType paletteType, INT optimalColors,
    175 			BOOL useTransparentColor, Bitmap *bitmap);
    176 
    177 	Bitmap(const BITMAPINFO *gdiBitmapInfo, VOID *gdiBitmapData);
    178 	Bitmap(IDirectDrawSurface7 *surface);
    179 	Bitmap(const WCHAR *filename, BOOL useEmbeddedColorManagement = FALSE);
    180 	Bitmap(HBITMAP hbm, HPALETTE hpal);
    181 	Bitmap(HICON hicon);
    182 	Bitmap(HINSTANCE hInstance, const WCHAR *bitmapName);
    183 	Bitmap(IStream *stream, BOOL useEmbeddedColorManagement = FALSE);
    184 	Bitmap(INT width, INT height, Graphics *target);
    185 	Bitmap(INT width, INT height, PixelFormat format = PixelFormat32bppARGB);
    186 	Bitmap(INT width, INT height, INT stride, PixelFormat format, BYTE *scan0);
    187 
    188 	virtual ~Bitmap()
    189 	{
    190 	}
    191 	virtual Bitmap* Clone() const
    192 	{
    193 		GpImage *cloneImage = NULL;
    194 		Status status = updateStatus(DllExports::GdipCloneImage(
    195 				nativeImage, &cloneImage));
    196 		if (status == Ok) {
    197 			Bitmap *result = new Bitmap(cloneImage, lastStatus);
    198 			if (!result) {
    199 				DllExports::GdipDisposeImage(cloneImage);
    200 				lastStatus = OutOfMemory;
    201 			}
    202 			return result;
    203 		} else {
    204 			return NULL;
    205 		}
    206 	}
    207 
    208 	Bitmap* Clone(const RectF& rect, PixelFormat format) const;
    209 	Bitmap* Clone(const Rect& rect, PixelFormat format) const;
    210 	Bitmap* Clone(REAL x, REAL y, REAL width, REAL height,
    211 			PixelFormat format) const;
    212 	Bitmap* Clone(INT x, INT y, INT width, INT height,
    213 			PixelFormat format) const;
    214 
    215 	Status ApplyEffect(Effect *effect, RECT *ROI);
    216 	Status ConvertFormat(PixelFormat format, DitherType ditherType,
    217 			PaletteType paletteType, ColorPalette *palette,
    218 			REAL alphaThresholdPercent);
    219 	Status GetHBITMAP(const Color& colorBackground, HBITMAP *hbmReturn) const;
    220 	Status GetHICON(HICON *icon) const;
    221 	Status GetHistogram(HistogramFormat format, UINT numberOfEntries,
    222 			UINT *channel0, UINT *channel1,
    223 			UINT *channel2, UINT *channel3) const;
    224 	Status GetHistogramSize(HistogramFormat format,
    225 			UINT *numberOfEntries) const;
    226 	Status GetPixel(INT x, INT y, Color *color) const;
    227 	Status LockBits(const Rect *rect, UINT flags, PixelFormat format,
    228 			BitmapData *lockedBitmapData);
    229 	Status SetPixel(INT x, INT y, const Color& color);
    230 	Status SetResolution(REAL xdpi, REAL ydpi);
    231 	Status UnlockBits(BitmapData *lcokedBitmapData);
    232 
    233 private:
    234 	Bitmap(GpImage *image, Status status): Image(image, status) {}
    235 	Bitmap(const Bitmap&);
    236 	Bitmap& operator=(const Bitmap&);
    237 };
    238 
    239 class CachedBitmap: public GdiplusBase
    240 {
    241 	friend class Graphics;
    242 
    243 public:
    244 	CachedBitmap(Bitmap *bitmap, Graphics *graphics);
    245 	~CachedBitmap();
    246 
    247 	Status GetLastStatus() const
    248 	{
    249 		return lastStatus;
    250 	}
    251 
    252 private:
    253 	CachedBitmap(const CachedBitmap&);
    254 	CachedBitmap& operator=(const CachedBitmap&);
    255 
    256 	GpCachedBitmap *nativeCachedBitmap;
    257 	Status lastStatus;
    258 };
    259 
    260 class CustomLineCap: public GdiplusBase
    261 {
    262 	friend class AdjustableArrowCap;
    263 	friend class Pen;
    264 
    265 public:
    266 	CustomLineCap(const GraphicsPath *fillPath,
    267 			const GraphicsPath *strokePath,
    268 			LineCap baseCap = LineCapFlat,
    269 			REAL baseInset = 0.0f);
    270 
    271 	virtual ~CustomLineCap()
    272 	{
    273 		DllExports::GdipDeleteCustomLineCap(nativeCustomLineCap);
    274 	}
    275 	virtual CustomLineCap* Clone() const
    276 	{
    277 		GpCustomLineCap *cloneCustomLineCap = NULL;
    278 		Status status = updateStatus(DllExports::GdipCloneCustomLineCap(
    279 				nativeCustomLineCap, &cloneCustomLineCap));
    280 		if (status == Ok) {
    281 			CustomLineCap *result = new CustomLineCap(
    282 					cloneCustomLineCap, lastStatus);
    283 			if (!result) {
    284 				DllExports::GdipDeleteCustomLineCap(cloneCustomLineCap);
    285 				lastStatus = OutOfMemory;
    286 			}
    287 			return result;
    288 		} else {
    289 			return NULL;
    290 		}
    291 	}
    292 
    293 	LineCap GetBaseCap() const;
    294 	REAL GetBaseInset() const;
    295 	Status GetStrokeCaps(LineCap *startCap, LineCap *endCap) const;
    296 	LineJoin GetStrokeJoin() const;
    297 	REAL GetWidthScale() const;
    298 	Status SetBaseCap(LineCap baseCap);
    299 	Status SetBaseInset(REAL inset);
    300 	Status SetStrokeCap(LineCap strokeCap);
    301 	Status SetStrokeCaps(LineCap startCap, LineCap endCap);
    302 	Status SetStrokeJoin(LineJoin lineJoin);
    303 	Status SetWidthScale(REAL widthScale);
    304 
    305 	Status GetLastStatus() const
    306 	{
    307 		Status result = lastStatus;
    308 		lastStatus = Ok;
    309 		return result;
    310 	}
    311 
    312 private:
    313 	CustomLineCap(GpCustomLineCap *customLineCap, Status status):
    314 		nativeCustomLineCap(customLineCap), lastStatus(status) {}
    315 	CustomLineCap(const CustomLineCap&);
    316 	CustomLineCap& operator=(const CustomLineCap&);
    317 
    318 	Status updateStatus(Status newStatus) const
    319 	{
    320 		if (newStatus != Ok) lastStatus = newStatus;
    321 		return newStatus;
    322 	}
    323 
    324 	GpCustomLineCap *nativeCustomLineCap;
    325 	mutable Status lastStatus;
    326 };
    327 
    328 class Font: public GdiplusBase
    329 {
    330 	friend class Graphics;
    331 
    332 public:
    333 	Font(const FontFamily *family, REAL emSize,
    334 			INT style = FontStyleRegular,
    335 			Unit unit = UnitPoint);
    336 	Font(HDC hdc, HFONT hfont);
    337 	Font(HDC hdc, const LOGFONTA *logfont);
    338 	Font(HDC hdc, const LOGFONTW *logfont);
    339 	Font(HDC hdc);
    340 	Font(const WCHAR *familyName, REAL emSize,
    341 			INT style = FontStyleRegular,
    342 			Unit unit = UnitPoint,
    343 			const FontCollection *fontCollection = NULL);
    344 	~Font();
    345 	Font* Clone() const;
    346 
    347 	Status GetFamily(FontFamily *family) const;
    348 	REAL GetHeight(const Graphics *graphics) const;
    349 	REAL GetHeight(REAL dpi) const;
    350 	Status GetLogFontA(const Graphics *graphics, LOGFONTA *logfontA) const;
    351 	Status GetLogFontW(const Graphics *graphics, LOGFONTW *logfontW) const;
    352 	REAL GetSize() const;
    353 	INT GetStyle() const;
    354 	Unit GetUnit() const;
    355 
    356 	Status GetLastStatus() const
    357 	{
    358 		return lastStatus;
    359 	}
    360 	BOOL IsAvailable() const
    361 	{
    362 		return nativeFont != NULL;
    363 	}
    364 
    365 private:
    366 	Font(GpFont *font, Status status):
    367 		nativeFont(font), lastStatus(status) {}
    368 	Font(const Font&);
    369 	Font& operator=(const Font&);
    370 
    371 	Status updateStatus(Status newStatus) const
    372 	{
    373 		if (newStatus != Ok) lastStatus = newStatus;
    374 		return newStatus;
    375 	}
    376 
    377 	GpFont *nativeFont;
    378 	mutable Status lastStatus;
    379 };
    380 
    381 class FontCollection: public GdiplusBase
    382 {
    383 	friend class InstalledFontCollection;
    384 	friend class PrivateFontCollection;
    385 	friend class Font;
    386 	friend class FontFamily;
    387 
    388 public:
    389 	FontCollection();
    390 	virtual ~FontCollection() {}
    391 
    392 	Status GetFamilies(INT numSought, FontFamily *families,
    393 			INT *numFound) const;
    394 	INT GetFamilyCount() const;
    395 
    396 	Status GetLastStatus() const
    397 	{
    398 		return lastStatus;
    399 	}
    400 
    401 private:
    402 	FontCollection(const FontCollection&);
    403 	FontCollection& operator=(const FontCollection&);
    404 
    405 	Status updateStatus(Status newStatus) const
    406 	{
    407 		return lastStatus = newStatus;
    408 	}
    409 
    410 	GpFontCollection *nativeFontCollection;
    411 	mutable Status lastStatus;
    412 };
    413 
    414 class FontFamily: public GdiplusBase
    415 {
    416 	friend class Font;
    417 	friend class FontCollection;
    418 	friend class GraphicsPath;
    419 
    420 public:
    421 	static const FontFamily* GenericMonospace();
    422 	static const FontFamily* GenericSansSerif();
    423 	static const FontFamily* GenericSerif();
    424 
    425 	FontFamily();
    426 	FontFamily(const WCHAR *name,
    427 			const FontCollection *fontCollection = NULL);
    428 	~FontFamily();
    429 	FontFamily* Clone() const;
    430 
    431 	UINT16 GetCellAscent(INT style) const;
    432 	UINT16 GetCellDescent(INT style) const;
    433 	UINT16 GetEmHeight(INT style) const;
    434 	Status GetFamilyName(WCHAR name[LF_FACESIZE],
    435 			LANGID language = LANG_NEUTRAL) const;
    436 	UINT16 GetLineSpacing(INT style) const;
    437 	BOOL IsStyleAvailable(INT style) const;
    438 
    439 	Status GetLastStatus() const
    440 	{
    441 		Status result = lastStatus;
    442 		lastStatus = Ok;
    443 		return result;
    444 	}
    445 	BOOL IsAvailable() const
    446 	{
    447 		return nativeFontFamily != NULL;
    448 	}
    449 
    450 private:
    451 	FontFamily(GpFontFamily *fontFamily, Status status):
    452 		nativeFontFamily(fontFamily), lastStatus(status) {}
    453 	FontFamily(const FontFamily&);
    454 	FontFamily& operator=(const FontFamily&);
    455 
    456 	Status updateStatus(Status newStatus) const
    457 	{
    458 		if (newStatus != Ok) lastStatus = newStatus;
    459 		return newStatus;
    460 	}
    461 
    462 	GpFontFamily *nativeFontFamily;
    463 	mutable Status lastStatus;
    464 };
    465 
    466 class InstalledFontCollection: public FontCollection
    467 {
    468 public:
    469 	InstalledFontCollection();
    470 	virtual ~InstalledFontCollection() {}
    471 };
    472 
    473 class PrivateFontCollection: public FontCollection
    474 {
    475 public:
    476 	PrivateFontCollection();
    477 
    478 	virtual ~PrivateFontCollection()
    479 	{
    480 		DllExports::GdipDeletePrivateFontCollection(&nativeFontCollection);
    481 	}
    482 
    483 	Status AddFontFile(const WCHAR *filename);
    484 	Status AddMemoryFont(const VOID *memory, INT length);
    485 };
    486 
    487 class Region: public GdiplusBase
    488 {
    489 	friend class Graphics;
    490 
    491 public:
    492 	static Region* FromHRGN(HRGN hrgn);
    493 
    494 	Region();
    495 	Region(const RectF& rect);
    496 	Region(const Rect& rect);
    497 	Region(const GraphicsPath *path);
    498 	Region(const BYTE *regionData, INT size);
    499 	Region(HRGN hrgn);
    500 	~Region();
    501 	Region* Clone() const;
    502 
    503 	Status Complement(const RectF& rect);
    504 	Status Complement(const Rect& rect);
    505 	Status Complement(const Region *region);
    506 	Status Complement(const GraphicsPath *path);
    507 	BOOL Equals(const Region *region, const Graphics *graphics) const;
    508 	Status Exclude(const RectF& rect);
    509 	Status Exclude(const Rect& rect);
    510 	Status Exclude(const Region *region);
    511 	Status Exclude(const GraphicsPath *path);
    512 	Status GetBounds(RectF *rect, const Graphics *graphics) const;
    513 	Status GetBounds(Rect *rect, const Graphics *graphics) const;
    514 	Status GetData(BYTE *buffer, UINT bufferSize, UINT *sizeFilled) const;
    515 	UINT GetDataSize() const;
    516 	HRGN GetHRGN(const Graphics *graphics) const;
    517 	Status GetRegionScans(const Matrix *matrix,
    518 			RectF *rects, INT *count) const;
    519 	Status GetRegionScans(const Matrix *matrix,
    520 			Rect *rects, INT *count) const;
    521 	UINT GetRegionScansCount(const Matrix *matrix) const;
    522 	Status Intersect(const RectF& rect);
    523 	Status Intersect(const Rect& rect);
    524 	Status Intersect(const Region *region);
    525 	Status Intersect(const GraphicsPath *path);
    526 	BOOL IsEmpty(const Graphics *graphics) const;
    527 	BOOL IsInfinite(const Graphics *graphics) const;
    528 	BOOL IsVisible(REAL x, REAL y,
    529 			const Graphics *graphics = NULL) const;
    530 	BOOL IsVisible(INT x, INT y,
    531 			const Graphics *graphics = NULL) const;
    532 	BOOL IsVisible(const PointF& point,
    533 			const Graphics *graphics = NULL) const;
    534 	BOOL IsVisible(const Point& point,
    535 			const Graphics *graphics = NULL) const;
    536 	BOOL IsVisible(REAL x, REAL y, REAL width, REAL height,
    537 			const Graphics *graphics = NULL) const;
    538 	BOOL IsVisible(INT x, INT y, INT width, INT height,
    539 			const Graphics *graphics = NULL) const;
    540 	BOOL IsVisible(const RectF& rect,
    541 			const Graphics *graphics = NULL) const;
    542 	BOOL IsVisible(const Rect& rect,
    543 			const Graphics *graphics = NULL) const;
    544 	Status MakeEmpty();
    545 	Status MakeInfinite();
    546 	Status Transform(const Matrix *matrix);
    547 	Status Translate(REAL dx, REAL dy);
    548 	Status Translate(INT dx, INT dy);
    549 	Status Union(const RectF& rect);
    550 	Status Union(const Rect& rect);
    551 	Status Union(const Region *region);
    552 	Status Union(const GraphicsPath *path);
    553 	Status Xor(const RectF& rect);
    554 	Status Xor(const Rect& rect);
    555 	Status Xor(const Region *region);
    556 	Status Xor(const GraphicsPath *path);
    557 
    558 	Status GetLastStatus() const
    559 	{
    560 		Status result = lastStatus;
    561 		lastStatus = Ok;
    562 		return result;
    563 	}
    564 
    565 private:
    566 	Region(GpRegion *region, Status status):
    567 		nativeRegion(region), lastStatus(status) {}
    568 	Region(const Region&);
    569 	Region& operator=(const Region&);
    570 
    571 	Status updateStatus(Status newStatus) const
    572 	{
    573 		if (newStatus != Ok) lastStatus = newStatus;
    574 		return newStatus;
    575 	}
    576 
    577 	GpRegion *nativeRegion;
    578 	mutable Status lastStatus;
    579 };
    580 
    581 #endif /* __GDIPLUS_HEADERS_H */
    582