// Jordi Mas i Hernandez (jordi@ximian.com)
// Sanjay Gupta (gsanjay@novell.com)
// Ravindra (rkumar@novell.com)
+// Peter Dennis Bartok (pbartok@novell.com)
+// Sebastien Pouliot <sebastien@ximian.com>
//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2004 - 2007 Novell, Inc (http://www.novell.com)
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
[DllImport("gdiplus.dll")]
static internal extern void GdiplusShutdown(ref ulong token);
- static ulong GdiPlusToken;
+ internal static ulong GdiPlusToken = 0;
static void ProcessExit (object sender, EventArgs e)
{
// shutting down
GC.Collect ();
GC.WaitForPendingFinalizers ();
+
+ GdiPlusToken = 0;
// This causes crashes in MS GDI+ because this call occurs before
// all managed GDI objects are finalized. When they are finalized they call
GdiplusStartupInput input = GdiplusStartupInput.MakeGdiplusStartupInput();
GdiplusStartupOutput output = GdiplusStartupOutput.MakeGdiplusStartupOutput();
- GdiplusStartup (ref GdiPlusToken, ref input, ref output);
+ try {
+ GdiplusStartup (ref GdiPlusToken, ref input, ref output);
+ }
+ catch (TypeInitializationException) {
+ Console.Error.WriteLine (
+ "* ERROR: Can not initialize GDI+ library\n" +
+ "\n" +
+ "Please check http://www.mono-project.com/Problem:GDIPlusInit for details");
+ }
+
AppDomain.CurrentDomain.ProcessExit += new EventHandler (ProcessExit);
}
+
+ static public bool RunningOnWindows ()
+ {
+ return !UseX11Drawable;
+ }
+
+ static public bool RunningOnUnix ()
+ {
+ return UseX11Drawable;
+ }
// Copies a Ptr to an array of Points and releases the memory
static public void FromUnManagedMemoryToPointI(IntPtr prt, Point [] pts)
case Status.WrongState:
throw new ArgumentException ("Properties not set properly.");
+ case Status.FontFamilyNotFound:
+ throw new ArgumentException ("FontFamily wasn't found.");
+
+ case Status.ValueOverflow:
+ throw new OverflowException ("Argument out of range.");
+
default:
throw new Exception ("Unknown Error.");
}
[DllImport("gdiplus.dll")]
static internal extern Status GdipFillRegion(IntPtr graphics, IntPtr brush, IntPtr region);
-
+
+ [DllImport("gdiplus.dll")]
+ static internal extern Status GdipGetRegionHRgn (IntPtr region, IntPtr graphics, ref IntPtr hRgn);
+
+ [DllImport("gdiplus.dll")]
+ static internal extern Status GdipCreateRegionHrgn (IntPtr hRgn, out IntPtr region);
+
// Solid brush functions
[DllImport("gdiplus.dll")]
static internal extern Status GdipCreateSolidFill (int color, out IntPtr brush);
[DllImport("gdiplus.dll")]
internal static extern Status GdipResetClip(IntPtr graphics);
[DllImport("gdiplus.dll")]
- internal static extern Status GdipEndContainer(IntPtr graphics, int state);
+ internal static extern Status GdipEndContainer(IntPtr graphics, uint state);
[DllImport("gdiplus.dll")]
internal static extern Status GdipGetClip (IntPtr graphics, IntPtr region);
[DllImport("gdiplus.dll")]
internal static extern Status GdipFlush(IntPtr graphics, FlushIntention intention);
+ [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
+ internal static extern Status GdipAddPathString (IntPtr path, string s, int lenght, IntPtr family, int style, float emSize, ref RectangleF layoutRect, IntPtr format);
+ [DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
+ internal static extern Status GdipAddPathStringI (IntPtr path, string s, int lenght, IntPtr family, int style, float emSize, ref Rectangle layoutRect, IntPtr format);
+
// Pen functions
[DllImport("gdiplus.dll")]
// Image functions
[DllImport("gdiplus.dll", CharSet=CharSet.Auto)]
internal static extern Status GdipLoadImageFromFile ( [MarshalAs(UnmanagedType.LPWStr)] string filename, out IntPtr image );
-
+
+#if !TEST
// Stream functions for Win32 (original Win32 ones)
[DllImport("gdiplus.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
internal static extern Status GdipLoadImageFromStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(ComIStreamMarshaler))] IStream stream, out IntPtr image);
[DllImport("gdiplus.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
internal static extern Status GdipSaveImageToStream(HandleRef image, [MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(ComIStreamMarshaler))] IStream stream, [In()] ref Guid clsidEncoder, HandleRef encoderParams);
-
+#endif
[DllImport("gdiplus.dll")]
internal static extern Status GdipCloneImage(IntPtr image, out IntPtr imageclone);
[DllImport("gdiplus.dll")]
internal static extern Status GdipGetImageFlags(IntPtr image, out int flag);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipGetImageType (IntPtr image, out ImageType type);
+
[DllImport("gdiplus.dll")]
internal static extern Status GdipImageGetFrameDimensionsCount ( IntPtr image, out uint count );
internal static extern Status GdipImageGetFrameDimensionsList ( IntPtr image, [Out] Guid [] dimensionIDs, uint count );
[DllImport("gdiplus.dll")]
- internal static extern Status GdipGetImageHeight (IntPtr image, out int height);
+ internal static extern Status GdipGetImageHeight (IntPtr image, out uint height);
[DllImport("gdiplus.dll")]
internal static extern Status GdipGetImageHorizontalResolution ( IntPtr image, out float resolution );
internal static extern Status GdipGetImageVerticalResolution ( IntPtr image, out float resolution );
[DllImport("gdiplus.dll")]
- internal static extern Status GdipGetImageWidth ( IntPtr image, out int width);
+ internal static extern Status GdipGetImageWidth (IntPtr image, out uint width);
[DllImport("gdiplus.dll")]
internal static extern Status GdipGetImageBounds ( IntPtr image, out RectangleF source, ref GraphicsUnit unit );
internal static extern Status GdipGetEncoderParameterList ( IntPtr image, ref Guid encoder, uint size, IntPtr buffer );
[DllImport("gdiplus.dll")]
- internal static extern Status GdipImageGetFrameCount (IntPtr image, ref Guid guidDimension, out int count );
+ internal static extern Status GdipImageGetFrameCount (IntPtr image, ref Guid guidDimension, out uint count );
[DllImport("gdiplus.dll")]
internal static extern Status GdipImageSelectActiveFrame (IntPtr image, ref Guid guidDimension, int frameIndex);
internal static extern Status GdipGetImageGraphicsContext (IntPtr image, out IntPtr graphics);
[DllImport("gdiplus.dll")]
internal static extern Status GdipDrawImage (IntPtr graphics, IntPtr image, float x, float y);
- [DllImport("gdiplus.dll")]
- internal static extern Status GdipBeginContainer (IntPtr graphics, RectangleF dstrect,
- RectangleF srcrect, GraphicsUnit unit, out int state);
-
- [DllImport("gdiplus.dll")]
- internal static extern Status GdipBeginContainerI (IntPtr graphics, Rectangle dstrect,
- Rectangle srcrect, GraphicsUnit unit, out int state);
- [DllImport("gdiplus.dll")]
- internal static extern Status GdipBeginContainer2 (IntPtr graphics, out int state);
+ [DllImport("gdiplus.dll")]
+ internal static extern Status GdipBeginContainer (IntPtr graphics, ref RectangleF dstrect, ref RectangleF srcrect, GraphicsUnit unit, out uint state);
+ [DllImport("gdiplus.dll")]
+ internal static extern Status GdipBeginContainerI (IntPtr graphics, ref Rectangle dstrect, ref Rectangle srcrect, GraphicsUnit unit, out uint state);
+ [DllImport("gdiplus.dll")]
+ internal static extern Status GdipBeginContainer2 (IntPtr graphics, out uint state);
[DllImport("gdiplus.dll")]
internal static extern Status GdipDrawImagePoints (IntPtr graphics, IntPtr image, PointF [] destPoints, int count);
[DllImport ("gdiplus.dll")]
internal static extern Status GdipCreateMatrix2 (float m11, float m12, float m21, float m22, float dx, float dy, out IntPtr matrix);
[DllImport ("gdiplus.dll")]
- internal static extern Status GdipCreateMatrix3 (RectangleF rect, PointF [] dstplg, out IntPtr matrix);
+ internal static extern Status GdipCreateMatrix3 (ref RectangleF rect, PointF [] dstplg, out IntPtr matrix);
[DllImport ("gdiplus.dll")]
- internal static extern Status GdipCreateMatrix3I (Rectangle rect, Point [] dstplg, out IntPtr matrix);
+ internal static extern Status GdipCreateMatrix3I (ref Rectangle rect, Point [] dstplg, out IntPtr matrix);
[DllImport ("gdiplus.dll")]
internal static extern Status GdipDeleteMatrix (IntPtr matrix);
internal static extern Status GdipGetPathLastPoint (IntPtr path, out PointF lastPoint);
[DllImport ("gdiplus.dll")]
internal static extern Status GdipAddPathLine (IntPtr path, float x1, float y1, float x2, float y2);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipAddPathLine2 (IntPtr path, PointF[] points, int count);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipAddPathLine2I (IntPtr path, Point[] points, int count);
[DllImport ("gdiplus.dll")]
internal static extern Status GdipAddPathArc (IntPtr path, float x, float y, float width, float height, float startAngle, float sweepAngle);
[DllImport ("gdiplus.dll")]
[DllImport ("gdiplus.dll")]
internal static extern Status GdipIsVisiblePathPointI (IntPtr path, int x, int y, IntPtr graphics, out bool result);
[DllImport ("gdiplus.dll")]
- internal static extern Status GdipIsOutlineVisiblePathPoint (IntPtr path, float x, float y, IntPtr graphics, out bool result);
+ internal static extern Status GdipIsOutlineVisiblePathPoint (IntPtr path, float x, float y, IntPtr pen, IntPtr graphics, out bool result);
[DllImport ("gdiplus.dll")]
- internal static extern Status GdipIsOutlineVisiblePathPointI (IntPtr path, int x, int y, IntPtr graphics, out bool result);
+ internal static extern Status GdipIsOutlineVisiblePathPointI (IntPtr path, int x, int y, IntPtr pen, IntPtr graphics, out bool result);
// GraphicsPathIterator
[DllImport("gdiplus.dll")]
[DllImport ("gdiplus.dll")]
internal static extern Status GdipSetImageAttributesColorMatrix (IntPtr imageattr,
- ColorAdjustType type, bool enableFlag, ColorMatrix colorMatrix,
- ColorMatrix grayMatrix, ColorMatrixFlag flags);
+ ColorAdjustType type, bool enableFlag, IntPtr colorMatrix,
+ IntPtr grayMatrix, ColorMatrixFlag flags);
[DllImport ("gdiplus.dll")]
internal static extern Status GdipSetImageAttributesGamma (IntPtr imageattr,
[DllImport("user32.dll", EntryPoint="GetDC", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
internal static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll", EntryPoint="ReleaseDC", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
- internal static extern int ReleaseDC(IntPtr hdc);
+ internal static extern int ReleaseDC (IntPtr hWnd, IntPtr hDC);
[DllImport("gdi32.dll", EntryPoint="SelectObject", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
internal static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);
[DllImport("user32.dll", SetLastError=true)]
internal static extern bool GetIconInfo (IntPtr hIcon, out IconInfo iconinfo);
-
+ [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, SetLastError=true)]
+ internal static extern IntPtr CreateIconIndirect ([In] ref IconInfo piconinfo);
+ [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, SetLastError=true)]
+ internal static extern bool DestroyIcon (IntPtr hIcon);
+ [DllImport("gdi32.dll")]
+ internal static extern bool DeleteObject (IntPtr hObject);
[DllImport("user32.dll")]
internal static extern IntPtr GetDesktopWindow ();
internal static extern Status GdipGetFontCollectionFamilyCount (IntPtr collection, out int found);
[DllImport ("gdiplus.dll")]
- internal static extern Status GdipGetFontCollectionFamilyList (IntPtr collection, int getCount, IntPtr dest, out int retCount);
+ internal static extern Status GdipGetFontCollectionFamilyList (IntPtr collection, int getCount, IntPtr[] dest, out int retCount);
//internal static extern Status GdipGetFontCollectionFamilyList( IntPtr collection, int getCount, [Out] FontFamily [] familyList, out int retCount );
[DllImport ("gdiplus.dll")]
internal static extern Status GdipNewPrivateFontCollection (out IntPtr collection);
[DllImport ("gdiplus.dll")]
- internal static extern Status GdipDeletePrivateFontCollection (IntPtr collection);
+ internal static extern Status GdipDeletePrivateFontCollection (ref IntPtr collection);
[DllImport ("gdiplus.dll", CharSet=CharSet.Auto)]
internal static extern Status GdipPrivateAddFontFile (IntPtr collection,
internal static extern Status GdipCreateFontFamilyFromName (
[MarshalAs(UnmanagedType.LPWStr)] string fName, IntPtr collection, out IntPtr fontFamily);
- [DllImport ("gdiplus.dll")]
- internal static extern Status GdipGetFamilyName(IntPtr family, IntPtr fName, int language);
+ [DllImport ("gdiplus.dll", CharSet=CharSet.Unicode)]
+ internal static extern Status GdipGetFamilyName(IntPtr family, StringBuilder name, int language);
[DllImport ("gdiplus.dll")]
internal static extern Status GdipGetGenericFontFamilySansSerif (out IntPtr fontFamily);
[DllImport ("gdiplus.dll")]
internal static extern Status GdipGetStringFormatTabStops(IntPtr format, int count, out float firstTabOffset, [In, Out] float [] tabStops);
+ // metafile
+ [DllImport ("gdiplus.dll", CharSet = CharSet.Auto)]
+ internal static extern Status GdipCreateMetafileFromFile ([MarshalAs (UnmanagedType.LPWStr)] string filename, out IntPtr metafile);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipCreateMetafileFromEmf (IntPtr hEmf, bool deleteEmf, out IntPtr metafile);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipCreateMetafileFromWmf (IntPtr hWmf, bool deleteWmf, WmfPlaceableFileHeader wmfPlaceableFileHeader, out IntPtr metafile);
+ [DllImport ("gdiplus.dll", CharSet = CharSet.Auto)]
+ internal static extern Status GdipGetMetafileHeaderFromFile ([MarshalAs (UnmanagedType.LPWStr)] string filename, IntPtr header);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipGetMetafileHeaderFromMetafile (IntPtr metafile, IntPtr header);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipGetMetafileHeaderFromEmf (IntPtr hEmf, IntPtr header);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipGetMetafileHeaderFromWmf (IntPtr hWmf, IntPtr wmfPlaceableFileHeader, IntPtr header);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipGetHemfFromMetafile (IntPtr metafile, out IntPtr hEmf);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipGetMetafileDownLevelRasterizationLimit (IntPtr metafile, ref uint metafileRasterizationLimitDpi);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipSetMetafileDownLevelRasterizationLimit (IntPtr metafile, uint metafileRasterizationLimitDpi);
+ [DllImport ("gdiplus.dll")]
+ internal static extern Status GdipPlayMetafileRecord (IntPtr metafile, EmfPlusRecordType recordType, int flags, int dataSize, byte[] data);
+#if !TEST
+ [DllImport("gdiplus.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
+ internal static extern Status GdipCreateMetafileFromStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(ComIStreamMarshaler))] IStream stream, out IntPtr metafile);
+ [DllImport("gdiplus.dll", ExactSpelling=true, CharSet=CharSet.Unicode)]
+ internal static extern Status GdipGetMetafileHeaderFromStream([MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef=typeof(ComIStreamMarshaler))] IStream stream, IntPtr header);
+#endif
//ImageCodecInfo functions
[DllImport("gdiplus.dll")]
static internal extern Status GdipGetImageDecodersSize (out int decoderNums, out int arraySize);
private byte[] start_buf;
private int start_buf_pos;
private int start_buf_len;
+ private byte[] managedBuf;
+ private const int default_bufsize = 4096;
public GdiPlusStreamHelper (Stream s)
{
+ managedBuf = new byte [default_bufsize];
+
stream = s;
if (stream != null && stream.CanSeek) {
stream.Seek (0, SeekOrigin.Begin);
return -1;
}
- byte[] managedBuf = new byte[bufsz];
+ if (bufsz > managedBuf.Length)
+ managedBuf = new byte[bufsz];
int bytesRead = 0;
long streamPosition = 0;
public int StreamPutBytesImpl (IntPtr buf, int bufsz)
{
- byte[] managedBuf = new byte[bufsz];
+ if (bufsz > managedBuf.Length)
+ managedBuf = new byte[bufsz];
Marshal.Copy (buf, managedBuf, 0, bufsz);
stream.Write (managedBuf, 0, bufsz);
return bufsz;
public long StreamSizeImpl ()
{
- return stream.Length;
+ try {
+ return stream.Length;
+ } catch {
+ return -1;
+ }
}
public StreamSizeDelegate SizeDelegate {
[DllImport("gdiplus.dll")]
internal static extern Status GdipCreateFromXDrawable_linux (IntPtr drawable, IntPtr display, out IntPtr graphics);
- // Stream functions for non-Win32 (libgdiplus specific(
+ // Stream functions for non-Win32 (libgdiplus specific)
[DllImport("gdiplus.dll")]
- static internal extern Status GdipLoadImageFromDelegate_linux ( StreamGetHeaderDelegate getHeader, StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes,
- StreamSeekDelegate doSeek, StreamCloseDelegate close, StreamSizeDelegate size, out IntPtr image);
+ static internal extern Status GdipLoadImageFromDelegate_linux (StreamGetHeaderDelegate getHeader,
+ StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes, StreamSeekDelegate doSeek,
+ StreamCloseDelegate close, StreamSizeDelegate size, out IntPtr image);
+
[DllImport("gdiplus.dll")]
- static internal extern Status GdipSaveImageToDelegate_linux ( IntPtr image, StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes,
- StreamSeekDelegate doSeek, StreamCloseDelegate close, StreamSizeDelegate size, ref Guid encoderClsID, IntPtr encoderParameters );
-
+ static internal extern Status GdipSaveImageToDelegate_linux (IntPtr image, StreamGetBytesDelegate getBytes,
+ StreamPutBytesDelegate putBytes, StreamSeekDelegate doSeek, StreamCloseDelegate close,
+ StreamSizeDelegate size, ref Guid encoderClsID, IntPtr encoderParameters);
+
+ [DllImport("gdiplus.dll")]
+ static internal extern Status GdipCreateMetafileFromDelegate_linux (StreamGetHeaderDelegate getHeader,
+ StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes, StreamSeekDelegate doSeek,
+ StreamCloseDelegate close, StreamSizeDelegate size, out IntPtr metafile);
+
+ [DllImport("gdiplus.dll")]
+ static internal extern Status GdipGetMetafileHeaderFromDelegate_linux (StreamGetHeaderDelegate getHeader,
+ StreamGetBytesDelegate getBytes, StreamPutBytesDelegate putBytes, StreamSeekDelegate doSeek,
+ StreamCloseDelegate close, StreamSizeDelegate size, IntPtr header);
#endregion
}
}