OSDN Git Service

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