LinearGradientBrush.jvm.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. using System;
  2. using java.awt;
  3. using geom = java.awt.geom;
  4. namespace System.Drawing.Drawing2D {
  5. /// <summary>
  6. /// Summary description for LinearGradientBrush.
  7. /// </summary>
  8. public sealed class LinearGradientBrush : Brush {
  9. Blend _blend;
  10. bool _gammaCorrection;
  11. ColorBlend _interpolationColors;
  12. WrapMode _wrapmode;
  13. RectangleF _gradientRectangle;
  14. GradientPaint _nativeObject;
  15. protected override Paint NativeObject {
  16. get {
  17. return _nativeObject;
  18. }
  19. }
  20. #region Initialization
  21. internal void Init(float x1, float y1, Color color1, float x2, float y2, Color color2, bool cyclic) {
  22. _nativeObject = new GradientPaint(
  23. x1, y1,
  24. new java.awt.Color(color1.R,color1.G,color1.B,color1.A),
  25. x2, y2,
  26. new java.awt.Color(color2.R,color2.G,color2.B,color2.A), cyclic);
  27. }
  28. internal void Init(float x1, float y1, Color color1, float x2, float y2, Color color2) {
  29. Init(x1, y1, color1, x2, y2, color2, false);
  30. }
  31. internal void Init(float x1, float y1, Color color1, float x2, float y2, Color color2, float angle) {
  32. _gradientRectangle = new RectangleF(x1, y1, x2-x1, y2-y1);
  33. PointF [] points = GetMedianeEnclosingRect(x1, y1, x2, y2, angle);
  34. Init(points[0].X, points[0].Y, color1, points[1].X, points[1].Y, color2);
  35. }
  36. internal void Init(float x1,float y1, Color color1,float x2, float y2, Color color2, LinearGradientMode linearGradientMode) {
  37. _gradientRectangle = new RectangleF(x1, y1, x2-x1, y2-y1);
  38. if (linearGradientMode == LinearGradientMode.Horizontal) {
  39. Init(x1, y1, color1, x2, y1, color2);
  40. }
  41. if (linearGradientMode == LinearGradientMode.Vertical) {
  42. Init(x1, y1, color1, x1, y2, color2);
  43. }
  44. if (linearGradientMode == LinearGradientMode.BackwardDiagonal) {
  45. PointF [] points = GetMedianeEnclosingRect(x1, y1, x2, y2, false);
  46. Init(points[0].X, points[0].Y, color2, points[1].X, points[1].Y, color1);
  47. }
  48. if (linearGradientMode == LinearGradientMode.ForwardDiagonal) {
  49. PointF [] points = GetMedianeEnclosingRect(x1, y1, x2, y2, true);
  50. Init(points[0].X, points[0].Y, color1, points[1].X, points[1].Y, color2);
  51. }
  52. }
  53. #endregion
  54. #region Constructors
  55. internal LinearGradientBrush (geom.Point2D p1, java.awt.Color color1, geom.Point2D p2, java.awt.Color color2, bool cyclic) {
  56. _nativeObject = new GradientPaint(p1, color1, p2, color2, cyclic);
  57. }
  58. internal LinearGradientBrush (float x1,float y1, Color color1,float x2, float y2, Color color2, LinearGradientMode mode) {
  59. Init(x1, y1, color1, x2, y2, color2, mode);
  60. }
  61. internal LinearGradientBrush (float x1, float y1, Color color1, float x2, float y2, Color color2) {
  62. Init(x1, y2, color1, x1, y2, color2);
  63. }
  64. public LinearGradientBrush (Point point1, Point point2, Color color1, Color color2) {
  65. _gradientRectangle = new RectangleF(point1.X, point1.Y, point2.X - point1.X, point2.Y - point2.Y);
  66. Init(point1.X, point1.Y, color1, point2.X, point2.Y, color2);
  67. }
  68. public LinearGradientBrush (PointF point1, PointF point2, Color color1, Color color2) {
  69. _gradientRectangle = new RectangleF(point1.X, point1.Y, point2.X - point1.X, point2.Y - point2.Y);
  70. Init(point1.X, point1.Y, color1, point2.X, point2.Y, color2);
  71. }
  72. public LinearGradientBrush (Rectangle rect, Color color1, Color color2, LinearGradientMode linearGradientMode) {
  73. Init(rect.X, rect.Y, color1, rect.X + rect.Width, rect.Y + rect.Height, color2, linearGradientMode);
  74. }
  75. public LinearGradientBrush (RectangleF rect, Color color1, Color color2, LinearGradientMode linearGradientMode) {
  76. Init(rect.X, rect.Y, color1, rect.X + rect.Width, rect.Y + rect.Height, color2, linearGradientMode);
  77. }
  78. public LinearGradientBrush (Rectangle rect, Color color1, Color color2, float angle) {
  79. Init(rect.X, rect.Y, color1, rect.X + rect.Width, rect.Y + rect.Height, color2, angle);
  80. }
  81. public LinearGradientBrush (RectangleF rect, Color color1, Color color2, float angle) {
  82. Init(rect.X, rect.Y, color1, rect.X + rect.Width, rect.Y + rect.Height, color2, angle);
  83. }
  84. public LinearGradientBrush (Rectangle rect, Color color1, Color color2, float angle, bool isAngleScaleable):
  85. this(rect, color1, color2, angle) {
  86. }
  87. public LinearGradientBrush (RectangleF rect, Color color1, Color color2, float angle, bool isAngleScaleable):
  88. this(rect, color1, color2, angle) {
  89. }
  90. #endregion
  91. #region GetMedianeEnclosingRect
  92. internal PointF [] GetMedianeEnclosingRect(float x1, float y1, float x2, float y2, float rotateAngle) {
  93. float width = x2 - x1;
  94. float height = y2 - y1;
  95. PointF rectCenter = new PointF(x1 + width/2, y1 + height/2);
  96. float gradLen = width * ((float)Math.Cos(rotateAngle * Math.PI / 180)) +
  97. height * ((float)Math.Sin(rotateAngle * Math.PI / 180));
  98. PointF [] points = new PointF []{ new PointF(rectCenter.X - gradLen/2, rectCenter.Y),
  99. new PointF(rectCenter.X + gradLen/2, rectCenter.Y) };
  100. Matrix mx = new Matrix();
  101. mx.RotateAt((float)rotateAngle, rectCenter);
  102. mx.TransformPoints(points);
  103. return points;
  104. }
  105. internal PointF [] GetMedianeEnclosingRect(float x1, float y1, float x2, float y2, bool forwardDiagonal) {
  106. float width = x2 - x1;
  107. float height = y2 - y1;
  108. PointF rectCenter = new PointF(x1 + width/2, y1 + height/2);
  109. float rotateAngle = (float)Math.Atan2(width, height);
  110. float gradLen = width * (float)Math.Cos(rotateAngle);
  111. if (!forwardDiagonal)
  112. rotateAngle = -rotateAngle;
  113. PointF [] points = new PointF []{ new PointF(rectCenter.X - gradLen, rectCenter.Y),
  114. new PointF(rectCenter.X + gradLen, rectCenter.Y) };
  115. Matrix mx = new Matrix();
  116. mx.RotateAt((float)rotateAngle * (float)(180/Math.PI), rectCenter);
  117. mx.TransformPoints(points);
  118. return points;
  119. }
  120. #endregion
  121. #region Public Properties
  122. // FALLBACK: no functionality implemented for this property
  123. public Blend Blend {
  124. get {
  125. return _blend;
  126. }
  127. set {
  128. _blend = value;
  129. }
  130. }
  131. // FALLBACK: no functionality implemented for this property
  132. public bool GammaCorrection {
  133. get {
  134. return _gammaCorrection;
  135. }
  136. set {
  137. _gammaCorrection = value;
  138. }
  139. }
  140. // FALLBACK: no functionality implemented for this property
  141. public ColorBlend InterpolationColors {
  142. get {
  143. return _interpolationColors;
  144. }
  145. set {
  146. _interpolationColors = value;
  147. }
  148. }
  149. public Color [] LinearColors {
  150. get {
  151. Color [] cl = new Color[2];
  152. java.awt.Color c1 = ((GradientPaint)NativeObject).getColor1();
  153. java.awt.Color c2 = ((GradientPaint)NativeObject).getColor2();
  154. cl[0] = Color.FromArgb(c1.getAlpha(),c1.getRed(),c1.getGreen(),c1.getBlue());
  155. cl[1] = Color.FromArgb(c2.getAlpha(),c2.getRed(),c2.getGreen(),c2.getBlue());
  156. return cl;
  157. }
  158. set {
  159. if (value == null)
  160. throw new ArgumentNullException("colors");
  161. geom.Point2D p1 = ((GradientPaint)NativeObject).getPoint1();
  162. geom.Point2D p2 = ((GradientPaint)NativeObject).getPoint2();
  163. Init(
  164. (float)p1.getX(), (float)p1.getY(), value[0],
  165. (float)p2.getX(), (float)p2.getY(), value[1]);
  166. }
  167. }
  168. public RectangleF Rectangle {
  169. get {
  170. return _gradientRectangle;
  171. }
  172. }
  173. public Matrix Transform {
  174. get { return BrushTransform; }
  175. set { BrushTransform = value; }
  176. }
  177. // FALLBACK: not functionality implemented for this property
  178. public WrapMode WrapMode {
  179. get {
  180. return _wrapmode;
  181. }
  182. set {
  183. _wrapmode = value;
  184. }
  185. }
  186. #endregion
  187. #region Public Methods
  188. public void MultiplyTransform (Matrix matrix) {
  189. BrushMultiplyTransform(matrix, MatrixOrder.Prepend);
  190. }
  191. public void MultiplyTransform (Matrix matrix, MatrixOrder order) {
  192. BrushMultiplyTransform(matrix, order);
  193. }
  194. public void ResetTransform () {
  195. BrushResetTransform();
  196. }
  197. public void RotateTransform (float angle) {
  198. BrushRotateTransform(angle, MatrixOrder.Prepend);
  199. }
  200. public void RotateTransform (float angle, MatrixOrder order) {
  201. BrushRotateTransform(angle, order);
  202. }
  203. public void ScaleTransform (float sx, float sy) {
  204. BrushScaleTransform(sx, sy, MatrixOrder.Prepend);
  205. }
  206. public void ScaleTransform (float sx, float sy, MatrixOrder order) {
  207. BrushScaleTransform(sx, sy, order);
  208. }
  209. public void SetBlendTriangularShape (float focus) {
  210. SetBlendTriangularShape (focus, 1.0F);
  211. }
  212. public void SetBlendTriangularShape (float focus, float scale) {
  213. Color [] cl = LinearColors;
  214. geom.Point2D p1 = ((GradientPaint)NativeObject).getPoint1();
  215. geom.Point2D p2 = ((GradientPaint)NativeObject).getPoint2();
  216. geom.Point2D.Double po = new geom.Point2D.Double(
  217. (p2.getX() + p1.getX()) / 2,
  218. (p2.getY() + p1.getY()) / 2);
  219. Init(
  220. (float)p1.getX(), (float)p1.getY(), cl[0],
  221. (float)po.getX(), (float)po.getY(), cl[1], true);
  222. }
  223. public void SetSigmaBellShape (float focus) {
  224. SetSigmaBellShape (focus, 1.0F);
  225. }
  226. public void SetSigmaBellShape (float focus, float scale) {
  227. // FALLBACK: Triangle shape used
  228. SetBlendTriangularShape (focus, scale);
  229. }
  230. public void TranslateTransform (float dx, float dy) {
  231. BrushTranslateTransform (dx, dy);
  232. }
  233. public void TranslateTransform (float dx, float dy, MatrixOrder order) {
  234. BrushTranslateTransform(dx, dy, order);
  235. }
  236. public override object Clone () {
  237. LinearGradientBrush b = new LinearGradientBrush(
  238. ((GradientPaint)NativeObject).getPoint1(),
  239. ((GradientPaint)NativeObject).getColor1(),
  240. ((GradientPaint)NativeObject).getPoint2(),
  241. ((GradientPaint)NativeObject).getColor2(),
  242. ((GradientPaint)NativeObject).isCyclic());
  243. b.Transform = this.Transform;
  244. b.Blend = this.Blend;
  245. return b;
  246. }
  247. #endregion
  248. }
  249. }