/binding/win32/gdiplusregion.d

http://github.com/wilkie/djehuty · D · 417 lines · 291 code · 99 blank · 27 comment · 5 complexity · 18c127e957e99e15e4090836a0ba59c7 MD5 · raw file

  1. /*
  2. * gdiplusregion.d
  3. *
  4. * This module implements GdiPlusRegion.h for D. The original
  5. * copyright info is given below.
  6. *
  7. * Author: Dave Wilkinson
  8. * Originated: November 25th, 2009
  9. *
  10. */
  11. module binding.win32.gdiplusregion;
  12. import binding.win32.windef;
  13. import binding.win32.winbase;
  14. import binding.win32.winnt;
  15. import binding.win32.wingdi;
  16. import binding.win32.guiddef;
  17. import binding.win32.gdiplusbase;
  18. import binding.win32.gdiplustypes;
  19. import binding.win32.gdiplusenums;
  20. import binding.win32.gdipluspixelformats;
  21. import binding.win32.gdiplusgpstubs;
  22. import binding.win32.gdiplusmetaheader;
  23. import binding.win32.gdipluspixelformats;
  24. import binding.win32.gdipluscolor;
  25. import binding.win32.gdipluscolormatrix;
  26. import binding.win32.gdiplusflat;
  27. import binding.win32.gdiplusimaging;
  28. import binding.win32.gdiplusbitmap;
  29. import binding.win32.gdiplusimageattributes;
  30. import binding.win32.gdiplusmatrix;
  31. import binding.win32.gdipluspath;
  32. import binding.win32.gdiplusgraphics;
  33. /**************************************************************************\
  34. *
  35. * Copyright (c) 1998-2001, Microsoft Corp. All Rights Reserved.
  36. *
  37. * Module Name:
  38. *
  39. * GdiplusRegion.h
  40. *
  41. * Abstract:
  42. *
  43. * GDI+ Region class implementation
  44. *
  45. \**************************************************************************/
  46. class Region : GdiplusBase {
  47. public:
  48. this() {
  49. GpRegion *region = null;
  50. lastResult = GdipCreateRegion(&region);
  51. SetNativeRegion(region);
  52. }
  53. this(in RectF rect) {
  54. GpRegion *region = null;
  55. lastResult = GdipCreateRegionRect(&rect, &region);
  56. SetNativeRegion(region);
  57. }
  58. this(in Rect rect) {
  59. GpRegion *region = null;
  60. lastResult = GdipCreateRegionRectI(&rect, &region);
  61. SetNativeRegion(region);
  62. }
  63. this(in GraphicsPath path) {
  64. GpRegion *region = null;
  65. lastResult = GdipCreateRegionPath(path.nativePath, &region);
  66. SetNativeRegion(region);
  67. }
  68. this(in BYTE* regionData, in INT size) {
  69. GpRegion *region = null;
  70. lastResult = GdipCreateRegionRgnData(regionData, size,
  71. &region);
  72. SetNativeRegion(region);
  73. }
  74. this(in HRGN hRgn) {
  75. GpRegion *region = null;
  76. lastResult = GdipCreateRegionHrgn(hRgn, &region);
  77. SetNativeRegion(region);
  78. }
  79. static Region FromHRGN(in HRGN hRgn) {
  80. GpRegion *region = null;
  81. if (GdipCreateRegionHrgn(hRgn, &region) == Status.Ok) {
  82. Region newRegion = new Region(region);
  83. if (newRegion is null) {
  84. GdipDeleteRegion(region);
  85. }
  86. return newRegion;
  87. }
  88. else
  89. return null;
  90. }
  91. ~this() {
  92. GdipDeleteRegion(nativeRegion);
  93. }
  94. Region Clone() {
  95. GpRegion *region = null;
  96. SetStatus(GdipCloneRegion(nativeRegion, &region));
  97. return new Region(region);
  98. }
  99. alias Clone dup;
  100. Status MakeInfinite() {
  101. return SetStatus(GdipSetInfinite(nativeRegion));
  102. }
  103. Status MakeEmpty() {
  104. return SetStatus(GdipSetEmpty(nativeRegion));
  105. }
  106. UINT GetDataSize() {
  107. UINT bufferSize = 0;
  108. SetStatus(GdipGetRegionDataSize(nativeRegion, &bufferSize));
  109. return bufferSize;
  110. }
  111. // buffer - where to put the data
  112. // bufferSize - how big the buffer is (should be at least as big as GetDataSize())
  113. // sizeFilled - if not null, this is an param that says how many bytes
  114. // of data were written to the buffer.
  115. Status GetData(BYTE* buffer, in UINT bufferSize, UINT* sizeFilled = null) {
  116. return SetStatus(GdipGetRegionData(nativeRegion, buffer, bufferSize, sizeFilled));
  117. }
  118. Status Intersect(in Rect rect) {
  119. return SetStatus(GdipCombineRegionRectI(nativeRegion, &rect, CombineMode.CombineModeIntersect));
  120. }
  121. Status Intersect(in RectF rect) {
  122. return SetStatus(GdipCombineRegionRect(nativeRegion, &rect, CombineMode.CombineModeIntersect));
  123. }
  124. Status Intersect(in GraphicsPath path) {
  125. return SetStatus(GdipCombineRegionPath(nativeRegion, path.nativePath, CombineMode.CombineModeIntersect));
  126. }
  127. Status Intersect(in Region region) {
  128. return SetStatus(GdipCombineRegionRegion(nativeRegion, region.nativeRegion, CombineMode.CombineModeIntersect));
  129. }
  130. Status Union(in Rect rect) {
  131. return SetStatus(GdipCombineRegionRectI(nativeRegion, &rect, CombineMode.CombineModeUnion));
  132. }
  133. Status Union(in RectF rect) {
  134. return SetStatus(GdipCombineRegionRect(nativeRegion, &rect, CombineMode.CombineModeUnion));
  135. }
  136. Status Union(in GraphicsPath path) {
  137. return SetStatus(GdipCombineRegionPath(nativeRegion, path.nativePath, CombineMode.CombineModeUnion));
  138. }
  139. Status Union(in Region region) {
  140. return SetStatus(GdipCombineRegionRegion(nativeRegion, region.nativeRegion, CombineMode.CombineModeUnion));
  141. }
  142. Status Xor(in Rect rect) {
  143. return SetStatus(GdipCombineRegionRectI(nativeRegion, &rect, CombineMode.CombineModeXor));
  144. }
  145. Status Xor(in RectF rect) {
  146. return SetStatus(GdipCombineRegionRect(nativeRegion, &rect, CombineMode.CombineModeXor));
  147. }
  148. Status Xor(in GraphicsPath path) {
  149. return SetStatus(GdipCombineRegionPath(nativeRegion, path.nativePath, CombineMode.CombineModeXor));
  150. }
  151. Status Xor(in Region region) {
  152. return SetStatus(GdipCombineRegionRegion(nativeRegion, region.nativeRegion, CombineMode.CombineModeXor));
  153. }
  154. Status Exclude(in Rect rect) {
  155. return SetStatus(GdipCombineRegionRectI(nativeRegion, &rect, CombineMode.CombineModeExclude));
  156. }
  157. Status Exclude(in RectF rect) {
  158. return SetStatus(GdipCombineRegionRect(nativeRegion, &rect, CombineMode.CombineModeExclude));
  159. }
  160. Status Exclude(in GraphicsPath path) {
  161. return SetStatus(GdipCombineRegionPath(nativeRegion, path.nativePath, CombineMode.CombineModeExclude));
  162. }
  163. Status Exclude(in Region region) {
  164. return SetStatus(GdipCombineRegionRegion(nativeRegion, region.nativeRegion, CombineMode.CombineModeExclude));
  165. }
  166. Status Complement(in Rect rect) {
  167. return SetStatus(GdipCombineRegionRectI(nativeRegion, &rect, CombineMode.CombineModeComplement));
  168. }
  169. Status Complement(in RectF rect) {
  170. return SetStatus(GdipCombineRegionRect(nativeRegion, &rect, CombineMode.CombineModeComplement));
  171. }
  172. Status Complement(in GraphicsPath path) {
  173. return SetStatus(GdipCombineRegionPath(nativeRegion, path.nativePath, CombineMode.CombineModeComplement));
  174. }
  175. Status Complement(in Region region) {
  176. return SetStatus(GdipCombineRegionRegion(nativeRegion, region.nativeRegion, CombineMode.CombineModeComplement));
  177. }
  178. Status Translate(in REAL dx,
  179. in REAL dy) {
  180. return SetStatus(GdipTranslateRegion(nativeRegion, dx, dy));
  181. }
  182. Status Translate(in INT dx,
  183. in INT dy) {
  184. return SetStatus(GdipTranslateRegionI(nativeRegion, dx, dy));
  185. }
  186. Status Transform(in Matrix matrix) {
  187. return SetStatus(GdipTransformRegion(nativeRegion, matrix.nativeMatrix));
  188. }
  189. Status GetBounds(ref Rect rect, in Graphics g) {
  190. return SetStatus(GdipGetRegionBoundsI(nativeRegion, g.nativeGraphics, &rect));
  191. }
  192. Status GetBounds(ref RectF rect, in Graphics g) {
  193. return SetStatus(GdipGetRegionBounds(nativeRegion, g.nativeGraphics, &rect));
  194. }
  195. HRGN GetHRGN (in Graphics g) {
  196. HRGN hrgn;
  197. SetStatus(GdipGetRegionHRgn(nativeRegion, g.nativeGraphics, &hrgn));
  198. return hrgn;
  199. }
  200. BOOL IsEmpty(in Graphics g) {
  201. BOOL booln = FALSE;
  202. SetStatus(GdipIsEmptyRegion(nativeRegion, g.nativeGraphics, &booln));
  203. return booln;
  204. }
  205. BOOL IsInfinite(in Graphics g) {
  206. BOOL booln = FALSE;
  207. SetStatus(GdipIsInfiniteRegion(nativeRegion, g.nativeGraphics, &booln));
  208. return booln;
  209. }
  210. BOOL IsVisible(in INT x,
  211. in INT y,
  212. in Graphics g = null) {
  213. return IsVisible(Point(x, y), g);
  214. }
  215. BOOL IsVisible(in Point point,
  216. in Graphics g = null) {
  217. BOOL booln = FALSE;
  218. SetStatus(GdipIsVisibleRegionPointI(nativeRegion,
  219. point.X,
  220. point.Y,
  221. (g is null)
  222. ? null : g.nativeGraphics,
  223. &booln));
  224. return booln;
  225. }
  226. BOOL IsVisible(in REAL x,
  227. in REAL y,
  228. in Graphics g = null) {
  229. return IsVisible(PointF(x, y), g);
  230. }
  231. BOOL IsVisible(in PointF point,
  232. in Graphics g = null) {
  233. BOOL booln = FALSE;
  234. SetStatus(GdipIsVisibleRegionPoint(nativeRegion, point.X, point.Y,
  235. (g is null) ? null : g.nativeGraphics,
  236. &booln));
  237. return booln;
  238. }
  239. BOOL IsVisible(in INT x,
  240. in INT y,
  241. in INT width,
  242. in INT height,
  243. in Graphics g) {
  244. return IsVisible(Rect(x, y, width, height), g);
  245. }
  246. BOOL IsVisible(in Rect rect,
  247. in Graphics g = null) {
  248. BOOL booln = FALSE;
  249. SetStatus(GdipIsVisibleRegionRectI(nativeRegion,
  250. rect.X,
  251. rect.Y,
  252. rect.Width,
  253. rect.Height,
  254. (g is null)
  255. ? null : g.nativeGraphics,
  256. &booln));
  257. return booln;
  258. }
  259. BOOL IsVisible(in REAL x,
  260. in REAL y,
  261. in REAL width,
  262. in REAL height,
  263. in Graphics g = null) {
  264. return IsVisible(RectF.init(x, y, width, height), g);
  265. }
  266. BOOL IsVisible(in RectF rect,
  267. in Graphics g = null) {
  268. BOOL booln = FALSE;
  269. SetStatus(GdipIsVisibleRegionRect(nativeRegion, rect.X,
  270. rect.Y, rect.Width,
  271. rect.Height,
  272. (g is null) ?
  273. null : g.nativeGraphics,
  274. &booln));
  275. return booln;
  276. }
  277. BOOL Equals(in Region region, in Graphics g) {
  278. BOOL booln = FALSE;
  279. SetStatus(GdipIsEqualRegion(nativeRegion, region.nativeRegion, g.nativeGraphics, &booln));
  280. return booln;
  281. }
  282. UINT GetRegionScansCount(in Matrix matrix) {
  283. UINT count = 0;
  284. SetStatus(GdipGetRegionScansCount(nativeRegion, &count, matrix.nativeMatrix));
  285. return count;
  286. }
  287. Status GetRegionScans(in Matrix matrix,
  288. RectF[] rects,
  289. ref INT count) {
  290. return SetStatus(GdipGetRegionScans(nativeRegion, rects.ptr, &count, matrix.nativeMatrix));
  291. }
  292. Status GetRegionScans(in Matrix matrix,
  293. Rect[] rects,
  294. ref INT count) {
  295. return SetStatus(GdipGetRegionScansI(nativeRegion, rects.ptr, &count, matrix.nativeMatrix));
  296. }
  297. Status GetLastStatus() {
  298. Status lastStatus = lastResult;
  299. lastResult = Status.Ok;
  300. return lastStatus;
  301. }
  302. protected:
  303. Status SetStatus(Status status) {
  304. if (status != Status.Ok)
  305. return (lastResult = status);
  306. else
  307. return status;
  308. }
  309. this(GpRegion* nativeRegion) {
  310. SetNativeRegion(nativeRegion);
  311. }
  312. VOID SetNativeRegion(GpRegion* nativeRegion) {
  313. this.nativeRegion = nativeRegion;
  314. }
  315. protected:
  316. package GpRegion* nativeRegion;
  317. package Status lastResult;
  318. }