gdiplusheaders.h 16 KB

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