New test.
[mono.git] / mcs / class / System.Drawing / System.Drawing / gdipFunctions.cs
1 //
2 // System.Drawing.gdipFunctions.cs
3 //
4 // Authors: 
5 //      Alexandre Pigolkine (pigolkine@gmx.de)
6 //      Jordi Mas i Hernandez (jordi@ximian.com)
7 //      Sanjay Gupta (gsanjay@novell.com)
8 //      Ravindra (rkumar@novell.com)
9 //      Peter Dennis Bartok (pbartok@novell.com)
10 //
11 // Copyright (C) 2004 - 2006 Novell, Inc (http://www.novell.com)
12 //
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
20 // 
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
23 // 
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 //
32
33 using System;
34 using System.IO;
35 using System.Runtime.InteropServices;
36 using System.Text;
37 using System.Drawing.Drawing2D;
38 using System.Drawing.Imaging;
39 using System.Drawing.Text;
40 using System.Security;
41 #if NET_2_0
42 using System.Runtime.InteropServices.ComTypes;
43 #else
44 using IStream = System.Runtime.InteropServices.UCOMIStream;
45 #endif
46
47 namespace System.Drawing
48 {
49         /// <summary>
50         /// GDI+ API Functions
51         /// </summary>
52         [SuppressUnmanagedCodeSecurity]
53         internal class GDIPlus
54         {
55                 public const int FACESIZE = 32;
56                 public const int LANG_NEUTRAL = 0;
57                 public static IntPtr Display = IntPtr.Zero;
58                 public static bool UseX11Drawable;
59                 public static bool UseQuartzDrawable = (Environment.GetEnvironmentVariable ("MONO_MWF_USE_QUARTZ_BACKEND") != null);
60                 public static bool UseCocoaDrawable = (Environment.GetEnvironmentVariable ("MONO_GDIP_USE_COCOA_BACKEND") != null);
61
62                 #region gdiplus.dll functions
63
64                 // startup / shutdown
65                 [DllImport("gdiplus.dll")]
66                 static internal extern Status GdiplusStartup(ref ulong token, ref GdiplusStartupInput input, ref GdiplusStartupOutput output);
67                 [DllImport("gdiplus.dll")]
68                 static internal extern void GdiplusShutdown(ref ulong token);
69                 
70                 internal static ulong GdiPlusToken = 0;
71
72                 static void ProcessExit (object sender, EventArgs e)
73                 {               
74                         // Called all pending objects and claim any pending handle before
75                         // shutting down
76                         GC.Collect ();  
77                         GC.WaitForPendingFinalizers ();
78                         
79                         GdiPlusToken = 0;
80
81                         // This causes crashes in MS GDI+ because this call occurs before
82                         // all managed GDI objects are finalized. When they are finalized they call
83                         // into a shutdown GDI+ and we crash.
84                         //GdiplusShutdown (ref GdiPlusToken);
85
86                         // This causes crashes in Mono libgdiplus because this call
87                         // occurs before all managed GDI objects are finalized
88                         // When they are finalized they use the closed display and
89                         // crash
90                         //if (UseX11Drawable && Display != IntPtr.Zero) {
91                         //      XCloseDisplay (Display);
92                         //}
93
94                 }
95
96                 static GDIPlus ()
97                 {
98                         // check for Unix platforms - see FAQ for more details
99                         // http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
100                         int platform = (int) Environment.OSVersion.Platform;
101                         UseX11Drawable = ((platform == 4) || (platform == 128));
102
103                         GdiplusStartupInput input = GdiplusStartupInput.MakeGdiplusStartupInput();
104                         GdiplusStartupOutput output = GdiplusStartupOutput.MakeGdiplusStartupOutput();
105                         GdiplusStartup (ref GdiPlusToken, ref input, ref output);
106                         AppDomain.CurrentDomain.ProcessExit += new EventHandler (ProcessExit);
107                 }
108                 
109                 // Copies a Ptr to an array of Points and releases the memory
110                 static public void FromUnManagedMemoryToPointI(IntPtr prt, Point [] pts)
111                 {                                               
112                         int nPointSize = Marshal.SizeOf(pts[0]);
113                         IntPtr pos = prt;
114                         for (int i=0; i<pts.Length; i++, pos = new IntPtr (pos.ToInt64 () + nPointSize))
115                                 pts[i] = (Point) Marshal.PtrToStructure(pos, typeof(Point));
116                         
117                         Marshal.FreeHGlobal(prt);                       
118                 }
119                 
120                 // Copies a Ptr to an array of Points and releases the memory
121                 static public void FromUnManagedMemoryToPoint (IntPtr prt, PointF [] pts)
122                 {                                               
123                         int nPointSize = Marshal.SizeOf(pts[0]);
124                         IntPtr pos = prt;
125                         for (int i=0; i<pts.Length; i++, pos = new IntPtr (pos.ToInt64 () + nPointSize))
126                                 pts[i] = (PointF) Marshal.PtrToStructure(pos, typeof(Point));
127                         
128                         Marshal.FreeHGlobal(prt);                       
129                 }
130                 
131                 // Copies an array of Points to unmanaged memory
132                 static public IntPtr FromPointToUnManagedMemoryI(Point [] pts)
133                 {
134                         int nPointSize =  Marshal.SizeOf(pts[0]);
135                         IntPtr dest = Marshal.AllocHGlobal(nPointSize* pts.Length);
136                         IntPtr pos = dest;
137                         for (int i=0; i<pts.Length; i++, pos = new IntPtr (pos.ToInt64 () + nPointSize))
138                                 Marshal.StructureToPtr(pts[i], pos, false);     
139                         
140                         return dest;                    
141                 }               
142                                 
143                 // Copies a Ptr to an array of v and releases the memory
144                 static public void FromUnManagedMemoryToRectangles (IntPtr prt, RectangleF [] pts)
145                 {                                               
146                         int nPointSize = Marshal.SizeOf (pts[0]);
147                         IntPtr pos = prt;
148                         for (int i = 0; i < pts.Length; i++, pos = new IntPtr (pos.ToInt64 () + nPointSize))
149                                 pts[i] = (RectangleF) Marshal.PtrToStructure(pos, typeof(RectangleF));
150                         
151                         Marshal.FreeHGlobal(prt);                       
152                 }
153                 
154                 // Copies an array of Points to unmanaged memory
155                 static public IntPtr FromPointToUnManagedMemory(PointF [] pts)
156                 {
157                         int nPointSize =  Marshal.SizeOf(pts[0]);
158                         IntPtr dest = Marshal.AllocHGlobal(nPointSize* pts.Length);                     
159                         IntPtr pos = dest;
160                         for (int i=0; i<pts.Length; i++, pos = new IntPtr (pos.ToInt64 () + nPointSize))
161                                 Marshal.StructureToPtr(pts[i], pos, false);     
162                         
163                         return dest;                    
164                 }
165
166                 // Converts a status into exception
167                 static internal void CheckStatus (Status status)
168                 {
169                         switch (status) {
170
171                                 case Status.Ok:
172                                         return;
173
174                                 // TODO: Add more status code mappings here
175
176                                 case Status.GenericError:
177                                         throw new Exception ("Generic Error.");
178
179                                 case Status.InvalidParameter:
180                                         throw new ArgumentException ("Invalid Parameter. A null reference or invalid value was found.");
181
182                                 case Status.OutOfMemory:
183                                         throw new OutOfMemoryException ("Out of memory.");
184
185                                 case Status.ObjectBusy:
186                                         throw new MemberAccessException ("Object busy.");
187
188                                 case Status.InsufficientBuffer:
189                                         throw new IO.InternalBufferOverflowException ("Insufficient buffer.");
190
191                                 case Status.PropertyNotSupported:
192                                         throw new NotSupportedException ("Property not supported.");
193
194                                 case Status.FileNotFound:
195                                         throw new IO.FileNotFoundException ("File not found.");
196
197                                 case Status.AccessDenied:
198                                         throw new UnauthorizedAccessException ("Access denied.");
199
200                                 case Status.UnknownImageFormat:
201                                         throw new NotSupportedException ("Either image format is unknown or you don't have the required libraries for this format.");
202
203                                 case Status.NotImplemented:
204                                         throw new NotImplementedException ("Feature not implemented.");
205
206                                 case Status.WrongState:
207                                         throw new ArgumentException ("Properties not set properly.");
208
209                                 case Status.FontFamilyNotFound:
210                                         throw new ArgumentException ("FontFamily wasn't found.");
211
212                                 case Status.ValueOverflow:
213                                         throw new OverflowException ("Argument out of range.");
214
215                                 default:
216                                         throw new Exception ("Unknown Error.");
217                         }
218                 }
219                 
220                 
221                 // Memory functions
222                 [DllImport("gdiplus.dll")]
223                 static internal extern IntPtr GdipAlloc (int size);
224                 [DllImport("gdiplus.dll")]
225                 static internal extern void GdipFree (IntPtr ptr);
226
227                 
228                 // Brush functions
229                 [DllImport("gdiplus.dll")]
230                 static internal extern Status GdipCloneBrush (IntPtr brush, out IntPtr clonedBrush);
231                 [DllImport("gdiplus.dll")]
232                 static internal extern Status GdipDeleteBrush (IntPtr brush);
233                 [DllImport("gdiplus.dll")]
234                 static internal extern Status GdipGetBrushType (IntPtr brush, out BrushType type);
235
236
237                 // Region functions
238                 [DllImport("gdiplus.dll")]
239                 static internal extern Status GdipCreateRegion (out IntPtr region);
240
241                 [DllImport("gdiplus.dll")]
242                 static internal extern Status GdipCreateRegionRgnData (byte[] data, int size, out IntPtr region);
243
244                 [DllImport("gdiplus.dll")]
245                 static internal extern Status GdipDeleteRegion (IntPtr region);
246
247                 [DllImport("gdiplus.dll")]
248                 static internal extern Status GdipCloneRegion (IntPtr region, out IntPtr cloned);
249
250                 [DllImport("gdiplus.dll")]
251                 static internal extern Status GdipCreateRegionRect (ref RectangleF rect, out IntPtr region);
252
253                 [DllImport("gdiplus.dll")]
254                 static internal extern Status GdipCreateRegionRectI (ref Rectangle rect,  out IntPtr region);
255
256                 [DllImport("gdiplus.dll")]
257                 static internal extern Status GdipCreateRegionPath (IntPtr path, out IntPtr region);
258
259                 [DllImport("gdiplus.dll")]
260                 static internal extern Status GdipTranslateRegion (IntPtr region, float dx, float dy);
261
262                 [DllImport("gdiplus.dll")]
263                 static internal extern Status GdipTranslateRegionI (IntPtr region, int dx, int dy);
264
265                 [DllImport("gdiplus.dll")]
266                 static internal extern Status GdipIsVisibleRegionPoint (IntPtr region, float x, float y,
267                         IntPtr graphics, out bool result);
268
269                 [DllImport("gdiplus.dll")]
270                 static internal extern Status GdipIsVisibleRegionPointI (IntPtr region, int x, int y,
271                         IntPtr graphics, out bool result);
272
273                 [DllImport("gdiplus.dll")]
274                 static internal extern Status GdipIsVisibleRegionRect (IntPtr region, float x, float y, float width,
275                         float height, IntPtr graphics, out bool result);
276
277                 [DllImport("gdiplus.dll")]
278                 static internal extern Status  GdipIsVisibleRegionRectI (IntPtr region, int x, int y, int width,
279                         int height, IntPtr graphics, out bool result);
280
281
282                 [DllImport("gdiplus.dll")]
283                 static internal extern Status GdipCombineRegionRect (IntPtr region, ref RectangleF rect,
284                         CombineMode combineMode);
285
286                 [DllImport("gdiplus.dll")]
287                 static internal extern Status GdipCombineRegionRectI (IntPtr region, ref Rectangle rect,
288                         CombineMode combineMode);
289
290                 [DllImport("gdiplus.dll")]
291                 static internal extern Status GdipCombineRegionPath (IntPtr region, IntPtr path, CombineMode combineMode);
292
293                 [DllImport("gdiplus.dll")]
294                 static internal extern Status GdipGetRegionBounds (IntPtr region, IntPtr graphics, ref RectangleF rect);
295
296                 [DllImport("gdiplus.dll")]
297                 static internal extern Status GdipSetInfinite (IntPtr region);
298
299                 [DllImport("gdiplus.dll")]
300                 static internal extern Status GdipSetEmpty (IntPtr region);
301
302                 [DllImport("gdiplus.dll")]
303                 static internal extern Status GdipIsEmptyRegion (IntPtr region, IntPtr graphics, out bool result);
304                 
305                 [DllImport("gdiplus.dll")]
306                 static internal extern Status GdipIsInfiniteRegion (IntPtr region, IntPtr graphics, out bool result);
307
308                 [DllImport("gdiplus.dll")]
309                 static internal extern Status GdipCombineRegionRegion (IntPtr region, IntPtr region2,
310                         CombineMode combineMode);
311                         
312                 [DllImport("gdiplus.dll")]
313                 static internal extern Status GdipIsEqualRegion (IntPtr region, IntPtr region2,
314                            IntPtr graphics, out bool result);                                   
315                            
316                 [DllImport("gdiplus.dll")]
317                 static internal extern Status GdipGetRegionDataSize (IntPtr region, out int bufferSize);
318
319                 [DllImport("gdiplus.dll")]
320                 static internal extern Status GdipGetRegionData (IntPtr region, byte[] buffer, int bufferSize, 
321                   out int sizeFilled);
322                   
323                 [DllImport("gdiplus.dll")]
324                 static internal extern Status GdipGetRegionScansCount (IntPtr region, out int count, IntPtr matrix);
325
326                 [DllImport("gdiplus.dll")]
327                 static internal extern Status GdipGetRegionScans (IntPtr region,  IntPtr rects, out int count, 
328                    IntPtr matrix);
329                 
330                 [DllImport("gdiplus.dll")]
331                 static internal extern Status GdipTransformRegion(IntPtr region, IntPtr matrix);
332                 
333                 [DllImport("gdiplus.dll")]
334                 static internal extern Status GdipFillRegion(IntPtr graphics, IntPtr brush, IntPtr region);
335
336                 [DllImport("gdiplus.dll")]
337                 static internal extern Status GdipGetRegionHRgn (IntPtr region, IntPtr graphics, ref IntPtr hRgn);
338
339                 [DllImport("gdiplus.dll")]
340                 static internal extern Status GdipCreateRegionHrgn (IntPtr hRgn, out IntPtr region);
341
342                 // Solid brush functions
343                 [DllImport("gdiplus.dll")]
344                 static internal extern Status GdipCreateSolidFill (int color, out IntPtr brush);
345                 [DllImport("gdiplus.dll")]
346                 static internal extern Status GdipGetSolidFillColor (IntPtr brush, out int color);
347                 [DllImport("gdiplus.dll")]
348                 static internal extern Status GdipSetSolidFillColor (IntPtr brush, int color);
349                 
350                 // Hatch Brush functions
351                 [DllImport("gdiplus.dll")]
352                 static internal extern Status GdipCreateHatchBrush (HatchStyle hatchstyle, int foreColor, int backColor, out IntPtr brush);
353                 [DllImport("gdiplus.dll")]
354                 static internal extern Status GdipGetHatchStyle (IntPtr brush, out HatchStyle hatchstyle);
355                 [DllImport("gdiplus.dll")]
356                 static internal extern Status GdipGetHatchForegroundColor (IntPtr brush, out int foreColor);
357                 [DllImport("gdiplus.dll")]
358                 static internal extern Status GdipGetHatchBackgroundColor (IntPtr brush, out int backColor);
359
360                 // Texture brush functions
361                 [DllImport("gdiplus.dll")]
362                 static internal extern Status GdipGetTextureImage (IntPtr texture, out IntPtr image);
363                 [DllImport("gdiplus.dll")]
364                 static internal extern Status GdipCreateTexture (IntPtr image, WrapMode wrapMode,  out IntPtr texture);
365                 [DllImport("gdiplus.dll")]
366                 static internal extern Status GdipCreateTextureIAI (IntPtr image, IntPtr imageAttributes, int x, int y, int width, int height, out IntPtr texture);
367                 [DllImport("gdiplus.dll")]
368                 static internal extern Status GdipCreateTextureIA (IntPtr image, IntPtr imageAttributes, float x, float y, float width, float height, out IntPtr texture);
369                 [DllImport("gdiplus.dll")]
370                 static internal extern Status GdipCreateTexture2I (IntPtr image, WrapMode wrapMode, int x, int y, int width, int height, out IntPtr texture);
371                 [DllImport("gdiplus.dll")]
372                 static internal extern Status GdipCreateTexture2 (IntPtr image, WrapMode wrapMode, float x, float y, float width, float height, out IntPtr texture);
373                 [DllImport("gdiplus.dll")]
374                 static internal extern Status GdipGetTextureTransform (IntPtr texture, IntPtr matrix);
375                 [DllImport("gdiplus.dll")]
376                 static internal extern Status GdipSetTextureTransform (IntPtr texture, IntPtr matrix);
377                 [DllImport("gdiplus.dll")]
378                 static internal extern Status GdipGetTextureWrapMode (IntPtr texture, out WrapMode wrapMode);
379                 [DllImport("gdiplus.dll")]
380                 static internal extern Status GdipSetTextureWrapMode (IntPtr texture, WrapMode wrapMode);
381                 [DllImport("gdiplus.dll")]
382                 static internal extern Status GdipMultiplyTextureTransform (IntPtr texture, IntPtr matrix, MatrixOrder order);
383                 [DllImport("gdiplus.dll")]
384                 static internal extern Status GdipResetTextureTransform (IntPtr texture);
385                 [DllImport("gdiplus.dll")]
386                 static internal extern Status GdipRotateTextureTransform (IntPtr texture, float angle, MatrixOrder order);
387                 [DllImport("gdiplus.dll")]
388                 static internal extern Status GdipScaleTextureTransform (IntPtr texture, float sx, float sy, MatrixOrder order);
389                 [DllImport("gdiplus.dll")]
390                 static internal extern Status GdipTranslateTextureTransform (IntPtr texture, float dx, float dy, MatrixOrder order);
391
392                 // PathGradientBrush functions
393                 [DllImport("gdiplus.dll")]
394                 static internal extern Status GdipCreatePathGradientFromPath (IntPtr path, out IntPtr brush);
395                 [DllImport("gdiplus.dll")]
396                 static internal extern Status GdipCreatePathGradientI (Point [] points, int count, WrapMode wrapMode, out IntPtr brush);
397                 [DllImport("gdiplus.dll")]
398                 static internal extern Status GdipCreatePathGradient (PointF [] points, int count, WrapMode wrapMode, out IntPtr brush);
399                 [DllImport("gdiplus.dll")]
400                 static internal extern Status GdipGetPathGradientBlendCount (IntPtr brush, out int count);
401                 [DllImport("gdiplus.dll")]
402                 static internal extern Status GdipGetPathGradientBlend (IntPtr brush, float [] blend, float [] positions, int count);
403                 [DllImport("gdiplus.dll")]
404                 static internal extern Status GdipSetPathGradientBlend (IntPtr brush, float [] blend, float [] positions, int count);
405                 [DllImport("gdiplus.dll")]
406                 static internal extern Status GdipGetPathGradientCenterColor (IntPtr brush, out int color);
407                 [DllImport("gdiplus.dll")]
408                 static internal extern Status GdipSetPathGradientCenterColor (IntPtr brush, int color);
409                 [DllImport("gdiplus.dll")]
410                 static internal extern Status GdipGetPathGradientCenterPoint (IntPtr brush, out PointF point);
411                 [DllImport("gdiplus.dll")]
412                 static internal extern Status GdipSetPathGradientCenterPoint (IntPtr brush, ref PointF point);
413                 [DllImport("gdiplus.dll")]
414                 static internal extern Status GdipGetPathGradientFocusScales (IntPtr brush, out float xScale, out float yScale);
415                 [DllImport("gdiplus.dll")]
416                 static internal extern Status GdipSetPathGradientFocusScales (IntPtr brush, float xScale, float yScale);
417                 [DllImport("gdiplus.dll")]
418                 static internal extern Status GdipGetPathGradientPresetBlendCount (IntPtr brush, out int count);
419                 [DllImport("gdiplus.dll")]
420                 static internal extern Status GdipGetPathGradientPresetBlend (IntPtr brush, int [] blend, float [] positions, int count);
421                 [DllImport("gdiplus.dll")]
422                 static internal extern Status GdipSetPathGradientPresetBlend (IntPtr brush, int [] blend, float [] positions, int count);
423                 [DllImport("gdiplus.dll")]
424                 static internal extern Status GdipGetPathGradientRect (IntPtr brush, out RectangleF rect);
425                 [DllImport("gdiplus.dll")]
426                 static internal extern Status GdipGetPathGradientSurroundColorCount (IntPtr brush, out int count);
427                 [DllImport("gdiplus.dll")]
428                 static internal extern Status GdipGetPathGradientSurroundColorsWithCount (IntPtr brush, int [] color, ref int count);
429                 [DllImport("gdiplus.dll")]
430                 static internal extern Status GdipSetPathGradientSurroundColorsWithCount (IntPtr brush, int [] color, ref int count);
431                 [DllImport("gdiplus.dll")]
432                 static internal extern Status GdipGetPathGradientTransform (IntPtr brush, IntPtr matrix);
433                 [DllImport("gdiplus.dll")]
434                 static internal extern Status GdipSetPathGradientTransform (IntPtr brush, IntPtr matrix);
435                 [DllImport("gdiplus.dll")]
436                 static internal extern Status GdipGetPathGradientWrapMode (IntPtr brush, out WrapMode wrapMode);
437                 [DllImport("gdiplus.dll")]
438                 static internal extern Status GdipSetPathGradientWrapMode (IntPtr brush, WrapMode wrapMode);
439                 [DllImport("gdiplus.dll")]
440                 static internal extern Status GdipSetPathGradientLinearBlend (IntPtr brush, float focus, float scale);
441                 [DllImport("gdiplus.dll")]
442                 static internal extern Status GdipSetPathGradientSigmaBlend (IntPtr brush, float focus, float scale);
443                 [DllImport("gdiplus.dll")]
444                 static internal extern Status GdipMultiplyPathGradientTransform (IntPtr texture, IntPtr matrix, MatrixOrder order);
445                 [DllImport("gdiplus.dll")]
446                 static internal extern Status GdipResetPathGradientTransform (IntPtr brush);
447                 [DllImport("gdiplus.dll")]
448                 static internal extern Status GdipRotatePathGradientTransform (IntPtr brush, float angle, MatrixOrder order);
449                 [DllImport("gdiplus.dll")]
450                 static internal extern Status GdipScalePathGradientTransform (IntPtr brush, float sx, float sy, MatrixOrder order);
451                 [DllImport("gdiplus.dll")]
452                 static internal extern Status GdipTranslatePathGradientTransform (IntPtr brush, float dx, float dy, MatrixOrder order);
453
454                 // LinearGradientBrush functions
455                 [DllImport("gdiplus.dll")]
456                 static internal extern Status GdipCreateLineBrushI (ref Point point1, ref Point point2, int color1, int color2, WrapMode wrapMode, out IntPtr brush);
457                 [DllImport("gdiplus.dll")]
458                 static internal extern Status GdipCreateLineBrush (ref PointF point1, ref PointF point2, int color1, int color2, WrapMode wrapMode, out IntPtr brush);
459                 [DllImport("gdiplus.dll")]
460                 static internal extern Status GdipCreateLineBrushFromRectI (ref Rectangle rect, int color1, int color2, LinearGradientMode linearGradientMode, WrapMode wrapMode, out IntPtr brush);
461                 [DllImport("gdiplus.dll")]
462                 static internal extern Status GdipCreateLineBrushFromRect (ref RectangleF rect, int color1, int color2, LinearGradientMode linearGradientMode, WrapMode wrapMode, out IntPtr brush);
463                 [DllImport("gdiplus.dll")]
464                 static internal extern Status GdipCreateLineBrushFromRectWithAngleI (ref Rectangle rect, int color1, int color2, float angle, bool isAngleScaleable, WrapMode wrapMode, out IntPtr brush);
465                 [DllImport("gdiplus.dll")]
466                 static internal extern Status GdipCreateLineBrushFromRectWithAngle (ref RectangleF rect, int color1, int color2, float angle, bool isAngleScaleable, WrapMode wrapMode, out IntPtr brush);
467                 [DllImport("gdiplus.dll")]
468                 static internal extern Status GdipGetLineBlendCount (IntPtr brush, out int count);
469                 [DllImport("gdiplus.dll")]
470                 static internal extern Status GdipSetLineBlend (IntPtr brush, float [] blend, float [] positions, int count);
471                 [DllImport("gdiplus.dll")]
472                 static internal extern Status GdipGetLineBlend (IntPtr brush, float [] blend, float [] positions, int count);
473                 [DllImport("gdiplus.dll")]
474                 static internal extern Status GdipSetLineGammaCorrection (IntPtr brush, bool useGammaCorrection);
475                 [DllImport("gdiplus.dll")]
476                 static internal extern Status GdipGetLineGammaCorrection (IntPtr brush, out bool useGammaCorrection);
477                 [DllImport("gdiplus.dll")]
478                 static internal extern Status GdipGetLinePresetBlendCount (IntPtr brush, out int count);
479                 [DllImport("gdiplus.dll")]
480                 static internal extern Status GdipSetLinePresetBlend (IntPtr brush, int [] blend, float [] positions, int count);
481                 [DllImport("gdiplus.dll")]
482                 static internal extern Status GdipGetLinePresetBlend (IntPtr brush, int [] blend, float [] positions, int count);
483                 [DllImport("gdiplus.dll")]
484                 static internal extern Status GdipSetLineColors (IntPtr brush, int color1, int color2);
485                 [DllImport("gdiplus.dll")]
486                 static internal extern Status GdipGetLineColors (IntPtr brush, int [] colors);
487                 [DllImport("gdiplus.dll")]
488                 static internal extern Status GdipGetLineRectI (IntPtr brush, out Rectangle rect);
489                 [DllImport("gdiplus.dll")]
490                 static internal extern Status GdipGetLineRect (IntPtr brush, out RectangleF rect);
491                 [DllImport("gdiplus.dll")]
492                 static internal extern Status GdipSetLineTransform (IntPtr brush, IntPtr matrix);
493                 [DllImport("gdiplus.dll")]
494                 static internal extern Status GdipGetLineTransform (IntPtr brush, IntPtr matrix);
495                 [DllImport("gdiplus.dll")]
496                 static internal extern Status GdipSetLineWrapMode (IntPtr brush, WrapMode wrapMode);
497                 [DllImport("gdiplus.dll")]
498                 static internal extern Status GdipGetLineWrapMode (IntPtr brush, out WrapMode wrapMode);
499                 [DllImport("gdiplus.dll")]
500                 static internal extern Status GdipSetLineLinearBlend (IntPtr brush, float focus, float scale);
501                 [DllImport("gdiplus.dll")]
502                 static internal extern Status GdipSetLineSigmaBlend (IntPtr brush, float focus, float scale);
503                 [DllImport("gdiplus.dll")]
504                 static internal extern Status GdipMultiplyLineTransform (IntPtr brush, IntPtr matrix, MatrixOrder order);
505                 [DllImport("gdiplus.dll")]
506                 static internal extern Status GdipResetLineTransform (IntPtr brush);
507                 [DllImport("gdiplus.dll")]
508                 static internal extern Status GdipRotateLineTransform (IntPtr brush, float angle, MatrixOrder order);
509                 [DllImport("gdiplus.dll")]
510                 static internal extern Status GdipScaleLineTransform (IntPtr brush, float sx, float sy, MatrixOrder order);
511                 [DllImport("gdiplus.dll")]
512                 static internal extern Status GdipTranslateLineTransform (IntPtr brush, float dx, float dy, MatrixOrder order);
513
514                 // Graphics functions
515                 [DllImport("gdiplus.dll")]
516                 static internal extern Status GdipCreateFromHDC(IntPtr hDC, out IntPtr graphics);
517                 [DllImport("gdiplus.dll")]
518                 static internal extern Status GdipDeleteGraphics(IntPtr graphics);
519                 [DllImport("gdiplus.dll")]
520                 static internal extern Status GdipRestoreGraphics(IntPtr graphics, uint graphicsState);
521                 [DllImport("gdiplus.dll")]
522                 static internal extern Status GdipSaveGraphics(IntPtr graphics, out uint state);
523                 [DllImport("gdiplus.dll")]                
524                 static internal extern Status GdipMultiplyWorldTransform (IntPtr graphics, IntPtr matrix, MatrixOrder order);
525                 
526                 [DllImport("gdiplus.dll")]
527                 static internal extern Status GdipRotateWorldTransform(IntPtr graphics, float angle, MatrixOrder order);
528                 [DllImport("gdiplus.dll")]
529                 static internal extern Status GdipTranslateWorldTransform(IntPtr graphics, float dx, float dy, MatrixOrder order);
530                 [DllImport("gdiplus.dll")]
531                 static internal extern Status GdipDrawArc (IntPtr graphics, IntPtr pen, float x, float y, float width, float height, float startAngle, float sweepAngle);
532                 [DllImport("gdiplus.dll")]
533                 static internal extern Status GdipDrawArcI (IntPtr graphics, IntPtr pen, int x, int y, int width, int height, float startAngle, float sweepAngle);
534                 [DllImport("gdiplus.dll")]
535                 static internal extern Status GdipDrawBezier (IntPtr graphics, IntPtr pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4);
536                 [DllImport("gdiplus.dll")]
537                 static internal extern Status GdipDrawBezierI (IntPtr graphics, IntPtr pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
538                 [DllImport("gdiplus.dll")]
539                 static internal extern Status GdipDrawEllipseI (IntPtr graphics, IntPtr pen, int x, int y, int width, int height);
540                 [DllImport("gdiplus.dll")]
541                 static internal extern Status GdipDrawEllipse (IntPtr graphics, IntPtr pen, float x, float y, float width, float height);
542                 [DllImport("gdiplus.dll")]
543                 static internal extern Status GdipDrawLine (IntPtr graphics, IntPtr pen, float x1, float y1, float x2, float y2);
544                 [DllImport("gdiplus.dll")]
545                 static internal extern Status GdipDrawLineI (IntPtr graphics, IntPtr pen, int x1, int y1, int x2, int y2);
546                 [DllImport ("gdiplus.dll")]
547                 static internal extern Status GdipDrawLines (IntPtr graphics, IntPtr pen, PointF [] points, int count);
548                 [DllImport ("gdiplus.dll")]
549                 static internal extern Status GdipDrawLinesI (IntPtr graphics, IntPtr pen, Point [] points, int count);
550                 [DllImport ("gdiplus.dll")]
551                 static internal extern Status GdipDrawPath (IntPtr graphics, IntPtr pen, IntPtr path);
552                 [DllImport ("gdiplus.dll")]
553                 static internal extern Status GdipDrawPie (IntPtr graphics, IntPtr pen, float x, float y, float width, float height, float startAngle, float sweepAngle);
554                 [DllImport ("gdiplus.dll")]
555                 static internal extern Status GdipDrawPieI (IntPtr graphics, IntPtr pen, int x, int y, int width, int height, float startAngle, float sweepAngle);
556                 [DllImport ("gdiplus.dll")]
557                 static internal extern Status GdipDrawPolygon (IntPtr graphics, IntPtr pen, PointF [] points, int count);
558                 [DllImport ("gdiplus.dll")]
559                 static internal extern Status GdipDrawPolygonI (IntPtr graphics, IntPtr pen, Point [] points, int count);
560                 [DllImport ("gdiplus.dll")]
561                 static internal extern Status GdipDrawRectangle (IntPtr graphics, IntPtr pen, float x, float y, float width, float height);
562                 [DllImport ("gdiplus.dll")]
563                 static internal extern Status GdipDrawRectangleI (IntPtr graphics, IntPtr pen, int x, int y, int width, int height);
564                 [DllImport ("gdiplus.dll")]
565                 static internal extern Status GdipDrawRectangles (IntPtr graphics, IntPtr pen, RectangleF [] rects, int count);
566                 [DllImport ("gdiplus.dll")]
567                 static internal extern Status GdipDrawRectanglesI (IntPtr graphics, IntPtr pen, Rectangle [] rects, int count);
568                 [DllImport("gdiplus.dll")]
569                 static internal extern Status GdipFillEllipseI (IntPtr graphics, IntPtr pen, int x, int y, int width, int height);
570                 [DllImport("gdiplus.dll")]
571                 static internal extern Status GdipFillEllipse (IntPtr graphics, IntPtr pen, float x, float y, float width, float height);
572                 [DllImport ("gdiplus.dll")]
573                 static internal extern  Status GdipFillPolygon (IntPtr graphics, IntPtr brush, PointF [] points, int count, FillMode fillMode);
574                 [DllImport ("gdiplus.dll")]
575                 static internal extern  Status GdipFillPolygonI (IntPtr graphics, IntPtr brush, Point [] points, int count, FillMode fillMode);
576                 [DllImport ("gdiplus.dll")]
577                 static internal extern  Status GdipFillPolygon2 (IntPtr graphics, IntPtr brush, PointF [] points, int count);
578                 [DllImport ("gdiplus.dll")]
579                 static internal extern  Status GdipFillPolygon2I (IntPtr graphics, IntPtr brush, Point [] points, int count);
580                 [DllImport("gdiplus.dll")]
581                 static internal extern Status GdipFillRectangle (IntPtr graphics, IntPtr brush, float x1, float y1, float x2, float y2);
582                 [DllImport("gdiplus.dll")]
583                 static internal extern Status GdipFillRectangleI (IntPtr graphics, IntPtr brush, int x1, int y1, int x2, int y2);
584                 [DllImport("gdiplus.dll")]
585                 static internal extern Status GdipFillRectangles (IntPtr graphics, IntPtr brush, RectangleF [] rects, int count);
586                 [DllImport("gdiplus.dll")]
587                 static internal extern Status GdipFillRectanglesI (IntPtr graphics, IntPtr brush, Rectangle [] rects, int count);
588                 [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
589                 static internal extern Status GdipDrawString (IntPtr graphics, string text, int len, IntPtr font, ref RectangleF rc, IntPtr format, IntPtr brush);
590                 [DllImport("gdiplus.dll")]
591                 static internal extern Status GdipGetDC (IntPtr graphics, out IntPtr hdc);
592                 [DllImport("gdiplus.dll")]
593                 static internal extern Status GdipReleaseDC (IntPtr graphics, IntPtr hdc);
594                 [DllImport("gdiplus.dll")]
595                 static internal extern Status GdipDrawImageRectI (IntPtr graphics, IntPtr image, int x, int y, int width, int height);
596                 [DllImport ("gdiplus.dll")]
597                 static internal extern Status GdipGetRenderingOrigin (IntPtr graphics, out int x, out int y);
598                 [DllImport ("gdiplus.dll")]
599                 static internal extern Status GdipSetRenderingOrigin (IntPtr graphics, int x, int y);
600                 [DllImport("gdiplus.dll")]
601                 internal static extern Status GdipCloneBitmapArea (float x, float y, float width, float height, PixelFormat format, IntPtr original, out IntPtr bitmap);
602                 [DllImport("gdiplus.dll")]
603                 internal static extern Status GdipCloneBitmapAreaI (int x, int y, int width, int height, PixelFormat format, IntPtr original, out IntPtr bitmap);
604                 [DllImport("gdiplus.dll")]
605                 internal static extern Status GdipResetWorldTransform (IntPtr graphics);
606                 [DllImport("gdiplus.dll")]
607                 internal static extern Status GdipSetWorldTransform (IntPtr graphics, IntPtr matrix);
608                 [DllImport("gdiplus.dll")]
609                 internal static extern Status GdipGetWorldTransform (IntPtr graphics, IntPtr matrix);
610                 [DllImport("gdiplus.dll")]
611                 internal static extern Status GdipScaleWorldTransform (IntPtr graphics, float sx, float sy, MatrixOrder order);                 
612                 [DllImport("gdiplus.dll")]
613                 internal static extern Status GdipGraphicsClear(IntPtr graphics, int argb);             
614                 [DllImport("gdiplus.dll")]
615                 internal static extern Status GdipDrawClosedCurve(IntPtr graphics, IntPtr pen, PointF [] points, int count);
616                 [DllImport("gdiplus.dll")]
617                 internal static extern Status GdipDrawClosedCurveI(IntPtr graphics, IntPtr pen, Point [] points, int count);            
618                 [DllImport("gdiplus.dll")]
619                 internal static extern Status GdipDrawClosedCurve2(IntPtr graphics, IntPtr pen, PointF [] points, int count, float tension);
620                 [DllImport("gdiplus.dll")]
621                 internal static extern Status GdipDrawClosedCurve2I(IntPtr graphics, IntPtr pen, Point [] points, int count, float tension);            
622                 [DllImport("gdiplus.dll")]
623                 internal static extern Status GdipDrawCurve(IntPtr graphics, IntPtr pen, PointF [] points, int count);
624                 [DllImport("gdiplus.dll")]
625                 internal static extern Status GdipDrawCurveI(IntPtr graphics, IntPtr pen, Point [] points, int count);
626                 [DllImport("gdiplus.dll")]
627                 internal static extern Status GdipDrawCurve2(IntPtr graphics, IntPtr pen, PointF [] points, int count, float tension);
628                 [DllImport("gdiplus.dll")]
629                 internal static extern Status GdipDrawCurve2I(IntPtr graphics, IntPtr pen, Point [] points, int count, float tension);
630                 [DllImport("gdiplus.dll")]
631                 internal static extern Status GdipDrawCurve3(IntPtr graphics, IntPtr pen, PointF [] points, int count, int offset, int numberOfSegments, float tension);
632                 [DllImport("gdiplus.dll")]
633                 internal static extern Status GdipDrawCurve3I(IntPtr graphics, IntPtr pen, Point [] points, int count, int offset, int numberOfSegments, float tension);                
634                 [DllImport("gdiplus.dll")]              
635                 internal static extern Status GdipSetClipRect(IntPtr graphics, float x, float y, float width, float height, CombineMode combineMode);
636                 [DllImport("gdiplus.dll")]      
637                 internal static extern Status GdipSetClipRectI(IntPtr graphics, int x, int y, int width, int height, CombineMode combineMode);
638                 [DllImport("gdiplus.dll")]      
639                 internal static extern Status GdipSetClipPath(IntPtr graphics, IntPtr path, CombineMode combineMode);
640                 [DllImport("gdiplus.dll")]      
641                 internal static extern Status GdipSetClipRegion(IntPtr graphics, IntPtr region, CombineMode combineMode);
642                 [DllImport("gdiplus.dll")]      
643                 internal static extern Status GdipSetClipGraphics(IntPtr graphics, IntPtr srcgraphics, CombineMode combineMode);                
644                 [DllImport("gdiplus.dll")]      
645                 internal static extern Status GdipResetClip(IntPtr graphics);           
646                 [DllImport("gdiplus.dll")]      
647                 internal static extern Status GdipEndContainer(IntPtr graphics, uint state);
648                 [DllImport("gdiplus.dll")]      
649                 internal static extern Status GdipGetClip (IntPtr graphics, IntPtr region);
650
651                 [DllImport("gdiplus.dll")]      
652                 internal static extern Status GdipFillClosedCurve(IntPtr graphics, IntPtr brush, PointF [] points, int count);
653                               
654                 [DllImport("gdiplus.dll")]      
655                 internal static extern Status GdipFillClosedCurveI(IntPtr graphics, IntPtr brush, Point [] points, int count);
656
657                 [DllImport("gdiplus.dll")]      
658                 internal static extern Status GdipFillClosedCurve2(IntPtr graphics, IntPtr brush, 
659                                           PointF [] points, int count, float tension, FillMode fillMode);
660
661                 [DllImport("gdiplus.dll")]      
662                 internal static extern Status GdipFillClosedCurve2I(IntPtr graphics, IntPtr brush,
663                               Point [] points, int count, float tension, FillMode fillMode);
664                               
665                 [DllImport("gdiplus.dll")]      
666                 internal static extern Status GdipFillPie(IntPtr graphics, IntPtr brush, float x, float y,
667                 float width, float height, float startAngle, float sweepAngle);
668
669                 [DllImport("gdiplus.dll")]      
670                 internal static extern Status GdipFillPieI(IntPtr graphics, IntPtr brush, int x, int y,
671              int width, int height, float startAngle, float sweepAngle);
672              
673                 [DllImport("gdiplus.dll")]      
674                 internal static extern Status GdipFillPath(IntPtr graphics, IntPtr brush, IntPtr path);
675                 
676                 [DllImport("gdiplus.dll")]      
677                 internal static extern Status GdipGetNearestColor(IntPtr graphics,  out int argb);
678                 
679                 [DllImport("gdiplus.dll")]      
680                 internal static extern Status GdipIsVisiblePoint(IntPtr graphics, float x, float y, out bool result);
681
682                 [DllImport("gdiplus.dll")]      
683                 internal static extern Status GdipIsVisiblePointI(IntPtr graphics, int x, int y, out bool result);
684
685                 [DllImport("gdiplus.dll")]      
686                 internal static extern Status GdipIsVisibleRect(IntPtr graphics, float x, float y,
687                            float width, float height, out bool result);
688
689                 [DllImport("gdiplus.dll")]      
690                 internal static extern Status GdipIsVisibleRectI(IntPtr graphics, int x, int y,
691                            int width, int height, out bool result);
692                            
693                 [DllImport("gdiplus.dll")]      
694                 internal static extern Status GdipTransformPoints(IntPtr graphics, CoordinateSpace destSpace,
695                              CoordinateSpace srcSpace, IntPtr points,  int count);
696
697                 [DllImport("gdiplus.dll")]      
698                 internal static extern Status GdipTransformPointsI(IntPtr graphics, CoordinateSpace destSpace,
699                              CoordinateSpace srcSpace, IntPtr points, int count);                           
700         
701         [DllImport("gdiplus.dll")]                           
702                 internal static extern Status GdipTranslateClip(IntPtr graphics, float dx, float dy);
703                 [DllImport("gdiplus.dll")]                           
704                 internal static extern Status GdipTranslateClipI(IntPtr graphics, int dx, int dy);              
705                 [DllImport("gdiplus.dll")]                           
706                 internal static extern Status GdipGetClipBounds(IntPtr graphics, out RectangleF rect);          
707                 [DllImport("gdiplus.dll")]                           
708                 internal static extern Status GdipSetCompositingMode(IntPtr graphics, CompositingMode compositingMode);
709                 [DllImport("gdiplus.dll")]                           
710                 internal static extern Status GdipGetCompositingMode(IntPtr graphics, out CompositingMode compositingMode);             
711                 [DllImport("gdiplus.dll")]                           
712                 internal static extern Status GdipSetCompositingQuality(IntPtr graphics, CompositingQuality compositingQuality);
713                 [DllImport("gdiplus.dll")]                           
714                 internal static extern Status GdipGetCompositingQuality(IntPtr graphics, out CompositingQuality compositingQuality);
715                 [DllImport("gdiplus.dll")]                           
716                 internal static extern Status GdipSetInterpolationMode(IntPtr graphics, InterpolationMode interpolationMode);
717                 [DllImport("gdiplus.dll")]                   
718                 internal static extern Status GdipGetInterpolationMode(IntPtr graphics, out InterpolationMode interpolationMode);               
719                 [DllImport("gdiplus.dll")]                   
720                 internal static extern Status GdipGetDpiX(IntPtr graphics, out float dpi);
721                 [DllImport("gdiplus.dll")]                   
722                 internal static extern Status GdipGetDpiY(IntPtr graphics, out float dpi);
723                 [DllImport("gdiplus.dll")]                   
724                 internal static extern Status GdipIsClipEmpty(IntPtr graphics, out bool result);
725                 [DllImport("gdiplus.dll")]                   
726                 internal static extern Status GdipIsVisibleClipEmpty(IntPtr graphics, out bool result);         
727                 [DllImport("gdiplus.dll")]                   
728                 internal static extern Status GdipGetPageUnit(IntPtr graphics, out GraphicsUnit unit);          
729                 [DllImport("gdiplus.dll")]                   
730                 internal static extern Status GdipGetPageScale(IntPtr graphics, out float scale);               
731                 [DllImport("gdiplus.dll")]                   
732                 internal static extern Status GdipSetPageUnit(IntPtr graphics, GraphicsUnit unit);
733                 [DllImport("gdiplus.dll")]                   
734                 internal static extern Status GdipSetPageScale(IntPtr graphics, float scale);
735                 [DllImport("gdiplus.dll")]                   
736                 internal static extern Status GdipSetPixelOffsetMode(IntPtr graphics, PixelOffsetMode pixelOffsetMode);
737                 [DllImport("gdiplus.dll")]                   
738                 internal static extern Status GdipGetPixelOffsetMode(IntPtr graphics, out PixelOffsetMode pixelOffsetMode);
739                 [DllImport("gdiplus.dll")]                   
740                 internal static extern Status GdipSetSmoothingMode(IntPtr graphics, SmoothingMode smoothingMode);
741                 [DllImport("gdiplus.dll")]                   
742                 internal static extern Status GdipGetSmoothingMode(IntPtr graphics, out SmoothingMode smoothingMode);
743                 [DllImport("gdiplus.dll")]                   
744                 internal static extern Status GdipSetTextContrast(IntPtr graphics, int contrast);
745                 [DllImport("gdiplus.dll")]                   
746                 internal static extern Status GdipGetTextContrast(IntPtr graphics, out int contrast);
747                 [DllImport("gdiplus.dll")]                   
748                 internal static extern Status GdipSetTextRenderingHint(IntPtr graphics, TextRenderingHint mode);
749                 [DllImport("gdiplus.dll")]                   
750                 internal static extern Status GdipGetTextRenderingHint(IntPtr graphics, out TextRenderingHint mode);
751                 [DllImport("gdiplus.dll")]                   
752                 internal static extern Status GdipGetVisibleClipBounds(IntPtr graphics, out RectangleF rect);
753                 
754                 [DllImport("gdiplus.dll")]                   
755                 internal static extern Status GdipFlush(IntPtr graphics, FlushIntention intention);
756
757                 [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
758                 internal static extern Status GdipAddPathString (IntPtr path, string s, int lenght, IntPtr family, int style, float emSize, ref RectangleF layoutRect, IntPtr format);
759                 [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
760                 internal static extern Status GdipAddPathStringI (IntPtr path, string s, int lenght, IntPtr family, int style, float emSize, ref Rectangle layoutRect, IntPtr format);
761
762                                 
763                 // Pen functions
764                 [DllImport("gdiplus.dll")]
765                 internal static extern Status GdipCreatePen1 (int argb, float width, Unit unit, out IntPtr pen);
766                 [DllImport("gdiplus.dll")]
767                 internal static extern Status GdipCreatePen2 (IntPtr brush, float width, Unit unit, out IntPtr pen);
768                 [DllImport("gdiplus.dll")]
769                 internal static extern Status GdipClonePen (IntPtr pen, out IntPtr clonepen);
770                 [DllImport("gdiplus.dll")]
771                 internal static extern Status GdipDeletePen(IntPtr pen);
772                 [DllImport("gdiplus.dll")]
773                 internal static extern Status GdipSetPenBrushFill (IntPtr pen, IntPtr brush);
774                 [DllImport("gdiplus.dll")]
775                 internal static extern Status GdipGetPenBrushFill (IntPtr pen, out IntPtr brush);
776                 [DllImport("gdiplus.dll")]
777                 internal static extern Status GdipGetPenFillType (IntPtr pen, out PenType type);
778                 [DllImport("gdiplus.dll")]
779                 internal static extern Status GdipSetPenColor (IntPtr pen, int color);
780                 [DllImport("gdiplus.dll")]                
781                 internal static extern Status GdipGetPenColor (IntPtr pen, out int color);
782                 [DllImport("gdiplus.dll")]
783                 internal static extern Status GdipSetPenCompoundArray (IntPtr pen, float[] dash, int count);
784                 [DllImport("gdiplus.dll")]
785                 internal static extern Status GdipGetPenCompoundArray (IntPtr pen, float[] dash, int count);
786                 [DllImport("gdiplus.dll")]
787                 internal static extern Status GdipGetPenCompoundCount (IntPtr pen, out int count);
788                 [DllImport("gdiplus.dll")]
789                 internal static extern Status GdipSetPenDashCap197819 (IntPtr pen, DashCap dashCap);
790                 [DllImport("gdiplus.dll")]
791                 internal static extern Status GdipGetPenDashCap197819 (IntPtr pen, out DashCap dashCap);
792                 [DllImport("gdiplus.dll")]
793                 internal static extern Status GdipSetPenDashStyle (IntPtr pen, DashStyle dashStyle);
794                 [DllImport("gdiplus.dll")]
795                 internal static extern Status GdipGetPenDashStyle (IntPtr pen, out DashStyle dashStyle);
796                 [DllImport("gdiplus.dll")]
797                 internal static extern Status GdipSetPenDashOffset (IntPtr pen, float offset);
798                 [DllImport("gdiplus.dll")]
799                 internal static extern Status GdipGetPenDashOffset (IntPtr pen, out float offset);
800                 [DllImport("gdiplus.dll")]
801                 internal static extern Status GdipGetPenDashCount (IntPtr pen, out int count);
802                 [DllImport("gdiplus.dll")]
803                 internal static extern Status GdipSetPenDashArray (IntPtr pen, float[] dash, int count);
804                 [DllImport("gdiplus.dll")]
805                 internal static extern Status GdipGetPenDashArray (IntPtr pen, float[] dash, int count);
806                 [DllImport("gdiplus.dll")]
807                 internal static extern Status GdipSetPenMiterLimit (IntPtr pen, float miterLimit);
808                 [DllImport("gdiplus.dll")]
809                 internal static extern Status GdipGetPenMiterLimit (IntPtr pen, out float miterLimit);
810                 [DllImport("gdiplus.dll")]
811                 internal static extern Status GdipSetPenLineJoin (IntPtr pen, LineJoin lineJoin);
812                 [DllImport("gdiplus.dll")]
813                 internal static extern Status GdipGetPenLineJoin (IntPtr pen, out LineJoin lineJoin);
814                 [DllImport("gdiplus.dll")]
815                 internal static extern Status GdipSetPenLineCap197819 (IntPtr pen, LineCap startCap, LineCap endCap, DashCap dashCap);
816                 [DllImport("gdiplus.dll")]
817                 internal static extern Status GdipSetPenMode (IntPtr pen, PenAlignment alignment);
818                 [DllImport("gdiplus.dll")]
819                 internal static extern Status GdipGetPenMode (IntPtr pen, out PenAlignment alignment);
820                 [DllImport("gdiplus.dll")]
821                 internal static extern Status GdipSetPenStartCap (IntPtr pen, LineCap startCap);
822                 [DllImport("gdiplus.dll")]
823                 internal static extern Status GdipGetPenStartCap (IntPtr pen, out LineCap startCap);
824                 [DllImport("gdiplus.dll")]
825                 internal static extern Status GdipSetPenEndCap (IntPtr pen, LineCap endCap);
826                 [DllImport("gdiplus.dll")]
827                 internal static extern Status GdipGetPenEndCap (IntPtr pen, out LineCap endCap);
828                 [DllImport("gdiplus.dll")]
829                 internal static extern Status GdipSetPenCustomStartCap (IntPtr pen, IntPtr customCap);
830                 [DllImport("gdiplus.dll")]
831                 internal static extern Status GdipGetPenCustomStartCap (IntPtr pen, out IntPtr customCap);
832                 [DllImport("gdiplus.dll")]
833                 internal static extern Status GdipSetPenCustomEndCap (IntPtr pen, IntPtr customCap);
834                 [DllImport("gdiplus.dll")]
835                 internal static extern Status GdipGetPenCustomEndCap (IntPtr pen, out IntPtr customCap);
836                 [DllImport("gdiplus.dll")]
837                 internal static extern Status GdipSetPenTransform (IntPtr pen, IntPtr matrix);
838                 [DllImport("gdiplus.dll")]
839                 internal static extern Status GdipGetPenTransform (IntPtr pen, IntPtr matrix);
840                 [DllImport("gdiplus.dll")]
841                 internal static extern Status GdipSetPenWidth (IntPtr pen, float width);
842                 [DllImport("gdiplus.dll")]
843                 internal static extern Status GdipGetPenWidth (IntPtr pen, out float width);
844                 [DllImport("gdiplus.dll")]
845                 internal static extern Status GdipResetPenTransform (IntPtr pen);
846                 [DllImport("gdiplus.dll")]
847                 internal static extern Status GdipMultiplyPenTransform (IntPtr pen, IntPtr matrix, MatrixOrder order);
848                 [DllImport("gdiplus.dll")]
849                 internal static extern Status GdipRotatePenTransform (IntPtr pen, float angle, MatrixOrder order);
850                 [DllImport("gdiplus.dll")]
851                 internal static extern Status GdipScalePenTransform (IntPtr pen, float sx, float sy, MatrixOrder order);
852                 [DllImport("gdiplus.dll")]
853                 internal static extern Status GdipTranslatePenTransform (IntPtr pen, float dx, float dy, MatrixOrder order);
854
855                 // CustomLineCap functions
856                 [DllImport("gdiplus.dll")]
857                 internal static extern Status GdipCreateCustomLineCap (IntPtr fillPath, IntPtr strokePath, LineCap baseCap, float baseInset, out IntPtr customCap);
858                 [DllImport("gdiplus.dll")]
859                 internal static extern Status GdipDeleteCustomLineCap (IntPtr customCap);
860                 [DllImport("gdiplus.dll")]
861                 internal static extern Status GdipCloneCustomLineCap (IntPtr customCap, out IntPtr clonedCap);
862                 [DllImport("gdiplus.dll")]
863                 internal static extern Status GdipSetCustomLineCapStrokeCaps (IntPtr customCap, LineCap startCap, LineCap endCap);
864                 [DllImport("gdiplus.dll")]
865                 internal static extern Status GdipGetCustomLineCapStrokeCaps (IntPtr customCap, out LineCap startCap, out LineCap endCap);
866                 [DllImport("gdiplus.dll")]
867                 internal static extern Status GdipSetCustomLineCapStrokeJoin (IntPtr customCap, LineJoin lineJoin);
868                 [DllImport("gdiplus.dll")]
869                 internal static extern Status GdipGetCustomLineCapStrokeJoin (IntPtr customCap, out LineJoin lineJoin);
870                 [DllImport("gdiplus.dll")]
871                 internal static extern Status GdipSetCustomLineCapBaseCap (IntPtr customCap, LineCap baseCap);
872                 [DllImport("gdiplus.dll")]
873                 internal static extern Status GdipGetCustomLineCapBaseCap (IntPtr customCap, out LineCap baseCap);
874                 [DllImport("gdiplus.dll")]
875                 internal static extern Status GdipSetCustomLineCapBaseInset (IntPtr customCap, float inset);
876                 [DllImport("gdiplus.dll")]
877                 internal static extern Status GdipGetCustomLineCapBaseInset (IntPtr customCap, out float inset);
878                 [DllImport("gdiplus.dll")]
879                 internal static extern Status GdipSetCustomLineCapWidthScale (IntPtr customCap, float widthScale);
880                 [DllImport("gdiplus.dll")]
881                 internal static extern Status GdipGetCustomLineCapWidthScale (IntPtr customCap, out float widthScale);
882
883                 // AdjustableArrowCap functions
884                 [DllImport("gdiplus.dll")]
885                 internal static extern Status GdipCreateAdjustableArrowCap (float height, float width, bool isFilled, out IntPtr arrowCap);
886                 [DllImport("gdiplus.dll")]
887                 internal static extern Status GdipSetAdjustableArrowCapHeight (IntPtr arrowCap, float height);
888                 [DllImport("gdiplus.dll")]
889                 internal static extern Status GdipGetAdjustableArrowCapHeight (IntPtr arrowCap, out float height);
890                 [DllImport("gdiplus.dll")]
891                 internal static extern Status GdipSetAdjustableArrowCapWidth (IntPtr arrowCap, float width);
892                 [DllImport("gdiplus.dll")]
893                 internal static extern Status GdipGetAdjustableArrowCapWidth (IntPtr arrowCap, out float width);
894                 [DllImport("gdiplus.dll")]
895                 internal static extern Status GdipSetAdjustableArrowCapMiddleInset (IntPtr arrowCap, float middleInset);
896                 [DllImport("gdiplus.dll")]
897                 internal static extern Status GdipGetAdjustableArrowCapMiddleInset (IntPtr arrowCap, out float middleInset);
898                 [DllImport("gdiplus.dll")]
899                 internal static extern Status GdipSetAdjustableArrowCapFillState (IntPtr arrowCap, bool isFilled);
900                 [DllImport("gdiplus.dll")]
901                 internal static extern Status GdipGetAdjustableArrowCapFillState (IntPtr arrowCap, out bool isFilled);
902
903
904                 [DllImport("gdiplus.dll")]
905                 internal static extern Status GdipCreateFromHWND (IntPtr hwnd, out IntPtr graphics);
906
907                 [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
908                 internal static extern Status GdipMeasureString(IntPtr graphics, string str, int length, IntPtr font,
909                  ref RectangleF layoutRect, IntPtr stringFormat, out RectangleF boundingBox, out int codepointsFitted,
910                                 out int linesFilled);                                           
911                                 
912                 [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
913                 internal static extern Status GdipMeasureCharacterRanges (IntPtr graphics, string str, int length, IntPtr font,
914                         ref RectangleF layoutRect, IntPtr stringFormat, int regcount, out IntPtr regions);          
915
916                 [DllImport("gdiplus.dll")]
917                 internal static extern Status GdipSetStringFormatMeasurableCharacterRanges (IntPtr native, 
918                         int cnt, CharacterRange [] range);
919                 
920                 [DllImport("gdiplus.dll")]
921                 internal static extern Status GdipGetStringFormatMeasurableCharacterRangeCount (IntPtr native, 
922                         out int cnt);           
923         
924                 // Bitmap functions
925                 [DllImport("gdiplus.dll")]
926                 internal static extern Status GdipCreateBitmapFromScan0 (int width, int height, int stride, PixelFormat format, IntPtr scan0, out IntPtr bmp);
927
928                 [DllImport("gdiplus.dll")]
929                 internal static extern Status GdipCreateBitmapFromGraphics (int width, int height, IntPtr target, out IntPtr bitmap);
930
931                 [DllImport("gdiplus.dll")]
932                 internal static extern Status GdipBitmapLockBits (IntPtr bmp, ref Rectangle rc, ImageLockMode flags, PixelFormat format, [In, Out] BitmapData bmpData);
933                 
934                 [DllImport("gdiplus.dll")]
935                 internal static extern Status GdipBitmapSetResolution(IntPtr bmp, float xdpi, float ydpi);
936                                 
937                 [DllImport("gdiplus.dll")]
938                 internal static extern Status GdipBitmapUnlockBits (IntPtr bmp, [In,Out] BitmapData bmpData);
939                 
940                 [DllImport("gdiplus.dll")]
941                 internal static extern Status GdipBitmapGetPixel (IntPtr bmp, int x, int y, out int argb); 
942                 
943                 [DllImport("gdiplus.dll")]
944                 internal static extern Status GdipBitmapSetPixel (IntPtr bmp, int x, int y, int argb);
945
946                 // Image functions
947                 [DllImport("gdiplus.dll", CharSet=CharSet.Auto)]
948                 internal static extern Status GdipLoadImageFromFile ( [MarshalAs(UnmanagedType.LPWStr)] string filename, out IntPtr image );
949
950 #if !TEST
951                 // Stream functions for Win32 (original Win32 ones)
952                 [DllImport("gdiplus.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
953                 internal static extern Status GdipLoadImageFromStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(ComIStreamMarshaler))] IStream stream, out IntPtr image);
954                 
955                 [DllImport("gdiplus.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
956                 internal static extern Status GdipSaveImageToStream(HandleRef image, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(ComIStreamMarshaler))] IStream stream, [In()] ref Guid clsidEncoder, HandleRef encoderParams);
957 #endif                  
958                                 
959                 [DllImport("gdiplus.dll")]
960                 internal static extern Status GdipCloneImage(IntPtr image, out IntPtr imageclone);
961  
962                 [DllImport("gdiplus.dll", CharSet=CharSet.Auto)]
963                 internal static extern Status GdipLoadImageFromFileICM ( [MarshalAs(UnmanagedType.LPWStr)] string filename, out IntPtr image );
964                 
965                 [DllImport("gdiplus.dll")]
966                 internal static extern Status GdipCreateBitmapFromHBITMAP ( IntPtr hBitMap, IntPtr gdiPalette, out IntPtr image );
967                 
968                 [DllImport("gdiplus.dll")]
969                 internal static extern Status GdipDisposeImage ( IntPtr image );
970
971                 [DllImport("gdiplus.dll")]
972                 internal static extern Status GdipGetImageFlags(IntPtr image, out int flag);
973
974                 [DllImport("gdiplus.dll")]
975                 internal static extern Status GdipImageGetFrameDimensionsCount ( IntPtr image, out uint count );
976                                                                                                    
977                 [DllImport("gdiplus.dll")]
978                 internal static extern Status GdipImageGetFrameDimensionsList ( IntPtr image, [Out] Guid [] dimensionIDs, uint count );
979  
980                 [DllImport("gdiplus.dll")]
981                 internal static extern Status GdipGetImageHeight (IntPtr image, out int height);
982                                                                                                    
983                 [DllImport("gdiplus.dll")]
984                 internal static extern Status GdipGetImageHorizontalResolution ( IntPtr image, out float resolution );
985
986                 [DllImport("gdiplus.dll")]
987                 internal static extern Status GdipGetImagePaletteSize ( IntPtr image, out int size );
988                                                                                                    
989                 [DllImport("gdiplus.dll")]
990                 internal static extern Status GdipGetImagePalette (IntPtr image, IntPtr palette, int size);
991
992                 [DllImport("gdiplus.dll")]
993                 internal static extern Status GdipSetImagePalette (IntPtr image, IntPtr palette);
994                 
995                 [DllImport("gdiplus.dll")]
996                 internal static extern Status GdipGetImageDimension ( IntPtr image, out float width, out float height );
997                                                                                                    
998                 [DllImport("gdiplus.dll")]
999                 internal static extern Status GdipGetImagePixelFormat ( IntPtr image, out PixelFormat format );
1000
1001                 [DllImport("gdiplus.dll")]
1002                 internal static extern Status GdipGetPropertyCount (IntPtr image, out uint propNumbers);
1003                 
1004                 [DllImport("gdiplus.dll")]
1005                 internal static extern Status GdipGetPropertyIdList (IntPtr image, uint propNumbers, [Out] int [] list);
1006  
1007                 [DllImport("gdiplus.dll")]
1008                 internal static extern Status GdipGetPropertySize (IntPtr image, out int bufferSize, out int propNumbers);
1009                 
1010                 [DllImport("gdiplus.dll")]
1011                 internal static extern Status GdipGetAllPropertyItems (IntPtr image, int bufferSize, int propNumbers, IntPtr items);
1012                                                                                                    
1013                 [DllImport("gdiplus.dll")]
1014                 internal static extern Status GdipGetImageRawFormat ( IntPtr image, out Guid format );
1015
1016                 [DllImport("gdiplus.dll")]
1017                 internal static extern Status GdipGetImageVerticalResolution ( IntPtr image, out float resolution );
1018                 
1019                 [DllImport("gdiplus.dll")]
1020                 internal static extern Status GdipGetImageWidth (IntPtr image, out uint width);
1021                 
1022                 [DllImport("gdiplus.dll")]
1023                 internal static extern Status GdipGetImageBounds ( IntPtr image, out RectangleF source, ref GraphicsUnit unit );
1024
1025                 [DllImport("gdiplus.dll")]
1026                 internal static extern Status GdipGetEncoderParameterListSize ( IntPtr image, ref Guid encoder, out uint size );
1027
1028                 [DllImport("gdiplus.dll")]
1029                 internal static extern Status GdipGetEncoderParameterList ( IntPtr image, ref Guid encoder, uint size, IntPtr buffer );
1030                 
1031                 [DllImport("gdiplus.dll")]
1032                 internal static extern Status GdipImageGetFrameCount (IntPtr image, ref Guid guidDimension, out int count );
1033                 
1034                 [DllImport("gdiplus.dll")]
1035                 internal static extern Status GdipImageSelectActiveFrame (IntPtr image, ref Guid guidDimension, int frameIndex);
1036                 
1037                 [DllImport("gdiplus.dll")]
1038                 internal static extern Status GdipGetPropertyItemSize (IntPtr image, int propertyID, out int propertySize);
1039
1040                 [DllImport("gdiplus.dll")]
1041                 internal static extern Status GdipGetPropertyItem (IntPtr image, int propertyID, int propertySize, IntPtr buffer);
1042                 
1043                 [DllImport("gdiplus.dll")]
1044                 internal static extern Status GdipRemovePropertyItem (IntPtr image, int propertyId);
1045                 
1046                 [DllImport("gdiplus.dll")]
1047                 internal static extern Status GdipSetPropertyItem (IntPtr image, IntPtr propertyItem);
1048                 
1049                 [DllImport("gdiplus.dll")]
1050                 internal static extern Status GdipGetImageThumbnail ( IntPtr image, uint width, uint height, out IntPtr thumbImage, IntPtr callback, IntPtr callBackData );
1051                 
1052                 [DllImport("gdiplus.dll")]
1053                 internal static extern Status GdipImageRotateFlip ( IntPtr image, RotateFlipType rotateFlipType );
1054                 
1055                 [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
1056                 internal static extern Status GdipSaveImageToFile (IntPtr image, string filename,  ref Guid encoderClsID, IntPtr encoderParameters); 
1057                 
1058                 [DllImport("gdiplus.dll")]
1059                 internal static extern Status GdipSaveAdd ( IntPtr image, IntPtr encoderParameters );
1060                 
1061                 [DllImport("gdiplus.dll")]
1062                 internal static extern Status GdipSaveAddImage (IntPtr image, IntPtr imagenew, IntPtr encoderParameters);
1063                 
1064                 [DllImport("gdiplus.dll")]
1065                 internal static extern Status GdipDrawImageI (IntPtr graphics, IntPtr image, int x, int y);
1066                 [DllImport("gdiplus.dll")]
1067                 internal static extern Status GdipGetImageGraphicsContext (IntPtr image, out IntPtr graphics);          
1068                 [DllImport("gdiplus.dll")]
1069                 internal static extern Status GdipDrawImage (IntPtr graphics, IntPtr image, float x, float y);
1070
1071                 [DllImport("gdiplus.dll")]
1072                 internal static extern Status GdipBeginContainer (IntPtr graphics, ref RectangleF dstrect, ref RectangleF srcrect, GraphicsUnit unit, out uint state);
1073                 [DllImport("gdiplus.dll")]
1074                 internal static extern Status GdipBeginContainerI (IntPtr graphics, ref Rectangle dstrect, ref Rectangle srcrect, GraphicsUnit unit, out uint state);
1075                 [DllImport("gdiplus.dll")]
1076                 internal static extern Status GdipBeginContainer2 (IntPtr graphics, out uint state); 
1077                 
1078                 [DllImport("gdiplus.dll")]
1079                 internal static extern Status GdipDrawImagePoints (IntPtr graphics, IntPtr image, PointF [] destPoints, int count);
1080
1081                 
1082                 [DllImport("gdiplus.dll")]
1083                 internal static extern Status GdipDrawImagePointsI (IntPtr graphics, IntPtr image,  Point [] destPoints, int count);
1084                 
1085                 [DllImport("gdiplus.dll")]
1086                 internal static extern Status GdipDrawImageRectRectI (IntPtr graphics, IntPtr image,
1087                                 int dstx, int dsty, int dstwidth, int dstheight,
1088                                 int srcx, int srcy, int srcwidth, int srcheight,
1089                                 GraphicsUnit srcUnit, IntPtr imageattr, Graphics.DrawImageAbort callback, IntPtr callbackData);                                 
1090
1091                 [DllImport("gdiplus.dll")]
1092                 internal static extern Status GdipDrawImageRectRect (IntPtr graphics, IntPtr image,
1093                                 float dstx, float dsty, float dstwidth, float dstheight,
1094                                 float srcx, float srcy, float srcwidth, float srcheight,
1095                                 GraphicsUnit srcUnit, IntPtr imageattr, Graphics.DrawImageAbort callback, IntPtr callbackData);                                                                 
1096                 
1097                 [DllImport("gdiplus.dll")]
1098                 internal static extern Status GdipDrawImagePointsRectI (IntPtr graphics, IntPtr image,
1099                          Point [] destPoints, int count, int srcx, int srcy, int srcwidth, int srcheight,
1100                          GraphicsUnit srcUnit, IntPtr imageattr, Graphics.DrawImageAbort callback, IntPtr callbackData);
1101                          
1102                 [DllImport("gdiplus.dll")]
1103                 internal static extern Status GdipDrawImagePointsRect (IntPtr graphics, IntPtr image,
1104                          PointF [] destPoints, int count, float srcx, float srcy, float srcwidth, float srcheight,
1105                          GraphicsUnit srcUnit, IntPtr imageattr, Graphics.DrawImageAbort callback, IntPtr callbackData);
1106                                 
1107                 [DllImport("gdiplus.dll")]                                      
1108                 internal static extern Status GdipDrawImageRect(IntPtr graphics, IntPtr image, float x, float y, float width, float height);
1109                 [DllImport("gdiplus.dll")]                                      
1110                 internal static extern Status GdipDrawImagePointRect(IntPtr graphics, IntPtr image, float x,
1111                                 float y, float srcx, float srcy, float srcwidth, float srcheight, GraphicsUnit srcUnit);
1112                 
1113                 [DllImport("gdiplus.dll")]                                      
1114                 internal static extern Status GdipDrawImagePointRectI(IntPtr graphics, IntPtr image, int x,
1115                                 int y, int srcx, int srcy, int srcwidth,
1116                                 int srcheight, GraphicsUnit srcUnit);                           
1117                                 
1118                 [DllImport("gdiplus.dll")]                                      
1119                 internal static extern Status GdipCreateStringFormat(StringFormatFlags formatAttributes,  int language, out IntPtr native);
1120                 
1121                 [DllImport("gdiplus.dll")]              
1122                 internal static extern Status GdipCreateHBITMAPFromBitmap (IntPtr bmp, out IntPtr HandleBmp, int clrbackground);
1123
1124                 [DllImport("gdiplus.dll", CharSet=CharSet.Auto)]
1125                 internal static extern Status GdipCreateBitmapFromFile ([MarshalAs (UnmanagedType.LPWStr)] string filename, out IntPtr bitmap);
1126
1127                 [DllImport("gdiplus.dll", CharSet=CharSet.Auto)]
1128                 internal static extern Status GdipCreateBitmapFromFileICM ([MarshalAs (UnmanagedType.LPWStr)] string filename, out IntPtr bitmap);
1129                 
1130                 [DllImport("gdiplus.dll")]
1131                 internal static extern Status GdipCreateHICONFromBitmap (IntPtr bmp, out IntPtr HandleIcon);
1132                 
1133                 [DllImport("gdiplus.dll")]
1134                 internal static extern Status GdipCreateBitmapFromHICON (IntPtr  hicon,  out IntPtr bitmap);
1135                 
1136                 [DllImport("gdiplus.dll")]
1137                 internal static extern Status GdipCreateBitmapFromResource (IntPtr hInstance,
1138                                 string lpBitmapName, out IntPtr bitmap);
1139
1140                 // Matrix functions
1141                 [DllImport ("gdiplus.dll")]
1142                 internal static extern Status GdipCreateMatrix (out IntPtr matrix);
1143                 [DllImport ("gdiplus.dll")]
1144                 internal static extern Status GdipCreateMatrix2 (float m11, float m12, float m21, float m22, float dx, float dy, out IntPtr matrix);
1145                 [DllImport ("gdiplus.dll")]
1146                 internal static extern Status GdipCreateMatrix3 (ref RectangleF rect, PointF [] dstplg, out IntPtr matrix);
1147                 [DllImport ("gdiplus.dll")]                
1148                 internal static extern Status GdipCreateMatrix3I (ref Rectangle rect, Point [] dstplg, out IntPtr matrix);
1149                 [DllImport ("gdiplus.dll")]
1150                 internal static extern Status GdipDeleteMatrix (IntPtr matrix);
1151
1152                 [DllImport ("gdiplus.dll")]
1153                 internal static extern Status GdipCloneMatrix (IntPtr matrix, out IntPtr cloneMatrix);
1154                 [DllImport ("gdiplus.dll")]
1155                 internal static extern Status GdipSetMatrixElements (IntPtr matrix, float m11, float m12, float m21, float m22, float dx, float dy);
1156                 [DllImport ("gdiplus.dll")]
1157                 internal static extern Status GdipGetMatrixElements (IntPtr matrix, IntPtr matrixOut);
1158                 [DllImport ("gdiplus.dll")]
1159                 internal static extern Status GdipMultiplyMatrix (IntPtr matrix, IntPtr matrix2, MatrixOrder order);
1160                 [DllImport ("gdiplus.dll")]
1161                 internal static extern Status GdipTranslateMatrix (IntPtr matrix, float offsetX, float offsetY, MatrixOrder order);
1162                 [DllImport ("gdiplus.dll")]
1163                 internal static extern Status GdipScaleMatrix (IntPtr matrix, float scaleX, float scaleY, MatrixOrder order);
1164                 [DllImport ("gdiplus.dll")]
1165                 internal static extern Status GdipRotateMatrix (IntPtr matrix, float angle, MatrixOrder order);
1166
1167                 [DllImport ("gdiplus.dll")]
1168                 internal static extern Status GdipShearMatrix (IntPtr matrix, float shearX, float shearY, MatrixOrder order);
1169
1170                 [DllImport ("gdiplus.dll")]
1171                 internal static extern Status GdipInvertMatrix (IntPtr matrix);
1172                 [DllImport ("gdiplus.dll")]
1173                 internal static extern Status GdipTransformMatrixPoints (IntPtr matrix, PointF [] pts, int count);
1174                 [DllImport ("gdiplus.dll")]
1175                 internal static extern Status GdipTransformMatrixPointsI (IntPtr matrix, Point [] pts, int count);                
1176                 [DllImport ("gdiplus.dll")]
1177                 internal static extern Status GdipVectorTransformMatrixPoints (IntPtr matrix, PointF [] pts, int count);
1178                 [DllImport ("gdiplus.dll")]
1179                 internal static extern Status GdipVectorTransformMatrixPointsI (IntPtr matrix, Point [] pts, int count);
1180                 [DllImport ("gdiplus.dll")]
1181                 internal static extern Status GdipIsMatrixInvertible (IntPtr matrix, out bool result);
1182
1183                 [DllImport ("gdiplus.dll")]
1184                 internal static extern Status GdipIsMatrixIdentity (IntPtr matrix, out bool result);
1185                 [DllImport ("gdiplus.dll")]                
1186                 internal static extern Status GdipIsMatrixEqual (IntPtr matrix, IntPtr matrix2, out bool result);
1187
1188                 // GraphicsPath functions
1189                 [DllImport ("gdiplus.dll")]
1190                 internal static extern Status GdipCreatePath (FillMode brushMode, out IntPtr path);
1191                 [DllImport ("gdiplus.dll")]                
1192                 internal static extern Status GdipCreatePath2 (PointF [] points, byte [] types, int count, FillMode brushMode, out IntPtr path);
1193                 [DllImport ("gdiplus.dll")]                
1194                 internal static extern Status GdipCreatePath2I (Point [] points, byte [] types, int count, FillMode brushMode, out IntPtr path);                
1195                 [DllImport ("gdiplus.dll")]
1196                 internal static extern Status GdipClonePath (IntPtr path, out IntPtr clonePath);
1197                 [DllImport ("gdiplus.dll")]                
1198                 internal static extern Status GdipDeletePath (IntPtr path);
1199                 [DllImport ("gdiplus.dll")]                
1200                 internal static extern Status GdipResetPath (IntPtr path);
1201                 [DllImport ("gdiplus.dll")]                
1202                 internal static extern Status GdipGetPointCount (IntPtr path, out int count);
1203                 [DllImport ("gdiplus.dll")]                
1204                 internal static extern Status GdipGetPathTypes (IntPtr path, [Out] byte [] types, int count);
1205                 [DllImport ("gdiplus.dll")]                
1206                 internal static extern Status GdipGetPathPoints (IntPtr path, [Out] PointF [] points, int count);
1207                 [DllImport ("gdiplus.dll")]                
1208                 internal static extern Status GdipGetPathPointsI (IntPtr path, [Out] Point [] points, int count);
1209                 [DllImport ("gdiplus.dll")]                                
1210                 internal static extern Status GdipGetPathFillMode (IntPtr path, out FillMode fillMode);
1211                 [DllImport ("gdiplus.dll")]                                                
1212                 internal static extern Status GdipSetPathFillMode (IntPtr path, FillMode fillMode);
1213                 [DllImport ("gdiplus.dll")]                                                
1214                 internal static extern Status GdipStartPathFigure (IntPtr path);
1215                 [DllImport ("gdiplus.dll")]                                                
1216                 internal static extern Status GdipClosePathFigure (IntPtr path);
1217                 [DllImport ("gdiplus.dll")]                                                
1218                 internal static extern Status GdipClosePathFigures (IntPtr path);
1219                 [DllImport ("gdiplus.dll")]                                                
1220                 internal static extern Status GdipSetPathMarker (IntPtr path);
1221                 [DllImport ("gdiplus.dll")]                                                
1222                 internal static extern Status GdipClearPathMarkers (IntPtr path);
1223                 [DllImport ("gdiplus.dll")]                                                
1224                 internal static extern Status GdipReversePath (IntPtr path);
1225                 [DllImport ("gdiplus.dll")]                                                
1226                 internal static extern Status GdipGetPathLastPoint (IntPtr path, out PointF lastPoint);
1227                 [DllImport ("gdiplus.dll")]                                                
1228                 internal static extern Status GdipAddPathLine (IntPtr path, float x1, float y1, float x2, float y2);
1229                 [DllImport ("gdiplus.dll")]
1230                 internal static extern Status GdipAddPathLine2 (IntPtr path, PointF[] points, int count);
1231                 [DllImport ("gdiplus.dll")]
1232                 internal static extern Status GdipAddPathLine2I (IntPtr path, Point[] points, int count);
1233                 [DllImport ("gdiplus.dll")]                                                
1234                 internal static extern Status GdipAddPathArc (IntPtr path, float x, float y, float width, float height, float startAngle, float sweepAngle);
1235                 [DllImport ("gdiplus.dll")]                                                                
1236                 internal static extern Status GdipAddPathBezier (IntPtr path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4);
1237                 [DllImport ("gdiplus.dll")]                                                                
1238                 internal static extern Status GdipAddPathBeziers (IntPtr path, PointF [] points, int count);
1239                 [DllImport ("gdiplus.dll")]                                                                
1240                 internal static extern Status GdipAddPathCurve (IntPtr path, PointF [] points, int count);
1241                 [DllImport ("gdiplus.dll")]                                                                
1242                 internal static extern Status GdipAddPathCurveI (IntPtr path, Point [] points, int count);
1243                 [DllImport ("gdiplus.dll")]                                                                
1244                 internal static extern Status GdipAddPathCurve2 (IntPtr path, PointF [] points, int count, float tension);
1245                 [DllImport ("gdiplus.dll")]                                                                
1246                 internal static extern Status GdipAddPathCurve2I (IntPtr path, Point [] points, int count, float tension);
1247                 [DllImport ("gdiplus.dll")]                                                                
1248                 internal static extern Status GdipAddPathCurve3 (IntPtr path, PointF [] points, int count, int offset, int numberOfSegments, float tension);
1249                 [DllImport ("gdiplus.dll")]                                                                
1250                 internal static extern Status GdipAddPathCurve3I (IntPtr path, Point [] points, int count, int offset, int numberOfSegments, float tension);
1251                 [DllImport ("gdiplus.dll")]                                                                
1252                 internal static extern Status GdipAddPathClosedCurve (IntPtr path, PointF [] points, int count);
1253                 [DllImport ("gdiplus.dll")]                                                                
1254                 internal static extern Status GdipAddPathClosedCurveI (IntPtr path, Point [] points, int count);
1255                 [DllImport ("gdiplus.dll")]                                                                
1256                 internal static extern Status GdipAddPathClosedCurve2 (IntPtr path, PointF [] points, int count, float tension);
1257                 [DllImport ("gdiplus.dll")]                                                                
1258                 internal static extern Status GdipAddPathClosedCurve2I (IntPtr path, Point [] points, int count, float tension);
1259                 [DllImport ("gdiplus.dll")]                                                                
1260                 internal static extern Status GdipAddPathRectangle (IntPtr path, float x, float y, float width, float height);
1261                 [DllImport ("gdiplus.dll")]                                                                
1262                 internal static extern Status GdipAddPathRectangles (IntPtr path, RectangleF [] rects, int count);
1263                 [DllImport ("gdiplus.dll")]                                                                
1264                 internal static extern Status GdipAddPathEllipse (IntPtr path, float x, float y, float width, float height);
1265                 [DllImport ("gdiplus.dll")]
1266                 internal static extern Status GdipAddPathEllipseI (IntPtr path, int x, int y, int width, int height);
1267                 [DllImport ("gdiplus.dll")]                                                                
1268                 internal static extern Status GdipAddPathPie (IntPtr path, float x, float y, float width, float height, float startAngle, float sweepAngle);
1269                 [DllImport ("gdiplus.dll")]                                                                
1270                 internal static extern Status GdipAddPathPieI (IntPtr path, int x, int y, int width, int height, float startAngle, float sweepAngle);                
1271                 [DllImport ("gdiplus.dll")]                                                                
1272                 internal static extern Status GdipAddPathPolygon (IntPtr path, PointF [] points, int count);
1273                 [DllImport ("gdiplus.dll")]                                                                
1274                 internal static extern Status GdipAddPathPath (IntPtr path, IntPtr addingPath, bool connect);
1275                 [DllImport ("gdiplus.dll")]
1276                 internal static extern Status GdipAddPathLineI (IntPtr path, int x1, int y1, int x2, int y2);
1277                 [DllImport ("gdiplus.dll")]                                                
1278                 internal static extern Status GdipAddPathArcI (IntPtr path, int x, int y, int width, int height, float startAngle, float sweepAngle);
1279                 
1280                 [DllImport ("gdiplus.dll")]                
1281                 internal static extern Status GdipAddPathBezierI (IntPtr path, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
1282                 [DllImport ("gdiplus.dll")]
1283                 internal static extern Status GdipAddPathBeziersI (IntPtr path, Point [] points, int count);
1284                                 
1285                 [DllImport ("gdiplus.dll")]                
1286                 internal static extern Status GdipAddPathPolygonI (IntPtr path, Point [] points, int count);
1287                 [DllImport ("gdiplus.dll")]                
1288                 internal static extern Status GdipAddPathRectangleI (IntPtr path, int x, int y, int width, int height);
1289                 [DllImport ("gdiplus.dll")]                
1290                 internal static extern Status GdipAddPathRectanglesI (IntPtr path, Rectangle [] rects, int count);
1291                 [DllImport ("gdiplus.dll")]
1292                 internal static extern Status GdipFlattenPath (IntPtr path, IntPtr matrix, float floatness);
1293                 [DllImport ("gdiplus.dll")]
1294                 internal static extern Status GdipTransformPath (IntPtr path, IntPtr matrix);
1295                 [DllImport ("gdiplus.dll")]
1296                 internal static extern Status GdipWarpPath (IntPtr path, IntPtr matrix,
1297                                                             PointF [] points, int count,
1298                                                             float srcx, float srcy, float srcwidth, float srcheight,
1299                                                             WarpMode mode, float flatness);
1300                 [DllImport ("gdiplus.dll")]
1301                 internal static extern Status GdipWidenPath (IntPtr path, IntPtr pen, IntPtr matrix, float flatness);
1302                 [DllImport ("gdiplus.dll")]                
1303                 internal static extern Status GdipGetPathWorldBounds (IntPtr path, out RectangleF bounds, IntPtr matrix, IntPtr pen);
1304                 [DllImport ("gdiplus.dll")]                
1305                 internal static extern Status GdipGetPathWorldBoundsI (IntPtr path, out Rectangle bounds, IntPtr matrix, IntPtr pen);
1306                 [DllImport ("gdiplus.dll")]                
1307                 internal static extern Status GdipIsVisiblePathPoint (IntPtr path, float x, float y, IntPtr graphics, out bool result);
1308                 [DllImport ("gdiplus.dll")]                
1309                 internal static extern Status GdipIsVisiblePathPointI (IntPtr path, int x, int y, IntPtr graphics, out bool result); 
1310                 [DllImport ("gdiplus.dll")]                
1311                 internal static extern Status GdipIsOutlineVisiblePathPoint (IntPtr path, float x, float y, IntPtr pen, IntPtr graphics, out bool result);
1312                 [DllImport ("gdiplus.dll")]                
1313                 internal static extern Status GdipIsOutlineVisiblePathPointI (IntPtr path, int x, int y, IntPtr pen, IntPtr graphics, out bool result); 
1314
1315                 // GraphicsPathIterator
1316                 [DllImport("gdiplus.dll")]
1317                 internal static extern Status GdipCreatePathIter (out IntPtr iterator, IntPtr path);
1318                 [DllImport("gdiplus.dll")]
1319                 internal static extern Status GdipPathIterGetCount (IntPtr iterator, out int count);
1320                 [DllImport("gdiplus.dll")]
1321                 internal static extern Status GdipPathIterGetSubpathCount (IntPtr iterator, out int count);
1322                 [DllImport("gdiplus.dll")]
1323                 internal static extern Status GdipDeletePathIter (IntPtr iterator);
1324                 [DllImport("gdiplus.dll")]
1325                 internal static extern Status GdipPathIterCopyData (IntPtr iterator, out int resultCount, PointF [] points, byte [] types, int startIndex, int endIndex);
1326                 [DllImport("gdiplus.dll")]
1327                 internal static extern Status GdipPathIterEnumerate (IntPtr iterator, out int resultCount, PointF [] points, byte [] types, int count);
1328                 [DllImport("gdiplus.dll")]
1329                 internal static extern Status GdipPathIterHasCurve (IntPtr iterator, out bool curve);
1330                 [DllImport("gdiplus.dll")]
1331                 internal static extern Status GdipPathIterNextMarkerPath (IntPtr iterator, out int resultCount, IntPtr path);
1332                 [DllImport("gdiplus.dll")]
1333                 internal static extern Status GdipPathIterNextMarker (IntPtr iterator, out int resultCount, out int startIndex, out int endIndex);
1334                 [DllImport("gdiplus.dll")]
1335                 internal static extern Status GdipPathIterNextPathType (IntPtr iterator, out int resultCount, out byte pathType, out int startIndex, out int endIndex);
1336                 [DllImport("gdiplus.dll")]
1337                 internal static extern Status GdipPathIterNextSubpathPath (IntPtr iterator, out int resultCount, IntPtr path, out bool isClosed);
1338                 [DllImport("gdiplus.dll")]
1339                 internal static extern Status GdipPathIterNextSubpath (IntPtr iterator, out int resultCount, out int startIndex, out int endIndex, out bool isClosed);
1340                 [DllImport("gdiplus.dll")]
1341                 internal static extern Status GdipPathIterRewind (IntPtr iterator);
1342
1343                 // ImageAttributes
1344                 [DllImport ("gdiplus.dll")]     
1345                 internal static extern Status GdipCreateImageAttributes (out IntPtr imageattr);
1346                                 
1347                 [DllImport ("gdiplus.dll")]     
1348                 internal static extern Status GdipSetImageAttributesColorKeys (IntPtr imageattr,
1349                                 ColorAdjustType type, bool enableFlag, int colorLow, int colorHigh);
1350                                 
1351                 [DllImport ("gdiplus.dll")]     
1352                 internal static extern Status GdipDisposeImageAttributes (IntPtr imageattr);
1353                                 
1354                 [DllImport ("gdiplus.dll")]     
1355                 internal static extern Status GdipSetImageAttributesColorMatrix (IntPtr imageattr,
1356                                 ColorAdjustType type, bool enableFlag, IntPtr colorMatrix,
1357                                 IntPtr grayMatrix,  ColorMatrixFlag flags);                                
1358
1359                 [DllImport ("gdiplus.dll")]     
1360                 internal static extern Status GdipSetImageAttributesGamma (IntPtr imageattr, 
1361                         ColorAdjustType type, bool enableFlag,  
1362                                                                                                                                                         float gamma);
1363                 
1364                 [DllImport ("gdiplus.dll")]     
1365                 internal static extern Status GdipSetImageAttributesNoOp (IntPtr imageattr, 
1366                         ColorAdjustType type, bool enableFlag);
1367                 
1368                 [DllImport ("gdiplus.dll")]     
1369                 internal static extern Status GdipSetImageAttributesOutputChannel (IntPtr imageattr,
1370                         ColorAdjustType type, bool enableFlag,  ColorChannelFlag channelFlags);
1371                 
1372                 [DllImport ("gdiplus.dll", CharSet=CharSet.Auto)]     
1373                 internal static extern Status GdipSetImageAttributesOutputChannelColorProfile (IntPtr imageattr,
1374                         ColorAdjustType type, bool enableFlag, [MarshalAs (UnmanagedType.LPWStr)] string profileName);
1375                                 
1376                 [DllImport ("gdiplus.dll")]     
1377                 internal static extern Status GdipSetImageAttributesRemapTable (IntPtr imageattr,
1378                         ColorAdjustType type, bool enableFlag,  uint mapSize, IntPtr colorMap);
1379                 
1380                 [DllImport ("gdiplus.dll")]     
1381                 internal static extern Status GdipSetImageAttributesThreshold (IntPtr imageattr, 
1382                         ColorAdjustType type, bool enableFlag, float thresHold);
1383                         
1384                 [DllImport ("gdiplus.dll")]     
1385                 internal static extern Status GdipCloneImageAttributes(IntPtr imageattr, out IntPtr cloneImageattr);
1386
1387                 [DllImport ("gdiplus.dll")]     
1388                 internal static extern Status GdipGetImageAttributesAdjustedPalette(IntPtr imageattr,
1389                         out IntPtr colorPalette,  ColorAdjustType colorAdjustType);
1390                         
1391                 [DllImport ("gdiplus.dll")]     
1392                 internal static extern Status GdipSetImageAttributesWrapMode(IntPtr imageattr,  WrapMode wrap,
1393                         int argb, bool clamp);
1394
1395                                
1396                 // Font         
1397                 [DllImport("gdiplus.dll")]                   
1398                 internal static extern Status GdipCreateFont (IntPtr fontFamily, float emSize, FontStyle style, GraphicsUnit  unit,  out IntPtr font);
1399                 [DllImport("gdiplus.dll")]                   
1400                 internal static extern Status GdipDeleteFont (IntPtr font);             
1401                 [DllImport("gdiplus.dll", CharSet=CharSet.Auto)]
1402                 internal static extern Status GdipGetLogFont(IntPtr font, IntPtr graphics, [MarshalAs(UnmanagedType.AsAny), Out] object logfontA);
1403
1404                 [DllImport("gdiplus.dll")]                   
1405                 internal static extern Status GdipCreateFontFromDC(IntPtr hdc, out IntPtr font);
1406                 [DllImport("gdiplus.dll", SetLastError=true, CharSet=CharSet.Auto)]
1407                 internal static extern Status GdipCreateFontFromLogfont(IntPtr hdc, ref LOGFONT lf, out IntPtr ptr);
1408
1409                 // These are our private functions, they exists in our own libgdiplus library, this way we
1410                 // avoid relying on wine in System.Drawing
1411                 [DllImport("gdiplus.dll")]
1412                 internal static extern Status GdipGetHfont (IntPtr font, out IntPtr Hfont);     
1413                 [DllImport("gdiplus.dll", CharSet=CharSet.Ansi)]                   
1414                 internal static extern Status GdipCreateFontFromHfont(IntPtr hdc, out IntPtr font, ref LOGFONT lf);
1415
1416                 // This is win32/gdi, not gdiplus, but it's easier to keep in here, also see above comment
1417                 [DllImport("gdi32.dll", CallingConvention=CallingConvention.StdCall, CharSet = CharSet.Auto)]
1418                 internal static extern IntPtr CreateFontIndirect (ref LOGFONT logfont); 
1419                 [DllImport("user32.dll", EntryPoint="GetDC", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
1420                 internal static extern IntPtr GetDC(IntPtr hwnd);       
1421                 [DllImport("user32.dll", EntryPoint="ReleaseDC", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
1422                 internal static extern int ReleaseDC(IntPtr hdc);
1423                 [DllImport("gdi32.dll", EntryPoint="SelectObject", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
1424                 internal static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);     
1425                 [DllImport("user32.dll", SetLastError=true)]
1426                 internal static extern bool GetIconInfo (IntPtr hIcon, out IconInfo iconinfo);
1427  
1428                 [DllImport("user32.dll")]
1429                 internal static extern IntPtr GetDesktopWindow ();
1430
1431                 [DllImport("gdi32.dll", SetLastError=true)]
1432                 public static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest, 
1433                         int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
1434
1435
1436                 // Some special X11 stuff
1437                 [DllImport("libX11", EntryPoint="XOpenDisplay")]
1438                 internal extern static IntPtr XOpenDisplay(IntPtr display);     
1439
1440                 [DllImport("libX11", EntryPoint="XCloseDisplay")]
1441                 internal extern static int XCloseDisplay(IntPtr display);       
1442
1443                 [DllImport ("libX11", EntryPoint="XRootWindow")]
1444                 internal extern static IntPtr XRootWindow(IntPtr display, int screen);
1445                         
1446                 [DllImport ("libX11", EntryPoint="XDefaultDepth")]
1447                 internal extern static uint XDefaultDepth(IntPtr display, int screen);
1448
1449                 [DllImport ("libX11", EntryPoint="XGetImage")]
1450                 internal extern static IntPtr XGetImage(IntPtr display, IntPtr drawable, int src_x, int src_y, int width, int height, int pane, int format);
1451
1452                 [DllImport ("libX11", EntryPoint="XGetPixel")]
1453                 internal extern static int XGetPixel(IntPtr image, int x, int y);
1454
1455                 [DllImport ("libX11", EntryPoint="XDestroyImage")]
1456                 internal extern static int XDestroyImage(IntPtr image);
1457
1458                 [DllImport ("libX11", EntryPoint="XDefaultVisual")]
1459                 internal extern static IntPtr XDefaultVisual(IntPtr display, int screen);
1460
1461                 [DllImport ("libX11", EntryPoint="XGetVisualInfo")]
1462                 internal extern static IntPtr XGetVisualInfo (IntPtr display, int vinfo_mask, ref XVisualInfo vinfo_template, ref int nitems);
1463
1464                 [DllImport ("libX11", EntryPoint="XVisualIDFromVisual")]
1465                 internal extern static int XVisualIDFromVisual(IntPtr visual);
1466
1467                 [DllImport ("libX11", EntryPoint="XFree")]
1468                 internal extern static void XFree (IntPtr data);        
1469                 
1470                 // FontCollection
1471                 [DllImport ("gdiplus.dll")]
1472                 internal static extern Status GdipGetFontCollectionFamilyCount (IntPtr collection, out int found);
1473                 
1474                 [DllImport ("gdiplus.dll")]
1475                 internal static extern Status GdipGetFontCollectionFamilyList (IntPtr collection, int getCount, IntPtr[] dest, out int retCount);
1476                 //internal static extern Status GdipGetFontCollectionFamilyList( IntPtr collection, int getCount, [Out] FontFamily [] familyList, out int retCount );
1477                 
1478                 [DllImport ("gdiplus.dll")]
1479                 internal static extern Status GdipNewInstalledFontCollection (out IntPtr collection);
1480                 
1481                 [DllImport ("gdiplus.dll")]
1482                 internal static extern Status GdipNewPrivateFontCollection (out IntPtr collection);
1483                 
1484                 [DllImport ("gdiplus.dll")]
1485                 internal static extern Status GdipDeletePrivateFontCollection (ref IntPtr collection);
1486                 
1487                 [DllImport ("gdiplus.dll", CharSet=CharSet.Auto)]
1488                 internal static extern Status GdipPrivateAddFontFile (IntPtr collection,
1489                                 [MarshalAs (UnmanagedType.LPWStr)] string fileName );
1490                 
1491                 [DllImport ("gdiplus.dll")]
1492                 internal static extern Status GdipPrivateAddMemoryFont (IntPtr collection, IntPtr mem, int length);
1493
1494                 //FontFamily
1495                 [DllImport ("gdiplus.dll", CharSet=CharSet.Auto)]
1496                 internal static extern Status GdipCreateFontFamilyFromName (
1497                         [MarshalAs(UnmanagedType.LPWStr)] string fName, IntPtr collection, out IntPtr fontFamily);
1498
1499                 [DllImport ("gdiplus.dll", CharSet=CharSet.Unicode)]
1500                 internal static extern Status GdipGetFamilyName(IntPtr family, StringBuilder name, int language);
1501
1502                 [DllImport ("gdiplus.dll")]
1503                 internal static extern Status GdipGetGenericFontFamilySansSerif (out IntPtr fontFamily);
1504
1505                 [DllImport ("gdiplus.dll")]
1506                 internal static extern Status GdipGetGenericFontFamilySerif (out IntPtr fontFamily);
1507
1508                 [DllImport ("gdiplus.dll")]
1509                 internal static extern Status GdipGetGenericFontFamilyMonospace (out IntPtr fontFamily);
1510                 
1511                 [DllImport ("gdiplus.dll")]
1512                 internal static extern Status GdipGetCellAscent (IntPtr fontFamily, int style, out short ascent);
1513
1514                 [DllImport ("gdiplus.dll")]
1515                 internal static extern Status GdipGetCellDescent (IntPtr fontFamily, int style, out short descent);
1516
1517                 [DllImport ("gdiplus.dll")]
1518                 internal static extern Status GdipGetLineSpacing (IntPtr fontFamily, int style, out short spacing);
1519
1520                 [DllImport ("gdiplus.dll")]
1521                 internal static extern Status GdipGetEmHeight (IntPtr fontFamily, int style, out short emHeight);
1522
1523                 [DllImport ("gdiplus.dll")]
1524                 internal static extern Status GdipIsStyleAvailable (IntPtr fontFamily, int style, out bool styleAvailable);
1525
1526                 [DllImport ("gdiplus.dll")]
1527                 internal static extern Status GdipDeleteFontFamily (IntPtr fontFamily);
1528                 
1529                 [DllImport ("gdiplus.dll")]
1530                 internal static extern Status GdipGetFontSize (IntPtr font, out float size);
1531                 
1532                 [DllImport ("gdiplus.dll")]
1533                 internal static extern Status GdipGetFontHeight (IntPtr font, IntPtr graphics, out float height);
1534                 
1535                 [DllImport ("gdiplus.dll")]
1536                 internal static extern Status GdipGetFontHeightGivenDPI (IntPtr font, float dpi, out float height);
1537                 
1538                 
1539                 // String Format
1540                 [DllImport ("gdiplus.dll")]
1541                 internal static extern Status GdipCreateStringFormat(int formatAttributes, int language, out IntPtr  format);
1542                 [DllImport ("gdiplus.dll")]
1543                 internal static extern Status GdipStringFormatGetGenericDefault(out IntPtr format);
1544                 [DllImport ("gdiplus.dll")]
1545                 internal static extern Status GdipStringFormatGetGenericTypographic(out IntPtr format);
1546                 [DllImport ("gdiplus.dll")]
1547                 internal static extern Status GdipDeleteStringFormat(IntPtr format);
1548                 [DllImport ("gdiplus.dll")]
1549                 internal static extern Status GdipCloneStringFormat(IntPtr srcformat, out IntPtr format);
1550                 [DllImport ("gdiplus.dll")]
1551                 internal static extern Status GdipSetStringFormatFlags(IntPtr format, StringFormatFlags flags);
1552                 [DllImport ("gdiplus.dll")]
1553                 internal static extern Status GdipGetStringFormatFlags(IntPtr format, out StringFormatFlags flags);
1554                 [DllImport ("gdiplus.dll")]
1555                 internal static extern Status GdipSetStringFormatAlign(IntPtr format, StringAlignment align);
1556                 [DllImport ("gdiplus.dll")]
1557                 internal static extern Status GdipGetStringFormatAlign(IntPtr format, out StringAlignment align);
1558                 [DllImport ("gdiplus.dll")]
1559                 internal static extern Status GdipSetStringFormatLineAlign(IntPtr format, StringAlignment align);
1560                 [DllImport ("gdiplus.dll")]
1561                 internal static extern Status GdipGetStringFormatLineAlign(IntPtr format, out StringAlignment align);
1562                 [DllImport ("gdiplus.dll")]
1563                 internal static extern Status GdipSetStringFormatTrimming(IntPtr format, StringTrimming trimming);
1564                 [DllImport ("gdiplus.dll")]
1565                 internal static extern Status GdipGetStringFormatTrimming(IntPtr format, out StringTrimming trimming);
1566                 [DllImport ("gdiplus.dll")]
1567                 internal static extern Status GdipSetStringFormatHotkeyPrefix(IntPtr format, HotkeyPrefix hotkeyPrefix);
1568                 [DllImport ("gdiplus.dll")]
1569                 internal static extern Status GdipGetStringFormatHotkeyPrefix(IntPtr format, out HotkeyPrefix hotkeyPrefix);
1570                 [DllImport ("gdiplus.dll")]
1571                 internal static extern Status GdipSetStringFormatTabStops(IntPtr format, float firstTabOffset, int count, float [] tabStops);
1572                 [DllImport ("gdiplus.dll")]
1573                 internal static extern Status GdipGetStringFormatDigitSubstitution(IntPtr format, int language, out StringDigitSubstitute substitute);
1574                 [DllImport ("gdiplus.dll")]
1575                 internal static extern Status GdipSetStringFormatDigitSubstitution(IntPtr format, int language, StringDigitSubstitute substitute);
1576                 [DllImport ("gdiplus.dll")]
1577                 internal static extern Status GdipGetStringFormatTabStopCount(IntPtr format, out int count);
1578                 [DllImport ("gdiplus.dll")]
1579                 internal static extern Status GdipGetStringFormatTabStops(IntPtr format, int count, out float firstTabOffset, [In, Out] float [] tabStops);
1580                                 
1581                 //ImageCodecInfo functions
1582                 [DllImport("gdiplus.dll")]
1583                 static internal extern Status GdipGetImageDecodersSize (out int decoderNums, out int arraySize);
1584                 [DllImport("gdiplus.dll")]
1585                 static internal extern Status GdipGetImageDecoders (int decoderNums, int arraySize, IntPtr decoders);
1586                 [DllImport("gdiplus.dll")]
1587                 static internal extern Status GdipGetImageEncodersSize (out int encoderNums, out int arraySize);
1588                 [DllImport("gdiplus.dll")]
1589                 static internal extern Status GdipGetImageEncoders (int encoderNums, int arraySize, IntPtr encoders);
1590
1591                 //
1592                 // These are stuff that is unix-only
1593                 //
1594                 public delegate int StreamGetHeaderDelegate(IntPtr buf, int bufsz);
1595                 public delegate int StreamGetBytesDelegate (IntPtr buf, int bufsz, bool peek);
1596                 public delegate long StreamSeekDelegate (int offset, int whence);
1597                 public delegate int StreamPutBytesDelegate (IntPtr buf, int bufsz);
1598                 public delegate void StreamCloseDelegate ();
1599                 public delegate long StreamSizeDelegate ();
1600
1601                 internal class GdiPlusStreamHelper 
1602                 {
1603                         public Stream stream;
1604                         
1605                         private StreamGetHeaderDelegate sghd = null;
1606                         private StreamGetBytesDelegate sgbd = null;
1607                         private StreamSeekDelegate skd = null;
1608                         private StreamPutBytesDelegate spbd = null;
1609                         private StreamCloseDelegate scd = null;
1610                         private StreamSizeDelegate ssd = null;
1611                         private byte[]  start_buf;
1612                         private int     start_buf_pos;
1613                         private int     start_buf_len;
1614                         
1615                         public GdiPlusStreamHelper (Stream s) 
1616                         { 
1617                                 stream = s;
1618                                 if (stream != null && stream.CanSeek) {
1619                                         stream.Seek (0, SeekOrigin.Begin);
1620                                 }
1621                         }
1622
1623                         public int StreamGetHeaderImpl (IntPtr buf, int bufsz)  {
1624                                 int     bytesRead;
1625
1626                                 start_buf = new byte[bufsz];
1627
1628                                 try {
1629                                         bytesRead = stream.Read (start_buf, 0, bufsz);
1630                                 } catch (IOException) {
1631                                         return -1;
1632                                 }
1633
1634                                 if (bytesRead > 0 && buf != IntPtr.Zero) {
1635                                         Marshal.Copy (start_buf, 0, (IntPtr) (buf.ToInt64()), bytesRead);
1636                                 }
1637
1638                                 start_buf_pos = 0;
1639                                 start_buf_len = bytesRead;
1640
1641                                 return bytesRead;
1642                         }
1643
1644                         public StreamGetHeaderDelegate GetHeaderDelegate {
1645                                 get {
1646                                         if (stream != null && stream.CanRead) {
1647                                                 if (sghd == null) {
1648                                                         sghd = new StreamGetHeaderDelegate (StreamGetHeaderImpl);
1649                                                 }
1650                                                 return sghd;
1651                                         }
1652                                         return null;
1653                                 }
1654                         }
1655
1656                         public int StreamGetBytesImpl (IntPtr buf, int bufsz, bool peek) 
1657                         {
1658                                 if (buf == IntPtr.Zero && peek) {
1659                                         return -1;
1660                                 }
1661
1662                                 byte[] managedBuf = new byte[bufsz];
1663                                 int bytesRead = 0;
1664                                 long streamPosition = 0;
1665
1666                                 if (bufsz > 0) {
1667                                         if (stream.CanSeek) {
1668                                                 streamPosition = stream.Position;
1669                                         }
1670                                         if (start_buf_len > 0) {
1671                                                 if (start_buf_len > bufsz) {
1672                                                         Array.Copy(start_buf, start_buf_pos, managedBuf, 0, bufsz);
1673                                                         start_buf_pos += bufsz;
1674                                                         start_buf_len -= bufsz;
1675                                                         bytesRead = bufsz;
1676                                                         bufsz = 0;
1677                                                 } else {
1678                                                         // this is easy
1679                                                         Array.Copy(start_buf, start_buf_pos, managedBuf, 0, start_buf_len);
1680                                                         bufsz -= start_buf_len;
1681                                                         bytesRead = start_buf_len;
1682                                                         start_buf_len = 0;
1683                                                 }
1684                                         }
1685
1686                                         if (bufsz > 0) {
1687                                                 try {
1688                                                         bytesRead += stream.Read (managedBuf, bytesRead, bufsz);
1689                                                 } catch (IOException) {
1690                                                         return -1;
1691                                                 }
1692                                         }
1693                         
1694                                         if (bytesRead > 0 && buf != IntPtr.Zero) {
1695                                                 Marshal.Copy (managedBuf, 0, (IntPtr) (buf.ToInt64()), bytesRead);
1696                                         }
1697
1698                                         if (!stream.CanSeek && (bufsz == 10) && peek) {
1699                                                 // Special 'hack' to support peeking of the type for gdi+ on non-seekable streams
1700                                         }
1701                                 
1702                                         if (peek) {
1703                                                 if (stream.CanSeek) {
1704                                                         // If we are peeking bytes, then go back to original position before peeking
1705                                                         stream.Seek (streamPosition, SeekOrigin.Begin);
1706                                                 } else {
1707                                                         throw new NotSupportedException();
1708                                                 }
1709                                         }
1710                                 }
1711                                 
1712                                 return bytesRead;
1713                         }
1714
1715                         public StreamGetBytesDelegate GetBytesDelegate {
1716                                 get {
1717                                         if (stream != null && stream.CanRead) {
1718                                                 if (sgbd == null) {
1719                                                         sgbd = new StreamGetBytesDelegate (StreamGetBytesImpl);
1720                                                 }
1721                                                 return sgbd;
1722                                         }
1723                                         return null;
1724                                 }
1725                         }
1726
1727                         public long StreamSeekImpl (int offset, int whence) 
1728                         {
1729                                 // Make sure we have a valid 'whence'.
1730                                 if ((whence < 0) || (whence > 2))
1731                                         return -1;
1732
1733                                 // Invalidate the start_buf if we're actually going to call a Seek method.
1734                                 start_buf_pos += start_buf_len;
1735                                 start_buf_len = 0;
1736
1737                                 SeekOrigin origin;
1738
1739                                 // Translate 'whence' into a SeekOrigin enum member.
1740                                 switch (whence)
1741                                 {
1742                                         case 0: origin = SeekOrigin.Begin;   break;
1743                                         case 1: origin = SeekOrigin.Current; break;
1744                                         case 2: origin = SeekOrigin.End;     break;
1745
1746                                         // The following line is redundant but necessary to avoid a
1747                                         // "Use of unassigned local variable" error without actually
1748                                         // initializing 'origin' to a dummy value.
1749                                         default: return -1;
1750                                 }
1751
1752                                 // Do the actual seek operation and return its result.
1753                                 return stream.Seek ((long) offset, origin);
1754                         }
1755
1756                         public StreamSeekDelegate SeekDelegate {
1757                                 get {
1758                                         if (stream != null && stream.CanSeek) {
1759                                                 if (skd == null) {
1760                                                         skd = new StreamSeekDelegate (StreamSeekImpl);
1761                                                 }
1762                                                 return skd;
1763                                         }
1764                                         return null;
1765                                 }
1766                         }
1767
1768                         public int StreamPutBytesImpl (IntPtr buf, int bufsz) 
1769                         {
1770                                 byte[] managedBuf = new byte[bufsz];
1771                                 Marshal.Copy (buf, managedBuf, 0, bufsz);
1772                                 stream.Write (managedBuf, 0, bufsz);
1773                                 return bufsz;
1774                         }
1775
1776                         public StreamPutBytesDelegate PutBytesDelegate {
1777                                 get {
1778                                         if (stream != null && stream.CanWrite) {
1779                                                 if (spbd == null) {
1780                                                         spbd = new StreamPutBytesDelegate (StreamPutBytesImpl);
1781                                                 }
1782                                                 return spbd;
1783                                         }
1784                                         return null;
1785                                 }
1786                         }
1787                         
1788                         public void StreamCloseImpl ()
1789                         {
1790                                 stream.Close ();
1791                         }
1792
1793                         public StreamCloseDelegate CloseDelegate {
1794                                 get {
1795                                         if (stream != null) {
1796                                                 if (scd == null) {
1797                                                         scd = new StreamCloseDelegate (StreamCloseImpl);
1798                                                 }
1799                                                 return scd;
1800                                         }
1801                                         return null;
1802                                 }
1803                         }
1804                         
1805                         public long StreamSizeImpl ()
1806                         {
1807                                 try {
1808                                         return stream.Length;
1809                                 } catch {
1810                                         return -1;
1811                                 }
1812                         }
1813
1814                         public StreamSizeDelegate SizeDelegate {
1815                                 get {
1816                                         if (stream != null) {
1817                                                 if (ssd == null) {
1818                                                         ssd = new StreamSizeDelegate (StreamSizeImpl);
1819                                                 }
1820                                                 return ssd;
1821                                         }
1822                                         return null;
1823                                 }
1824                         }
1825
1826                 }
1827                 
1828                 /* Mac only function calls */
1829                 [DllImport("gdiplus.dll")]
1830                 internal static extern Status GdipCreateFromQuartz_macosx (IntPtr cgref, int width, int height, out IntPtr graphics);
1831
1832                 /* Linux only function calls*/
1833                 [DllImport("gdiplus.dll")]
1834                 internal static extern Status GdipSetVisibleClip_linux (IntPtr graphics, ref Rectangle rect);
1835                 
1836                 [DllImport("gdiplus.dll")]
1837                 internal static extern Status GdipCreateFromXDrawable_linux (IntPtr drawable, IntPtr display, out IntPtr graphics);
1838                 
1839                 // Stream functions for non-Win32 (libgdiplus specific(
1840                 [DllImport("gdiplus.dll")]
1841                 static internal extern Status GdipLoadImageFromDelegate_linux ( StreamGetHeaderDelegate getHeader, StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes, 
1842                                                         StreamSeekDelegate doSeek, StreamCloseDelegate close, StreamSizeDelegate size, out IntPtr image);
1843                 [DllImport("gdiplus.dll")]
1844                 static internal extern Status GdipSaveImageToDelegate_linux ( IntPtr image, StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes, 
1845                         StreamSeekDelegate doSeek, StreamCloseDelegate close, StreamSizeDelegate size, ref Guid encoderClsID, IntPtr encoderParameters );               
1846                 
1847 #endregion
1848         }
1849 }