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