LinearGradientBrush.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. //
  2. // System.Drawing.Drawing2D.LinearGradientBrush.cs
  3. //
  4. // Authors:
  5. // Dennis Hayes ([email protected])
  6. // Ravindra ([email protected])
  7. //
  8. // (C) 2002/3 Ximian, Inc. http://www.ximian.com
  9. // (C) 2004 Novell, Inc. http://www.novell.com
  10. //
  11. using System;
  12. namespace System.Drawing.Drawing2D
  13. {
  14. /// <summary>
  15. /// Summary description for LinearGradientBrush.
  16. /// </summary>
  17. public sealed class LinearGradientBrush : Brush
  18. {
  19. Blend blend;
  20. Color [] linearColors;
  21. bool useGammaCorrection;
  22. RectangleF rectangle;
  23. ColorBlend interpolationColors;
  24. Matrix transform;
  25. WrapMode wrapMode;
  26. internal LinearGradientBrush (IntPtr native) : base (native)
  27. {
  28. }
  29. public LinearGradientBrush (Point point1, Point point2, Color color1, Color color2)
  30. {
  31. Status status = GDIPlus.GdipCreateLineBrushI (ref point1, ref point2, color1.ToArgb (), color2.ToArgb (), WrapMode.Tile, out nativeObject);
  32. GDIPlus.CheckStatus (status);
  33. Rectangle rect;
  34. status = GDIPlus.GdipGetLineRectI (nativeObject, out rect);
  35. GDIPlus.CheckStatus (status);
  36. rectangle = (RectangleF) rect;
  37. }
  38. public LinearGradientBrush (PointF point1, PointF point2, Color color1, Color color2)
  39. {
  40. Status status = GDIPlus.GdipCreateLineBrush (ref point1, ref point2, color1.ToArgb (), color2.ToArgb (), WrapMode.Tile, out nativeObject);
  41. GDIPlus.CheckStatus (status);
  42. status = GDIPlus.GdipGetLineRect (nativeObject, out rectangle);
  43. GDIPlus.CheckStatus (status);
  44. }
  45. public LinearGradientBrush (Rectangle rect, Color color1, Color color2, LinearGradientMode linearGradientMode)
  46. {
  47. Status status = GDIPlus.GdipCreateLineBrushFromRectI (ref rect, color1.ToArgb (), color2.ToArgb (), linearGradientMode, WrapMode.Tile, out nativeObject);
  48. GDIPlus.CheckStatus (status);
  49. rectangle = (RectangleF) rect;
  50. }
  51. public LinearGradientBrush (Rectangle rect, Color color1, Color color2, float angle) : this (rect, color1, color2, angle, false)
  52. {
  53. }
  54. public LinearGradientBrush (RectangleF rect, Color color1, Color color2, LinearGradientMode linearGradientMode)
  55. {
  56. Status status = GDIPlus.GdipCreateLineBrushFromRect (ref rect, color1.ToArgb (), color2.ToArgb (), linearGradientMode, WrapMode.Tile, out nativeObject);
  57. GDIPlus.CheckStatus (status);
  58. rectangle = rect;
  59. }
  60. public LinearGradientBrush (RectangleF rect, Color color1, Color color2, float angle) : this (rect, color1, color2, angle, false)
  61. {
  62. }
  63. public LinearGradientBrush (Rectangle rect, Color color1, Color color2, float angle, bool isAngleScaleable)
  64. {
  65. Status status = GDIPlus.GdipCreateLineBrushFromRectWithAngleI (ref rect, color1.ToArgb (), color2.ToArgb (), angle, isAngleScaleable, WrapMode.Tile, out nativeObject);
  66. GDIPlus.CheckStatus (status);
  67. rectangle = (RectangleF) rect;
  68. }
  69. public LinearGradientBrush (RectangleF rect, Color color1, Color color2, float angle, bool isAngleScaleable)
  70. {
  71. Status status = GDIPlus.GdipCreateLineBrushFromRectWithAngle (ref rect, color1.ToArgb (), color2.ToArgb (), angle, isAngleScaleable, WrapMode.Tile, out nativeObject);
  72. GDIPlus.CheckStatus (status);
  73. rectangle = rect;
  74. }
  75. // Public Properties
  76. public Blend Blend {
  77. get {
  78. return blend;
  79. }
  80. set {
  81. Status status = GDIPlus.GdipSetLineBlend (nativeObject, value.Factors, value.Positions, value.Factors.Length);
  82. GDIPlus.CheckStatus (status);
  83. blend = value;
  84. }
  85. }
  86. public bool GammaCorrection {
  87. get {
  88. return useGammaCorrection;
  89. }
  90. set {
  91. Status status = GDIPlus.GdipSetLineGammaCorrection (nativeObject, value);
  92. GDIPlus.CheckStatus (status);
  93. useGammaCorrection = value;
  94. }
  95. }
  96. public ColorBlend InterpolationColors {
  97. get {
  98. return interpolationColors;
  99. }
  100. set {
  101. Color [] colors = value.Colors;
  102. int [] blend = new int [colors.Length];
  103. for (int i = 0; i < colors.Length; i++)
  104. blend [i] = colors [i].ToArgb ();
  105. Status status = GDIPlus.GdipSetLinePresetBlend (nativeObject, blend, value.Positions, blend.Length);
  106. GDIPlus.CheckStatus (status);
  107. interpolationColors = value;
  108. }
  109. }
  110. public Color [] LinearColors {
  111. get {
  112. return linearColors;
  113. }
  114. set {
  115. Status status = GDIPlus.GdipSetLineColors (nativeObject, value [0].ToArgb (), value [1].ToArgb ());
  116. GDIPlus.CheckStatus (status);
  117. linearColors = value;
  118. }
  119. }
  120. public RectangleF Rectangle {
  121. get {
  122. return rectangle;
  123. }
  124. }
  125. public Matrix Transform {
  126. get {
  127. return transform;
  128. }
  129. set {
  130. Status status = GDIPlus.GdipSetLineTransform (nativeObject, value.nativeMatrix);
  131. GDIPlus.CheckStatus (status);
  132. transform = value;
  133. }
  134. }
  135. public WrapMode WrapMode {
  136. get {
  137. return wrapMode;
  138. }
  139. set {
  140. Status status = GDIPlus.GdipSetLineWrapMode (nativeObject, value);
  141. GDIPlus.CheckStatus (status);
  142. wrapMode = value;
  143. }
  144. }
  145. // Public Methods
  146. public void MultiplyTransform (Matrix matrix)
  147. {
  148. MultiplyTransform (matrix, MatrixOrder.Prepend);
  149. }
  150. public void MultiplyTransform (Matrix matrix, MatrixOrder order)
  151. {
  152. Status status = GDIPlus.GdipMultiplyLineTransform (nativeObject, matrix.nativeMatrix, order);
  153. GDIPlus.CheckStatus (status);
  154. }
  155. public void ResetTransform ()
  156. {
  157. Status status = GDIPlus.GdipResetLineTransform (nativeObject);
  158. GDIPlus.CheckStatus (status);
  159. }
  160. public void RotateTransform (float angle)
  161. {
  162. RotateTransform (angle, MatrixOrder.Prepend);
  163. }
  164. public void RotateTransform (float angle, MatrixOrder order)
  165. {
  166. Status status = GDIPlus.GdipRotateLineTransform (nativeObject, angle, order);
  167. GDIPlus.CheckStatus (status);
  168. }
  169. public void ScaleTransform (float sx, float sy)
  170. {
  171. ScaleTransform (sx, sy, MatrixOrder.Prepend);
  172. }
  173. public void ScaleTransform (float sx, float sy, MatrixOrder order)
  174. {
  175. Status status = GDIPlus.GdipScaleLineTransform (nativeObject, sx, sy, order);
  176. GDIPlus.CheckStatus (status);
  177. }
  178. public void SetBlendTriangularShape (float focus)
  179. {
  180. SetBlendTriangularShape (focus, 1.0F);
  181. }
  182. public void SetBlendTriangularShape (float focus, float scale)
  183. {
  184. Status status = GDIPlus.GdipSetLineLinearBlend (nativeObject, focus, scale);
  185. GDIPlus.CheckStatus (status);
  186. }
  187. public void SetSigmaBellShape (float focus)
  188. {
  189. SetSigmaBellShape (focus, 1.0F);
  190. }
  191. public void SetSigmaBellShape (float focus, float scale)
  192. {
  193. Status status = GDIPlus.GdipSetLineSigmaBlend (nativeObject, focus, scale);
  194. GDIPlus.CheckStatus (status);
  195. }
  196. public void TranslateTransform (float dx, float dy)
  197. {
  198. TranslateTransform (dx, dy, MatrixOrder.Prepend);
  199. }
  200. public void TranslateTransform (float dx, float dy, MatrixOrder order)
  201. {
  202. Status status = GDIPlus.GdipTranslateLineTransform (nativeObject, dx, dy, order);
  203. GDIPlus.CheckStatus (status);
  204. }
  205. public override object Clone ()
  206. {
  207. IntPtr clonePtr;
  208. Status status = GDIPlus.GdipCloneBrush (nativeObject, out clonePtr);
  209. GDIPlus.CheckStatus (status);
  210. LinearGradientBrush clone = new LinearGradientBrush (clonePtr);
  211. return clone;
  212. }
  213. }
  214. }