/binding/win32/gdipluspen.d

http://github.com/wilkie/djehuty · D · 445 lines · 310 code · 107 blank · 28 comment · 16 complexity · d178bad60640d9de86b8f3551c033029 MD5 · raw file

  1. /*
  2. * gdipluspen.d
  3. *
  4. * This module implements GdiPlusPen.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.gdipluspen;
  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.gdiplusbrush;
  32. import binding.win32.gdipluslinecaps;
  33. /**************************************************************************\
  34. *
  35. * Copyright (c) 1998-2001, Microsoft Corp. All Rights Reserved.
  36. *
  37. * Module Name:
  38. *
  39. * GdiplusPen.h
  40. *
  41. * Abstract:
  42. *
  43. * GDI+ Pen class
  44. *
  45. \**************************************************************************/
  46. extern(System):
  47. //--------------------------------------------------------------------------
  48. // Pen class
  49. //--------------------------------------------------------------------------
  50. class Pen : GdiplusBase {
  51. this(in Color color,
  52. in REAL width = 1.0f) {
  53. Unit unit = Unit.UnitWorld;
  54. nativePen = null;
  55. lastResult = GdipCreatePen1(color.GetValue(),
  56. width, unit, &nativePen);
  57. }
  58. this(in Brush brush, in REAL width = 1.0f) {
  59. Unit unit = Unit.UnitWorld;
  60. nativePen = null;
  61. lastResult = GdipCreatePen2(brush.nativeBrush,
  62. width, unit, &nativePen);
  63. }
  64. ~this() {
  65. GdipDeletePen(nativePen);
  66. }
  67. Pen Clone() {
  68. GpPen *clonePen = null;
  69. lastResult = GdipClonePen(nativePen, &clonePen);
  70. return new Pen(clonePen, lastResult);
  71. }
  72. alias Clone dup;
  73. Status SetWidth(in REAL width) {
  74. return SetStatus(GdipSetPenWidth(nativePen, width));
  75. }
  76. REAL GetWidth() {
  77. REAL width;
  78. SetStatus(GdipGetPenWidth(nativePen, &width));
  79. return width;
  80. }
  81. // Set/get line caps: start, end, and dash
  82. // Line cap and join APIs by using LineCap and LineJoin enums.
  83. Status SetLineCap(in LineCap startCap,
  84. in LineCap endCap,
  85. in DashCap dashCap) {
  86. return SetStatus(GdipSetPenLineCap197819(nativePen,
  87. startCap, endCap, dashCap));
  88. }
  89. Status SetStartCap(in LineCap startCap) {
  90. return SetStatus(GdipSetPenStartCap(nativePen, startCap));
  91. }
  92. Status SetEndCap(in LineCap endCap) {
  93. return SetStatus(GdipSetPenEndCap(nativePen, endCap));
  94. }
  95. Status SetDashCap(in DashCap dashCap) {
  96. return SetStatus(GdipSetPenDashCap197819(nativePen,
  97. dashCap));
  98. }
  99. LineCap GetStartCap() {
  100. LineCap startCap;
  101. SetStatus(GdipGetPenStartCap(nativePen, &startCap));
  102. return startCap;
  103. }
  104. LineCap GetEndCap() {
  105. LineCap endCap;
  106. SetStatus(GdipGetPenEndCap(nativePen, &endCap));
  107. return endCap;
  108. }
  109. DashCap GetDashCap() {
  110. DashCap dashCap;
  111. SetStatus(GdipGetPenDashCap197819(nativePen,
  112. &dashCap));
  113. return dashCap;
  114. }
  115. Status SetLineJoin(in LineJoin lineJoin) {
  116. return SetStatus(GdipSetPenLineJoin(nativePen, lineJoin));
  117. }
  118. LineJoin GetLineJoin() {
  119. LineJoin lineJoin;
  120. SetStatus(GdipGetPenLineJoin(nativePen, &lineJoin));
  121. return lineJoin;
  122. }
  123. Status SetCustomStartCap(in CustomLineCap* customCap) {
  124. GpCustomLineCap* nativeCap = null;
  125. if(customCap)
  126. nativeCap = customCap.nativeCap;
  127. return SetStatus(GdipSetPenCustomStartCap(nativePen,
  128. nativeCap));
  129. }
  130. Status GetCustomStartCap(out CustomLineCap* customCap) {
  131. if(!customCap)
  132. return SetStatus(Status.InvalidParameter);
  133. return SetStatus(GdipGetPenCustomStartCap(nativePen,
  134. &(customCap.nativeCap)));
  135. }
  136. Status SetCustomEndCap(in CustomLineCap* customCap) {
  137. GpCustomLineCap* nativeCap = null;
  138. if(customCap)
  139. nativeCap = customCap.nativeCap;
  140. return SetStatus(GdipSetPenCustomEndCap(nativePen,
  141. nativeCap));
  142. }
  143. Status GetCustomEndCap(out CustomLineCap* customCap) {
  144. if(!customCap)
  145. return SetStatus(Status.InvalidParameter);
  146. return SetStatus(GdipGetPenCustomEndCap(nativePen,
  147. &(customCap.nativeCap)));
  148. }
  149. Status SetMiterLimit(in REAL miterLimit) {
  150. return SetStatus(GdipSetPenMiterLimit(nativePen,
  151. miterLimit));
  152. }
  153. REAL GetMiterLimit() {
  154. REAL miterLimit;
  155. SetStatus(GdipGetPenMiterLimit(nativePen, &miterLimit));
  156. return miterLimit;
  157. }
  158. Status SetAlignment(in PenAlignment penAlignment) {
  159. return SetStatus(GdipSetPenMode(nativePen, penAlignment));
  160. }
  161. PenAlignment GetAlignment() {
  162. PenAlignment penAlignment;
  163. SetStatus(GdipGetPenMode(nativePen, &penAlignment));
  164. return penAlignment;
  165. }
  166. Status SetTransform(in Matrix* matrix) {
  167. return SetStatus(GdipSetPenTransform(nativePen,
  168. matrix.nativeMatrix));
  169. }
  170. Status GetTransform(out Matrix* matrix) {
  171. return SetStatus(GdipGetPenTransform(nativePen,
  172. matrix.nativeMatrix));
  173. }
  174. Status ResetTransform() {
  175. return SetStatus(GdipResetPenTransform(nativePen));
  176. }
  177. Status MultiplyTransform(in Matrix* matrix,
  178. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  179. return SetStatus(GdipMultiplyPenTransform(nativePen,
  180. matrix.nativeMatrix,
  181. order));
  182. }
  183. Status TranslateTransform(in REAL dx,
  184. in REAL dy,
  185. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  186. return SetStatus(GdipTranslatePenTransform(nativePen,
  187. dx,
  188. dy,
  189. order));
  190. }
  191. Status ScaleTransform(in REAL sx,
  192. in REAL sy,
  193. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  194. return SetStatus(GdipScalePenTransform(nativePen,
  195. sx,
  196. sy,
  197. order));
  198. }
  199. Status RotateTransform(in REAL angle,
  200. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  201. return SetStatus(GdipRotatePenTransform(nativePen,
  202. angle,
  203. order));
  204. }
  205. PenType GetPenType() {
  206. PenType type;
  207. SetStatus(GdipGetPenFillType(nativePen, &type));
  208. return type;
  209. }
  210. Status SetColor(in Color color) {
  211. return SetStatus(GdipSetPenColor(nativePen,
  212. color.GetValue()));
  213. }
  214. Status SetBrush(in Brush brush) {
  215. return SetStatus(GdipSetPenBrushFill(nativePen,
  216. brush.nativeBrush));
  217. }
  218. Status GetColor(out Color color) {
  219. if (color is null) {
  220. return SetStatus(Status.InvalidParameter);
  221. }
  222. PenType type = GetPenType();
  223. if (type != PenType.PenTypeSolidColor) {
  224. return Status.WrongState;
  225. }
  226. ARGB argb;
  227. SetStatus(GdipGetPenColor(nativePen,
  228. &argb));
  229. if (lastResult == Status.Ok) {
  230. color.SetValue(argb);
  231. }
  232. return lastResult;
  233. }
  234. Brush GetBrush() {
  235. PenType type = GetPenType();
  236. Brush brush = null;
  237. switch(type) {
  238. case PenType.PenTypeSolidColor:
  239. brush = new SolidBrush();
  240. break;
  241. case PenType.PenTypeHatchFill:
  242. brush = new HatchBrush();
  243. break;
  244. case PenType.PenTypeTextureFill:
  245. brush = new TextureBrush();
  246. break;
  247. case PenType.PenTypePathGradient:
  248. brush = new Brush();
  249. break;
  250. case PenType.PenTypeLinearGradient:
  251. brush = new LinearGradientBrush();
  252. break;
  253. default:
  254. break;
  255. }
  256. if(brush) {
  257. GpBrush* nativeBrush;
  258. SetStatus(GdipGetPenBrushFill(nativePen,
  259. &nativeBrush));
  260. brush.SetNativeBrush(nativeBrush);
  261. }
  262. return brush;
  263. }
  264. DashStyle GetDashStyle() {
  265. DashStyle dashStyle;
  266. SetStatus(GdipGetPenDashStyle(nativePen, &dashStyle));
  267. return dashStyle;
  268. }
  269. Status SetDashStyle(in DashStyle dashStyle) {
  270. return SetStatus(GdipSetPenDashStyle(nativePen,
  271. dashStyle));
  272. }
  273. REAL GetDashOffset() {
  274. REAL dashOffset;
  275. SetStatus(GdipGetPenDashOffset(nativePen, &dashOffset));
  276. return dashOffset;
  277. }
  278. Status SetDashOffset(in REAL dashOffset) {
  279. return SetStatus(GdipSetPenDashOffset(nativePen,
  280. dashOffset));
  281. }
  282. Status SetDashPattern(in REAL* dashArray, in INT count) {
  283. return SetStatus(GdipSetPenDashArray(nativePen,
  284. dashArray,
  285. count));
  286. }
  287. INT GetDashPatternCount() {
  288. INT count = 0;
  289. SetStatus(GdipGetPenDashCount(nativePen, &count));
  290. return count;
  291. }
  292. Status GetDashPattern(out REAL* dashArray, in INT count) {
  293. if (dashArray is null || count <= 0)
  294. return SetStatus(Status.InvalidParameter);
  295. return SetStatus(GdipGetPenDashArray(nativePen,
  296. dashArray,
  297. count));
  298. }
  299. Status SetCompoundArray(in REAL* compoundArray,
  300. in INT count) {
  301. return SetStatus(GdipSetPenCompoundArray(nativePen,
  302. compoundArray,
  303. count));
  304. }
  305. INT GetCompoundArrayCount() {
  306. INT count = 0;
  307. SetStatus(GdipGetPenCompoundCount(nativePen, &count));
  308. return count;
  309. }
  310. Status GetCompoundArray(out REAL* compoundArray, in INT count) {
  311. if (compoundArray is null || count <= 0)
  312. return SetStatus(Status.InvalidParameter);
  313. return SetStatus(GdipGetPenCompoundArray(nativePen,
  314. compoundArray,
  315. count));
  316. }
  317. Status GetLastStatus() {
  318. Status lastStatus = lastResult;
  319. lastResult = Status.Ok;
  320. return lastStatus;
  321. }
  322. protected:
  323. package this(GpPen* nativePen, Status status) {
  324. lastResult = status;
  325. SetNativePen(nativePen);
  326. }
  327. VOID SetNativePen(GpPen* nativePen) {
  328. this.nativePen = nativePen;
  329. }
  330. Status SetStatus(Status status) {
  331. if (status != Status.Ok)
  332. return (lastResult = status);
  333. else
  334. return status;
  335. }
  336. package GpPen* nativePen;
  337. package Status lastResult;
  338. }