//
// Copyright (C) 2003 Ximian, Inc. (http://www.ximian.com)
//
-// Copyright (C) 2004 Novell, Inc. (http://www.novell.com)
+// Copyright (C) 2004-2005 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
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
-using System;
+
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.ComponentModel;
using System.Runtime.InteropServices;
+using System.Security.Permissions;
using System.Text;
namespace System.Drawing
private bool disposed = false;
private static float defDpiX = 0;
private static float defDpiY = 0;
- private static IntPtr display = IntPtr.Zero;
-
- // We use X Drawable on Linux.
- private static bool use_x_drawable = (Environment.OSVersion.Platform == (PlatformID) 128);
[ComVisible(false)]
public delegate bool EnumerateMetafileProc (EmfPlusRecordType recordType,
}
public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle)
- {
- Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref layoutRectangle, IntPtr.Zero, brush.nativeObject);
- GDIPlus.CheckStatus (status);
+ {
+ DrawString (s, font, brush, layoutRectangle, null);
}
-
+
public void DrawString (string s, Font font, Brush brush, PointF point)
{
- RectangleF rc = new RectangleF (point.X, point.Y, 0, 0);
- Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref rc, IntPtr.Zero, brush.nativeObject);
- GDIPlus.CheckStatus (status);
+ DrawString (s, font, brush, new RectangleF (point.X, point.Y, 0, 0), null);
}
-
+
public void DrawString (string s, Font font, Brush brush, PointF point, StringFormat format)
{
- RectangleF rc = new RectangleF (point.X, point.Y, 0, 0);
- Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref rc, format.NativeObject, brush.nativeObject);
- GDIPlus.CheckStatus (status);
- }
-
- public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)
- {
- Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref layoutRectangle, format.NativeObject, brush.nativeObject);
- GDIPlus.CheckStatus (status);
+ DrawString(s, font, brush, new RectangleF(point.X, point.Y, 0, 0), format);
}
public void DrawString (string s, Font font, Brush brush, float x, float y)
{
- RectangleF rc = new RectangleF (x, y, 0, 0);
-
- Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject,
- ref rc, IntPtr.Zero, brush.nativeObject);
- GDIPlus.CheckStatus (status);
+ DrawString (s, font, brush, new RectangleF (x, y, 0, 0), null);
}
public void DrawString (string s, Font font, Brush brush, float x, float y, StringFormat format)
{
- RectangleF rc = new RectangleF (x, y, 0, 0);
+ DrawString (s, font, brush, new RectangleF(x, y, 0, 0), format);
+ }
+
+ public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)
+ {
+ if (font == null)
+ throw new ArgumentNullException ("font");
+ if (brush == null)
+ throw new ArgumentNullException ("brush");
+ if (s == null || s.Length == 0)
+ return;
- Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject,
- ref rc, format.NativeObject, brush.nativeObject);
+ Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref layoutRectangle, format != null ? format.NativeObject : IntPtr.Zero, brush.nativeObject);
GDIPlus.CheckStatus (status);
}
-
public void EndContainer (GraphicsContainer container)
{
Status status = GDIPlus.GdipEndContainer(nativeObject, container.NativeObject);
public void Flush (FlushIntention intention)
{
Status status = GDIPlus.GdipFlush (nativeObject, intention);
- GDIPlus.CheckStatus (status);
+ GDIPlus.CheckStatus (status);
+ if (GDIPlus.UseQuartzDrawable || GDIPlus.UseCocoaDrawable)
+ Carbon.CGContextSynchronize (GDIPlus.Display);
}
[EditorBrowsable (EditorBrowsableState.Advanced)]
}
[EditorBrowsable (EditorBrowsableState.Advanced)]
+ [SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
public static Graphics FromHdcInternal (IntPtr hdc)
{
- display = hdc;
+ GDIPlus.Display = hdc;
return null;
}
- public static Graphics FromHwndWithSize (IntPtr hwnd, int width, int height) {
- IntPtr graphics;
- Status s = GDIPlus.GdipCreateFromQuartz_macosx (hwnd, width, height, out graphics);
- GDIPlus.CheckStatus (s);
- return new Graphics (graphics);
- }
-
[EditorBrowsable (EditorBrowsableState.Advanced)]
public static Graphics FromHwnd (IntPtr hwnd)
{
IntPtr graphics;
- if (use_x_drawable) {
- if (display == IntPtr.Zero) {
- display = GDIPlus.XOpenDisplay (IntPtr.Zero);
+ if (GDIPlus.UseCocoaDrawable) {
+ CarbonContext cgContext = Carbon.GetCGContextForNSView (hwnd);
+ GDIPlus.GdipCreateFromQuartz_macosx (cgContext.ctx, cgContext.width, cgContext.height, out graphics);
+
+ GDIPlus.Display = cgContext.ctx;
+ return new Graphics (graphics);
+ }
+ if (GDIPlus.UseQuartzDrawable) {
+ CarbonContext cgContext = Carbon.GetCGContextForView (hwnd);
+ GDIPlus.GdipCreateFromQuartz_macosx (cgContext.ctx, cgContext.width, cgContext.height, out graphics);
+
+ GDIPlus.Display = cgContext.ctx;
+ return new Graphics (graphics);
+ }
+ if (GDIPlus.UseX11Drawable) {
+ if (GDIPlus.Display == IntPtr.Zero) {
+ GDIPlus.Display = GDIPlus.XOpenDisplay (IntPtr.Zero);
}
- return FromXDrawable (hwnd, display);
+ return FromXDrawable (hwnd, GDIPlus.Display);
}
return new Graphics (graphics);
}
-
- [MonoTODO]
+
[EditorBrowsable (EditorBrowsableState.Advanced)]
+ [SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
public static Graphics FromHwndInternal (IntPtr hwnd)
{
- throw new NotImplementedException ();
+ return FromHwnd (hwnd);
}
public static Graphics FromImage (Image image)
{
- if (image == null) throw new ArgumentException ();
+ IntPtr graphics;
+
+ if (image == null)
+ throw new ArgumentNullException ();
- int graphics;
Status status = GDIPlus.GdipGetImageGraphicsContext (image.nativeObject, out graphics);
GDIPlus.CheckStatus (status);
- Graphics result = new Graphics ((IntPtr) graphics);
+ Graphics result = new Graphics (graphics);
- if (Environment.OSVersion.Platform == (PlatformID) 128) {
+ // check for Unix platforms - see FAQ for more details
+ // http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
+ int platform = (int) Environment.OSVersion.Platform;
+ if ((platform == 4) || (platform == 128)) {
Rectangle rect = new Rectangle (0,0, image.Width, image.Height);
GDIPlus.GdipSetVisibleClip_linux (result.NativeObject, ref rect);
}
internal static Graphics FromXDrawable (IntPtr drawable, IntPtr display)
{
IntPtr graphics;
+
Status s = GDIPlus.GdipCreateFromXDrawable_linux (drawable, display, out graphics);
GDIPlus.CheckStatus (s);
return new Graphics (graphics);
throw new NotImplementedException ();
}
- [MonoTODO]
[EditorBrowsable (EditorBrowsableState.Advanced)]
public IntPtr GetHdc ()
{
- int hdc;
- Status status = GDIPlus.GdipGetDC (nativeObject, out hdc);
- GDIPlus.CheckStatus (status);
-
- return (IntPtr) hdc;
+ IntPtr hdc;
+ GDIPlus.CheckStatus (GDIPlus.GdipGetDC (this.nativeObject, out hdc));
+ return hdc;
}
[MonoTODO]
[EditorBrowsable (EditorBrowsableState.Advanced)]
+ [SecurityPermission (SecurityAction.LinkDemand, UnmanagedCode = true)]
public void ReleaseHdcInternal (IntPtr hdc)
{
throw new NotImplementedException ();
}
public void Restore (GraphicsState gstate)
- {
- Transform = gstate.matrix.Clone ();
+ {
Status status = GDIPlus.GdipRestoreGraphics (nativeObject, gstate.nativeState);
GDIPlus.CheckStatus (status);
}
}
public GraphicsState Save ()
- {
- GraphicsState state = new GraphicsState ();
- state.matrix = Transform.Clone ();
+ {
uint saveState;
Status status = GDIPlus.GdipSaveGraphics (nativeObject, out saveState);
GDIPlus.CheckStatus (status);
+ GraphicsState state = new GraphicsState ();
state.nativeState = saveState;
return state;
}