//
// System.Drawing.Graphics.cs
//
// (C) 2003 Ximian, Inc.  http://www.ximian.com
//
// Authors:
//	Gonzalo Paniagua Javier (gonzalo@ximian.com) (stubbed out)
//      Alexandre Pigolkine(pigolkine@gmx.de)
//		Jordi Mas i Hernandez (jordi@ximian.com)
//
using System;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Runtime.InteropServices;
using System.Text;

namespace System.Drawing
{
	[ComVisible(false)]
	public sealed class Graphics : MarshalByRefObject, IDisposable
	{
		internal IntPtr nativeObject = IntPtr.Zero;
		
		public delegate bool EnumerateMetafileProc (EmfPlusRecordType recordType,
							    int flags,
							    int dataSize,
							    IntPtr data,
							    PlayRecordCallback callbackData);
		
		public delegate bool DrawImageAbort (IntPtr callbackData);

		private Graphics (IntPtr nativeGraphics)
		{
			nativeObject = nativeGraphics;
		}
		
		internal IntPtr NativeObject {
			get{
				return nativeObject;
			}

			set {
				nativeObject = value;
			}
		}

		[MonoTODO]
		public void AddMetafileComment (byte [] data)
		{
			throw new NotImplementedException ();
		}

		
		public GraphicsContainer BeginContainer ()
		{
			int state;

                        GDIPlus.GdipBeginContainer2 (nativeObject, out state);
        	
                        return new GraphicsContainer(state);
		}
		
		public GraphicsContainer BeginContainer (Rectangle dstrect, Rectangle srcrect, GraphicsUnit unit)
		{
			int state;

                        GDIPlus.GdipBeginContainerI (nativeObject, dstrect, srcrect, unit, out state);        	
        	
                        return new GraphicsContainer (state);
		}

		
		public GraphicsContainer BeginContainer (RectangleF dstrect, RectangleF srcrect, GraphicsUnit unit)
		{
			int state;

                        GDIPlus.GdipBeginContainer (nativeObject, dstrect, srcrect, unit, out state);        	
        	
                        return new GraphicsContainer (state);
		}

		
		public void Clear (Color color)
		{			
 			GDIPlus.GdipGraphicsClear(nativeObject, color.ToArgb()); 			
		}

