New tests.
[mono.git] / mcs / class / System.Drawing / Test / System.Drawing / GDIPlusTest.cs
1 //
2 // Direct GDI+ API unit tests
3 //
4 // Authors:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
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
29 using System;
30 using System.Drawing;
31 using System.Drawing.Drawing2D;
32 using System.Drawing.Imaging;
33 using System.Runtime.InteropServices;
34 using NUnit.Framework;
35
36 namespace MonoTests.System.Drawing {
37
38         [TestFixture]
39         public class GDIPlusTest {
40
41                 // for the moment this LOGFONT is different (and ok) from the one defined internally in SD
42                 [StructLayout (LayoutKind.Sequential, CharSet = CharSet.Auto)]
43                 public class LOGFONT {
44                         public int lfHeight = 0;
45                         public int lfWidth = 0;
46                         public int lfEscapement = 0;
47                         public int lfOrientation = 0;
48                         public int lfWeight = 0;
49                         public byte lfItalic = 0;
50                         public byte lfUnderline = 0;
51                         public byte lfStrikeOut = 0;
52                         public byte lfCharSet = 0;
53                         public byte lfOutPrecision = 0;
54                         public byte lfClipPrecision = 0;
55                         public byte lfQuality = 0;
56                         public byte lfPitchAndFamily = 0;
57                         [MarshalAs (UnmanagedType.ByValTStr, SizeConst = 32)]
58                         public string lfFaceName = null;
59                 }
60
61                 // FontFamily
62                 [Test]
63                 public void DeleteFontFamily ()
64                 {
65                         // invalid image pointer (null)
66                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteFontFamily (IntPtr.Zero), "null");
67
68                         IntPtr font_family;
69                         GDIPlus.GdipCreateFontFamilyFromName ("Arial", IntPtr.Zero, out font_family);
70                         if (font_family != IntPtr.Zero)
71                                 Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (font_family), "first");
72                         else
73                                 Assert.Ignore ("Arial isn't available on this platform");
74                 }
75
76                 [Test]
77                 [Category ("NotWorking")]
78                 public void DeleteFontFamily_DoubleDispose ()
79                 {
80                         IntPtr font_family;
81                         GDIPlus.GdipGetGenericFontFamilySerif (out font_family);
82                         // first dispose
83                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (font_family), "first");
84                         // second dispose
85                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (font_family), "second");
86                 }
87
88                 // Font
89                 [Test]
90                 public void CreateFont ()
91                 {
92                         IntPtr family;
93                         GDIPlus.GdipCreateFontFamilyFromName ("Arial", IntPtr.Zero, out family);
94                         if (family == IntPtr.Zero)
95                                 Assert.Ignore ("Arial isn't available on this platform");
96
97                         IntPtr font;
98                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateFont (family, 10f, FontStyle.Regular, GraphicsUnit.Point, out font), "GdipCreateFont");
99                         Assert.IsTrue (font != IntPtr.Zero, "font");
100
101                         LOGFONT lf = new LOGFONT ();
102                         lf.lfCharSet = 1;
103                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetLogFont (font, IntPtr.Zero, (object) lf), "GdipGetLogFont-null-graphics");
104                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet-null-graphics");
105                         // other lf members looks like garbage
106
107                         IntPtr image;
108                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
109                         Assert.IsTrue (image != IntPtr.Zero, "image");
110
111                         IntPtr graphics;
112                         GDIPlus.GdipGetImageGraphicsContext (image, out graphics);
113                         Assert.IsTrue (graphics != IntPtr.Zero, "graphics");
114
115                         lf.lfCharSet = 1;
116                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetLogFont (IntPtr.Zero, graphics, (object) lf), "GdipGetLogFont-null");
117                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet-null");
118
119                         lf.lfCharSet = 1;
120                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetLogFont (font, graphics, (object) lf), "GdipGetLogFont");
121                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet");
122                         // strangely this is 1 in the managed side
123
124                         lf.lfCharSet = 2;
125                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetLogFont (font, graphics, (object) lf), "GdipGetLogFont-2");
126                         Assert.AreEqual (0, lf.lfCharSet, "lfCharSet");
127                         // strangely this is 2 in the managed side
128
129                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFont (font), "GdipDeleteFont");
130                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteFont (IntPtr.Zero), "GdipDeleteFont-null");
131
132                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteFontFamily (family), "GdipDeleteFontFamily");
133                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "GdipDisposeImage");
134                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteGraphics (graphics), "GdipDeleteGraphics");
135                 }
136
137                 // Bitmap
138                 [Test]
139                 public void CreateBitmapFromScan0 ()
140                 {
141                         IntPtr bmp;
142                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateBitmapFromScan0 (-1, 10, 10, PixelFormat.Format32bppArgb, IntPtr.Zero, out bmp), "negative width");
143                 }
144
145                 [Test]
146                 public void Unlock ()
147                 {
148                         IntPtr bmp;
149                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out bmp);
150                         Assert.IsTrue (bmp != IntPtr.Zero, "bmp");
151
152                         BitmapData bd = null;
153                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipBitmapUnlockBits (bmp, bd), "BitmapData");
154
155                         bd = new BitmapData ();
156                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipBitmapUnlockBits (IntPtr.Zero, bd), "handle");
157
158                         Assert.AreEqual (Status.Win32Error, GDIPlus.GdipBitmapUnlockBits (bmp, bd), "not locked");
159
160                         Rectangle rect = new Rectangle (2, 2, 5, 5);
161                         Assert.AreEqual (Status.Ok, GDIPlus.GdipBitmapLockBits (bmp, ref rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb, bd), "locked");
162                         Assert.AreEqual (rect.Width, bd.Width, "Width");
163                         Assert.AreEqual (rect.Height, bd.Height, "Height");
164                         Assert.AreEqual (PixelFormat.Format24bppRgb, bd.PixelFormat, "PixelFormat");
165
166                         Assert.AreEqual (Status.Ok, GDIPlus.GdipBitmapUnlockBits (bmp, bd), "unlocked");
167
168                         Assert.AreEqual (Status.Win32Error, GDIPlus.GdipBitmapUnlockBits (bmp, bd), "unlocked-twice");
169
170                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (bmp), "GdipDisposeImage");
171                 }
172
173                 // Brush
174                 [Test]
175                 public void DeleteBrush ()
176                 {
177                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteBrush (IntPtr.Zero), "GdipDeleteBrush");
178                 }
179
180                 // Graphics
181                 [Test]
182                 public void Graphics ()
183                 {
184                         IntPtr graphics;
185                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetImageGraphicsContext (IntPtr.Zero, out graphics), "GdipGetImageGraphicsContext");
186
187                         IntPtr image;
188                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
189                         Assert.IsTrue (image != IntPtr.Zero, "image");
190
191                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetImageGraphicsContext (image, out graphics), "GdipGetImageGraphicsContext");
192                         Assert.IsTrue (graphics != IntPtr.Zero, "graphics");
193                         
194
195                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteGraphics (graphics), "GdipDeleteGraphics");
196                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteGraphics (IntPtr.Zero), "GdipDeleteGraphics-null");
197
198                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "GdipDisposeImage");
199                 }
200
201                 // GraphicsPath
202                 [Test]
203                 public void GetPointCount_Zero ()
204                 {
205                         IntPtr path;
206                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
207                         Assert.IsTrue (path != IntPtr.Zero, "Handle");
208
209                         int count;
210                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPointCount (IntPtr.Zero, out count), "GdipGetPointCount-null");
211                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPointCount (path, out count), "GdipGetPointCount");
212                         Assert.AreEqual (0, count, "Count");
213
214                         PointF[] points = new PointF[count];
215                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathPoints (IntPtr.Zero, points, count), "GdipGetPathPoints-null-1");
216                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathPoints (path, null, count), "GdipGetPathPoints-null-2");
217                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathPoints (path, points, count), "GdipGetPathPoints");
218                         // can't get the points if the count is zero!
219
220                         byte[] types = new byte[count];
221                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathTypes (IntPtr.Zero, types, count), "GdipGetPathTypes-null-1");
222                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathTypes (path, null, count), "GdipGetPathTypes-null-2");
223                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathTypes (path, types, count), "GdipGetPathTypes");
224                         // can't get the types if the count is zero!
225
226                         PointF[] pts_2f = new PointF[2] { new PointF (2f, 4f), new PointF (10f, 30f) };
227                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine2 (IntPtr.Zero, pts_2f, pts_2f.Length), "GdipAddPathLine2-null-path");
228                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine2 (path, null, pts_2f.Length), "GdipAddPathLine2-null-points");
229                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine2 (path, pts_2f, -1), "GdipAddPathLine2-negative-count");
230                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine2 (path, pts_2f, pts_2f.Length), "GdipAddPathLine2");
231
232                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPointCount (path, out count), "GdipGetPointCount");
233                         Assert.AreEqual (2, count, "Count");
234
235                         points = new PointF[count];
236                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathPoints (path, points, count), "GdipGetPathPoints-ok");
237
238                         types = new byte[count];
239                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathTypes (path, types, count), "GdipGetPathTypes-ok");
240
241                         Assert.AreEqual (Status.Ok, GDIPlus.GdipResetPath (path), "GdipResetPath");
242                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipResetPath (IntPtr.Zero), "GdipResetPath-null");
243
244                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
245                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeletePath (IntPtr.Zero), "GdipDeletePath-null");
246                 }
247
248                 [Test]
249                 public void Widen ()
250                 {
251                         IntPtr pen;
252                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePen1 (0, 0f, Unit.UnitWorld, out pen), "GdipCreatePen1");
253
254                         IntPtr path;
255                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
256
257                         IntPtr matrix;
258                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateMatrix (out matrix), "GdipCreateMatrix");
259
260                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipWidenPath (IntPtr.Zero, pen, matrix, 1.0f), "GdipWidenPath-null-path");
261                         // empty path
262                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipWidenPath (path, pen, matrix, 1.0f), "GdipWidenPath");
263
264                         // add something to the path
265                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipAddPathLine (IntPtr.Zero, 1, 1, 10, 10), "GdipAddPathLine");
266                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine (path, 1, 1, 10, 10), "GdipAddPathLine");
267
268                         int count;
269                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPointCount (path, out count), "GdipGetPointCount");
270                         Assert.AreEqual (2, count, "Count");
271
272                         Assert.AreEqual (Status.Ok, GDIPlus.GdipWidenPath (path, pen, matrix, 1.0f), "GdipWidenPath-2");
273
274                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (matrix), "GdipDeleteMatrix");
275                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
276                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePen (pen), "GdipDeletePen");
277                 }
278
279                 // GraphicsPathIterator
280                 [Test]
281                 public void GraphicsPathIterator ()
282                 {
283                         IntPtr path;
284                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
285                         
286                         IntPtr iter;
287                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathIter (out iter, path), "GdipCreatePathIter");
288
289                         int count = -1;
290                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterGetCount (IntPtr.Zero, out count), "GdipPathIterGetCount-null");
291                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterGetCount (iter, out count), "GdipPathIterGetCount");
292                         Assert.AreEqual (0, count, "count-1");
293
294                         count = -1;
295                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterGetSubpathCount (IntPtr.Zero, out count), "GdipPathIterGetSubpathCount-null");
296                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterGetSubpathCount (iter, out count), "GdipPathIterGetSubpathCount");
297                         Assert.AreEqual (0, count, "count-2");
298
299                         bool curve;
300                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterHasCurve (IntPtr.Zero, out curve), "GdipPathIterHasCurve-null");
301                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterHasCurve (iter, out curve), "GdipPathIterHasCurve");
302                         Assert.IsFalse (curve, "curve");
303
304                         int result;
305                         PointF[] points = new PointF[count];
306                         byte[] types = new byte[count];
307                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterEnumerate (IntPtr.Zero, out result, points, types, count), "GdipPathIterEnumerate-iter");
308                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterEnumerate (iter, out result, null, types, count), "GdipPathIterEnumerate-points");
309                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterEnumerate (iter, out result, points, null, count), "GdipPathIterEnumerate-types");
310                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterEnumerate (iter, out result, points, types, -1), "GdipPathIterEnumerate-count");
311                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterEnumerate (iter, out result, points, types, count), "GdipPathIterEnumerate");
312
313                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterCopyData (IntPtr.Zero, out result, points, types, 0, 0), "GdipPathIterCopyData-iter");
314                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterCopyData (iter, out result, null, types, 0, 0), "GdipPathIterCopyData-points");
315                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterCopyData (iter, out result, points, null, 0, 0), "GdipPathIterCopyData-types");
316                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterCopyData (iter, out result, points, types, -1, 0), "GdipPathIterCopyData-start");
317                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterCopyData (iter, out result, points, types, 0, -1), "GdipPathIterCopyData-end");
318                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterCopyData (iter, out result, points, types, 0, 0), "GdipPathIterCopyData");
319
320                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterNextMarkerPath (IntPtr.Zero, out result, path), "GdipPathIterNextMarkerPath-iter");
321                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextMarkerPath (iter, out result, IntPtr.Zero), "GdipPathIterNextMarkerPath-path");
322                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextMarkerPath (iter, out result, path), "GdipPathIterNextMarkerPath");
323
324                         result = -1;
325                         int start = -1;
326                         int end = -1;
327                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterNextMarker (IntPtr.Zero, out result, out start, out end), "GdipPathIterNextMarker-iter");
328                         start = -1;
329                         end = -1;
330                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextMarker (iter, out result, out start, out end), "GdipPathIterNextMarker");
331                         Assert.AreEqual (0, result, "result-4");
332                         Assert.AreEqual (-1, start, "start-1");
333                         Assert.AreEqual (-1, end, "end-1");
334
335                         byte pathType = 255;
336                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterNextPathType (IntPtr.Zero, out result, out pathType, out start, out end), "GdipPathIterNextPathType-iter");
337                         pathType = 255;
338                         start = -1;
339                         end = -1;
340                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextPathType (iter, out result, out pathType, out start, out end), "GdipPathIterNextPathType");
341                         Assert.AreEqual (0, result, "result-5");
342                         Assert.AreEqual (255, pathType, "pathType");
343                         Assert.AreEqual (-1, start, "start-2");
344                         Assert.AreEqual (-1, end, "end-2");
345
346                         bool closed = false;
347                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterNextSubpathPath (IntPtr.Zero, out result, IntPtr.Zero, out closed), "GdipPathIterNextSubpathPath-iter");
348                         closed = false;
349                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextSubpathPath (iter, out result, IntPtr.Zero, out closed), "GdipPathIterNextSubpathPath-path");
350                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextSubpathPath (iter, out result, path, out closed), "GdipPathIterNextSubpathPath");
351
352                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterNextSubpath (IntPtr.Zero, out result, out start, out end, out closed), "GdipPathIterNextSubpath-iter");
353                         start = -1;
354                         end = -1;
355                         closed = false;
356                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextSubpath (iter, out result, out start, out end, out closed), "GdipPathIterNextSubpath");
357                         Assert.AreEqual (-1, start, "start-3");
358                         Assert.AreEqual (-1, end, "end-3");
359
360                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipPathIterRewind (IntPtr.Zero), "GdipPathIterRewind-null");
361                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterRewind (iter), "GdipPathIterRewind");
362
363                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeletePathIter (IntPtr.Zero), "GdipDeletePathIter-null");
364                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePathIter (iter), "GdipDeletePathIter");
365                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
366                 }
367
368                 [Test]
369                 public void GraphicsPathIterator_WithoutPath ()
370                 {
371                         // a path isn't required to create an iterator - ensure we never crash for any api
372                         IntPtr iter;
373                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathIter (out iter, IntPtr.Zero), "GdipCreatePathIter-null");
374
375                         int count = -1;
376                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterGetCount (iter, out count), "GdipPathIterGetCount");
377                         Assert.AreEqual (0, count, "count-1");
378
379                         count = -1;
380                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterGetSubpathCount (iter, out count), "GdipPathIterGetSubpathCount");
381                         Assert.AreEqual (0, count, "count-2");
382
383                         bool curve;
384                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterHasCurve (iter, out curve), "GdipPathIterHasCurve");
385
386                         int result = -1;
387                         PointF[] points = new PointF[count];
388                         byte[] types = new byte[count];
389                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterEnumerate (iter, out result, points, types, count), "GdipPathIterEnumerate");
390                         Assert.AreEqual (0, result, "result-1");
391
392                         result = -1;
393                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterCopyData (iter, out result, points, types, 0, 0), "GdipPathIterCopyData");
394                         Assert.AreEqual (0, result, "result-2");
395
396                         result = -1;
397                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextMarkerPath (iter, out result, IntPtr.Zero), "GdipPathIterNextMarkerPath");
398                         Assert.AreEqual (0, result, "result-3");
399
400                         result = -1;
401                         int start = -1;
402                         int end = -1;
403                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextMarker (iter, out result, out start, out end), "GdipPathIterNextMarker");
404                         Assert.AreEqual (0, result, "result-4");
405                         Assert.AreEqual (-1, start, "start-1");
406                         Assert.AreEqual (-1, end, "end-1");
407
408                         result = -1;
409                         byte pathType = 255;
410                         start = -1;
411                         end = -1;
412                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextPathType (iter, out result, out pathType, out start, out end), "GdipPathIterNextPathType");
413                         Assert.AreEqual (0, result, "result-5");
414                         Assert.AreEqual (255, pathType, "pathType");
415                         Assert.AreEqual (-1, start, "start-2");
416                         Assert.AreEqual (-1, end, "end-2");
417
418                         bool closed = false;
419                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextSubpathPath (iter, out result, IntPtr.Zero, out closed), "GdipPathIterNextSubpathPath");
420
421                         start = -1;
422                         end = -1;
423                         closed = false;
424                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterNextSubpath (iter, out result, out start, out end, out closed), "GdipPathIterNextSubpath");
425                         Assert.AreEqual (-1, start, "start-3");
426                         Assert.AreEqual (-1, end, "end-3");
427
428                         Assert.AreEqual (Status.Ok, GDIPlus.GdipPathIterRewind (iter), "GdipPathIterRewind");
429
430                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePathIter (iter), "GdipDeletePathIter");
431                 }
432
433                 // Matrix
434                 [Test]
435                 public void Matrix ()
436                 {
437                         IntPtr matrix;
438                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateMatrix (out matrix), "GdipCreateMatrix");
439                         Assert.IsTrue (matrix != IntPtr.Zero, "Handle");
440
441                         bool result;
442                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipIsMatrixIdentity (IntPtr.Zero, out result), "GdipIsMatrixIdentity-null");
443                         Assert.AreEqual (Status.Ok, GDIPlus.GdipIsMatrixIdentity (matrix, out result), "GdipIsMatrixIdentity");
444                         Assert.IsTrue (result, "identity");
445
446                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipIsMatrixInvertible (IntPtr.Zero, out result), "GdipIsMatrixInvertible-null");
447                         Assert.AreEqual (Status.Ok, GDIPlus.GdipIsMatrixInvertible (matrix, out result), "GdipIsMatrixInvertible");
448                         Assert.IsTrue (result, "invertible");
449
450                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipInvertMatrix (IntPtr.Zero), "GdipInvertMatrix-null");
451                         Assert.AreEqual (Status.Ok, GDIPlus.GdipInvertMatrix (matrix), "GdipInvertMatrix");
452
453                         PointF[] points = new PointF[1];
454                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipTransformMatrixPoints (IntPtr.Zero, points, 1), "GdipTransformMatrixPoints-null-points-1");
455                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipTransformMatrixPoints (matrix, null, 1), "GdipTransformMatrixPoints-matrix-points-1");
456                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipTransformMatrixPoints (matrix, points, 0), "GdipTransformMatrixPoints-matrix-points-0");
457                         Assert.AreEqual (Status.Ok, GDIPlus.GdipTransformMatrixPoints (matrix, points, 1), "GdipTransformMatrixPoints");
458
459                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipVectorTransformMatrixPoints (IntPtr.Zero, points, 1), "GdipVectorTransformMatrixPoints-null-points-1");
460                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipVectorTransformMatrixPoints (matrix, null, 1), "GdipVectorTransformMatrixPoints-matrix-points-1");
461                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipVectorTransformMatrixPoints (matrix, points, 0), "GdipVectorTransformMatrixPoints-matrix-points-0");
462                         Assert.AreEqual (Status.Ok, GDIPlus.GdipVectorTransformMatrixPoints (matrix, points, 1), "GdipVectorTransformMatrixPoints");
463
464                         IntPtr clone;
465                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCloneMatrix (IntPtr.Zero, out clone), "GdipCloneMatrix");
466                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCloneMatrix (matrix, out clone), "GdipCloneMatrix");
467                         Assert.IsTrue (clone != IntPtr.Zero, "Handle-clone");
468
469                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipIsMatrixEqual (IntPtr.Zero, clone, out result), "GdipIsMatrixEqual-null-clone");
470                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipIsMatrixEqual (matrix, IntPtr.Zero, out result), "GdipIsMatrixEqual-matrix-null");
471                         Assert.AreEqual (Status.Ok, GDIPlus.GdipIsMatrixEqual (matrix, clone, out result), "GdipIsMatrixEqual-matrix-clone");
472                         Assert.IsTrue (result, "equal");
473
474                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipMultiplyMatrix (IntPtr.Zero, clone, MatrixOrder.Append), "GdipMultiplyMatrix-null-clone-append");
475                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipMultiplyMatrix (matrix, IntPtr.Zero, MatrixOrder.Prepend), "GdipMultiplyMatrix-matrix-null-prepend");
476                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipMultiplyMatrix (matrix, clone, (MatrixOrder)Int32.MinValue), "GdipMultiplyMatrix-matrix-clone-invalid");
477                         Assert.AreEqual (Status.Ok, GDIPlus.GdipMultiplyMatrix (matrix, clone, MatrixOrder.Append), "GdipMultiplyMatrix-matrix-clone-append");
478
479                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipTranslateMatrix (IntPtr.Zero, 1f, 2f, MatrixOrder.Append), "GdipTranslateMatrix-null-append");
480                         Assert.AreEqual (Status.Ok, GDIPlus.GdipTranslateMatrix (matrix, Single.NaN, Single.NegativeInfinity, MatrixOrder.Prepend), "GdipTranslateMatrix-nan-append");
481                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipTranslateMatrix (matrix, 1f, 2f, (MatrixOrder) Int32.MinValue), "GdipTranslateMatrix-matrix-invalid");
482                         Assert.AreEqual (Status.Ok, GDIPlus.GdipTranslateMatrix (matrix, 1f, 2f, MatrixOrder.Append), "GdipTranslateMatrix-matrix-append");
483
484                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipScaleMatrix (IntPtr.Zero, 1f, 2f, MatrixOrder.Append), "GdipScaleMatrix-null-append");
485                         Assert.AreEqual (Status.Ok, GDIPlus.GdipScaleMatrix (matrix, Single.NaN, Single.NegativeInfinity, MatrixOrder.Prepend), "GdipScaleMatrix-nan-append");
486                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipScaleMatrix (matrix, 1f, 2f, (MatrixOrder) Int32.MinValue), "GdipScaleMatrix-matrix-invalid");
487                         Assert.AreEqual (Status.Ok, GDIPlus.GdipScaleMatrix (matrix, 1f, 2f, MatrixOrder.Append), "GdipScaleMatrix-matrix-append");
488
489                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipShearMatrix (IntPtr.Zero, 1f, 2f, MatrixOrder.Append), "GdipShearMatrix-null-append");
490                         Assert.AreEqual (Status.Ok, GDIPlus.GdipShearMatrix (matrix, Single.NaN, Single.NegativeInfinity, MatrixOrder.Prepend), "GdipShearMatrix-nan-append");
491                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipShearMatrix (matrix, 1f, 2f, (MatrixOrder) Int32.MinValue), "GdipShearMatrix-matrix-invalid");
492                         Assert.AreEqual (Status.Ok, GDIPlus.GdipShearMatrix (matrix, 1f, 2f, MatrixOrder.Append), "GdipShearMatrix-matrix-append");
493
494                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeleteMatrix (IntPtr.Zero), "GdipDeleteMatrix-null");
495                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (matrix), "GdipDeleteMatrix");
496                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (clone), "GdipDeleteMatrix-clone");
497                 }
498
499                 [Test]
500                 public void Matrix2 ()
501                 {
502                         IntPtr matrix;
503                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateMatrix2 (Single.MinValue, Single.MaxValue, Single.NegativeInfinity, 
504                                 Single.PositiveInfinity, Single.NaN, Single.Epsilon, out matrix), "GdipCreateMatrix2");
505                         Assert.IsTrue (matrix != IntPtr.Zero, "Handle");
506
507                         // check data
508                         float[] elements = new float[6];
509                         IntPtr data = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (float)) * 6);
510                         try {
511                                 Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetMatrixElements (IntPtr.Zero, data), "GdipSetMatrixElements-null-matrix");
512                                 Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetMatrixElements (matrix, IntPtr.Zero), "GdipSetMatrixElements-null-data");
513                                 Assert.AreEqual (Status.Ok, GDIPlus.GdipGetMatrixElements (matrix, data), "GdipSetMatrixElements-null-matrix");
514                                 Marshal.Copy (data, elements, 0, 6);
515                                 Assert.AreEqual (Single.MinValue, elements [0], "0");
516                                 Assert.AreEqual (Single.MaxValue, elements [1], "1");
517                                 Assert.AreEqual (Single.NegativeInfinity, elements [2], "2");
518                                 Assert.AreEqual (Single.PositiveInfinity, elements [3], "3");
519                                 Assert.AreEqual (Single.NaN, elements [4], "4");
520                                 Assert.AreEqual (Single.Epsilon, elements [5], "5");
521                         }
522                         finally {
523                                 Marshal.FreeHGlobal (data);
524                         }
525
526                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetMatrixElements (IntPtr.Zero, 0f, 0f, 0f, 0f, 0f, 0f), "GdipSetMatrixElements-null");
527                         Assert.AreEqual (Status.Ok, GDIPlus.GdipSetMatrixElements (matrix, 0f, 0f, 0f, 0f, 0f, 0f), "GdipSetMatrixElements");
528
529                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (matrix), "GdipDeleteMatrix");
530                 }
531
532                 [Test]
533                 public void Matrix3 ()
534                 {
535                         RectangleF rect = new RectangleF ();
536                         IntPtr matrix;
537                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateMatrix3 (ref rect, null, out matrix), "GdipCreateMatrix3-null");
538
539                         // provding less than 3 points would results in AccessViolationException under MS 2.0 but can't happen using the managed SD code
540                         PointF[] points = new PointF[3];
541                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateMatrix3 (ref rect, points, out matrix), "GdipCreateMatrix3-empty-rect");
542                         rect = new RectangleF (10f, 20f, 0f, 40f);
543                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateMatrix3 (ref rect, points, out matrix), "GdipCreateMatrix3-empty-width");
544                         rect = new RectangleF (10f, 20f, 30f, 0f);
545                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateMatrix3 (ref rect, points, out matrix), "GdipCreateMatrix3-empty-height");
546
547                         rect = new RectangleF (0f, 0f, 30f, 40f);
548                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateMatrix3 (ref rect, points, out matrix), "GdipCreateMatrix3-3");
549                         Assert.IsTrue (matrix != IntPtr.Zero, "Handle");
550
551                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (matrix), "GdipDeleteMatrix");
552                 }
553
554                 // Image
555                 [Test]
556                 public void DisposeImage ()
557                 {
558                         // invalid image pointer (null)
559                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDisposeImage (IntPtr.Zero), "null");
560
561                         IntPtr image;
562                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
563                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "first");
564                 }
565
566                 [Test]
567                 [Category ("NotWorking")]
568                 public void DisposeImage_Dual ()
569                 {
570                         IntPtr image;
571                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
572                         // first dispose
573                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "first");
574                         // second dispose
575                         Assert.AreEqual (Status.ObjectBusy, GDIPlus.GdipDisposeImage (image), "second");
576                 }
577
578                 [Test]
579                 [Category ("NotWorking")] // libgdiplus doesn't implement GdipGetImageThumbnail (it is done inside S.D)
580                 public void GetImageThumbnail ()
581                 {
582                         IntPtr ptr;
583
584                         // invalid image pointer (null)
585                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetImageThumbnail (IntPtr.Zero, 10, 10, out ptr, IntPtr.Zero, IntPtr.Zero));
586
587                         IntPtr image;
588                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
589                         try {
590                                 // invalid width (0)
591                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 0, 10, out ptr, IntPtr.Zero, IntPtr.Zero));
592                                 // invalid width (negative)
593                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 0x8000000, 10, out ptr, IntPtr.Zero, IntPtr.Zero));
594                                 // invalid height (0)
595                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 10, 0, out ptr, IntPtr.Zero, IntPtr.Zero));
596                                 // invalid height (negative)
597                                 Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetImageThumbnail (image, 10, 0x8000000, out ptr, IntPtr.Zero, IntPtr.Zero));
598                         }
599                         finally {
600                                 GDIPlus.GdipDisposeImage (image);
601                         }
602                 }
603
604                 [Test]
605                 public void Encoder ()
606                 {
607                         IntPtr image;
608                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
609
610                         Guid g = new Guid ();
611                         uint size = UInt32.MaxValue;
612                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetEncoderParameterListSize (IntPtr.Zero, ref g, out size), "GdipGetEncoderParameterListSize-null-guid-uint");
613                         Assert.AreEqual (UInt32.MaxValue, size, "size-1");
614                         // note: can't test a null Guid (it's a struct)
615 #if false
616                         Assert.AreEqual (Status. FileNotFound, GDIPlus.GdipGetEncoderParameterListSize (image, ref g, out size), "GdipGetEncoderParameterListSize-image-badguid-uint");
617                         Assert.AreEqual (UInt32.MaxValue, size, "size-2");
618
619                         g = new Guid ("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");
620                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetEncoderParameterListSize (image, ref g, out size), "GdipGetEncoderParameterListSize-image-guid-uint");
621                         Assert.AreEqual (UInt32.MaxValue, size, "size-3");
622 #endif
623                         GDIPlus.GdipDisposeImage (image);
624                 }
625
626                 // ImageAttribute
627                 [Test]
628                 public void ImageAttribute ()
629                 {
630                         IntPtr attr;
631                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateImageAttributes (out attr), "GdipCreateImageAttributes");
632
633                         IntPtr clone;
634                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCloneImageAttributes (IntPtr.Zero, out clone), "GdipCloneImageAttributes");
635                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCloneImageAttributes (attr, out clone), "GdipCloneImageAttributes");
636
637                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetImageAttributesColorMatrix (attr, ColorAdjustType.Default, true, IntPtr.Zero, IntPtr.Zero, ColorMatrixFlag.Default), "GdipSetImageAttributesColorMatrix-true-matrix1");
638                         // the first color matrix can be null if enableFlag is false
639                         Assert.AreEqual (Status.Ok, GDIPlus.GdipSetImageAttributesColorMatrix (attr, ColorAdjustType.Default, false, IntPtr.Zero, IntPtr.Zero, ColorMatrixFlag.Default), "GdipSetImageAttributesColorMatrix-false-matrix1");
640                         ColorMatrix cm = new ColorMatrix ();
641                         IntPtr color = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (ColorMatrix)));
642                         try {
643                                 Marshal.StructureToPtr (cm, color, false);
644                                 Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetImageAttributesColorMatrix (IntPtr.Zero, ColorAdjustType.Default, true, color, IntPtr.Zero, ColorMatrixFlag.Default), "GdipSetImageAttributesColorMatrix-null");
645                                 Assert.AreEqual (Status.Ok, GDIPlus.GdipSetImageAttributesColorMatrix (attr, ColorAdjustType.Default, true, color, IntPtr.Zero, ColorMatrixFlag.Default), "GdipCloneImageAttributes");
646                         }
647                         finally {
648                                 Marshal.FreeHGlobal (color);
649                         }
650
651                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDisposeImageAttributes (IntPtr.Zero), "GdipDisposeImageAttributes-null");
652                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImageAttributes (attr), "GdipDisposeImageAttributes");
653                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImageAttributes (clone), "GdipDisposeImageAttributes-clone");
654                 }
655
656                 // PathGradientBrush
657                 [Test]
658                 public void CreatePathGradient ()
659                 {
660                         PointF[] points = null;
661                         IntPtr brush;
662                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradient (points, 0, WrapMode.Clamp, out brush), "null");
663
664                         points = new PointF [0];
665                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradient (points, 0, WrapMode.Clamp, out brush), "empty");
666
667                         points = new PointF[1];
668                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradient (points, 1, WrapMode.Clamp, out brush), "one");
669
670                         points = null;
671                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradient (points, 2, WrapMode.Clamp, out brush), "null/two");
672
673                         points = new PointF[2] { new PointF (1, 2), new PointF (20, 30) };
674                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathGradient (points, 2, WrapMode.Clamp, out brush), "two");
675                         Assert.IsTrue (brush != IntPtr.Zero, "Handle");
676
677                         int count;
678                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathGradientBlendCount (brush, out count), "GdipGetPathGradientBlendCount");
679                         Assert.AreEqual (1, count, "blend count");
680
681                         int[] colors = new int[count];
682                         float[] positions = new float[count];
683                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathGradientPresetBlend (brush, colors, positions, count), "GdipGetPathGradientBlend");
684                         // can't call that for 1 count!
685
686                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
687                 }
688
689                 [Test]
690                 public void CreatePathGradient_FromPath_Line ()
691                 {
692                         IntPtr path;
693                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
694
695                         IntPtr brush;
696                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradientFromPath (IntPtr.Zero, out brush), "null");
697                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreatePathGradientFromPath (path, out brush), "empty path");
698
699                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine (path, 1, 1, 10, 10), "GdipAddPathLine");
700
701                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathGradientFromPath (path, out brush), "path");
702                         Assert.IsTrue (brush != IntPtr.Zero, "Handle");
703
704                         int count;
705                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathGradientBlendCount (brush, out count), "GdipGetPathGradientBlendCount");
706                         Assert.AreEqual (1, count, "blend count");
707
708                         int[] colors = new int[count];
709                         float[] positions = new float[count];
710                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathGradientPresetBlend (brush, colors, positions, count), "GdipGetPathGradientBlend");
711
712                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
713                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
714                 }
715
716                 [Test]
717                 public void CreatePathGradient_FromPath_Lines ()
718                 {
719                         IntPtr path;
720                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePath (FillMode.Alternate, out path), "GdipCreatePath");
721
722                         PointF[] pts_2f = new PointF[2] { new PointF (2f, 4f), new PointF (10f, 30f) };
723                         Assert.AreEqual (Status.Ok, GDIPlus.GdipAddPathLine2 (path, pts_2f, pts_2f.Length), "GdipAddPathLine2");
724
725                         IntPtr brush;
726                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePathGradientFromPath (path, out brush), "path");
727                         Assert.IsTrue (brush != IntPtr.Zero, "Handle");
728
729                         int count;
730                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPathGradientBlendCount (brush, out count), "GdipGetPathGradientBlendCount");
731                         Assert.AreEqual (1, count, "blend count");
732
733                         int[] colors = new int[count];
734                         float[] positions = new float[count];
735                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPathGradientPresetBlend (brush, colors, positions, count), "GdipGetPathGradientBlend");
736
737                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
738                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePath (path), "GdipDeletePath");
739                 }
740
741                 // Pen
742                 [Test]
743                 public void CreatePen ()
744                 {
745                         IntPtr pen;
746                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreatePen1 (0, 0f, Unit.UnitWorld, out pen), "GdipCreatePen1");
747                         Assert.IsTrue (pen != IntPtr.Zero, "pen");
748
749                         DashStyle ds;
750                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPenDashStyle (pen, out ds), "GdipGetPenDashStyle");
751                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashStyle (IntPtr.Zero, out ds), "GdipGetPenDashStyle-null");
752
753                         ds = DashStyle.Custom;
754                         Assert.AreEqual (Status.Ok, GDIPlus.GdipSetPenDashStyle (pen, ds), "GdipSetPenDashStyle");
755                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetPenDashStyle (IntPtr.Zero, ds), "GdipSetPenDashStyle-null");
756
757                         int count;
758                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetPenDashCount (pen, out count), "GdipGetPenDashCount");
759                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashCount (IntPtr.Zero, out count), "GdipGetPenDashCount-null");
760                         Assert.AreEqual (0, count, "count");
761
762                         float[] dash = new float[count];
763                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipGetPenDashArray (pen, dash, count), "GdipGetPenDashArray");
764                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashArray (IntPtr.Zero, dash, count), "GdipGetPenDashArray-null-pen");
765                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetPenDashArray (pen, null, count), "GdipGetPenDashArray-null-dash");
766
767                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeletePen (pen), "GdipDeletePen");
768                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipDeletePen (IntPtr.Zero), "GdipDeletePen-null");
769                 }
770
771                 // Region
772                 [Test]
773                 public void CreateRegionRgnData ()
774                 {
775                         IntPtr region;
776                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateRegionRgnData (null, 0, out region));
777
778                         byte[] data = new byte[0];
779                         Assert.AreEqual (Status.GenericError, GDIPlus.GdipCreateRegionRgnData (data, 0, out region));
780                 }
781
782                 [Test]
783                 public void DrawingOperations ()
784                 {
785                         IntPtr graphics, image;
786
787                         IntPtr pen;
788                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero,
789                                                            out image);
790
791                         GDIPlus.GdipGetImageGraphicsContext (image, out graphics);
792                         GDIPlus.GdipCreatePen1 (0, 0f, Unit.UnitWorld, out pen);
793
794                         // DrawCurve
795
796                         Assert.AreEqual (Status.InvalidParameter,
797                                          GDIPlus.GdipDrawCurveI (IntPtr.Zero, IntPtr.Zero, null, 0));
798
799                         Assert.AreEqual (Status.InvalidParameter, 
800                                          GDIPlus.GdipDrawCurveI (graphics, pen, new Point [] {}, 0),
801                                          "DrawCurve with no pts");
802                         Assert.AreEqual (Status.InvalidParameter,
803                                          GDIPlus.GdipDrawCurveI (graphics, pen,
804                                                                  new Point [] { new Point (1, 1) }, 1),
805                                          "DrawCurve with 1 pt");
806                         Assert.AreEqual (Status.Ok,
807                                          GDIPlus.GdipDrawCurveI (graphics, pen,
808                                                                  new Point [] { new Point (1, 1),
809                                                                                 new Point (2, 2) }, 2),
810                                          "DrawCurve with 2 pts");
811
812                         // DrawClosedCurve
813
814                         Assert.AreEqual (Status.InvalidParameter, 
815                                          GDIPlus.GdipDrawClosedCurveI (graphics, pen, new Point [] {}, 0),
816                                          "DrawClosedCurve with no pts");
817                         Assert.AreEqual (Status.InvalidParameter,
818                                          GDIPlus.GdipDrawClosedCurveI (graphics, pen,
819                                                                        new Point [] { new Point (1, 1) }, 1),
820                                          "DrawClosedCurve with 1 pt");
821                         Assert.AreEqual (Status.InvalidParameter,
822                                          GDIPlus.GdipDrawClosedCurveI (graphics, pen,
823                                                                        new Point [] { new Point (1, 1),
824                                                                                       new Point (2, 2) }, 2),
825                                          "DrawClosedCurve with 2 pt2");
826
827                         // DrawPolygon
828
829                         Assert.AreEqual (Status.InvalidParameter,
830                                          GDIPlus.GdipDrawPolygonI (graphics, pen, new Point [] {}, 0),
831                                          "DrawPolygon with no pts");
832                         Assert.AreEqual (Status.InvalidParameter,
833                                          GDIPlus.GdipDrawPolygonI (graphics, pen,
834                                                                    new Point [] { new Point (1, 1) }, 1),
835                                          "DrawPolygon with only one pt");
836
837                         GDIPlus.GdipDeletePen (pen);                    
838
839                         // FillClosedCurve
840
841                         IntPtr brush;
842                         GDIPlus.GdipCreateSolidFill (0, out brush);
843
844
845                         Assert.AreEqual (Status.InvalidParameter,
846                                          GDIPlus.GdipFillClosedCurveI (graphics, brush, new Point [] {}, 0),
847                                          "FillClosedCurve with no pts");
848                         Assert.AreEqual (Status.Ok,
849                                          GDIPlus.GdipFillClosedCurveI (graphics, brush, 
850                                                                        new Point [] { new Point (1, 1) }, 1),
851                                          "FillClosedCurve with 1 pt");
852                         Assert.AreEqual (Status.Ok,
853                                          GDIPlus.GdipFillClosedCurveI (graphics, brush,
854                                                                        new Point [] { new Point (1, 1),
855                                                                                       new Point (2, 2) }, 2),
856                                          "FillClosedCurve with 2 pts");
857                         
858                         GDIPlus.GdipDeleteBrush (brush);
859                         
860                         GDIPlus.GdipDeleteGraphics (graphics);
861                         GDIPlus.GdipDisposeImage (image);
862                 }
863
864                 // TextureBrush
865                 [Test]
866                 public void Texture ()
867                 {
868                         IntPtr image;
869                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
870
871                         IntPtr brush;
872                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateTexture (IntPtr.Zero, WrapMode.Tile, out brush), "GdipCreateTexture-image");
873                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTexture (image, (WrapMode)Int32.MinValue, out brush), "GdipCreateTexture-wrapmode");
874                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateTexture (image, WrapMode.Tile, out brush), "GdipCreateTexture");
875
876                         IntPtr image2;
877 // this would throw an AccessViolationException under MS 2.0 (missing null check?)
878 //                      Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetTextureImage (IntPtr.Zero, out image2), "GdipGetTextureImage-brush");
879                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetTextureImage (brush, out image2), "GdipGetTextureImage");
880                         Assert.IsFalse (image == image2, "image");
881
882                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
883                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "GdipDisposeImage");
884                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image2), "GdipDisposeImage-image2");
885                 }
886
887                 [Test]
888                 public void Texture2 ()
889                 {
890                         IntPtr image;
891                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
892
893                         IntPtr brush;
894                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateTexture2 (IntPtr.Zero, WrapMode.Tile, 0, 0, 10, 10, out brush), "GdipCreateTexture2-image");
895                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateTexture2 (IntPtr.Zero, (WrapMode) Int32.MinValue, 0, 0, 10, 10, out brush), "GdipCreateTexture2-wrapmode");
896                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTexture2 (image, WrapMode.Tile, 0, 0, 0, 10, out brush), "GdipCreateTexture2-width");
897                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTexture2 (image, WrapMode.Tile, 0, 0, 10, 0, out brush), "GdipCreateTexture2-height");
898                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTexture2 (image, WrapMode.Tile, -1, 0, 0, 10, out brush), "GdipCreateTexture2-x");
899                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTexture2 (image, WrapMode.Tile, 0, -1, 10, 0, out brush), "GdipCreateTexture2-y");
900                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTexture2 (image, WrapMode.Tile, 1, 0, 10, 10, out brush), "GdipCreateTexture2-too-wide");
901                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTexture2 (image, WrapMode.Tile, 0, 1, 10, 10, out brush), "GdipCreateTexture2-too-tall");
902                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateTexture2 (image, WrapMode.Tile, 0, 0, 10, 10, out brush), "GdipCreateTexture2");
903
904                         WrapMode wm;
905                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetTextureWrapMode (IntPtr.Zero, out wm), "GdipGetTextureWrapMode-brush");
906                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetTextureWrapMode (brush, out wm), "GdipGetTextureWrapMode");
907                         Assert.AreEqual (WrapMode.Tile, wm, "WrapMode");
908
909                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetTextureWrapMode (IntPtr.Zero, WrapMode.Clamp), "GdipSetTextureWrapMode-brush");
910                         Assert.AreEqual (Status.Ok, GDIPlus.GdipSetTextureWrapMode (brush, WrapMode.Clamp), "GdipSetTextureWrapMode");
911                         GDIPlus.GdipGetTextureWrapMode (brush, out wm);
912                         Assert.AreEqual (WrapMode.Clamp, wm, "WrapMode.Clamp");
913
914                         // an invalid WrapMode is ignored
915                         Assert.AreEqual (Status.Ok, GDIPlus.GdipSetTextureWrapMode (brush, (WrapMode) Int32.MinValue), "GdipSetTextureWrapMode-wrapmode");
916                         GDIPlus.GdipGetTextureWrapMode (brush, out wm);
917                         Assert.AreEqual (WrapMode.Clamp, wm, "WrapMode/Invalid");
918
919                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
920                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "GdipDisposeImage");
921                 }
922
923                 [Test]
924                 public void TextureIA ()
925                 {
926                         IntPtr image;
927                         GDIPlus.GdipCreateBitmapFromScan0 (10, 10, 0, PixelFormat.Format32bppArgb, IntPtr.Zero, out image);
928
929                         IntPtr brush;
930                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipCreateTextureIA (IntPtr.Zero, IntPtr.Zero, 0, 0, 10, 10, out brush), "GdipCreateTexture2-image");
931                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTextureIA (image, IntPtr.Zero, 0, 0, 0, 10, out brush), "GdipCreateTexture2-width");
932                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTextureIA (image, IntPtr.Zero, 0, 0, 10, 0, out brush), "GdipCreateTexture2-height");
933                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTextureIA (image, IntPtr.Zero, -1, 0, 10, 10, out brush), "GdipCreateTexture2-x");
934                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTextureIA (image, IntPtr.Zero, 0, -1, 10, 10, out brush), "GdipCreateTexture2-y");
935                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTextureIA (image, IntPtr.Zero, 1, 0, 10, 10, out brush), "GdipCreateTexture2-too-wide");
936                         Assert.AreEqual (Status.OutOfMemory, GDIPlus.GdipCreateTextureIA (image, IntPtr.Zero, 0, 1, 10, 10, out brush), "GdipCreateTexture2-too-tall");
937                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateTextureIA (image, IntPtr.Zero, 0, 0, 10, 10, out brush), "GdipCreateTexture2");
938
939                         // TODO - handle ImageAttribute in the tests
940
941                         IntPtr matrix;
942                         Assert.AreEqual (Status.Ok, GDIPlus.GdipCreateMatrix (out matrix), "GdipCreateMatrix");
943
944                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetTextureTransform (IntPtr.Zero, matrix), "GdipGetTextureTransform-brush");
945                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipGetTextureTransform (brush, IntPtr.Zero), "GdipGetTextureTransform-matrix");
946                         Assert.AreEqual (Status.Ok, GDIPlus.GdipGetTextureTransform (brush, matrix), "GdipGetTextureTransform");
947
948                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetTextureTransform (IntPtr.Zero, matrix), "GdipSetTextureTransform-brush");
949                         Assert.AreEqual (Status.InvalidParameter, GDIPlus.GdipSetTextureTransform (brush, IntPtr.Zero), "GdipSetTextureTransform-matrix");
950                         Assert.AreEqual (Status.Ok, GDIPlus.GdipSetTextureTransform (brush, matrix), "GdipSetTextureTransform");
951
952                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteMatrix (matrix), "GdipDeleteMatrix");
953                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDeleteBrush (brush), "GdipDeleteBrush");
954                         Assert.AreEqual (Status.Ok, GDIPlus.GdipDisposeImage (image), "GdipDisposeImage");
955                 }
956         }
957 }