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