		[MonoTODO]
		public void Dispose ()
		{
		}

		
		public void DrawArc (Pen pen, Rectangle rect, float startAngle, float sweepAngle)
		{
			DrawArc (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
		}

		
		public void DrawArc (Pen pen, RectangleF rect, float startAngle, float sweepAngle)
		{
			DrawArc (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
		}

		
		public void DrawArc (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle)
		{
			GDIPlus.GdipDrawArc (nativeObject, pen.nativeObject,
                                        x, y, width, height, startAngle, sweepAngle);                        
		}

		public void DrawArc (Pen pen, int x, int y, int width, int height, float startAngle, float sweepAngle)
		{			
			GDIPlus.GdipDrawArcI (nativeObject, pen.nativeObject,
                                        x, y, width, height, startAngle, sweepAngle);
                                                    
		}

		public void DrawBezier (Pen pen, PointF pt1, PointF pt2, PointF pt3, PointF pt4)
		{
			GDIPlus.GdipDrawBezier (nativeObject, pen.nativeObject, 
                                        pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);                                     
			
		}

		public void DrawBezier (Pen pen, Point pt1, Point pt2, Point pt3, Point pt4)
		{
			GDIPlus.GdipDrawBezierI (nativeObject, pen.nativeObject, 
                                        pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);                                        
		
		}

		public void DrawBezier (Pen pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
		{
			GDIPlus.GdipDrawBezier (nativeObject, pen.nativeObject, x1, y1, x2, y2, x3, y3, x4, y4);
		}

                [MonoTODO]
		public void DrawBeziers (Pen pen, Point [] points)
		{
                        int length = points.Length;

                        if (length < 3)
                                return;

			for (int i = 0; i < length; i += 3) {
                                Point p1 = points [i];
                                Point p2 = points [i + 1];
                                Point p3 = points [i + 2];
                                Point p4 = points [i + 3];

                                GDIPlus.GdipDrawBezier (nativeObject, pen.nativeObject,
                                                        p1.X, p1.Y, p2.X, p2.Y, 
                                                        p3.X, p3.Y, p4.X, p4.Y);
                        }
		}

                [MonoTODO]
		public void DrawBeziers (Pen pen, PointF [] points)
		{
			int length = points.Length;

                        if (length < 3)
                                return;

			for (int i = 0; i < length; i += 3) {
                                PointF p1 = points [i];
                                PointF p2 = points [i + 1];
                                PointF p3 = points [i + 2];
                                PointF p4 = points [i + 3];

                                GDIPlus.GdipDrawBezier (nativeObject, pen.nativeObject,
                                                        p1.X, p1.Y, p2.X, p2.Y, 
                                                        p3.X, p3.Y, p4.X, p4.Y);
                        }
		}

		
		public void DrawClosedCurve (Pen pen, PointF [] points)
		{
	 		GDIPlus.GdipDrawClosedCurve (nativeObject, pen.nativeObject, points, points.Length);
		}
		
		public void DrawClosedCurve (Pen pen, Point [] points)
		{
			GDIPlus.GdipDrawClosedCurveI (nativeObject, pen.nativeObject, points, points.Length);	 		
		}
 			
		public void DrawClosedCurve (Pen pen, Point [] points, float tension, FillMode fillmode)
		{
			GDIPlus.GdipDrawClosedCurve2I (nativeObject, pen.nativeObject, points, points.Length, tension); 
		}
		
		public void DrawClosedCurve (Pen pen, PointF [] points, float tension, FillMode fillmode)
		{
			GDIPlus.GdipDrawClosedCurve2 (nativeObject, pen.nativeObject, points, points.Length, tension);
		}
		
		public void DrawCurve (Pen pen, Point [] points)
		{
			GDIPlus.GdipDrawCurveI (nativeObject, pen.nativeObject, points, points.Length);	 		
		}
		
		public void DrawCurve (Pen pen, PointF [] points)
		{
			GDIPlus.GdipDrawCurve (nativeObject, pen.nativeObject, points, points.Length); 				
			
		}
		
		public void DrawCurve (Pen pen, PointF [] points, float tension)
		{			
			GDIPlus.GdipDrawCurve2 (nativeObject, pen.nativeObject, points, points.Length, tension); 		
			
		}
		
		public void DrawCurve (Pen pen, Point [] points, float tension)
		{
			GDIPlus.GdipDrawCurve2I (nativeObject, pen.nativeObject, points, points.Length, tension);		
			
		}
		
		[MonoTODO]
		public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments)
		{
			
		}

		public void DrawCurve (Pen pen, Point [] points, int offset, int numberOfSegments, float tension)
		{
			GDIPlus.GdipDrawCurve3I (nativeObject, pen.nativeObject, points, points.Length,
                                        offset, numberOfSegments, tension);
		}

		
		public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments, float tension)
		{
			GDIPlus.GdipDrawCurve3 (nativeObject, pen.nativeObject, points, points.Length, 
                                        offset, numberOfSegments, tension);
		}

		public void DrawEllipse (Pen pen, Rectangle rect)
		{
			DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
		}

		public void DrawEllipse (Pen pen, RectangleF rect)
		{
			DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
		}

		public void DrawEllipse (Pen pen, int x, int y, int width, int height)
		{
			GDIPlus.GdipDrawEllipseI (nativeObject, pen.nativeObject, x, y, width, height);
		}

		public void DrawEllipse (Pen pen, float x, float y, float width, float height)
		{
			GDIPlus.GdipDrawEllipse (nativeObject, pen.nativeObject, x, y, width, height); 
		}

		[MonoTODO]
		public void DrawIcon (Icon icon, Rectangle targetRect)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawIcon (Icon icon, int x, int y)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawIconUnstretched (Icon icon, Rectangle targetRect)
		{
			throw new NotImplementedException ();
		}
		
		public void DrawImage (Image image, RectangleF rect)
		{
			GDIPlus.GdipDrawImageRect(nativeObject, image.NativeObject, rect.X, rect.Y,
                           rect.Width, rect.Height);
		}

		
		public void DrawImage (Image image, PointF point)
		{
			GDIPlus.GdipDrawImage (nativeObject, image.NativeObject, point.X, point.Y); 			
		}

		
		public void DrawImage (Image image, Point [] destPoints)
		{
			GDIPlus.GdipDrawImagePointsI (nativeObject, image.NativeObject, destPoints, destPoints.Length);
		}

		
		public void DrawImage (Image image, Point point)
		{
			DrawImage (image, point.X, point.Y);
		}

		
		public void DrawImage (Image image, Rectangle rect)
		{
			DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
		}

		
		public void DrawImage (Image image, PointF [] destPoints)
		{
			GDIPlus.GdipDrawImagePoints (nativeObject, image.NativeObject, destPoints, destPoints.Length);
		}

		
		public void DrawImage (Image image, int x, int y)
		{
			GDIPlus.GdipDrawImageI (nativeObject, image.NativeObject, x, y);
		}

		
		public void DrawImage (Image image, float x, float y)
		{
			GDIPlus.GdipDrawImage (nativeObject, image.NativeObject, x, y);
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, 
                                ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}
		
		public void DrawImage (Image image, float x, float y, float width, float height)
		{
			GDIPlus.GdipDrawImageRect(nativeObject, image.NativeObject, x, y,
                           width, height);
		}

		[MonoTODO]
		public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, 
                                ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, int x, int y, Rectangle srcRect, GraphicsUnit srcUnit)
		{
			throw new NotImplementedException ();
		}
		
