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@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 
~Image()68 	virtual ~Image()
69 	{
70 		DllExports::GdipDisposeImage(nativeImage);
71 	}
Clone()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 
GetLastStatus()133 	Status GetLastStatus() const
134 	{
135 		Status result = lastStatus;
136 		lastStatus = Ok;
137 		return result;
138 	}
139 
140 private:
Image(GpImage * image,Status status)141 	Image(GpImage *image, Status status):
142 		nativeImage(image), lastStatus(status) {}
143 	Image(const Image&);
144 	Image& operator=(const Image&);
145 
updateStatus(Status newStatus)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 
~Bitmap()188 	virtual ~Bitmap()
189 	{
190 	}
Clone()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:
Bitmap(GpImage * image,Status status)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 
GetLastStatus()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 
~CustomLineCap()271 	virtual ~CustomLineCap()
272 	{
273 		DllExports::GdipDeleteCustomLineCap(nativeCustomLineCap);
274 	}
Clone()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 
GetLastStatus()305 	Status GetLastStatus() const
306 	{
307 		Status result = lastStatus;
308 		lastStatus = Ok;
309 		return result;
310 	}
311 
312 private:
CustomLineCap(GpCustomLineCap * customLineCap,Status status)313 	CustomLineCap(GpCustomLineCap *customLineCap, Status status):
314 		nativeCustomLineCap(customLineCap), lastStatus(status) {}
315 	CustomLineCap(const CustomLineCap&);
316 	CustomLineCap& operator=(const CustomLineCap&);
317 
updateStatus(Status newStatus)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 
GetLastStatus()356 	Status GetLastStatus() const
357 	{
358 		return lastStatus;
359 	}
IsAvailable()360 	BOOL IsAvailable() const
361 	{
362 		return nativeFont != NULL;
363 	}
364 
365 private:
Font(GpFont * font,Status status)366 	Font(GpFont *font, Status status):
367 		nativeFont(font), lastStatus(status) {}
368 	Font(const Font&);
369 	Font& operator=(const Font&);
370 
updateStatus(Status newStatus)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();
~FontCollection()390 	virtual ~FontCollection() {}
391 
392 	Status GetFamilies(INT numSought, FontFamily *families,
393 			INT *numFound) const;
394 	INT GetFamilyCount() const;
395 
GetLastStatus()396 	Status GetLastStatus() const
397 	{
398 		return lastStatus;
399 	}
400 
401 private:
402 	FontCollection(const FontCollection&);
403 	FontCollection& operator=(const FontCollection&);
404 
updateStatus(Status newStatus)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 
GetLastStatus()439 	Status GetLastStatus() const
440 	{
441 		Status result = lastStatus;
442 		lastStatus = Ok;
443 		return result;
444 	}
IsAvailable()445 	BOOL IsAvailable() const
446 	{
447 		return nativeFontFamily != NULL;
448 	}
449 
450 private:
FontFamily(GpFontFamily * fontFamily,Status status)451 	FontFamily(GpFontFamily *fontFamily, Status status):
452 		nativeFontFamily(fontFamily), lastStatus(status) {}
453 	FontFamily(const FontFamily&);
454 	FontFamily& operator=(const FontFamily&);
455 
updateStatus(Status newStatus)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();
~InstalledFontCollection()470 	virtual ~InstalledFontCollection() {}
471 };
472 
473 class PrivateFontCollection: public FontCollection
474 {
475 public:
476 	PrivateFontCollection();
477 
~PrivateFontCollection()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 
GetLastStatus()558 	Status GetLastStatus() const
559 	{
560 		Status result = lastStatus;
561 		lastStatus = Ok;
562 		return result;
563 	}
564 
565 private:
Region(GpRegion * region,Status status)566 	Region(GpRegion *region, Status status):
567 		nativeRegion(region), lastStatus(status) {}
568 	Region(const Region&);
569 	Region& operator=(const Region&);
570 
updateStatus(Status newStatus)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