2 // System.Drawing.Graphics.cs
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com) (stubbed out)
6 // Alexandre Pigolkine(pigolkine@gmx.de)
7 // Jordi Mas i Hernandez (jordi@ximian.com)
9 // Copyright (C) 2003 Ximian, Inc. (http://www.ximian.com)
11 // Copyright (C) 2004 Novell, Inc. (http://www.novell.com)
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System.Drawing.Drawing2D;
34 using System.Drawing.Imaging;
35 using System.Drawing.Text;
36 using System.ComponentModel;
37 using System.Runtime.InteropServices;
40 namespace System.Drawing
43 public sealed class Graphics : MarshalByRefObject, IDisposable
45 internal IntPtr nativeObject = IntPtr.Zero;
46 private bool disposed = false;
47 private static float defDpiX = 0;
48 private static float defDpiY = 0;
49 private static IntPtr display = IntPtr.Zero;
51 // We use X Drawable on Linux.
52 private static bool use_x_drawable = (Environment.OSVersion.Platform == (PlatformID) 128);
53 private static bool use_quartz_drawable = (Environment.GetEnvironmentVariable ("MONO_MWF_USE_QUARTZ_BACKEND") != null);
56 public delegate bool EnumerateMetafileProc (EmfPlusRecordType recordType,
60 PlayRecordCallback callbackData);
63 public delegate bool DrawImageAbort (IntPtr callbackData);
65 private Graphics (IntPtr nativeGraphics)
67 nativeObject = nativeGraphics;
75 static internal float systemDpiX {
78 Bitmap bmp = new Bitmap (1, 1);
79 Graphics g = Graphics.FromImage (bmp);
86 static internal float systemDpiY {
89 Bitmap bmp = new Bitmap (1, 1);
90 Graphics g = Graphics.FromImage (bmp);
97 internal IntPtr NativeObject {
103 nativeObject = value;
108 public void AddMetafileComment (byte [] data)
110 throw new NotImplementedException ();
114 public GraphicsContainer BeginContainer ()
118 status = GDIPlus.GdipBeginContainer2 (nativeObject, out state);
119 GDIPlus.CheckStatus (status);
121 return new GraphicsContainer(state);
124 public GraphicsContainer BeginContainer (Rectangle dstrect, Rectangle srcrect, GraphicsUnit unit)
128 status = GDIPlus.GdipBeginContainerI (nativeObject, dstrect, srcrect, unit, out state);
129 GDIPlus.CheckStatus (status);
131 return new GraphicsContainer (state);
135 public GraphicsContainer BeginContainer (RectangleF dstrect, RectangleF srcrect, GraphicsUnit unit)
139 status = GDIPlus.GdipBeginContainer (nativeObject, dstrect, srcrect, unit, out state);
140 GDIPlus.CheckStatus (status);
142 return new GraphicsContainer (state);
146 public void Clear (Color color)
149 status = GDIPlus.GdipGraphicsClear (nativeObject, color.ToArgb ());
150 GDIPlus.CheckStatus (status);
153 public void Dispose ()
157 status = GDIPlus.GdipDeleteGraphics (nativeObject);
158 nativeObject = IntPtr.Zero;
159 GDIPlus.CheckStatus (status);
165 public void DrawArc (Pen pen, Rectangle rect, float startAngle, float sweepAngle)
167 DrawArc (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
171 public void DrawArc (Pen pen, RectangleF rect, float startAngle, float sweepAngle)
173 DrawArc (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
177 public void DrawArc (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle)
180 status = GDIPlus.GdipDrawArc (nativeObject, pen.nativeObject,
181 x, y, width, height, startAngle, sweepAngle);
182 GDIPlus.CheckStatus (status);
185 // Microsoft documentation states that the signature for this member should be
186 // public void DrawArc( Pen pen, int x, int y, int width, int height, int startAngle,
187 // int sweepAngle. However, GdipDrawArcI uses also float for the startAngle and sweepAngle params
188 public void DrawArc (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle)
191 status = GDIPlus.GdipDrawArcI (nativeObject, pen.nativeObject,
192 x, y, width, height, startAngle, sweepAngle);
193 GDIPlus.CheckStatus (status);
196 public void DrawBezier (Pen pen, PointF pt1, PointF pt2, PointF pt3, PointF pt4)
199 status = GDIPlus.GdipDrawBezier (nativeObject, pen.nativeObject,
200 pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X,
201 pt3.Y, pt4.X, pt4.Y);
202 GDIPlus.CheckStatus (status);
205 public void DrawBezier (Pen pen, Point pt1, Point pt2, Point pt3, Point pt4)
208 status = GDIPlus.GdipDrawBezierI (nativeObject, pen.nativeObject,
209 pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X,
210 pt3.Y, pt4.X, pt4.Y);
211 GDIPlus.CheckStatus (status);
214 public void DrawBezier (Pen pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
217 status = GDIPlus.GdipDrawBezier (nativeObject, pen.nativeObject, x1,
218 y1, x2, y2, x3, y3, x4, y4);
219 GDIPlus.CheckStatus (status);
222 public void DrawBeziers (Pen pen, Point [] points)
224 int length = points.Length;
230 for (int i = 0; i < length; i += 3) {
231 Point p1 = points [i];
232 Point p2 = points [i + 1];
233 Point p3 = points [i + 2];
234 Point p4 = points [i + 3];
236 status = GDIPlus.GdipDrawBezier (nativeObject,
238 p1.X, p1.Y, p2.X, p2.Y,
239 p3.X, p3.Y, p4.X, p4.Y);
240 GDIPlus.CheckStatus (status);
244 public void DrawBeziers (Pen pen, PointF [] points)
246 int length = points.Length;
252 for (int i = 0; i < length; i += 3) {
253 PointF p1 = points [i];
254 PointF p2 = points [i + 1];
255 PointF p3 = points [i + 2];
256 PointF p4 = points [i + 3];
258 status = GDIPlus.GdipDrawBezier (nativeObject,
260 p1.X, p1.Y, p2.X, p2.Y,
261 p3.X, p3.Y, p4.X, p4.Y);
262 GDIPlus.CheckStatus (status);
267 public void DrawClosedCurve (Pen pen, PointF [] points)
270 status = GDIPlus.GdipDrawClosedCurve (nativeObject, pen.nativeObject, points, points.Length);
271 GDIPlus.CheckStatus (status);
274 public void DrawClosedCurve (Pen pen, Point [] points)
277 status = GDIPlus.GdipDrawClosedCurveI (nativeObject, pen.nativeObject, points, points.Length);
278 GDIPlus.CheckStatus (status);
281 public void DrawClosedCurve (Pen pen, Point [] points, float tension, FillMode fillmode)
284 status = GDIPlus.GdipDrawClosedCurve2I (nativeObject, pen.nativeObject, points, points.Length, tension);
285 GDIPlus.CheckStatus (status);
288 public void DrawClosedCurve (Pen pen, PointF [] points, float tension, FillMode fillmode)
291 status = GDIPlus.GdipDrawClosedCurve2 (nativeObject, pen.nativeObject, points, points.Length, tension);
292 GDIPlus.CheckStatus (status);
295 public void DrawCurve (Pen pen, Point [] points)
298 status = GDIPlus.GdipDrawCurveI (nativeObject, pen.nativeObject, points, points.Length);
299 GDIPlus.CheckStatus (status);
302 public void DrawCurve (Pen pen, PointF [] points)
305 status = GDIPlus.GdipDrawCurve (nativeObject, pen.nativeObject, points, points.Length);
306 GDIPlus.CheckStatus (status);
309 public void DrawCurve (Pen pen, PointF [] points, float tension)
312 status = GDIPlus.GdipDrawCurve2 (nativeObject, pen.nativeObject, points, points.Length, tension);
313 GDIPlus.CheckStatus (status);
316 public void DrawCurve (Pen pen, Point [] points, float tension)
319 status = GDIPlus.GdipDrawCurve2I (nativeObject, pen.nativeObject, points, points.Length, tension);
320 GDIPlus.CheckStatus (status);
324 public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments)
327 status = GDIPlus.GdipDrawCurve3 (nativeObject, pen.nativeObject,
328 points, points.Length, offset,
329 numberOfSegments, 0.5f);
330 GDIPlus.CheckStatus (status);
333 public void DrawCurve (Pen pen, Point [] points, int offset, int numberOfSegments, float tension)
336 status = GDIPlus.GdipDrawCurve3I (nativeObject, pen.nativeObject,
337 points, points.Length, offset,
338 numberOfSegments, tension);
339 GDIPlus.CheckStatus (status);
343 public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments, float tension)
346 status = GDIPlus.GdipDrawCurve3 (nativeObject, pen.nativeObject,
347 points, points.Length, offset,
348 numberOfSegments, tension);
349 GDIPlus.CheckStatus (status);
352 public void DrawEllipse (Pen pen, Rectangle rect)
354 DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
357 public void DrawEllipse (Pen pen, RectangleF rect)
359 DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
362 public void DrawEllipse (Pen pen, int x, int y, int width, int height)
365 status = GDIPlus.GdipDrawEllipseI (nativeObject, pen.nativeObject, x, y, width, height);
366 GDIPlus.CheckStatus (status);
369 public void DrawEllipse (Pen pen, float x, float y, float width, float height)
371 Status status = GDIPlus.GdipDrawEllipse (nativeObject, pen.nativeObject, x, y, width, height);
372 GDIPlus.CheckStatus (status);
375 public void DrawIcon (Icon icon, Rectangle targetRect)
377 Image img = icon.ToBitmap ();
378 DrawImage (img, targetRect);
381 public void DrawIcon (Icon icon, int x, int y)
383 Image img = icon.ToBitmap ();
384 DrawImage (img, x, y);
387 public void DrawIconUnstretched (Icon icon, Rectangle targetRect)
389 Image img = icon.ToBitmap ();
390 DrawImageUnscaled (img, targetRect);
393 public void DrawImage (Image image, RectangleF rect)
395 Status status = GDIPlus.GdipDrawImageRect(nativeObject, image.NativeObject, rect.X, rect.Y, rect.Width, rect.Height);
396 GDIPlus.CheckStatus (status);
400 public void DrawImage (Image image, PointF point)
402 Status status = GDIPlus.GdipDrawImage (nativeObject, image.NativeObject, point.X, point.Y);
403 GDIPlus.CheckStatus (status);
407 public void DrawImage (Image image, Point [] destPoints)
409 Status status = GDIPlus.GdipDrawImagePointsI (nativeObject, image.NativeObject, destPoints, destPoints.Length);
410 GDIPlus.CheckStatus (status);
414 public void DrawImage (Image image, Point point)
416 DrawImage (image, point.X, point.Y);
420 public void DrawImage (Image image, Rectangle rect)
422 DrawImage (image, rect.X, rect.Y, rect.Width, rect.Height);
426 public void DrawImage (Image image, PointF [] destPoints)
428 Status status = GDIPlus.GdipDrawImagePoints (nativeObject, image.NativeObject, destPoints, destPoints.Length);
429 GDIPlus.CheckStatus (status);
433 public void DrawImage (Image image, int x, int y)
435 Status status = GDIPlus.GdipDrawImageI (nativeObject, image.NativeObject, x, y);
436 GDIPlus.CheckStatus (status);
440 public void DrawImage (Image image, float x, float y)
442 Status status = GDIPlus.GdipDrawImage (nativeObject, image.NativeObject, x, y);
443 GDIPlus.CheckStatus (status);
447 public void DrawImage (Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit)
449 Status status = GDIPlus.GdipDrawImageRectRectI (nativeObject, image.NativeObject,
450 destRect.X, destRect.Y, destRect.Width, destRect.Height,
451 srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height,
452 srcUnit, IntPtr.Zero, null, IntPtr.Zero);
453 GDIPlus.CheckStatus (status);
456 public void DrawImage (Image image, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit)
458 Status status = GDIPlus.GdipDrawImageRectRect (nativeObject, image.NativeObject,
459 destRect.X, destRect.Y, destRect.Width, destRect.Height,
460 srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height,
461 srcUnit, IntPtr.Zero, null, IntPtr.Zero);
462 GDIPlus.CheckStatus (status);
466 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit)
468 Status status = GDIPlus.GdipDrawImagePointsRectI (nativeObject, image.NativeObject,
469 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
470 srcRect.Width, srcRect.Height, srcUnit, IntPtr.Zero,
472 GDIPlus.CheckStatus (status);
476 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit)
479 Status status = GDIPlus.GdipDrawImagePointsRect (nativeObject, image.NativeObject,
480 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
481 srcRect.Width, srcRect.Height, srcUnit, IntPtr.Zero,
483 GDIPlus.CheckStatus (status);
487 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit,
488 ImageAttributes imageAttr)
490 Status status = GDIPlus.GdipDrawImagePointsRectI (nativeObject, image.NativeObject,
491 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
492 srcRect.Width, srcRect.Height, srcUnit,
493 imageAttr.NativeObject, null, IntPtr.Zero);
494 GDIPlus.CheckStatus (status);
497 public void DrawImage (Image image, float x, float y, float width, float height)
499 Status status = GDIPlus.GdipDrawImageRect(nativeObject, image.NativeObject, x, y,
501 GDIPlus.CheckStatus (status);
505 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit,
506 ImageAttributes imageAttr)
508 Status status = GDIPlus.GdipDrawImagePointsRect (nativeObject, image.NativeObject,
509 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
510 srcRect.Width, srcRect.Height, srcUnit,
511 imageAttr.NativeObject, null, IntPtr.Zero);
512 GDIPlus.CheckStatus (status);
516 public void DrawImage (Image image, int x, int y, Rectangle srcRect, GraphicsUnit srcUnit)
518 Status status = GDIPlus.GdipDrawImagePointRectI(nativeObject, image.NativeObject, x, y, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit);
519 GDIPlus.CheckStatus (status);
522 public void DrawImage (Image image, int x, int y, int width, int height)
524 Status status = GDIPlus.GdipDrawImageRectI (nativeObject, image.nativeObject, x, y, width, height);
525 GDIPlus.CheckStatus (status);
528 public void DrawImage (Image image, float x, float y, RectangleF srcRect, GraphicsUnit srcUnit)
530 Status status = GDIPlus.GdipDrawImagePointRect (nativeObject, image.nativeObject, x, y, srcRect.X, srcRect.Y, srcRect.Width, srcRect.Height, srcUnit);
531 GDIPlus.CheckStatus (status);
535 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
537 Status status = GDIPlus.GdipDrawImagePointsRect (nativeObject, image.NativeObject,
538 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
539 srcRect.Width, srcRect.Height, srcUnit,
540 imageAttr.NativeObject, callback, IntPtr.Zero);
541 GDIPlus.CheckStatus (status);
545 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
548 Status status = GDIPlus.GdipDrawImagePointsRectI (nativeObject, image.NativeObject,
549 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
550 srcRect.Width, srcRect.Height, srcUnit,
551 imageAttr.NativeObject, callback, IntPtr.Zero);
552 GDIPlus.CheckStatus (status);
556 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
559 Status status = GDIPlus.GdipDrawImagePointsRectI (nativeObject, image.NativeObject,
560 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
561 srcRect.Width, srcRect.Height, srcUnit,
562 imageAttr.NativeObject, callback, (IntPtr) callbackData);
563 GDIPlus.CheckStatus (status);
567 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit)
569 Status status = GDIPlus.GdipDrawImageRectRect (nativeObject, image.NativeObject,
570 destRect.X, destRect.Y, destRect.Width, destRect.Height,
571 srcX, srcY, srcWidth, srcHeight, srcUnit, IntPtr.Zero,
573 GDIPlus.CheckStatus (status);
576 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
578 Status status = GDIPlus.GdipDrawImagePointsRect (nativeObject, image.NativeObject,
579 destPoints, destPoints.Length , srcRect.X, srcRect.Y,
580 srcRect.Width, srcRect.Height, srcUnit,
581 imageAttr.NativeObject, callback, (IntPtr) callbackData);
582 GDIPlus.CheckStatus (status);
586 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit)
588 Status status = GDIPlus.GdipDrawImageRectRectI (nativeObject, image.NativeObject,
589 destRect.X, destRect.Y, destRect.Width, destRect.Height,
590 srcX, srcY, srcWidth, srcHeight, srcUnit, IntPtr.Zero,
592 GDIPlus.CheckStatus (status);
596 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs)
598 Status status = GDIPlus.GdipDrawImageRectRect (nativeObject, image.NativeObject,
599 destRect.X, destRect.Y, destRect.Width, destRect.Height,
600 srcX, srcY, srcWidth, srcHeight, srcUnit,
601 imageAttrs.NativeObject, null, IntPtr.Zero);
602 GDIPlus.CheckStatus (status);
605 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr)
607 Status status = GDIPlus.GdipDrawImageRectRectI (nativeObject, image.NativeObject,
608 destRect.X, destRect.Y, destRect.Width,
609 destRect.Height, srcX, srcY, srcWidth, srcHeight,
610 srcUnit, imageAttr.NativeObject, null, IntPtr.Zero);
611 GDIPlus.CheckStatus (status);
614 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
616 Status status = GDIPlus.GdipDrawImageRectRectI (nativeObject, image.NativeObject,
617 destRect.X, destRect.Y, destRect.Width,
618 destRect.Height, srcX, srcY, srcWidth, srcHeight,
619 srcUnit, imageAttr.NativeObject, callback,
621 GDIPlus.CheckStatus (status);
624 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
626 Status status = GDIPlus.GdipDrawImageRectRect (nativeObject, image.NativeObject,
627 destRect.X, destRect.Y, destRect.Width,
628 destRect.Height, srcX, srcY, srcWidth, srcHeight,
629 srcUnit, imageAttr.NativeObject,
630 callback, IntPtr.Zero);
631 GDIPlus.CheckStatus (status);
635 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
637 Status status = GDIPlus.GdipDrawImageRectRect (nativeObject, image.NativeObject,
638 destRect.X, destRect.Y, destRect.Width, destRect.Height,
639 srcX, srcY, srcWidth, srcHeight, srcUnit,
640 imageAttr.NativeObject, callback, callbackData);
641 GDIPlus.CheckStatus (status);
645 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
647 Status status = GDIPlus.GdipDrawImageRectRect (nativeObject, image.NativeObject,
648 destRect.X, destRect.Y, destRect.Width, destRect.Height,
649 srcX, srcY, srcWidth, srcHeight, srcUnit,
650 imageAttr.NativeObject, callback, callbackData);
651 GDIPlus.CheckStatus (status);
654 public void DrawImageUnscaled (Image image, Point point)
656 DrawImageUnscaled (image, point.X, point.Y);
659 public void DrawImageUnscaled (Image image, Rectangle rect)
661 DrawImageUnscaled (image, rect.X, rect.Y, rect.Width, rect.Height);
664 public void DrawImageUnscaled (Image image, int x, int y)
666 DrawImage (image, x, y, image.Width, image.Height);
669 public void DrawImageUnscaled (Image image, int x, int y, int width, int height)
671 Image tmpImg = new Bitmap (width, height);
672 Graphics g = FromImage (tmpImg);
673 g.DrawImage (image, 0, 0, image.Width, image.Height);
674 this.DrawImage (tmpImg, x, y, width, height);
679 public void DrawLine (Pen pen, PointF pt1, PointF pt2)
681 Status status = GDIPlus.GdipDrawLine (nativeObject, pen.nativeObject,
682 pt1.X, pt1.Y, pt2.X, pt2.Y);
683 GDIPlus.CheckStatus (status);
686 public void DrawLine (Pen pen, Point pt1, Point pt2)
688 Status status = GDIPlus.GdipDrawLineI (nativeObject, pen.nativeObject,
689 pt1.X, pt1.Y, pt2.X, pt2.Y);
690 GDIPlus.CheckStatus (status);
693 public void DrawLine (Pen pen, int x1, int y1, int x2, int y2)
695 Status status = GDIPlus.GdipDrawLineI (nativeObject, pen.nativeObject, x1, y1, x2, y2);
696 GDIPlus.CheckStatus (status);
699 public void DrawLine (Pen pen, float x1, float y1, float x2, float y2)
701 Status status = GDIPlus.GdipDrawLine (nativeObject, pen.nativeObject, x1, y1, x2, y2);
702 GDIPlus.CheckStatus (status);
705 public void DrawLines (Pen pen, PointF [] points)
707 Status status = GDIPlus.GdipDrawLines (nativeObject, pen.nativeObject, points, points.Length);
708 GDIPlus.CheckStatus (status);
711 public void DrawLines (Pen pen, Point [] points)
713 Status status = GDIPlus.GdipDrawLinesI (nativeObject, pen.nativeObject, points, points.Length);
714 GDIPlus.CheckStatus (status);
717 public void DrawPath (Pen pen, GraphicsPath path)
719 Status status = GDIPlus.GdipDrawPath (nativeObject, pen.nativeObject, path.nativePath);
720 GDIPlus.CheckStatus (status);
723 public void DrawPie (Pen pen, Rectangle rect, float startAngle, float sweepAngle)
725 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
728 public void DrawPie (Pen pen, RectangleF rect, float startAngle, float sweepAngle)
730 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
733 public void DrawPie (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle)
735 Status status = GDIPlus.GdipDrawPie (nativeObject, pen.nativeObject, x, y, width, height, startAngle, sweepAngle);
736 GDIPlus.CheckStatus (status);
739 // Microsoft documentation states that the signature for this member should be
740 // public void DrawPie(Pen pen, int x, int y, int width, int height, int startAngle
741 // int sweepAngle. However, GdipDrawPieI uses also float for the startAngle and sweepAngle params
742 public void DrawPie (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle)
744 Status status = GDIPlus.GdipDrawPieI (nativeObject, pen.nativeObject, x, y, width, height, startAngle, sweepAngle);
745 GDIPlus.CheckStatus (status);
748 public void DrawPolygon (Pen pen, Point [] points)
750 Status status = GDIPlus.GdipDrawPolygonI (nativeObject, pen.nativeObject, points, points.Length);
751 GDIPlus.CheckStatus (status);
754 public void DrawPolygon (Pen pen, PointF [] points)
756 Status status = GDIPlus.GdipDrawPolygon (nativeObject, pen.nativeObject, points, points.Length);
757 GDIPlus.CheckStatus (status);
760 internal void DrawRectangle (Pen pen, RectangleF rect)
762 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
765 public void DrawRectangle (Pen pen, Rectangle rect)
767 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
770 public void DrawRectangle (Pen pen, float x, float y, float width, float height)
772 Status status = GDIPlus.GdipDrawRectangle (nativeObject, pen.nativeObject, x, y, width, height);
773 GDIPlus.CheckStatus (status);
776 public void DrawRectangle (Pen pen, int x, int y, int width, int height)
778 Status status = GDIPlus.GdipDrawRectangleI (nativeObject, pen.nativeObject, x, y, width, height);
779 GDIPlus.CheckStatus (status);
782 public void DrawRectangles (Pen pen, RectangleF [] rects)
784 Status status = GDIPlus.GdipDrawRectangles (nativeObject, pen.nativeObject, rects, rects.Length);
785 GDIPlus.CheckStatus (status);
788 public void DrawRectangles (Pen pen, Rectangle [] rects)
790 Status status = GDIPlus.GdipDrawRectanglesI (nativeObject, pen.nativeObject, rects, rects.Length);
791 GDIPlus.CheckStatus (status);
794 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle)
796 Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref layoutRectangle, IntPtr.Zero, brush.nativeObject);
797 GDIPlus.CheckStatus (status);
800 public void DrawString (string s, Font font, Brush brush, PointF point)
802 RectangleF rc = new RectangleF (point.X, point.Y, 0, 0);
803 Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref rc, IntPtr.Zero, brush.nativeObject);
804 GDIPlus.CheckStatus (status);
807 public void DrawString (string s, Font font, Brush brush, PointF point, StringFormat format)
809 RectangleF rc = new RectangleF (point.X, point.Y, 0, 0);
810 Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref rc, format.NativeObject, brush.nativeObject);
811 GDIPlus.CheckStatus (status);
814 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)
816 Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject, ref layoutRectangle, format.NativeObject, brush.nativeObject);
817 GDIPlus.CheckStatus (status);
820 public void DrawString (string s, Font font, Brush brush, float x, float y)
822 RectangleF rc = new RectangleF (x, y, 0, 0);
824 Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject,
825 ref rc, IntPtr.Zero, brush.nativeObject);
826 GDIPlus.CheckStatus (status);
829 public void DrawString (string s, Font font, Brush brush, float x, float y, StringFormat format)
831 RectangleF rc = new RectangleF (x, y, 0, 0);
833 Status status = GDIPlus.GdipDrawString (nativeObject, s, s.Length, font.NativeObject,
834 ref rc, format.NativeObject, brush.nativeObject);
835 GDIPlus.CheckStatus (status);
839 public void EndContainer (GraphicsContainer container)
841 Status status = GDIPlus.GdipEndContainer(nativeObject, container.NativeObject);
842 GDIPlus.CheckStatus (status);
846 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback)
848 throw new NotImplementedException ();
852 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback)
854 throw new NotImplementedException ();
858 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback)
860 throw new NotImplementedException ();
864 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback)
866 throw new NotImplementedException ();
870 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback)
872 throw new NotImplementedException ();
876 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback)
878 throw new NotImplementedException ();
882 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
884 throw new NotImplementedException ();
888 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData)
890 throw new NotImplementedException ();
894 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
896 throw new NotImplementedException ();
900 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
902 throw new NotImplementedException ();
906 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
908 throw new NotImplementedException ();
912 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData)
914 throw new NotImplementedException ();
918 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
920 throw new NotImplementedException ();
924 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
926 throw new NotImplementedException ();
930 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
932 throw new NotImplementedException ();
936 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
938 throw new NotImplementedException ();
942 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
944 throw new NotImplementedException ();
948 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
950 throw new NotImplementedException ();
954 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
956 throw new NotImplementedException ();
960 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
962 throw new NotImplementedException ();
966 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
968 throw new NotImplementedException ();
972 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
974 throw new NotImplementedException ();
978 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
980 throw new NotImplementedException ();
984 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
986 throw new NotImplementedException ();
990 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
992 throw new NotImplementedException ();
996 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
998 throw new NotImplementedException ();
1002 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
1004 throw new NotImplementedException ();
1008 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
1010 throw new NotImplementedException ();
1014 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
1016 throw new NotImplementedException ();
1020 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
1022 throw new NotImplementedException ();
1026 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
1028 throw new NotImplementedException ();
1032 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
1034 throw new NotImplementedException ();
1038 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
1040 throw new NotImplementedException ();
1044 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
1046 throw new NotImplementedException ();
1050 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
1052 throw new NotImplementedException ();
1056 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
1058 throw new NotImplementedException ();
1061 public void ExcludeClip (Rectangle rect)
1063 Status status = GDIPlus.GdipSetClipRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, CombineMode.Exclude);
1064 GDIPlus.CheckStatus (status);
1067 public void ExcludeClip (Region region)
1069 Status status = GDIPlus.GdipSetClipRegion (nativeObject, region.NativeObject, CombineMode.Exclude);
1070 GDIPlus.CheckStatus (status);
1074 public void FillClosedCurve (Brush brush, PointF [] points)
1076 Status status = GDIPlus.GdipFillClosedCurve (nativeObject, brush.NativeObject, points, points.Length);
1077 GDIPlus.CheckStatus (status);
1081 public void FillClosedCurve (Brush brush, Point [] points)
1083 Status status = GDIPlus.GdipFillClosedCurveI (nativeObject, brush.NativeObject, points, points.Length);
1084 GDIPlus.CheckStatus (status);
1088 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode)
1090 FillClosedCurve (brush, points, fillmode, 0.5f);
1093 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode)
1095 FillClosedCurve (brush, points, fillmode, 0.5f);
1098 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode, float tension)
1100 Status status = GDIPlus.GdipFillClosedCurve2 (nativeObject, brush.NativeObject, points, points.Length, tension, fillmode);
1101 GDIPlus.CheckStatus (status);
1104 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode, float tension)
1106 Status status = GDIPlus.GdipFillClosedCurve2I (nativeObject, brush.NativeObject, points, points.Length, tension, fillmode);
1107 GDIPlus.CheckStatus (status);
1110 public void FillEllipse (Brush brush, Rectangle rect)
1112 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
1115 public void FillEllipse (Brush brush, RectangleF rect)
1117 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
1120 public void FillEllipse (Brush brush, float x, float y, float width, float height)
1122 Status status = GDIPlus.GdipFillEllipse (nativeObject, brush.nativeObject, x, y, width, height);
1123 GDIPlus.CheckStatus (status);
1126 public void FillEllipse (Brush brush, int x, int y, int width, int height)
1128 Status status = GDIPlus.GdipFillEllipseI (nativeObject, brush.nativeObject, x, y, width, height);
1129 GDIPlus.CheckStatus (status);
1132 public void FillPath (Brush brush, GraphicsPath path)
1134 Status status = GDIPlus.GdipFillPath (nativeObject, brush.NativeObject, path.NativeObject);
1135 GDIPlus.CheckStatus (status);
1138 public void FillPie (Brush brush, Rectangle rect, float startAngle, float sweepAngle)
1140 Status status = GDIPlus.GdipFillPie (nativeObject, brush.NativeObject, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
1141 GDIPlus.CheckStatus (status);
1144 public void FillPie (Brush brush, int x, int y, int width, int height, int startAngle, int sweepAngle)
1146 Status status = GDIPlus.GdipFillPieI (nativeObject, brush.NativeObject, x, y, width, height, startAngle, sweepAngle);
1147 GDIPlus.CheckStatus (status);
1150 public void FillPie (Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle)
1152 Status status = GDIPlus.GdipFillPie (nativeObject, brush.NativeObject, x, y, width, height, startAngle, sweepAngle);
1153 GDIPlus.CheckStatus (status);
1156 public void FillPolygon (Brush brush, PointF [] points)
1158 Status status = GDIPlus.GdipFillPolygon2 (nativeObject, brush.nativeObject, points, points.Length);
1159 GDIPlus.CheckStatus (status);
1162 public void FillPolygon (Brush brush, Point [] points)
1164 Status status = GDIPlus.GdipFillPolygon2I (nativeObject, brush.nativeObject, points, points.Length);
1165 GDIPlus.CheckStatus (status);
1168 public void FillPolygon (Brush brush, Point [] points, FillMode fillMode)
1170 Status status = GDIPlus.GdipFillPolygonI (nativeObject, brush.nativeObject, points, points.Length, fillMode);
1171 GDIPlus.CheckStatus (status);
1174 public void FillPolygon (Brush brush, PointF [] points, FillMode fillMode)
1176 Status status = GDIPlus.GdipFillPolygon (nativeObject, brush.nativeObject, points, points.Length, fillMode);
1177 GDIPlus.CheckStatus (status);
1180 public void FillRectangle (Brush brush, RectangleF rect)
1182 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
1185 public void FillRectangle (Brush brush, Rectangle rect)
1187 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
1190 public void FillRectangle (Brush brush, int x, int y, int width, int height)
1192 Status status = GDIPlus.GdipFillRectangleI (nativeObject, brush.nativeObject, x, y, width, height);
1193 GDIPlus.CheckStatus (status);
1196 public void FillRectangle (Brush brush, float x, float y, float width, float height)
1198 Status status = GDIPlus.GdipFillRectangle (nativeObject, brush.nativeObject, x, y, width, height);
1199 GDIPlus.CheckStatus (status);
1202 public void FillRectangles (Brush brush, Rectangle [] rects)
1204 Status status = GDIPlus.GdipFillRectanglesI (nativeObject, brush.nativeObject, rects, rects.Length);
1205 GDIPlus.CheckStatus (status);
1208 public void FillRectangles (Brush brush, RectangleF [] rects)
1210 Status status = GDIPlus.GdipFillRectangles (nativeObject, brush.nativeObject, rects, rects.Length);
1211 GDIPlus.CheckStatus (status);
1215 public void FillRegion (Brush brush, Region region)
1217 Status status = GDIPlus.GdipFillRegion (nativeObject, brush.NativeObject, region.NativeObject);
1218 GDIPlus.CheckStatus(status);
1222 public void Flush ()
1224 Flush (FlushIntention.Flush);
1228 public void Flush (FlushIntention intention)
1230 Status status = GDIPlus.GdipFlush (nativeObject, intention);
1231 GDIPlus.CheckStatus (status);
1232 if (use_quartz_drawable)
1233 Carbon.CGContextFlush (display);
1236 [EditorBrowsable (EditorBrowsableState.Advanced)]
1237 public static Graphics FromHdc (IntPtr hdc)
1240 Status status = GDIPlus.GdipCreateFromHDC (hdc, out graphics);
1241 GDIPlus.CheckStatus (status);
1242 return new Graphics (graphics);
1246 [EditorBrowsable (EditorBrowsableState.Advanced)]
1247 public static Graphics FromHdc (IntPtr hdc, IntPtr hdevice)
1249 throw new NotImplementedException ();
1252 [EditorBrowsable (EditorBrowsableState.Advanced)]
1253 public static Graphics FromHdcInternal (IntPtr hdc)
1259 [EditorBrowsable (EditorBrowsableState.Advanced)]
1260 public static Graphics FromHwnd (IntPtr hwnd)
1264 if (use_quartz_drawable) {
1265 CarbonContext cgContext = Carbon.GetCGContextForView (hwnd);
1266 GDIPlus.GdipCreateFromQuartz_macosx (cgContext.ctx, cgContext.width, cgContext.height, out graphics);
1268 display = cgContext.ctx;
1269 return new Graphics (graphics);
1271 if (use_x_drawable) {
1272 if (display == IntPtr.Zero) {
1273 display = GDIPlus.XOpenDisplay (IntPtr.Zero);
1276 return FromXDrawable (hwnd, display);
1280 Status status = GDIPlus.GdipCreateFromHWND (hwnd, out graphics);
1281 GDIPlus.CheckStatus (status);
1283 return new Graphics (graphics);
1287 [EditorBrowsable (EditorBrowsableState.Advanced)]
1288 public static Graphics FromHwndInternal (IntPtr hwnd)
1290 throw new NotImplementedException ();
1293 public static Graphics FromImage (Image image)
1295 if (image == null) throw new ArgumentException ();
1298 Status status = GDIPlus.GdipGetImageGraphicsContext (image.nativeObject, out graphics);
1299 GDIPlus.CheckStatus (status);
1300 Graphics result = new Graphics ((IntPtr) graphics);
1302 if (Environment.OSVersion.Platform == (PlatformID) 128) {
1303 Rectangle rect = new Rectangle (0,0, image.Width, image.Height);
1304 GDIPlus.GdipSetVisibleClip_linux (result.NativeObject, ref rect);
1310 internal static Graphics FromXDrawable (IntPtr drawable, IntPtr display)
1313 Status s = GDIPlus.GdipCreateFromXDrawable_linux (drawable, display, out graphics);
1314 GDIPlus.CheckStatus (s);
1315 return new Graphics (graphics);
1319 public static IntPtr GetHalftonePalette ()
1321 throw new NotImplementedException ();
1325 [EditorBrowsable (EditorBrowsableState.Advanced)]
1326 public IntPtr GetHdc ()
1329 Status status = GDIPlus.GdipGetDC (nativeObject, out hdc);
1330 GDIPlus.CheckStatus (status);
1332 return (IntPtr) hdc;
1336 public Color GetNearestColor (Color color)
1340 Status status = GDIPlus.GdipGetNearestColor (nativeObject, out argb);
1341 GDIPlus.CheckStatus (status);
1343 return Color.FromArgb (argb);
1347 public void IntersectClip (Region region)
1349 Status status = GDIPlus.GdipSetClipRegion (nativeObject, region.NativeObject, CombineMode.Intersect);
1350 GDIPlus.CheckStatus (status);
1353 public void IntersectClip (RectangleF rect)
1355 Status status = GDIPlus.GdipSetClipRect (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, CombineMode.Intersect);
1356 GDIPlus.CheckStatus (status);
1359 public void IntersectClip (Rectangle rect)
1361 Status status = GDIPlus.GdipSetClipRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, CombineMode.Intersect);
1362 GDIPlus.CheckStatus (status);
1365 public bool IsVisible (Point point)
1367 bool isVisible = false;
1369 Status status = GDIPlus.GdipIsVisiblePointI (nativeObject, point.X, point.Y, out isVisible);
1370 GDIPlus.CheckStatus (status);
1376 public bool IsVisible (RectangleF rect)
1378 bool isVisible = false;
1380 Status status = GDIPlus.GdipIsVisibleRect (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, out isVisible);
1381 GDIPlus.CheckStatus (status);
1386 public bool IsVisible (PointF point)
1388 bool isVisible = false;
1390 Status status = GDIPlus.GdipIsVisiblePoint (nativeObject, point.X, point.Y, out isVisible);
1391 GDIPlus.CheckStatus (status);
1396 public bool IsVisible (Rectangle rect)
1398 bool isVisible = false;
1400 Status status = GDIPlus.GdipIsVisibleRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, out isVisible);
1401 GDIPlus.CheckStatus (status);
1406 public bool IsVisible (float x, float y)
1408 return IsVisible (new PointF (x, y));
1411 public bool IsVisible (int x, int y)
1413 return IsVisible (new Point (x, y));
1416 public bool IsVisible (float x, float y, float width, float height)
1418 return IsVisible (new RectangleF (x, y, width, height));
1422 public bool IsVisible (int x, int y, int width, int height)
1424 return IsVisible (new Rectangle (x, y, width, height));
1428 public Region [] MeasureCharacterRanges (string text, Font font, RectangleF layoutRect, StringFormat stringFormat)
1431 int regcount = stringFormat.GetMeasurableCharacterRangeCount ();
1432 IntPtr[] native_regions = new IntPtr [regcount];
1433 Region[] regions = new Region [regcount];
1435 for (int i = 0; i < regcount; i++) {
1436 regions[i] = new Region ();
1437 native_regions[i] = regions[i].NativeObject;
1440 status = GDIPlus.GdipMeasureCharacterRanges (nativeObject, text, text.Length,
1441 font.NativeObject, ref layoutRect, stringFormat.NativeObject,
1442 regcount, out native_regions[0]);
1444 GDIPlus.CheckStatus (status);
1450 public SizeF MeasureString (string text, Font font)
1452 return MeasureString (text, font, new Size (0, 0));
1456 public SizeF MeasureString (string text, Font font, SizeF layoutArea)
1458 int charactersFitted, linesFilled;
1459 RectangleF boundingBox = new RectangleF ();
1460 RectangleF rect = new RectangleF (0, 0, layoutArea.Width,
1463 if (text == null || text.Length == 0)
1467 throw new ArgumentNullException ("font");
1469 Status status = GDIPlus.GdipMeasureString (nativeObject, text, text.Length,
1470 font.NativeObject, ref rect,
1471 IntPtr.Zero, out boundingBox,
1472 out charactersFitted, out linesFilled);
1473 GDIPlus.CheckStatus (status);
1475 return new SizeF (boundingBox.Width, boundingBox.Height);
1479 public SizeF MeasureString (string text, Font font, int width)
1481 RectangleF boundingBox = new RectangleF ();
1482 RectangleF rect = new RectangleF (0, 0, width, 999999);
1483 int charactersFitted, linesFilled;
1485 if (text == null || text.Length == 0)
1489 throw new ArgumentNullException ("font");
1491 Status status = GDIPlus.GdipMeasureString (nativeObject, text, text.Length,
1492 font.NativeObject, ref rect,
1493 IntPtr.Zero, out boundingBox,
1494 out charactersFitted, out linesFilled);
1495 GDIPlus.CheckStatus (status);
1497 return new SizeF (boundingBox.Width, boundingBox.Height);
1501 public SizeF MeasureString (string text, Font font, SizeF layoutArea,
1502 StringFormat stringFormat)
1504 int charactersFitted, linesFilled;
1505 return MeasureString (text, font, layoutArea, stringFormat,
1506 out charactersFitted, out linesFilled);
1510 public SizeF MeasureString (string text, Font font, int width, StringFormat format)
1512 int charactersFitted, linesFilled;
1513 return MeasureString (text, font, new SizeF (width, 999999),
1514 format, out charactersFitted, out linesFilled);
1518 public SizeF MeasureString (string text, Font font, PointF origin,
1519 StringFormat stringFormat)
1521 RectangleF boundingBox = new RectangleF ();
1522 RectangleF rect = new RectangleF (origin.X, origin.Y, 0, 0);
1523 int charactersFitted, linesFilled;
1525 if (text == null || text.Length == 0)
1529 throw new ArgumentNullException ("font");
1531 if (stringFormat == null)
1532 stringFormat = new StringFormat ();
1534 Status status = GDIPlus.GdipMeasureString (nativeObject, text, text.Length,
1535 font.NativeObject, ref rect,
1536 stringFormat.NativeObject,
1538 out charactersFitted,
1540 GDIPlus.CheckStatus (status);
1542 return new SizeF (boundingBox.Width, boundingBox.Height);
1546 public SizeF MeasureString (string text, Font font, SizeF layoutArea,
1547 StringFormat stringFormat, out int charactersFitted,
1548 out int linesFilled)
1550 RectangleF boundingBox = new RectangleF ();
1551 RectangleF rect = new RectangleF (0, 0, layoutArea.Width, layoutArea.Height);
1552 charactersFitted = 0;
1555 if (text == null || text.Length == 0)
1559 throw new ArgumentNullException ("font");
1561 if (stringFormat == null)
1562 stringFormat = new StringFormat ();
1564 Status status = GDIPlus.GdipMeasureString (nativeObject, text, text.Length,
1565 font.NativeObject, ref rect,
1566 stringFormat.NativeObject,
1568 out charactersFitted,
1570 GDIPlus.CheckStatus (status);
1572 return new SizeF (boundingBox.Width, boundingBox.Height);
1575 public void MultiplyTransform (Matrix matrix)
1577 MultiplyTransform (matrix, MatrixOrder.Prepend);
1580 public void MultiplyTransform (Matrix matrix, MatrixOrder order)
1582 Status status = GDIPlus.GdipMultiplyWorldTransform (nativeObject,
1583 matrix.nativeMatrix,
1585 GDIPlus.CheckStatus (status);
1588 [EditorBrowsable (EditorBrowsableState.Advanced)]
1589 public void ReleaseHdc (IntPtr hdc)
1591 Status status = GDIPlus.GdipReleaseDC (nativeObject, hdc);
1592 GDIPlus.CheckStatus (status);
1596 [EditorBrowsable (EditorBrowsableState.Advanced)]
1597 public void ReleaseHdcInternal (IntPtr hdc)
1599 throw new NotImplementedException ();
1603 public void ResetClip ()
1605 Status status = GDIPlus.GdipResetClip (nativeObject);
1606 GDIPlus.CheckStatus (status);
1609 public void ResetTransform ()
1611 Status status = GDIPlus.GdipResetWorldTransform (nativeObject);
1612 GDIPlus.CheckStatus (status);
1615 public void Restore (GraphicsState gstate)
1617 Transform = gstate.matrix.Clone ();
1618 Status status = GDIPlus.GdipRestoreGraphics (nativeObject, gstate.nativeState);
1619 GDIPlus.CheckStatus (status);
1623 public void RotateTransform (float angle)
1625 RotateTransform (angle, MatrixOrder.Prepend);
1628 public void RotateTransform (float angle, MatrixOrder order)
1631 Status status = GDIPlus.GdipRotateWorldTransform (nativeObject, angle, order);
1632 GDIPlus.CheckStatus (status);
1635 public GraphicsState Save ()
1637 GraphicsState state = new GraphicsState ();
1638 state.matrix = Transform.Clone ();
1640 Status status = GDIPlus.GdipSaveGraphics (nativeObject, out saveState);
1641 GDIPlus.CheckStatus (status);
1643 state.nativeState = saveState;
1647 public void ScaleTransform (float sx, float sy)
1649 ScaleTransform (sx, sy, MatrixOrder.Prepend);
1652 public void ScaleTransform (float sx, float sy, MatrixOrder order)
1654 Status status = GDIPlus.GdipScaleWorldTransform (nativeObject, sx, sy, order);
1655 GDIPlus.CheckStatus (status);
1659 public void SetClip (RectangleF rect)
1661 SetClip (rect, CombineMode.Replace);
1665 public void SetClip (GraphicsPath path)
1667 SetClip (path, CombineMode.Replace);
1671 public void SetClip (Rectangle rect)
1673 SetClip (rect, CombineMode.Replace);
1677 public void SetClip (Graphics g)
1679 SetClip (g, CombineMode.Replace);
1683 public void SetClip (Graphics g, CombineMode combineMode)
1685 Status status = GDIPlus.GdipSetClipGraphics (nativeObject, g.NativeObject, combineMode);
1686 GDIPlus.CheckStatus (status);
1690 public void SetClip (Rectangle rect, CombineMode combineMode)
1692 Status status = GDIPlus.GdipSetClipRectI (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, combineMode);
1693 GDIPlus.CheckStatus (status);
1697 public void SetClip (RectangleF rect, CombineMode combineMode)
1699 Status status = GDIPlus.GdipSetClipRect (nativeObject, rect.X, rect.Y, rect.Width, rect.Height, combineMode);
1700 GDIPlus.CheckStatus (status);
1704 public void SetClip (Region region, CombineMode combineMode)
1706 Status status = GDIPlus.GdipSetClipRegion(nativeObject, region.NativeObject, combineMode);
1707 GDIPlus.CheckStatus (status);
1711 public void SetClip (GraphicsPath path, CombineMode combineMode)
1713 Status status = GDIPlus.GdipSetClipPath (nativeObject, path.NativeObject, combineMode);
1714 GDIPlus.CheckStatus (status);
1718 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, PointF [] pts)
1720 IntPtr ptrPt = GDIPlus.FromPointToUnManagedMemory (pts);
1722 Status status = GDIPlus.GdipTransformPoints (nativeObject, destSpace, srcSpace, ptrPt, pts.Length);
1723 GDIPlus.CheckStatus (status);
1725 GDIPlus.FromUnManagedMemoryToPoint (ptrPt, pts);
1729 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, Point [] pts)
1731 IntPtr ptrPt = GDIPlus.FromPointToUnManagedMemoryI (pts);
1733 Status status = GDIPlus.GdipTransformPointsI (nativeObject, destSpace, srcSpace, ptrPt, pts.Length);
1734 GDIPlus.CheckStatus (status);
1736 GDIPlus.FromUnManagedMemoryToPointI (ptrPt, pts);
1740 public void TranslateClip (int dx, int dy)
1742 Status status = GDIPlus.GdipTranslateClipI (nativeObject, dx, dy);
1743 GDIPlus.CheckStatus (status);
1747 public void TranslateClip (float dx, float dy)
1749 Status status = GDIPlus.GdipTranslateClip (nativeObject, dx, dy);
1750 GDIPlus.CheckStatus (status);
1753 public void TranslateTransform (float dx, float dy)
1755 TranslateTransform (dx, dy, MatrixOrder.Prepend);
1759 public void TranslateTransform (float dx, float dy, MatrixOrder order)
1761 Status status = GDIPlus.GdipTranslateWorldTransform (nativeObject, dx, dy, order);
1762 GDIPlus.CheckStatus (status);
1765 public Region Clip {
1767 Region reg = new Region();
1768 Status status = GDIPlus.GdipGetClip (nativeObject, reg.NativeObject);
1769 GDIPlus.CheckStatus (status);
1773 SetClip (value, CombineMode.Replace);
1777 public RectangleF ClipBounds {
1779 RectangleF rect = new RectangleF ();
1780 Status status = GDIPlus.GdipGetClipBounds (nativeObject, out rect);
1781 GDIPlus.CheckStatus (status);
1786 public CompositingMode CompositingMode {
1788 CompositingMode mode;
1789 Status status = GDIPlus.GdipGetCompositingMode (nativeObject, out mode);
1790 GDIPlus.CheckStatus (status);
1795 Status status = GDIPlus.GdipSetCompositingMode (nativeObject, value);
1796 GDIPlus.CheckStatus (status);
1801 public CompositingQuality CompositingQuality {
1803 CompositingQuality quality;
1805 Status status = GDIPlus.GdipGetCompositingQuality (nativeObject, out quality);
1806 GDIPlus.CheckStatus (status);
1810 Status status = GDIPlus.GdipSetCompositingQuality (nativeObject, value);
1811 GDIPlus.CheckStatus (status);
1819 Status status = GDIPlus.GdipGetDpiX (nativeObject, out x);
1820 GDIPlus.CheckStatus (status);
1829 Status status = GDIPlus.GdipGetDpiY (nativeObject, out y);
1830 GDIPlus.CheckStatus (status);
1835 public InterpolationMode InterpolationMode {
1837 InterpolationMode imode = InterpolationMode.Invalid;
1838 Status status = GDIPlus.GdipGetInterpolationMode (nativeObject, out imode);
1839 GDIPlus.CheckStatus (status);
1843 Status status = GDIPlus.GdipSetInterpolationMode (nativeObject, value);
1844 GDIPlus.CheckStatus (status);
1848 public bool IsClipEmpty {
1850 bool isEmpty = false;
1852 Status status = GDIPlus.GdipIsClipEmpty (nativeObject, out isEmpty);
1853 GDIPlus.CheckStatus (status);
1858 public bool IsVisibleClipEmpty {
1860 bool isEmpty = false;
1862 Status status = GDIPlus.GdipIsVisibleClipEmpty (nativeObject, out isEmpty);
1863 GDIPlus.CheckStatus (status);
1868 public float PageScale {
1872 Status status = GDIPlus.GdipGetPageScale (nativeObject, out scale);
1873 GDIPlus.CheckStatus (status);
1877 Status status = GDIPlus.GdipSetPageScale (nativeObject, value);
1878 GDIPlus.CheckStatus (status);
1882 public GraphicsUnit PageUnit {
1886 Status status = GDIPlus.GdipGetPageUnit (nativeObject, out unit);
1887 GDIPlus.CheckStatus (status);
1891 Status status = GDIPlus.GdipSetPageUnit (nativeObject, value);
1892 GDIPlus.CheckStatus (status);
1896 public PixelOffsetMode PixelOffsetMode {
1898 PixelOffsetMode pixelOffset = PixelOffsetMode.Invalid;
1900 Status status = GDIPlus.GdipGetPixelOffsetMode (nativeObject, out pixelOffset);
1901 GDIPlus.CheckStatus (status);
1905 Status status = GDIPlus.GdipSetPixelOffsetMode (nativeObject, value);
1906 GDIPlus.CheckStatus (status);
1910 public Point RenderingOrigin {
1913 Status status = GDIPlus.GdipGetRenderingOrigin (nativeObject, out x, out y);
1914 GDIPlus.CheckStatus (status);
1915 return new Point (x, y);
1919 Status status = GDIPlus.GdipSetRenderingOrigin (nativeObject, value.X, value.Y);
1920 GDIPlus.CheckStatus (status);
1924 public SmoothingMode SmoothingMode {
1926 SmoothingMode mode = SmoothingMode.Invalid;
1928 Status status = GDIPlus.GdipGetSmoothingMode (nativeObject, out mode);
1929 GDIPlus.CheckStatus (status);
1934 Status status = GDIPlus.GdipSetSmoothingMode (nativeObject, value);
1935 GDIPlus.CheckStatus (status);
1939 public int TextContrast {
1943 Status status = GDIPlus.GdipGetTextContrast (nativeObject, out contrast);
1944 GDIPlus.CheckStatus (status);
1949 Status status = GDIPlus.GdipSetTextContrast (nativeObject, value);
1950 GDIPlus.CheckStatus (status);
1954 public TextRenderingHint TextRenderingHint {
1956 TextRenderingHint hint;
1958 Status status = GDIPlus.GdipGetTextRenderingHint (nativeObject, out hint);
1959 GDIPlus.CheckStatus (status);
1964 Status status = GDIPlus.GdipSetTextRenderingHint (nativeObject, value);
1965 GDIPlus.CheckStatus (status);
1969 public Matrix Transform {
1971 Matrix matrix = new Matrix ();
1972 Status status = GDIPlus.GdipGetWorldTransform (nativeObject, matrix.nativeMatrix);
1973 GDIPlus.CheckStatus (status);
1977 Status status = GDIPlus.GdipSetWorldTransform (nativeObject, value.nativeMatrix);
1978 GDIPlus.CheckStatus (status);
1982 public RectangleF VisibleClipBounds {
1986 Status status = GDIPlus.GdipGetVisibleClipBounds (nativeObject, out rect);
1987 GDIPlus.CheckStatus (status);