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