/binding/win32/gdiplusbrush.d

http://github.com/wilkie/djehuty · D · 750 lines · 538 code · 164 blank · 48 comment · 20 complexity · b716b34957babf7abb652932bace5127 MD5 · raw file

  1. /*
  2. * gdiplusbrush.d
  3. *
  4. * This module implements GdiPlusBrush.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.gdiplusbrush;
  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. /**************************************************************************\
  32. *
  33. * Copyright (c) 1998-2001, Microsoft Corp. All Rights Reserved.
  34. *
  35. * Module Name:
  36. *
  37. * GdiplusBrush.h
  38. *
  39. * Abstract:
  40. *
  41. * GDI+ Brush class
  42. *
  43. \**************************************************************************/
  44. extern(System):
  45. //--------------------------------------------------------------------------
  46. // Abstract base class for various brush types
  47. //--------------------------------------------------------------------------
  48. class Brush : GdiplusBase {
  49. ~this() {
  50. GdipDeleteBrush(nativeBrush);
  51. }
  52. Brush Clone() {
  53. GpBrush *brush = null;
  54. SetStatus(GdipCloneBrush(nativeBrush, &brush));
  55. Brush newBrush = new Brush(brush, lastResult);
  56. if (newBrush is null) {
  57. GdipDeleteBrush(brush);
  58. }
  59. return newBrush;
  60. }
  61. alias Clone dup;
  62. BrushType GetType() {
  63. BrushType type = cast(BrushType)(-1);
  64. SetStatus(GdipGetBrushType(nativeBrush, &type));
  65. return type;
  66. }
  67. Status GetLastStatus() {
  68. Status lastStatus = lastResult;
  69. lastResult = Status.Ok;
  70. return lastStatus;
  71. }
  72. protected:
  73. package this() {
  74. SetStatus(Status.NotImplemented);
  75. }
  76. package this(GpBrush* nativeBrush, Status status) {
  77. lastResult = status;
  78. SetNativeBrush(nativeBrush);
  79. }
  80. package VOID SetNativeBrush(GpBrush* nativeBrush) {
  81. this.nativeBrush = nativeBrush;
  82. }
  83. package Status SetStatus(Status status) {
  84. if (status != Status.Ok)
  85. return (lastResult = status);
  86. else
  87. return status;
  88. }
  89. package GpBrush* nativeBrush;
  90. package Status lastResult;
  91. }
  92. //--------------------------------------------------------------------------
  93. // Solid Fill Brush Object
  94. //--------------------------------------------------------------------------
  95. class SolidBrush : Brush {
  96. this(ref Color color) {
  97. GpSolidFill *brush = null;
  98. lastResult = GdipCreateSolidFill(color.GetValue(), &brush);
  99. SetNativeBrush(cast(GpBrush*)brush);
  100. }
  101. Status GetColor(Color color) {
  102. ARGB argb;
  103. if (color is null) {
  104. return SetStatus(Status.InvalidParameter);
  105. }
  106. SetStatus(GdipGetSolidFillColor(cast(GpSolidFill*)nativeBrush,
  107. &argb));
  108. color = new Color(argb);
  109. return lastResult;
  110. }
  111. Status SetColor(in Color color) {
  112. return SetStatus(GdipSetSolidFillColor(cast(GpSolidFill*)nativeBrush,
  113. color.GetValue()));
  114. }
  115. protected:
  116. package this() {
  117. }
  118. }
  119. //--------------------------------------------------------------------------
  120. // Texture Brush Fill Object
  121. //--------------------------------------------------------------------------
  122. class TextureBrush : Brush {
  123. this(in Image* image,
  124. in WrapMode wrapMode = WrapMode.WrapModeTile) {
  125. GpTexture *texture = null;
  126. lastResult = GdipCreateTexture(
  127. image.nativeImage,
  128. wrapMode, &texture);
  129. SetNativeBrush(cast(GpBrush*)texture);
  130. }
  131. // When creating a texture brush from a metafile image, the dstRect
  132. // is used to specify the size that the metafile image should be
  133. // rendered at in the device units of the destination graphics.
  134. // It is NOT used to crop the metafile image, so only the width
  135. // and height values matter for metafiles.
  136. this(in Image* image,
  137. in WrapMode wrapMode,
  138. in RectF dstRect) {
  139. GpTexture *texture = null;
  140. lastResult = GdipCreateTexture2(
  141. image.nativeImage,
  142. wrapMode,
  143. dstRect.X,
  144. dstRect.Y,
  145. dstRect.Width,
  146. dstRect.Height,
  147. &texture);
  148. SetNativeBrush(texture);
  149. }
  150. this(in Image *image,
  151. in RectF dstRect,
  152. in ImageAttributes *imageAttributes = null) {
  153. GpTexture *texture = null;
  154. lastResult = GdipCreateTextureIA(
  155. image.nativeImage,
  156. (imageAttributes !is null)?imageAttributes.nativeImageAttr:null,
  157. dstRect.X,
  158. dstRect.Y,
  159. dstRect.Width,
  160. dstRect.Height,
  161. &texture
  162. );
  163. SetNativeBrush(texture);
  164. }
  165. this(in Image *image,
  166. in Rect dstRect,
  167. in ImageAttributes *imageAttributes = null) {
  168. GpTexture *texture = null;
  169. lastResult = GdipCreateTextureIAI(
  170. image.nativeImage,
  171. (imageAttributes !is null)?imageAttributes.nativeImageAttr:null,
  172. dstRect.X,
  173. dstRect.Y,
  174. dstRect.Width,
  175. dstRect.Height,
  176. &texture
  177. );
  178. SetNativeBrush(texture);
  179. }
  180. this(in Image* image, in WrapMode wrapMode, in Rect dstRect) {
  181. GpTexture *texture = null;
  182. lastResult = GdipCreateTexture2I(
  183. image.nativeImage,
  184. wrapMode,
  185. dstRect.X,
  186. dstRect.Y,
  187. dstRect.Width,
  188. dstRect.Height,
  189. &texture);
  190. SetNativeBrush(texture);
  191. }
  192. this(in Image* image,
  193. in WrapMode wrapMode,
  194. in REAL dstX,
  195. in REAL dstY,
  196. in REAL dstWidth,
  197. in REAL dstHeight)
  198. {
  199. GpTexture *texture = null;
  200. lastResult = GdipCreateTexture2(
  201. image.nativeImage,
  202. wrapMode,
  203. dstX,
  204. dstY,
  205. dstWidth,
  206. dstHeight,
  207. &texture);
  208. SetNativeBrush(texture);
  209. }
  210. this(in Image* image,
  211. in WrapMode wrapMode,
  212. in INT dstX,
  213. in INT dstY,
  214. in INT dstWidth,
  215. in INT dstHeight) {
  216. GpTexture *texture = null;
  217. lastResult = GdipCreateTexture2I(
  218. image.nativeImage,
  219. wrapMode,
  220. dstX,
  221. dstY,
  222. dstWidth,
  223. dstHeight,
  224. &texture);
  225. SetNativeBrush(texture);
  226. }
  227. Status SetTransform(Matrix matrix) {
  228. return SetStatus(GdipSetTextureTransform(cast(GpTexture*)nativeBrush,
  229. matrix.nativeMatrix));
  230. }
  231. Status GetTransform(in Matrix matrix) {
  232. return SetStatus(GdipGetTextureTransform(cast(GpTexture*)nativeBrush,
  233. matrix.nativeMatrix));
  234. }
  235. Status ResetTransform() {
  236. return SetStatus(GdipResetTextureTransform(cast(GpTexture*)nativeBrush));
  237. }
  238. Status MultiplyTransform(in Matrix* matrix,
  239. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  240. return SetStatus(GdipMultiplyTextureTransform(cast(GpTexture*)nativeBrush,
  241. matrix.nativeMatrix,
  242. order));
  243. }
  244. Status TranslateTransform(in REAL dx,
  245. in REAL dy,
  246. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend)
  247. {
  248. return SetStatus(GdipTranslateTextureTransform(cast(GpTexture*)nativeBrush,
  249. dx, dy, order));
  250. }
  251. Status ScaleTransform(in REAL sx,
  252. in REAL sy,
  253. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  254. return SetStatus(GdipScaleTextureTransform(cast(GpTexture*)nativeBrush,
  255. sx, sy, order));
  256. }
  257. Status RotateTransform(in REAL angle,
  258. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  259. return SetStatus(GdipRotateTextureTransform(cast(GpTexture*)nativeBrush,
  260. angle, order));
  261. }
  262. Status SetWrapMode(in WrapMode wrapMode) {
  263. return SetStatus(GdipSetTextureWrapMode(cast(GpTexture*)nativeBrush,
  264. wrapMode));
  265. }
  266. WrapMode GetWrapMode() {
  267. WrapMode wrapMode;
  268. SetStatus(GdipGetTextureWrapMode(cast(GpTexture*)nativeBrush,
  269. &wrapMode));
  270. return wrapMode;
  271. }
  272. Image GetImage() {
  273. GpImage *image;
  274. SetStatus(GdipGetTextureImage(cast(GpTexture *)nativeBrush,
  275. &image));
  276. Image retimage = new Image(image, lastResult);
  277. if (retimage is null) {
  278. GdipDisposeImage(image);
  279. }
  280. return retimage;
  281. }
  282. protected:
  283. package this() {
  284. }
  285. }
  286. //--------------------------------------------------------------------------
  287. // Linear Gradient Brush Object
  288. //--------------------------------------------------------------------------
  289. class LinearGradientBrush : Brush {
  290. this(in PointF point1,
  291. in PointF point2,
  292. in Color color1,
  293. in Color color2) {
  294. GpLineGradient *brush = null;
  295. lastResult = GdipCreateLineBrush(&point1,
  296. &point2,
  297. color1.GetValue(),
  298. color2.GetValue(),
  299. WrapMode.WrapModeTile,
  300. &brush);
  301. SetNativeBrush(brush);
  302. }
  303. this(in Point point1,
  304. in Point point2,
  305. in Color color1,
  306. in Color color2) {
  307. GpLineGradient *brush = null;
  308. lastResult = GdipCreateLineBrushI(&point1,
  309. &point2,
  310. color1.GetValue(),
  311. color2.GetValue(),
  312. WrapMode.WrapModeTile,
  313. &brush);
  314. SetNativeBrush(brush);
  315. }
  316. this(in RectF rect,
  317. in Color color1,
  318. in Color color2,
  319. in LinearGradientMode mode) {
  320. GpLineGradient *brush = null;
  321. lastResult = GdipCreateLineBrushFromRect(&rect,
  322. color1.GetValue(),
  323. color2.GetValue(),
  324. mode,
  325. WrapMode.WrapModeTile,
  326. &brush);
  327. SetNativeBrush(brush);
  328. }
  329. this(in Rect rect,
  330. in Color color1,
  331. in Color color2,
  332. in LinearGradientMode mode) {
  333. GpLineGradient *brush = null;
  334. lastResult = GdipCreateLineBrushFromRectI(&rect,
  335. color1.GetValue(),
  336. color2.GetValue(),
  337. mode,
  338. WrapMode.WrapModeTile,
  339. &brush);
  340. SetNativeBrush(brush);
  341. }
  342. this(in RectF rect,
  343. in Color color1,
  344. in Color color2,
  345. in REAL angle,
  346. in BOOL isAngleScalable = FALSE)
  347. {
  348. GpLineGradient *brush = null;
  349. lastResult = GdipCreateLineBrushFromRectWithAngle(&rect,
  350. color1.GetValue(),
  351. color2.GetValue(),
  352. angle,
  353. isAngleScalable,
  354. WrapMode.WrapModeTile,
  355. &brush);
  356. SetNativeBrush(brush);
  357. }
  358. this(in Rect rect,
  359. in Color color1,
  360. in Color color2,
  361. in REAL angle,
  362. in BOOL isAngleScalable = FALSE) {
  363. GpLineGradient *brush = null;
  364. lastResult = GdipCreateLineBrushFromRectWithAngleI(&rect,
  365. color1.GetValue(),
  366. color2.GetValue(),
  367. angle,
  368. isAngleScalable,
  369. WrapMode.WrapModeTile,
  370. &brush);
  371. SetNativeBrush(brush);
  372. }
  373. Status SetLinearColors(in Color color1,
  374. in Color color2) {
  375. return SetStatus(GdipSetLineColors(cast(GpLineGradient*)nativeBrush,
  376. color1.GetValue(),
  377. color2.GetValue()));
  378. }
  379. Status GetLinearColors(ref Color[] colors) {
  380. ARGB[2] argb;
  381. colors = new Color[2];
  382. Status status = SetStatus(GdipGetLineColors(cast(GpLineGradient*) nativeBrush, argb.ptr));
  383. if (status == Status.Ok) {
  384. // use bitwise copy operator for Color copy
  385. colors[0] = new Color(argb[0]);
  386. colors[1] = new Color(argb[1]);
  387. }
  388. return status;
  389. }
  390. Status GetRectangle(RectF* rect) {
  391. return SetStatus(GdipGetLineRect(cast(GpLineGradient*)nativeBrush, rect));
  392. }
  393. Status GetRectangle(Rect* rect) {
  394. return SetStatus(GdipGetLineRectI(cast(GpLineGradient*)nativeBrush, rect));
  395. }
  396. Status SetGammaCorrection(in BOOL useGammaCorrection) {
  397. return SetStatus(GdipSetLineGammaCorrection(cast(GpLineGradient*)nativeBrush,
  398. useGammaCorrection));
  399. }
  400. BOOL GetGammaCorrection() {
  401. BOOL useGammaCorrection;
  402. SetStatus(GdipGetLineGammaCorrection(cast(GpLineGradient*)nativeBrush,
  403. &useGammaCorrection));
  404. return useGammaCorrection;
  405. }
  406. INT GetBlendCount() {
  407. INT count = 0;
  408. SetStatus(GdipGetLineBlendCount(cast(GpLineGradient*)
  409. nativeBrush,
  410. &count));
  411. return count;
  412. }
  413. Status SetBlend(in REAL* blendFactors,
  414. in REAL* blendPositions,
  415. in INT count) {
  416. return SetStatus(GdipSetLineBlend(cast(GpLineGradient*)
  417. nativeBrush,
  418. blendFactors,
  419. blendPositions,
  420. count));
  421. }
  422. Status GetBlend(REAL* blendFactors,
  423. REAL* blendPositions,
  424. in INT count) {
  425. return SetStatus(GdipGetLineBlend(cast(GpLineGradient*)nativeBrush,
  426. blendFactors,
  427. blendPositions,
  428. count));
  429. }
  430. INT GetInterpolationColorCount() {
  431. INT count = 0;
  432. SetStatus(GdipGetLinePresetBlendCount(cast(GpLineGradient*)
  433. nativeBrush,
  434. &count));
  435. return count;
  436. }
  437. Status SetInterpolationColors(in Color* presetColors,
  438. in REAL* blendPositions,
  439. in INT count) {
  440. if ((count <= 0) || !presetColors)
  441. return SetStatus(Status.InvalidParameter);
  442. ARGB *argbs = cast(ARGB*) new BYTE[count*ARGB.sizeof];
  443. if (argbs) {
  444. for (INT i = 0; i < count; i++) {
  445. argbs[i] = presetColors[i].GetValue();
  446. }
  447. Status status = SetStatus(GdipSetLinePresetBlend(
  448. cast(GpLineGradient*) nativeBrush,
  449. argbs,
  450. blendPositions,
  451. count));
  452. return status;
  453. }
  454. else {
  455. return SetStatus(Status.OutOfMemory);
  456. }
  457. }
  458. Status GetInterpolationColors(Color[] presetColors,
  459. REAL* blendPositions,
  460. in INT count) {
  461. if ((count <= 0) || !presetColors)
  462. return SetStatus(Status.InvalidParameter);
  463. ARGB[] argbs = new ARGB[count];
  464. if (!argbs) {
  465. return SetStatus(Status.OutOfMemory);
  466. }
  467. Status status = SetStatus(GdipGetLinePresetBlend(cast(GpLineGradient*)nativeBrush,
  468. argbs.ptr,
  469. blendPositions,
  470. count));
  471. if (status == Status.Ok) {
  472. for (INT i = 0; i < count; i++) {
  473. presetColors[i] = new Color(argbs[i]);
  474. }
  475. }
  476. return status;
  477. }
  478. Status SetBlendBellShape(in REAL focus,
  479. in REAL scale = 1.0f) {
  480. return SetStatus(GdipSetLineSigmaBlend(cast(GpLineGradient*)nativeBrush, focus, scale));
  481. }
  482. Status SetBlendTriangularShape(
  483. in REAL focus,
  484. in REAL scale = 1.0f
  485. ) {
  486. return SetStatus(GdipSetLineLinearBlend(cast(GpLineGradient*)nativeBrush, focus, scale));
  487. }
  488. Status SetTransform(in Matrix* matrix) {
  489. return SetStatus(GdipSetLineTransform(cast(GpLineGradient*)nativeBrush,
  490. matrix.nativeMatrix));
  491. }
  492. Status GetTransform(Matrix *matrix) {
  493. return SetStatus(GdipGetLineTransform(cast(GpLineGradient*)nativeBrush,
  494. matrix.nativeMatrix));
  495. }
  496. Status ResetTransform() {
  497. return SetStatus(GdipResetLineTransform(cast(GpLineGradient*)nativeBrush));
  498. }
  499. Status MultiplyTransform(in Matrix* matrix,
  500. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  501. return SetStatus(GdipMultiplyLineTransform(cast(GpLineGradient*)nativeBrush,
  502. matrix.nativeMatrix,
  503. order));
  504. }
  505. Status TranslateTransform(in REAL dx,
  506. in REAL dy,
  507. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  508. return SetStatus(GdipTranslateLineTransform(cast(GpLineGradient*)nativeBrush,
  509. dx, dy, order));
  510. }
  511. Status ScaleTransform(in REAL sx,
  512. in REAL sy,
  513. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  514. return SetStatus(GdipScaleLineTransform(cast(GpLineGradient*)nativeBrush,
  515. sx, sy, order));
  516. }
  517. Status RotateTransform(in REAL angle,
  518. in MatrixOrder order = MatrixOrder.MatrixOrderPrepend) {
  519. return SetStatus(GdipRotateLineTransform(cast(GpLineGradient*)nativeBrush,
  520. angle, order));
  521. }
  522. Status SetWrapMode(in WrapMode wrapMode) {
  523. return SetStatus(GdipSetLineWrapMode(cast(GpLineGradient*)nativeBrush,
  524. wrapMode));
  525. }
  526. WrapMode GetWrapMode() {
  527. WrapMode wrapMode;
  528. SetStatus(GdipGetLineWrapMode(cast(GpLineGradient*)
  529. nativeBrush,
  530. &wrapMode));
  531. return wrapMode;
  532. }
  533. protected:
  534. package this() {
  535. }
  536. }
  537. //--------------------------------------------------------------------------
  538. // PathGradientBrush object is defined
  539. // in gdipluspath.h.
  540. //--------------------------------------------------------------------------
  541. //--------------------------------------------------------------------------
  542. // Hatch Brush Object
  543. //--------------------------------------------------------------------------
  544. class HatchBrush : Brush {
  545. this(in HatchStyle hatchStyle,
  546. in Color foreColor,
  547. in Color backColor = Color.init) {
  548. GpHatch *brush = null;
  549. lastResult = GdipCreateHatchBrush(hatchStyle,
  550. foreColor.GetValue(),
  551. backColor.GetValue(),
  552. &brush);
  553. SetNativeBrush(brush);
  554. }
  555. HatchStyle GetHatchStyle() {
  556. HatchStyle hatchStyle;
  557. SetStatus(GdipGetHatchStyle(cast(GpHatch*)nativeBrush,
  558. &hatchStyle));
  559. return hatchStyle;
  560. }
  561. Status GetForegroundColor(Color* color) {
  562. ARGB argb;
  563. if (color is null) {
  564. return SetStatus(Status.InvalidParameter);
  565. }
  566. Status status = SetStatus(GdipGetHatchForegroundColor(
  567. cast(GpHatch*)nativeBrush,
  568. &argb));
  569. color.SetValue(argb);
  570. return status;
  571. }
  572. Status GetBackgroundColor(Color *color) {
  573. ARGB argb;
  574. if (color is null) {
  575. return SetStatus(Status.InvalidParameter);
  576. }
  577. Status status = SetStatus(GdipGetHatchBackgroundColor(
  578. cast(GpHatch*)nativeBrush,
  579. &argb));
  580. color.SetValue(argb);
  581. return status;
  582. }
  583. protected:
  584. package this() {
  585. }
  586. }