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