		public void DrawImage (Image image, int x, int y, int width, int height)
		{
			GDIPlus.GdipDrawImageRectI (nativeObject, image.nativeObject, x, y, width, height);
		}

		public void DrawImage (Image image, float x, float y, RectangleF srcRect, GraphicsUnit srcUnit)
		{
			GDIPlus.GdipDrawImagePointRect(nativeObject, image.nativeObject, x, y, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit);                                                            
		}

		[MonoTODO]
		public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, 
                                ImageAttributes imageAttr, DrawImageAbort callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, 
                                ImageAttributes imageAttr, DrawImageAbort callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, 
                                ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, 
                                GraphicsUnit srcUnit)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, 
                                ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, 
                                GraphicsUnit srcUnit)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, 
                                GraphicsUnit srcUnit, ImageAttributes imageAttrs)
		{
			throw new NotImplementedException ();
		}
		
		public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, 
                                GraphicsUnit srcUnit, ImageAttributes imageAttr)
		{			
			GDIPlus.GdipDrawImageRectRectI (nativeObject, image.NativeObject, 
                                        destRect.X, destRect.Y, destRect.Width, destRect.Height,
                                        srcX, srcY, srcWidth, srcHeight, srcUnit, imageAttr.NativeObject, IntPtr.Zero, 0);
 
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight,
                                GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight,
                                GraphicsUnit srcUnit, ImageAttributes imageAttrs, DrawImageAbort callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight,
                                GraphicsUnit srcUnit, ImageAttributes imageAttrs, DrawImageAbort callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, 
                                GraphicsUnit srcUnit, ImageAttributes imageAttrs, DrawImageAbort callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}		
		
		public void DrawImageUnscaled (Image image, Point point)
		{
			DrawImage(image, point.X, point.Y);
		}
		
		public void DrawImageUnscaled (Image image, Rectangle rect)
		{
			DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
		}
		
		public void DrawImageUnscaled (Image image, int x, int y)
		{
			DrawImage(image, x, y);
		}

		public void DrawImageUnscaled (Image image, int x, int y, int width, int height)
		{
			DrawImage(image, x, y, width, height);
		}

		public void DrawLine (Pen pen, PointF pt1, PointF pt2)
		{
                        GDIPlus.GdipDrawLine (
                                nativeObject, pen.nativeObject,
                                pt1.X, pt1.Y,
                                pt2.X, pt2.Y);                             
				
		}

		public void DrawLine (Pen pen, Point pt1, Point pt2)
		{
                        GDIPlus.GdipDrawLineI (
                                nativeObject, pen.nativeObject,
                                pt1.X, pt1.Y,
                                pt2.X, pt2.Y);                           
		}

		public void DrawLine (Pen pen, int x1, int y1, int x2, int y2)
		{
			GDIPlus.GdipDrawLineI (nativeObject, pen.nativeObject, x1, y1, x2, y2);			
		}

		public void DrawLine (Pen pen, float x1, float y1, float x2, float y2)
		{
			GDIPlus.GdipDrawLine (nativeObject, pen.nativeObject, x1, y1, x2, y2);	
		}

		public void DrawLines (Pen pen, PointF [] points)
		{
			GDIPlus.GdipDrawLines (nativeObject, pen.nativeObject, points, points.Length);	
		}

		public void DrawLines (Pen pen, Point [] points)
		{
			GDIPlus.GdipDrawLinesI (nativeObject, pen.nativeObject, points, points.Length);			
		}

		public void DrawPath (Pen pen, GraphicsPath path)
		{
			GDIPlus.GdipDrawPath (nativeObject, pen.nativeObject, path.nativePath);
		}
		
		public void DrawPie (Pen pen, Rectangle rect, float startAngle, float sweepAngle)
		{
			DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
		}
		
		public void DrawPie (Pen pen, RectangleF rect, float startAngle, float sweepAngle)
		{
			DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
		}
		
		public void DrawPie (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle)
		{
			GDIPlus.GdipDrawPie (nativeObject, pen.nativeObject, x, y, width, height, startAngle, sweepAngle);
		}
		
		public void DrawPie (Pen pen, int x, int y, int width, int height, float startAngle, float sweepAngle)
		{
			GDIPlus.GdipDrawPieI (nativeObject, pen.nativeObject, x, y, width, height, startAngle, sweepAngle);
		}

		public void DrawPolygon (Pen pen, Point [] points)
		{
			GDIPlus.GdipDrawPolygonI (nativeObject, pen.nativeObject, points, points.Length);
		}

		public void DrawPolygon (Pen pen, PointF [] points)
		{
			GDIPlus.GdipDrawPolygon (nativeObject, pen.nativeObject, points, points.Length);
		}

		public void DrawRectangle (Pen pen, RectangleF rect)
		{
			DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
		}

		public void DrawRectangle (Pen pen, Rectangle rect)
		{
			DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
		}

		public void DrawRectangle (Pen pen, float x, float y, float width, float height)
		{
			GDIPlus.GdipDrawRectangle (nativeObject, pen.nativeObject, x, y, width, height);
		}

		public void DrawRectangle (Pen pen, int x, int y, int width, int height)
		{
			GDIPlus.GdipDrawRectangleI (nativeObject, pen.nativeObject, x, y, width, height);
		}

		public void DrawRectangles (Pen pen, RectangleF [] rects)
		{
			foreach (RectangleF rc in rects)
				DrawRectangle (pen, rc.Left, rc.Top, rc.Width, rc.Height);
		}

		public void DrawRectangles (Pen pen, Rectangle [] rects)
		{
			foreach (RectangleF rc in rects)
				DrawRectangle(pen, rc.Left, rc.Top, rc.Width, rc.Height);
		}

		
		public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle)
		{			
			GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref layoutRectangle, IntPtr.Zero, brush.nativeObject);			 
		}

		[MonoTODO("This ignores the font")]
		public void DrawString (string s, Font font, Brush brush, PointF point)
		{
			RectangleF rc = new RectangleF (point.X, point.Y, 0, 0);
			GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref rc, IntPtr.Zero, brush.nativeObject);
		}

		[MonoTODO ("This ignores the font and format")]
		public void DrawString (string s, Font font, Brush brush, PointF point, StringFormat format)
		{
			RectangleF rc = new RectangleF (point.X, point.Y, 0, 0);
			GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref rc, IntPtr.Zero, brush.nativeObject);
		}

		[MonoTODO ("This ignores the font and the format")]
		public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)
		{
			GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref layoutRectangle, 
			IntPtr.Zero, brush.nativeObject);
		}

		[MonoTODO("This ignores the font")]
		public void DrawString (string s, Font font, Brush brush, float x, float y)
		{
			Console.WriteLine ("DrawString!");
			RectangleF rc = new RectangleF (x, y, 0, 0);
			
			GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, 
				ref rc, IntPtr.Zero, brush.nativeObject);			
		}

		[MonoTODO]
		public void DrawString (string s, Font font, Brush brush, float x, float y, StringFormat format)
		{
			//throw new NotImplementedException ();
		}

		
		public void EndContainer (GraphicsContainer container)
		{
			GDIPlus.GdipEndContainer(nativeObject, container.NativeObject);
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
		{
			throw new NotImplementedException ();
		}
	
		public void ExcludeClip (Rectangle rect)
		{
			GDIPlus.GdipSetClipRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, CombineMode.Exclude);    
		}

		[MonoTODO]
		public void ExcludeClip (Region region)
		{
			throw new NotImplementedException ();
		}

		
		public void FillClosedCurve (Brush brush, PointF [] points)
		{
		       GDIPlus.GdipFillClosedCurve (nativeObject, brush.NativeObject, points, points.Length);
		}

		
		public void FillClosedCurve (Brush brush, Point [] points)
		{
			GDIPlus.GdipFillClosedCurveI (nativeObject, brush.NativeObject, points, points.Length);
		}

		
		public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode)
		{
			FillClosedCurve (brush, points, fillmode, 0.5f);
		}
		
		public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode)
		{
			FillClosedCurve (brush, points, fillmode, 0.5f);
		}

		public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode, float tension)
		{
			GDIPlus.GdipFillClosedCurve2 (nativeObject, brush.NativeObject, points, points.Length, tension, fillmode);
		}

		public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode, float tension)
		{
			GDIPlus.GdipFillClosedCurve2I (nativeObject, brush.NativeObject, points, points.Length, tension, fillmode);
		}

		public void FillEllipse (Brush brush, Rectangle rect)
		{
			FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
		}

		public void FillEllipse (Brush brush, RectangleF rect)
		{
			FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
		}

		public void FillEllipse (Brush brush, float x, float y, float width, float height)
		{
                        GDIPlus.GdipFillEllipse (nativeObject, brush.nativeObject, x, y, width, height);
		}

		public void FillEllipse (Brush brush, int x, int y, int width, int height)
		{
			GDIPlus.GdipFillEllipseI (nativeObject, brush.nativeObject, x, y, width, height);
		}

		public void FillPath (Brush brush, GraphicsPath path)
		{
			GDIPlus.GdipFillPath (nativeObject, brush.NativeObject,  path.NativeObject);
		}

		public void FillPie (Brush brush, Rectangle rect, float startAngle, float sweepAngle)
		{
			GDIPlus.GdipFillPie (nativeObject, brush.NativeObject, rect.X, rect.Y, rect.Width, rect.Height,
                                        startAngle, sweepAngle);
		}

		public void FillPie (Brush brush, int x, int y, int width, int height, int startAngle, int sweepAngle)
		{
			GDIPlus.GdipFillPieI (nativeObject, brush.NativeObject, x, y, width, height, startAngle, sweepAngle);
		}

		public void FillPie (Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle)
		{
			GDIPlus.GdipFillPie (nativeObject, brush.NativeObject, x, y, width, height, startAngle, sweepAngle);
		}

		public void FillPolygon (Brush brush, PointF [] points)
		{
			GDIPlus.GdipFillPolygon2 (nativeObject, brush.nativeObject, points, points.Length);
		}

		public void FillPolygon (Brush brush, Point [] points)
		{
			GDIPlus.GdipFillPolygon2I (nativeObject, brush.nativeObject, points, points.Length);
		}

		public void FillPolygon (Brush brush, Point [] points, FillMode fillMode)
		{
			GDIPlus.GdipFillPolygonI (nativeObject, brush.nativeObject, points, points.Length, fillMode);
		}

		public void FillPolygon (Brush brush, PointF [] points, FillMode fillMode)
		{
			GDIPlus.GdipFillPolygon (nativeObject, brush.nativeObject, points, points.Length, fillMode);
		}

		public void FillRectangle (Brush brush, RectangleF rect)
		{
                        FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
		}

		public void FillRectangle (Brush brush, Rectangle rect)
		{
                        FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
		}

		public void FillRectangle (Brush brush, int x, int y, int width, int height)
		{
			GDIPlus.GdipFillRectangle (nativeObject, brush.nativeObject, (float)x, (float)y, (float)width, (float)height);
		}

		public void FillRectangle (Brush brush, float x, float y, float width, float height)
		{
			GDIPlus.GdipFillRectangle (nativeObject, brush.nativeObject, x, y, width, height);
		}

		public void FillRectangles (Brush brush, Rectangle [] rects)
		{
                        foreach (Rectangle rc in rects)
                                FillRectangle(brush, rc);
		}

		public void FillRectangles (Brush brush, RectangleF [] rects)
		{
			foreach (RectangleF rc in rects)
                                FillRectangle(brush, rc);
		}

		[MonoTODO]
		public void FillRegion (Brush brush, Region region)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public void Flush ()
		{
			Flush (FlushIntention.Flush);
		}

		[MonoTODO]
		public void Flush (FlushIntention intention)
		{
			throw new NotImplementedException ();
		}

		
		public static Graphics FromHdc (IntPtr hdc)
		{
			int graphics;
			GDIPlus.GdipCreateFromHDC (hdc, out graphics);
			Graphics result = new Graphics ((IntPtr) graphics);
			return result;
		}

		[MonoTODO]
		public static Graphics FromHdc (IntPtr hdc, IntPtr hdevice)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public static Graphics FromHdcInternal (IntPtr hdc)
		{
			throw new NotImplementedException ();
		}
		
		public static Graphics FromHwnd (IntPtr hwnd)
		{
			IntPtr graphics;
			
			GDIPlus.GdipCreateFromHWND (hwnd, out graphics); 			
 			
			return new Graphics (graphics); 
		}

		[MonoTODO]
		public static Graphics FromHwndInternal (IntPtr hwnd)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public static Graphics FromImage (Image image)
		{
			if (image == null) throw new ArgumentException ();
			int graphics;
			GDIPlus.GdipGetImageGraphicsContext (image.nativeObject, out graphics);
			Graphics result = new Graphics ((IntPtr) graphics);
			return result;
		}

		[MonoTODO]
		public static IntPtr GetHalftonePalette ()
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public IntPtr GetHdc ()
		{
			int hdc;
			GDIPlus.GdipGetDC (nativeObject, out hdc);
			return (IntPtr) hdc;
		}

		
		public Color GetNearestColor (Color color)
		{
			int argb;
			
			GDIPlus.GdipGetNearestColor (nativeObject, out argb);			
			return Color.FromArgb (argb);
		}

		[MonoTODO]
		public void IntersectClip (Region region)
		{
			throw new NotImplementedException ();
		}
		
		public void IntersectClip (RectangleF rect)
		{
			GDIPlus.GdipSetClipRect (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, CombineMode.Intersect);
		}

		public void IntersectClip (Rectangle rect)
		{			
			GDIPlus.GdipSetClipRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, CombineMode.Intersect);
		}

		public bool IsVisible (Point point)
		{
			bool isVisible = false;

			GDIPlus.GdipIsVisiblePointI (nativeObject, point.X, point.Y, out isVisible);

                        return isVisible;
		}

		
		public bool IsVisible (RectangleF rect)
		{
			bool isVisible = false;

			GDIPlus.GdipIsVisibleRect (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, out isVisible);

                        return isVisible;
		}

		public bool IsVisible (PointF point)
		{
			bool isVisible = false;

			GDIPlus.GdipIsVisiblePoint (nativeObject, point.X, point.Y, out isVisible);

                        return isVisible;
		}
		
		public bool IsVisible (Rectangle rect)
		{
			bool isVisible = false;

			GDIPlus.GdipIsVisibleRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, out isVisible);

                        return isVisible;
		}
		
		public bool IsVisible (float x, float y)
		{
			return IsVisible (new PointF (x, y));
		}
		
		public bool IsVisible (int x, int y)
		{
			return IsVisible (new Point (x, y));
		}
		
		public bool IsVisible (float x, float y, float width, float height)
		{
			return IsVisible (new RectangleF (x, y, width, height));
		}

		
		public bool IsVisible (int x, int y, int width, int height)
		{
			return IsVisible (new Rectangle (x, y, width, height));
		}

		[MonoTODO]
		public Region [] MeasureCharacterRanges (string text, Font font, RectangleF layoutRect, StringFormat stringFormat)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public SizeF MeasureString (string text, Font font)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public SizeF MeasureString (string text, Font font, SizeF layoutArea)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public SizeF MeasureString (string text, Font font, int width)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat stringFormat)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public SizeF MeasureString (string text, Font font, int width, StringFormat format)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public SizeF MeasureString (string text, Font font, PointF origin, StringFormat stringFormat)
		{
			throw new NotImplementedException ();
		}

		[MonoTODO]
		public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat stringFormat, 
                                out int charactersFitted, out int linesFilled)
		{
			throw new NotImplementedException ();
		}

		public void MultiplyTransform (Matrix matrix)
		{
			MultiplyTransform (matrix, MatrixOrder.Prepend);
		}

		public void MultiplyTransform (Matrix matrix, MatrixOrder order)
		{
			GDIPlus.GdipMultiplyWorldTransform (nativeObject, matrix.nativeMatrix, order);
		}
		
		public void ReleaseHdc (IntPtr hdc)
		{
			GDIPlus.GdipReleaseDC (nativeObject, hdc);
		}

		[MonoTODO]
		public void ReleaseHdcInternal (IntPtr hdc)
		{
			throw new NotImplementedException ();
		}

		
		public void ResetClip ()
		{
			GDIPlus.GdipResetClip(nativeObject);
		}

		public void ResetTransform ()
		{
			GDIPlus.GdipResetWorldTransform (nativeObject);
		}

		[MonoTODO]
		public void Restore (GraphicsState gstate)
		{
			Transform = gstate.matrix.Clone();
			GDIPlus.GdipRestoreGraphics (nativeObject, gstate.nativeState);
		}

		[MonoTODO]
		public void RotateTransform (float angle)
		{
			RotateTransform(angle, MatrixOrder.Prepend);
		}

		[MonoTODO]
		public void RotateTransform (float angle, MatrixOrder order)
		{
			//transform.Rotate(angle, order);
			GDIPlus.GdipRotateWorldTransform (nativeObject, angle, order);
		}

		[MonoTODO]
		public GraphicsState Save ()
		{
			//return implementation.Save();
			GraphicsState state = new GraphicsState();
			state.matrix = Transform.Clone ();
			uint saveState;
			GDIPlus.GdipSaveGraphics (nativeObject, out saveState);
			state.nativeState = saveState;
			return state;
		}

		public void ScaleTransform (float sx, float sy)
		{
			ScaleTransform (sx, sy, MatrixOrder.Prepend);
		}

		public void ScaleTransform (float sx, float sy, MatrixOrder order)
		{
                        GDIPlus.GdipScaleWorldTransform (nativeObject, sx, sy, order);
		}

		
		public void SetClip (RectangleF rect)
		{
                        SetClip (rect, CombineMode.Replace);
		}

		
		public void SetClip (GraphicsPath path)
		{
			SetClip (path, CombineMode.Replace);
		}

		
		public void SetClip (Rectangle rect)
		{
			SetClip (rect, CombineMode.Replace);
		}

		
		public void SetClip (Graphics g)
		{
			SetClip (g, CombineMode.Replace);
		}

		
		public void SetClip (Graphics g, CombineMode combineMode)
		{
			GDIPlus.GdipSetClipGraphics (nativeObject, g.NativeObject, combineMode);
		}

		
		public void SetClip (Rectangle rect, CombineMode combineMode)
		{
			GDIPlus.GdipSetClipRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, combineMode);
		}

		
		public void SetClip (RectangleF rect, CombineMode combineMode)
		{
			GDIPlus.GdipSetClipRect (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, combineMode);		
		}

		[MonoTODO]
		public void SetClip (Region region, CombineMode combineMode)
		{
			//GDIPlus.GdipSetClipRegion(nativeObject,  region.NativeObject, combineMode); //TODO: Region not implemented yet
		}

		
		public void SetClip (GraphicsPath path, CombineMode combineMode)
		{
			GDIPlus.GdipSetClipPath (nativeObject, path.NativeObject, combineMode);
		}

		
		public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, PointF [] pts)
		{
			IntPtr ptrPt =  GDIPlus.FromPointToUnManagedMemory (pts);
            
                        Status status = GDIPlus.GdipTransformPoints (nativeObject, destSpace, srcSpace,  ptrPt, pts.Length);
			
			GDIPlus.FromUnManagedMemoryToPoint (ptrPt, pts);
		}

				
		public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, Point [] pts)
		{						
                        IntPtr ptrPt =  GDIPlus.FromPointToUnManagedMemoryI (pts);
            
                        Status status = GDIPlus.GdipTransformPointsI (nativeObject, destSpace, srcSpace, ptrPt, pts.Length);
			
			GDIPlus.FromUnManagedMemoryToPointI (ptrPt, pts);
		}

		
		public void TranslateClip (int dx, int dy)
		{
			GDIPlus.GdipTranslateClipI (nativeObject, dx, dy);			
		}

		
		public void TranslateClip (float dx, float dy)
		{
			GDIPlus.GdipTranslateClip (nativeObject, dx, dy);
		}

		public void TranslateTransform (float dx, float dy)
		{
			TranslateTransform (dx, dy, MatrixOrder.Prepend);
		}

		
		public void TranslateTransform (float dx, float dy, MatrixOrder order)
		{			
			GDIPlus.GdipTranslateWorldTransform (nativeObject, dx, dy, order);
		}

		public Region Clip {
			get {
				throw new NotImplementedException ();
			}
			set {
				//throw new NotImplementedException ();
			}
		}

		public RectangleF ClipBounds {
			get {
                                RectangleF rect = new RectangleF ();					
                                GDIPlus.GdipGetClipBounds (nativeObject, out rect);
                                return rect;
			}
		}

		public CompositingMode CompositingMode {
			get {
                                CompositingMode mode;
                                GDIPlus.GdipGetCompositingMode (nativeObject, out mode);    
                                return mode;
			}
			set {
				
                                GDIPlus.GdipSetCompositingMode (nativeObject, value);    
			}

		}

		public CompositingQuality CompositingQuality {
			get {
                                CompositingQuality quality;

                                GDIPlus.GdipGetCompositingQuality (nativeObject, out quality);
        			return quality;
			}
			set {
                                GDIPlus.GdipSetCompositingQuality (nativeObject, value); 
			}
		}

		public float DpiX {
			get {
                                float x;

       				GDIPlus.GdipGetDpiX (nativeObject, out x);
        			return x;
			}
		}

		public float DpiY {
			get {
                                float y;

       				GDIPlus.GdipGetDpiY (nativeObject, out y);
        			return y;
			}
		}

		public InterpolationMode InterpolationMode {
			get {				
                                InterpolationMode imode = InterpolationMode.Invalid;
        			GDIPlus.GdipGetInterpolationMode (nativeObject, out imode);
        			return imode;
			}
			set {
                                GDIPlus.GdipSetInterpolationMode (nativeObject, value);
			}
		}

		public bool IsClipEmpty {
			get {
                                bool isEmpty = false;

        			GDIPlus.GdipIsClipEmpty (nativeObject, out isEmpty);
        			return isEmpty;
			}
		}

		public bool IsVisibleClipEmpty {
			get {
                                bool isEmpty = false;

        			GDIPlus.GdipIsVisibleClipEmpty (nativeObject, out isEmpty);
        			return isEmpty;
			}
		}

		public float PageScale {
			get {
                                float scale;

        			GDIPlus.GdipGetPageScale (nativeObject, out scale);
        			return scale;
			}
			set {
                                GDIPlus.GdipSetPageScale (nativeObject, value);
			}
		}

		public GraphicsUnit PageUnit {
			get {
                                GraphicsUnit unit;
                                
                                GDIPlus.GdipGetPageUnit (nativeObject, out unit);
        			return unit;
			}
			set {
                                GDIPlus.GdipSetPageUnit (nativeObject, value);
			}
		}

		public PixelOffsetMode PixelOffsetMode {
			get {
			        PixelOffsetMode pixelOffset = PixelOffsetMode.Invalid;
                                
                                GDIPlus.GdipGetPixelOffsetMode (nativeObject, out pixelOffset);

        			return pixelOffset;
			}
			set {
                                GDIPlus.GdipSetPixelOffsetMode (nativeObject, value); 
			}
		}

		public Point RenderingOrigin {
			get {
                                int x, y;
				GDIPlus.GdipGetRenderingOrigin (
                                        nativeObject, out x, out y);

                                return new Point (x, y);
			}

			set {
                                GDIPlus.GdipSetRenderingOrigin (nativeObject, value.X, value.Y);
			}
		}

		public SmoothingMode SmoothingMode {
			get {
                                SmoothingMode mode = SmoothingMode.Invalid;

        			GDIPlus.GdipGetSmoothingMode (nativeObject, out mode);
                                
                                return mode;
			}

			set {
                                GDIPlus.GdipSetSmoothingMode (nativeObject, value);
			}
		}

		public int TextContrast {
			get {	
                                int contrast;
					
                                GDIPlus.GdipGetTextContrast (nativeObject, out contrast);
                                return contrast;
			}

                        set {
                                GDIPlus.GdipSetTextContrast (nativeObject, value);
			}
		}

		public TextRenderingHint TextRenderingHint {
			get {
                                TextRenderingHint hint;

                                GDIPlus.GdipGetTextRenderingHint (nativeObject, out hint);
                                return hint;        
			}

			set {
                                GDIPlus.GdipSetTextRenderingHint (nativeObject, value);
			}
		}

		public Matrix Transform {
			get {
                                Matrix matrix = new Matrix ();
                                GDIPlus.GdipGetWorldTransform (nativeObject, matrix.nativeMatrix);

                                return matrix;
			}
			set {
                                GDIPlus.GdipSetWorldTransform (nativeObject, value.nativeMatrix);
			}
		}

		public RectangleF VisibleClipBounds {
			get {
                                RectangleF rect;
					
                                GDIPlus.GdipGetVisibleClipBounds (nativeObject, out rect);
                                return rect;
			}
		}
	}
}

