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