LinearGradientBrushTest.cs 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
  1. //
  2. // System.Drawing.Drawing2D.LinearGradientBrush unit tests
  3. //
  4. // Authors:
  5. // Sebastien Pouliot <[email protected]>
  6. //
  7. // Copyright (C) 2006 Novell, Inc (http://www.novell.com)
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. using System;
  29. using System.ComponentModel;
  30. using System.Drawing;
  31. using System.Drawing.Drawing2D;
  32. using System.Security.Permissions;
  33. using NUnit.Framework;
  34. namespace MonoTests.System.Drawing.Drawing2D {
  35. [TestFixture]
  36. [SecurityPermission (SecurityAction.Deny, UnmanagedCode = true)]
  37. public class LinearGradientBrushTest {
  38. private Point pt1;
  39. private Point pt2;
  40. private Color c1;
  41. private Color c2;
  42. private LinearGradientBrush default_brush;
  43. private Matrix empty_matrix;
  44. private RectangleF rect;
  45. [TestFixtureSetUp]
  46. public void FixtureSetUp ()
  47. {
  48. pt1 = new Point (0, 0);
  49. pt2 = new Point (32, 32);
  50. c1 = Color.Blue;
  51. c2 = Color.Red;
  52. default_brush = new LinearGradientBrush (pt1, pt2, c1, c2);
  53. empty_matrix = new Matrix ();
  54. rect = new RectangleF (0, 0, 32, 32);
  55. }
  56. private void CheckDefaultRectangle (string msg, RectangleF rect)
  57. {
  58. Assert.AreEqual (pt1.X, rect.X, msg + ".Rectangle.X");
  59. Assert.AreEqual (pt1.Y, rect.Y, msg + ".Rectangle.Y");
  60. Assert.AreEqual (pt2.X, rect.Width, msg + ".Rectangle.Width");
  61. Assert.AreEqual (pt2.Y, rect.Height, msg + ".Rectangle.Height");
  62. }
  63. private void CheckDefaultMatrix (Matrix matrix)
  64. {
  65. float[] elements = matrix.Elements;
  66. Assert.AreEqual (1, elements[0], 0.1, "matrix.0");
  67. Assert.AreEqual (1, elements[1], 0.1, "matrix.1");
  68. Assert.AreEqual (-1, elements[2], 0.1, "matrix.2");
  69. Assert.AreEqual (1, elements[3], 0.1, "matrix.3");
  70. Assert.AreEqual (16, elements[4], "matrix.4");
  71. Assert.AreEqual (-16, elements[5], "matrix.5");
  72. }
  73. private void CheckBrushAt45 (LinearGradientBrush lgb)
  74. {
  75. CheckDefaultRectangle ("4", lgb.Rectangle);
  76. Assert.AreEqual (1, lgb.Blend.Factors.Length, "Blend.Factors");
  77. Assert.AreEqual (1, lgb.Blend.Factors[0], "Blend.Factors [0]");
  78. Assert.AreEqual (1, lgb.Blend.Positions.Length, "Blend.Positions");
  79. // lgb.Blend.Positions [0] is always small (e-39) but never quite the same
  80. Assert.IsFalse (lgb.GammaCorrection, "GammaCorrection");
  81. Assert.AreEqual (2, lgb.LinearColors.Length, "LinearColors");
  82. Assert.IsNotNull (lgb.Transform, "Transform");
  83. CheckDefaultMatrix (lgb.Transform);
  84. }
  85. private void CheckMatrixAndRect (PointF pt1, PointF pt2, float[] testVals)
  86. {
  87. Matrix m;
  88. RectangleF rect;
  89. using (LinearGradientBrush b = new LinearGradientBrush (pt1, pt2, Color.Black, Color.White)) {
  90. m = b.Transform;
  91. rect = b.Rectangle;
  92. }
  93. Assert.AreEqual (testVals[0], m.Elements[0], 0.0001, "matrix.0");
  94. Assert.AreEqual (testVals[1], m.Elements[1], 0.0001, "matrix.1");
  95. Assert.AreEqual (testVals[2], m.Elements[2], 0.0001, "matrix.2");
  96. Assert.AreEqual (testVals[3], m.Elements[3], 0.0001, "matrix.3");
  97. Assert.AreEqual (testVals[4], m.Elements[4], 0.0001, "matrix.4");
  98. Assert.AreEqual (testVals[5], m.Elements[5], 0.0001, "matrix.5");
  99. Assert.AreEqual (testVals[6], rect.X, 0.0001, "rect.X");
  100. Assert.AreEqual (testVals[7], rect.Y, 0.0001, "rect.Y");
  101. Assert.AreEqual (testVals[8], rect.Width, 0.0001, "rect.Width");
  102. Assert.AreEqual (testVals[9], rect.Height, 0.0001, "rect.Height");
  103. }
  104. private void CheckMatrixForScalableAngle (RectangleF rect, float angle, float[] testVals)
  105. {
  106. Matrix m;
  107. using (LinearGradientBrush b = new LinearGradientBrush (rect, Color.Firebrick, Color.Lavender, angle, true)) {
  108. m = b.Transform;
  109. }
  110. Assert.AreEqual (testVals[0], m.Elements[0], 0.0001, "matrix.0");
  111. Assert.AreEqual (testVals[1], m.Elements[1], 0.0001, "matrix.1");
  112. Assert.AreEqual (testVals[2], m.Elements[2], 0.0001, "matrix.2");
  113. Assert.AreEqual (testVals[3], m.Elements[3], 0.0001, "matrix.3");
  114. Assert.AreEqual (testVals[4], m.Elements[4], 0.0001, "matrix.4");
  115. Assert.AreEqual (testVals[5], m.Elements[5], 0.0001, "matrix.5");
  116. }
  117. [Test]
  118. public void Constructor_Point_Point_Color_Color ()
  119. {
  120. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  121. CheckBrushAt45 (lgb);
  122. Assert.AreEqual (WrapMode.Tile, lgb.WrapMode, "WrapMode.Tile");
  123. lgb.WrapMode = WrapMode.TileFlipX;
  124. Assert.AreEqual (WrapMode.TileFlipX, lgb.WrapMode, "WrapMode.TileFlipX");
  125. lgb.WrapMode = WrapMode.TileFlipY;
  126. Assert.AreEqual (WrapMode.TileFlipY, lgb.WrapMode, "WrapMode.TileFlipY");
  127. lgb.WrapMode = WrapMode.TileFlipXY;
  128. Assert.AreEqual (WrapMode.TileFlipXY, lgb.WrapMode, "WrapMode.TileFlipXY");
  129. // can't set WrapMode.Clamp
  130. }
  131. [Test]
  132. public void Constructor_Point_Point_Color_Color_1 ()
  133. {
  134. PointF pt1 = new Point (100, 200);
  135. PointF pt2 = new Point (200, 200);
  136. CheckMatrixAndRect (pt1, pt2, new float[] { 1, 0, 0, 1, 0, 0, 100, 150, 100, 100 });
  137. pt1 = new Point (100, 200);
  138. pt2 = new Point (0, 200);
  139. CheckMatrixAndRect (pt1, pt2, new float[] { -1, 0, 0, -1, 100, 400, 0, 150, 100, 100 });
  140. pt1 = new Point (100, 200);
  141. pt2 = new Point (100, 300);
  142. CheckMatrixAndRect (pt1, pt2, new float[] { 0, 1, -1, 0, 350, 150, 50, 200, 100, 100 });
  143. pt1 = new Point (100, 200);
  144. pt2 = new Point (100, 100);
  145. CheckMatrixAndRect (pt1, pt2, new float[] { 0, -1, 1, 0, -50, 250, 50, 100, 100, 100 });
  146. pt1 = new Point (100, 100);
  147. pt2 = new Point (150, 225);
  148. CheckMatrixAndRect (pt1, pt2, new float[] { 1, 2.5f, -0.6896552f, 0.2758622f, 112.069f, -194.8276f, 100, 100, 50, 125 });
  149. pt1 = new Point (100, 100);
  150. pt2 = new Point (55, 200);
  151. CheckMatrixAndRect (pt1, pt2, new float[] { -1, 2.222222f, -0.7484408f, -0.3367983f, 267.2661f, 28.29753f, 55, 100, 45, 100 });
  152. pt1 = new Point (100, 100);
  153. pt2 = new Point (150, 60);
  154. CheckMatrixAndRect (pt1, pt2, new float[] { 1, -0.8000001f, 0.9756095f, 1.219512f, -78.04876f, 82.43903f, 100, 60, 50, 40 });
  155. pt1 = new Point (100, 100);
  156. pt2 = new Point (27, 59);
  157. CheckMatrixAndRect (pt1, pt2, new float[] { -1, -0.5616435f, 0.8539224f, -1.520399f, 59.11317f, 236.0361f, 27, 59, 73, 41 });
  158. }
  159. [Test]
  160. public void Constructor_RectangleF_Color_Color_Single_0 ()
  161. {
  162. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  163. CheckDefaultRectangle ("Original", lgb.Rectangle);
  164. Assert.AreEqual (1, lgb.Blend.Factors.Length, "Blend.Factors");
  165. Assert.AreEqual (1, lgb.Blend.Factors[0], "Blend.Factors[0]");
  166. Assert.AreEqual (1, lgb.Blend.Positions.Length, "Blend.Positions");
  167. // lgb.Blend.Positions [0] is always small (e-39) but never quite the same
  168. Assert.IsFalse (lgb.GammaCorrection, "GammaCorrection");
  169. Assert.AreEqual (c1.ToArgb (), lgb.LinearColors[0].ToArgb (), "LinearColors[0]");
  170. Assert.AreEqual (c2.ToArgb (), lgb.LinearColors[1].ToArgb (), "LinearColors[1]");
  171. Assert.AreEqual (rect, lgb.Rectangle, "Rectangle");
  172. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity");
  173. Assert.AreEqual (WrapMode.Tile, lgb.WrapMode, "WrapMode");
  174. Matrix matrix = new Matrix (2, -1, 1, 2, 10, 10);
  175. lgb.Transform = matrix;
  176. Assert.AreEqual (matrix, lgb.Transform, "Transform");
  177. }
  178. [Test]
  179. public void Constructor_RectangleF_Color_Color_Single_22_5 ()
  180. {
  181. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 22.5f);
  182. CheckDefaultRectangle ("Original", lgb.Rectangle);
  183. float[] elements = lgb.Transform.Elements;
  184. Assert.AreEqual (1.207107, elements[0], 0.0001, "matrix.0");
  185. Assert.AreEqual (0.5, elements[1], 0.0001, "matrix.1");
  186. Assert.AreEqual (-0.5, elements[2], 0.0001, "matrix.2");
  187. Assert.AreEqual (1.207107, elements[3], 0.0001, "matrix.3");
  188. Assert.AreEqual (4.686291, elements[4], 0.0001, "matrix.4");
  189. Assert.AreEqual (-11.313709, elements[5], 0.0001, "matrix.5");
  190. }
  191. [Test]
  192. public void Constructor_RectangleF_Color_Color_Single_45 ()
  193. {
  194. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 45f);
  195. CheckBrushAt45 (lgb);
  196. }
  197. [Test]
  198. public void Constructor_RectangleF_Color_Color_Single_90 ()
  199. {
  200. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 90f);
  201. CheckDefaultRectangle ("Original", lgb.Rectangle);
  202. float[] elements = lgb.Transform.Elements;
  203. Assert.AreEqual (0, elements[0], 0.0001, "matrix.0");
  204. Assert.AreEqual (1, elements[1], 0.0001, "matrix.1");
  205. Assert.AreEqual (-1, elements[2], 0.0001, "matrix.2");
  206. Assert.AreEqual (0, elements[3], 0.0001, "matrix.3");
  207. Assert.AreEqual (32, elements[4], 0.0001, "matrix.4");
  208. Assert.AreEqual (0, elements[5], 0.0001, "matrix.5");
  209. }
  210. [Test]
  211. public void Constructor_RectangleF_Color_Color_Single_135 ()
  212. {
  213. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 135f);
  214. CheckDefaultRectangle ("Original", lgb.Rectangle);
  215. float[] elements = lgb.Transform.Elements;
  216. Assert.AreEqual (-1, elements[0], 0.0001, "matrix.0");
  217. Assert.AreEqual (1, elements[1], 0.0001, "matrix.1");
  218. Assert.AreEqual (-1, elements[2], 0.0001, "matrix.2");
  219. Assert.AreEqual (-1, elements[3], 0.0001, "matrix.3");
  220. Assert.AreEqual (48, elements[4], 0.0001, "matrix.4");
  221. Assert.AreEqual (16, elements[5], 0.0001, "matrix.5");
  222. }
  223. [Test]
  224. public void Constructor_RectangleF_Color_Color_Single_180 ()
  225. {
  226. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 180f);
  227. CheckDefaultRectangle ("Original", lgb.Rectangle);
  228. float[] elements = lgb.Transform.Elements;
  229. Assert.AreEqual (-1, elements[0], 0.0001, "matrix.0");
  230. Assert.AreEqual (0, elements[1], 0.0001, "matrix.1");
  231. Assert.AreEqual (0, elements[2], 0.0001, "matrix.2");
  232. Assert.AreEqual (-1, elements[3], 0.0001, "matrix.3");
  233. Assert.AreEqual (32, elements[4], 0.0001, "matrix.4");
  234. Assert.AreEqual (32, elements[5], 0.0001, "matrix.5");
  235. }
  236. [Test]
  237. public void Constructor_RectangleF_Color_Color_Single_270 ()
  238. {
  239. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 270f);
  240. CheckDefaultRectangle ("Original", lgb.Rectangle);
  241. float[] elements = lgb.Transform.Elements;
  242. Assert.AreEqual (0, elements[0], 0.0001, "matrix.0");
  243. Assert.AreEqual (-1, elements[1], 0.0001, "matrix.1");
  244. Assert.AreEqual (1, elements[2], 0.0001, "matrix.2");
  245. Assert.AreEqual (0, elements[3], 0.0001, "matrix.3");
  246. Assert.AreEqual (0, elements[4], 0.0001, "matrix.4");
  247. Assert.AreEqual (32, elements[5], 0.0001, "matrix.5");
  248. }
  249. [Test]
  250. public void Constructor_RectangleF_Color_Color_Single_315 ()
  251. {
  252. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 315f);
  253. CheckDefaultRectangle ("Original", lgb.Rectangle);
  254. float[] elements = lgb.Transform.Elements;
  255. Assert.AreEqual (1, elements[0], 0.0001, "matrix.0");
  256. Assert.AreEqual (-1, elements[1], 0.0001, "matrix.1");
  257. Assert.AreEqual (1, elements[2], 0.0001, "matrix.2");
  258. Assert.AreEqual (1, elements[3], 0.0001, "matrix.3");
  259. Assert.AreEqual (-16, elements[4], 0.0001, "matrix.4");
  260. Assert.AreEqual (16, elements[5], 0.0001, "matrix.5");
  261. }
  262. [Test]
  263. public void Constructor_RectangleF_Color_Color_Single_360()
  264. {
  265. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 360f);
  266. CheckDefaultRectangle ("Original", lgb.Rectangle);
  267. float[] elements = lgb.Transform.Elements;
  268. // just like 0'
  269. Assert.AreEqual (1, elements[0], 0.0001, "matrix.0");
  270. Assert.AreEqual (0, elements[1], 0.0001, "matrix.1");
  271. Assert.AreEqual (0, elements[2], 0.0001, "matrix.2");
  272. Assert.AreEqual (1, elements[3], 0.0001, "matrix.3");
  273. Assert.AreEqual (0, elements[4], 0.0001, "matrix.4");
  274. Assert.AreEqual (0, elements[5], 0.0001, "matrix.5");
  275. }
  276. [Test]
  277. public void Constructor_RectangleF_Color_Color_Single_540 ()
  278. {
  279. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 540f);
  280. CheckDefaultRectangle ("Original", lgb.Rectangle);
  281. float[] elements = lgb.Transform.Elements;
  282. // just like 180'
  283. Assert.AreEqual (-1, elements[0], 0.0001, "matrix.0");
  284. Assert.AreEqual (0, elements[1], 0.0001, "matrix.1");
  285. Assert.AreEqual (0, elements[2], 0.0001, "matrix.2");
  286. Assert.AreEqual (-1, elements[3], 0.0001, "matrix.3");
  287. Assert.AreEqual (32, elements[4], 0.0001, "matrix.4");
  288. Assert.AreEqual (32, elements[5], 0.0001, "matrix.5");
  289. }
  290. [Test]
  291. [ExpectedException (typeof (ArgumentException))]
  292. public void InterpolationColors_Colors_InvalidBlend ()
  293. {
  294. // default Blend doesn't allow getting this property
  295. Assert.IsNotNull (default_brush.InterpolationColors.Colors);
  296. }
  297. [Test]
  298. [ExpectedException (typeof (ArgumentException))]
  299. public void InterpolationColors_Positions_InvalidBlend ()
  300. {
  301. // default Blend doesn't allow getting this property
  302. Assert.IsNotNull (default_brush.InterpolationColors.Positions);
  303. }
  304. [Test]
  305. [ExpectedException (typeof (IndexOutOfRangeException))]
  306. public void LinearColors_Empty ()
  307. {
  308. default_brush.LinearColors = new Color[0];
  309. }
  310. [Test]
  311. [ExpectedException (typeof (IndexOutOfRangeException))]
  312. public void LinearColors_One ()
  313. {
  314. default_brush.LinearColors = new Color[1];
  315. }
  316. [Test]
  317. public void LinearColors_Two ()
  318. {
  319. Assert.AreEqual (Color.FromArgb (255, 0, 0, 255), default_brush.LinearColors[0], "0");
  320. Assert.AreEqual (Color.FromArgb (255, 255, 0, 0), default_brush.LinearColors[1], "1");
  321. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  322. lgb.LinearColors = new Color[2] { Color.Black, Color.White };
  323. // not the same, the alpha is changed to 255 so they can't compare
  324. Assert.AreEqual (Color.FromArgb (255, 0, 0, 0), lgb.LinearColors[0], "0");
  325. Assert.AreEqual (Color.FromArgb (255, 255, 255, 255), lgb.LinearColors[1], "1");
  326. }
  327. [Test]
  328. public void LinearColors_Three ()
  329. {
  330. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  331. lgb.LinearColors = new Color[3] { Color.Red, Color.Green, Color.Blue };
  332. // not the same, the alpha is changed to 255 so they can't compare
  333. Assert.AreEqual (Color.FromArgb (255, 255, 0, 0), lgb.LinearColors[0], "0");
  334. Assert.AreEqual (Color.FromArgb (255, 0, 128, 0), lgb.LinearColors[1], "1");
  335. }
  336. [Test]
  337. public void Rectangle ()
  338. {
  339. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  340. CheckDefaultRectangle ("Original", lgb.Rectangle);
  341. lgb.MultiplyTransform (new Matrix (2, 0, 0, 2, 2, 2));
  342. CheckDefaultRectangle ("Multiply", lgb.Rectangle);
  343. lgb.ResetTransform ();
  344. CheckDefaultRectangle ("Reset", lgb.Rectangle);
  345. lgb.RotateTransform (90);
  346. CheckDefaultRectangle ("Rotate", lgb.Rectangle);
  347. lgb.ScaleTransform (4, 0.25f);
  348. CheckDefaultRectangle ("Scale", lgb.Rectangle);
  349. lgb.TranslateTransform (-10, -20);
  350. CheckDefaultRectangle ("Translate", lgb.Rectangle);
  351. lgb.SetBlendTriangularShape (0.5f);
  352. CheckDefaultRectangle ("SetBlendTriangularShape", lgb.Rectangle);
  353. lgb.SetSigmaBellShape (0.5f);
  354. CheckDefaultRectangle ("SetSigmaBellShape", lgb.Rectangle);
  355. }
  356. [Test]
  357. [ExpectedException (typeof (ArgumentNullException))]
  358. public void Transform_Null ()
  359. {
  360. default_brush.Transform = null;
  361. }
  362. [Test]
  363. public void Transform_Empty ()
  364. {
  365. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  366. lgb.Transform = new Matrix ();
  367. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity");
  368. }
  369. [Test]
  370. [ExpectedException (typeof (ArgumentException))]
  371. public void Transform_NonInvertible ()
  372. {
  373. default_brush.Transform = new Matrix (123, 24, 82, 16, 47, 30);
  374. }
  375. [Test]
  376. public void WrapMode_AllValid ()
  377. {
  378. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  379. lgb.WrapMode = WrapMode.Tile;
  380. Assert.AreEqual (WrapMode.Tile, lgb.WrapMode, "WrapMode.Tile");
  381. lgb.WrapMode = WrapMode.TileFlipX;
  382. Assert.AreEqual (WrapMode.TileFlipX, lgb.WrapMode, "WrapMode.TileFlipX");
  383. lgb.WrapMode = WrapMode.TileFlipY;
  384. Assert.AreEqual (WrapMode.TileFlipY, lgb.WrapMode, "WrapMode.TileFlipY");
  385. lgb.WrapMode = WrapMode.TileFlipXY;
  386. Assert.AreEqual (WrapMode.TileFlipXY, lgb.WrapMode, "WrapMode.TileFlipXY");
  387. }
  388. [Test]
  389. [ExpectedException (typeof (ArgumentException))]
  390. public void WrapMode_Clamp ()
  391. {
  392. default_brush.WrapMode = WrapMode.Clamp;
  393. }
  394. [Test]
  395. [ExpectedException (typeof (InvalidEnumArgumentException))]
  396. public void WrapMode_Invalid ()
  397. {
  398. default_brush.WrapMode = (WrapMode) Int32.MinValue;
  399. }
  400. [Test]
  401. public void Clone ()
  402. {
  403. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  404. LinearGradientBrush clone = (LinearGradientBrush) lgb.Clone ();
  405. Assert.AreEqual (lgb.Blend.Factors.Length, clone.Blend.Factors.Length, "Blend.Factors.Length");
  406. Assert.AreEqual (lgb.Blend.Positions.Length, clone.Blend.Positions.Length, "Blend.Positions.Length");
  407. Assert.AreEqual (lgb.GammaCorrection, clone.GammaCorrection, "GammaCorrection");
  408. Assert.AreEqual (lgb.LinearColors.Length, clone.LinearColors.Length, "LinearColors.Length");
  409. Assert.AreEqual (lgb.LinearColors.Length, clone.LinearColors.Length, "LinearColors.Length");
  410. Assert.AreEqual (lgb.Rectangle, clone.Rectangle, "Rectangle");
  411. Assert.AreEqual (lgb.Transform, clone.Transform, "Transform");
  412. Assert.AreEqual (lgb.WrapMode, clone.WrapMode, "WrapMode");
  413. }
  414. [Test]
  415. [ExpectedException (typeof (ArgumentNullException))]
  416. public void MultiplyTransform1_Null ()
  417. {
  418. default_brush.MultiplyTransform (null);
  419. }
  420. [Test]
  421. [ExpectedException (typeof (ArgumentNullException))]
  422. public void MultiplyTransform2_Null ()
  423. {
  424. default_brush.MultiplyTransform (null, MatrixOrder.Append);
  425. }
  426. [Test]
  427. public void MultiplyTransform2_Invalid ()
  428. {
  429. default_brush.MultiplyTransform (empty_matrix, (MatrixOrder) Int32.MinValue);
  430. }
  431. [Test]
  432. [ExpectedException (typeof (ArgumentException))]
  433. public void MultiplyTransform_NonInvertible ()
  434. {
  435. Matrix noninvertible = new Matrix (123, 24, 82, 16, 47, 30);
  436. default_brush.MultiplyTransform (noninvertible);
  437. }
  438. [Test]
  439. public void ResetTransform ()
  440. {
  441. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  442. Assert.IsFalse (lgb.Transform.IsIdentity, "Transform.IsIdentity");
  443. lgb.ResetTransform ();
  444. Assert.IsTrue (lgb.Transform.IsIdentity, "Reset.IsIdentity");
  445. }
  446. [Test]
  447. public void RotateTransform ()
  448. {
  449. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  450. lgb.RotateTransform (90);
  451. float[] elements = lgb.Transform.Elements;
  452. Assert.AreEqual (0, elements[0], 0.1, "matrix.0");
  453. Assert.AreEqual (1, elements[1], 0.1, "matrix.1");
  454. Assert.AreEqual (-1, elements[2], 0.1, "matrix.2");
  455. Assert.AreEqual (0, elements[3], 0.1, "matrix.3");
  456. Assert.AreEqual (0, elements[4], 0.1, "matrix.4");
  457. Assert.AreEqual (0, elements[5], 0.1, "matrix.5");
  458. lgb.RotateTransform (270);
  459. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity");
  460. }
  461. [Test]
  462. [NUnit.Framework.Category ("NotWorking")]
  463. public void RotateTransform_Max ()
  464. {
  465. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  466. lgb.RotateTransform (Single.MaxValue);
  467. float[] elements = lgb.Transform.Elements;
  468. Assert.AreEqual (5.93904E+36, elements[0], 1e32, "matrix.0");
  469. Assert.AreEqual (5.93904E+36, elements[1], 1e32, "matrix.1");
  470. Assert.AreEqual (-5.93904E+36, elements[2], 1e32, "matrix.2");
  471. Assert.AreEqual (5.93904E+36, elements[3], 1e32, "matrix.3");
  472. Assert.AreEqual (0, elements[4], 0.1, "matrix.4");
  473. Assert.AreEqual (0, elements[5], 0.1, "matrix.5");
  474. }
  475. [Test]
  476. [NUnit.Framework.Category ("NotWorking")]
  477. public void RotateTransform_Min ()
  478. {
  479. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  480. lgb.RotateTransform (Single.MinValue);
  481. float[] elements = lgb.Transform.Elements;
  482. Assert.AreEqual (-5.93904E+36, elements[0], 1e32, "matrix.0");
  483. Assert.AreEqual (-5.93904E+36, elements[1], 1e32, "matrix.1");
  484. Assert.AreEqual (5.93904E+36, elements[2], 1e32, "matrix.2");
  485. Assert.AreEqual (-5.93904E+36, elements[3], 1e32, "matrix.3");
  486. Assert.AreEqual (0, elements[4], 0.1, "matrix.4");
  487. Assert.AreEqual (0, elements[5], 0.1, "matrix.5");
  488. }
  489. [Test]
  490. [ExpectedException (typeof (ArgumentException))]
  491. public void RotateTransform_InvalidOrder ()
  492. {
  493. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  494. lgb.RotateTransform (720, (MatrixOrder) Int32.MinValue);
  495. }
  496. [Test]
  497. public void ScaleTransform ()
  498. {
  499. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  500. lgb.ScaleTransform (2, 4);
  501. float[] elements = lgb.Transform.Elements;
  502. Assert.AreEqual (2, elements[0], 0.1, "matrix.0");
  503. Assert.AreEqual (0, elements[1], 0.1, "matrix.1");
  504. Assert.AreEqual (0, elements[2], 0.1, "matrix.2");
  505. Assert.AreEqual (4, elements[3], 0.1, "matrix.3");
  506. Assert.AreEqual (0, elements[4], 0.1, "matrix.4");
  507. Assert.AreEqual (0, elements[5], 0.1, "matrix.5");
  508. lgb.ScaleTransform (0.5f, 0.25f);
  509. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity");
  510. }
  511. [Test]
  512. public void ScaleTransform_45 ()
  513. {
  514. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 45f);
  515. lgb.ScaleTransform (3, 3);
  516. float[] elements = lgb.Transform.Elements;
  517. Assert.AreEqual (3, elements[0], 0.1, "matrix.0");
  518. Assert.AreEqual (3, elements[1], 0.1, "matrix.1");
  519. Assert.AreEqual (-3, elements[2], 0.1, "matrix.2");
  520. Assert.AreEqual (3, elements[3], 0.1, "matrix.3");
  521. Assert.AreEqual (16, elements[4], 0.1, "matrix.4");
  522. Assert.AreEqual (-16, elements[5], 0.1, "matrix.5");
  523. }
  524. [Test]
  525. public void ScaleTransform_MaxMin ()
  526. {
  527. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  528. lgb.ScaleTransform (Single.MaxValue, Single.MinValue);
  529. float[] elements = lgb.Transform.Elements;
  530. Assert.AreEqual (Single.MaxValue, elements[0], 1e33, "matrix.0");
  531. Assert.AreEqual (0, elements[1], 0.1, "matrix.1");
  532. Assert.AreEqual (0, elements[2], 0.1, "matrix.2");
  533. Assert.AreEqual (Single.MinValue, elements[3], 1e33, "matrix.3");
  534. Assert.AreEqual (0, elements[4], 0.1, "matrix.4");
  535. Assert.AreEqual (0, elements[5], 0.1, "matrix.5");
  536. }
  537. [Test]
  538. [ExpectedException (typeof (ArgumentException))]
  539. public void ScaleTransform_InvalidOrder ()
  540. {
  541. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  542. lgb.ScaleTransform (1, 1, (MatrixOrder) Int32.MinValue);
  543. }
  544. [Test]
  545. public void SetBlendTriangularShape_Focus ()
  546. {
  547. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  548. // max valid
  549. lgb.SetBlendTriangularShape (1);
  550. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  551. // min valid
  552. lgb.SetBlendTriangularShape (0);
  553. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  554. // middle
  555. lgb.SetBlendTriangularShape (0.5f);
  556. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  557. // no impact on matrix
  558. }
  559. [Test]
  560. public void SetBlendTriangularShape_Scale ()
  561. {
  562. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  563. // max valid
  564. lgb.SetBlendTriangularShape (0, 1);
  565. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  566. // min valid
  567. lgb.SetBlendTriangularShape (1, 0);
  568. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  569. // middle
  570. lgb.SetBlendTriangularShape (0.5f, 0.5f);
  571. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  572. // no impact on matrix
  573. }
  574. [Test]
  575. [ExpectedException (typeof (ArgumentException))]
  576. public void SetBlendTriangularShape_FocusTooSmall ()
  577. {
  578. default_brush.SetBlendTriangularShape (-1);
  579. }
  580. [Test]
  581. [ExpectedException (typeof (ArgumentException))]
  582. public void SetBlendTriangularShape_FocusTooBig ()
  583. {
  584. default_brush.SetBlendTriangularShape (1.01f);
  585. }
  586. [Test]
  587. [ExpectedException (typeof (ArgumentException))]
  588. public void SetBlendTriangularShape_ScaleTooSmall ()
  589. {
  590. default_brush.SetBlendTriangularShape (1, -1);
  591. }
  592. [Test]
  593. [ExpectedException (typeof (ArgumentException))]
  594. public void SetBlendTriangularShape_ScaleTooBig ()
  595. {
  596. default_brush.SetBlendTriangularShape (1, 1.01f);
  597. }
  598. [Test]
  599. public void SetSigmaBellShape_Focus ()
  600. {
  601. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  602. // max valid
  603. lgb.SetSigmaBellShape (1);
  604. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  605. // min valid
  606. lgb.SetSigmaBellShape (0);
  607. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  608. // middle
  609. lgb.SetSigmaBellShape (0.5f);
  610. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  611. // no impact on matrix
  612. }
  613. [Test]
  614. public void SetSigmaBellShape_Scale ()
  615. {
  616. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  617. // max valid
  618. lgb.SetSigmaBellShape (0, 1);
  619. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-1");
  620. // min valid
  621. lgb.SetSigmaBellShape (1, 0);
  622. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-2");
  623. // middle
  624. lgb.SetSigmaBellShape (0.5f, 0.5f);
  625. Assert.IsTrue (lgb.Transform.IsIdentity, "Transform.IsIdentity-3");
  626. // no impact on matrix
  627. }
  628. [Test]
  629. [ExpectedException (typeof (ArgumentException))]
  630. public void SetSigmaBellShape_FocusTooSmall ()
  631. {
  632. default_brush.SetSigmaBellShape (-1);
  633. }
  634. [Test]
  635. [ExpectedException (typeof (ArgumentException))]
  636. public void SetSigmaBellShape_FocusTooBig ()
  637. {
  638. default_brush.SetSigmaBellShape (1.01f);
  639. }
  640. [Test]
  641. [ExpectedException (typeof (ArgumentException))]
  642. public void SetSigmaBellShape_ScaleTooSmall ()
  643. {
  644. default_brush.SetSigmaBellShape (1, -1);
  645. }
  646. [Test]
  647. [ExpectedException (typeof (ArgumentException))]
  648. public void SetSigmaBellShape_ScaleTooBig ()
  649. {
  650. default_brush.SetSigmaBellShape (1, 1.01f);
  651. }
  652. [Test]
  653. public void TranslateTransform ()
  654. {
  655. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 0f);
  656. lgb.TranslateTransform (1, 1);
  657. float[] elements = lgb.Transform.Elements;
  658. Assert.AreEqual (1, elements[0], 0.1, "matrix.0");
  659. Assert.AreEqual (0, elements[1], 0.1, "matrix.1");
  660. Assert.AreEqual (0, elements[2], 0.1, "matrix.2");
  661. Assert.AreEqual (1, elements[3], 0.1, "matrix.3");
  662. Assert.AreEqual (1, elements[4], 0.1, "matrix.4");
  663. Assert.AreEqual (1, elements[5], 0.1, "matrix.5");
  664. lgb.TranslateTransform (-1, -1);
  665. // strangely lgb.Transform.IsIdentity is false
  666. elements = lgb.Transform.Elements;
  667. Assert.AreEqual (1, elements[0], 0.1, "revert.matrix.0");
  668. Assert.AreEqual (0, elements[1], 0.1, "revert.matrix.1");
  669. Assert.AreEqual (0, elements[2], 0.1, "revert.matrix.2");
  670. Assert.AreEqual (1, elements[3], 0.1, "revert.matrix.3");
  671. Assert.AreEqual (0, elements[4], 0.1, "revert.matrix.4");
  672. Assert.AreEqual (0, elements[5], 0.1, "revert.matrix.5");
  673. }
  674. [Test]
  675. [ExpectedException (typeof (ArgumentException))]
  676. public void TranslateTransform_InvalidOrder ()
  677. {
  678. LinearGradientBrush lgb = new LinearGradientBrush (pt1, pt2, c1, c2);
  679. lgb.TranslateTransform (1, 1, (MatrixOrder) Int32.MinValue);
  680. }
  681. [Test]
  682. public void Transform_Operations ()
  683. {
  684. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 45f);
  685. Matrix clone = lgb.Transform.Clone ();
  686. Matrix mul = clone.Clone ();
  687. clone.Multiply (mul, MatrixOrder.Append);
  688. lgb.MultiplyTransform (mul, MatrixOrder.Append);
  689. Assert.AreEqual (lgb.Transform, clone, "Multiply/Append");
  690. clone.Multiply (mul, MatrixOrder.Prepend);
  691. lgb.MultiplyTransform (mul, MatrixOrder.Prepend);
  692. Assert.AreEqual (lgb.Transform, clone, "Multiply/Prepend");
  693. clone.Rotate (45, MatrixOrder.Append);
  694. lgb.RotateTransform (45, MatrixOrder.Append);
  695. Assert.AreEqual (lgb.Transform, clone, "Rotate/Append");
  696. clone.Rotate (45, MatrixOrder.Prepend);
  697. lgb.RotateTransform (45, MatrixOrder.Prepend);
  698. Assert.AreEqual (lgb.Transform, clone, "Rotate/Prepend");
  699. clone.Scale (0.25f, 2, MatrixOrder.Append);
  700. lgb.ScaleTransform (0.25f, 2, MatrixOrder.Append);
  701. Assert.AreEqual (lgb.Transform, clone, "Scale/Append");
  702. clone.Scale (0.25f, 2, MatrixOrder.Prepend);
  703. lgb.ScaleTransform (0.25f, 2, MatrixOrder.Prepend);
  704. Assert.AreEqual (lgb.Transform, clone, "Scale/Prepend");
  705. clone.Translate (10, 20, MatrixOrder.Append);
  706. lgb.TranslateTransform (10, 20, MatrixOrder.Append);
  707. Assert.AreEqual (lgb.Transform, clone, "Translate/Append");
  708. clone.Translate (30, 40, MatrixOrder.Prepend);
  709. lgb.TranslateTransform (30, 40, MatrixOrder.Prepend);
  710. Assert.AreEqual (lgb.Transform, clone, "Translate/Prepend");
  711. clone.Reset ();
  712. lgb.ResetTransform ();
  713. Assert.AreEqual (lgb.Transform, clone, "Reset");
  714. }
  715. [Test]
  716. public void Transform_Operations_OnScalableAngle ()
  717. {
  718. LinearGradientBrush lgb = new LinearGradientBrush (rect, c1, c2, 360f, true);
  719. Matrix clone = lgb.Transform.Clone ();
  720. Matrix mul = clone.Clone ();
  721. Matrix m = new Matrix ();
  722. m.Scale (2, 1);
  723. m.Translate (rect.Width, rect.Height);
  724. m.Rotate (30f);
  725. clone.Multiply (mul, MatrixOrder.Append);
  726. lgb.MultiplyTransform (mul, MatrixOrder.Append);
  727. Assert.AreEqual (lgb.Transform, clone, "Multiply/Append");
  728. clone.Multiply (mul, MatrixOrder.Prepend);
  729. lgb.MultiplyTransform (mul, MatrixOrder.Prepend);
  730. Assert.AreEqual (lgb.Transform, clone, "Multiply/Prepend");
  731. clone.Rotate (45, MatrixOrder.Append);
  732. lgb.RotateTransform (45, MatrixOrder.Append);
  733. Assert.AreEqual (lgb.Transform, clone, "Rotate/Append");
  734. clone.Rotate (45, MatrixOrder.Prepend);
  735. lgb.RotateTransform (45, MatrixOrder.Prepend);
  736. Assert.AreEqual (lgb.Transform, clone, "Rotate/Prepend");
  737. clone.Scale (0.25f, 2, MatrixOrder.Append);
  738. lgb.ScaleTransform (0.25f, 2, MatrixOrder.Append);
  739. Assert.AreEqual (lgb.Transform, clone, "Scale/Append");
  740. clone.Scale (0.25f, 2, MatrixOrder.Prepend);
  741. lgb.ScaleTransform (0.25f, 2, MatrixOrder.Prepend);
  742. Assert.AreEqual (lgb.Transform, clone, "Scale/Prepend");
  743. clone.Translate (10, 20, MatrixOrder.Append);
  744. lgb.TranslateTransform (10, 20, MatrixOrder.Append);
  745. Assert.AreEqual (lgb.Transform, clone, "Translate/Append");
  746. clone.Translate (30, 40, MatrixOrder.Prepend);
  747. lgb.TranslateTransform (30, 40, MatrixOrder.Prepend);
  748. Assert.AreEqual (lgb.Transform, clone, "Translate/Prepend");
  749. clone.Reset ();
  750. lgb.ResetTransform ();
  751. Assert.AreEqual (lgb.Transform, clone, "Reset");
  752. }
  753. [Test]
  754. public void Constructor_Rectangle_Angle_Scalable ()
  755. {
  756. CheckMatrixForScalableAngle (new RectangleF (0, 0, 10, 10), 15, new float[] { 1.183013f, 0.3169873f, -0.3169873f, 1.183012f, 0.6698728f, -2.5f });
  757. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 50), 15, new float[] { 1.183012f, 0.176104f, -0.5705772f, 1.183012f, 34.77311f, -28.76387f });
  758. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 50), 75, new float[] { 0.3169872f, 0.6572293f, -2.129423f, 0.3169873f, 232.2269f, 8.763878f });
  759. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 50), 95, new float[] { -0.09442029f, 0.599571f, -1.942611f, -0.09442017f, 247.2034f, 48.05788f });
  760. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 50), 150, new float[] { -1.183013f, 0.3794515f, -1.229423f, -1.183013f, 268.2269f, 157.0972f });
  761. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 50), 215, new float[] { -1.140856f, -0.4437979f, 1.437905f, -1.140856f, 38.34229f, 215.2576f });
  762. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 50), 300, new float[] { 0.6830127f, -0.6572294f, 2.129422f, 0.6830124f, -157.2269f, 76.23613f });
  763. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 150), 15, new float[] { 1.183012f, 0.5283121f, -0.1901924f, 1.183012f, 11.95002f, -64.33012f });
  764. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 150), 75, new float[] { 0.3169872f, 1.971688f, -0.7098077f, 0.3169872f, 147.05f, -55.66987f });
  765. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 150), 95, new float[] { -0.09442029f, 1.798713f, -0.6475369f, -0.09442022f, 169.499f, 12.84323f });
  766. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 150), 150, new float[] { -1.183013f, 1.138354f, -0.4098077f, -1.183013f, 219.05f, 209.3301f });
  767. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 150), 215, new float[] { -1.140856f, -1.331394f, 0.4793016f, -1.140856f, 95.85849f, 388.8701f });
  768. CheckMatrixForScalableAngle (new RectangleF (30, 60, 90, 150), 300, new float[] { 0.6830127f, -1.971688f, 0.7098075f, 0.6830125f, -72.04998f, 190.6699f });
  769. }
  770. }
  771. }