2 using System.Drawing.Drawing2D;
\r
3 using System.Drawing.Imaging;
\r
4 using System.Drawing.Text;
\r
5 using System.ComponentModel;
\r
6 using System.Collections;
\r
7 using System.Runtime.InteropServices;
\r
9 using awt = java.awt;
\r
10 using geom = java.awt.geom;
\r
12 namespace System.Drawing {
\r
14 public sealed class Graphics : MarshalByRefObject, IDisposable {
\r
15 sealed class DummyStroke : awt.Stroke {
\r
16 #region Stroke Members
\r
18 awt.Shape awt.Stroke.createStrokedShape(awt.Shape arg_0) {
\r
19 throw new NotImplementedException("DummyStroke");
\r
25 sealed class NormalizingPathIterator : geom.PathIterator {
\r
29 readonly geom.PathIterator _iter;
\r
31 const float norm = 0.5f;
\r
32 const float rnd = (1.0f - norm);
40 public NormalizingPathIterator(geom.PathIterator iter) {
\r
48 static int GetIndex(int type) {
\r
50 switch ((GraphicsPath.JPI)type) {
51 case GraphicsPath.JPI.SEG_CUBICTO:
54 case GraphicsPath.JPI.SEG_QUADTO:
57 case GraphicsPath.JPI.SEG_MOVETO:
58 case GraphicsPath.JPI.SEG_LINETO:
61 case GraphicsPath.JPI.SEG_CLOSE:
72 #region PathIterator Members
\r
74 void geom.PathIterator.next() {
\r
78 bool geom.PathIterator.isDone() {
\r
79 return _iter.isDone();
\r
82 int geom.PathIterator.currentSegment(float[] point) {
\r
83 int type = _iter.currentSegment(point);
\r
85 int index = GetIndex(type);
88 float ox = point[index];
89 float oy = point[index+1];
90 float newax = (float) java.lang.Math.floor(ox + rnd) + norm;
91 float neway = (float) java.lang.Math.floor(oy + rnd) + norm;
93 point[index+1] = neway;
96 switch ((GraphicsPath.JPI)type) {
97 case GraphicsPath.JPI.SEG_CUBICTO:
103 case GraphicsPath.JPI.SEG_QUADTO:
104 point[0] += (newax + ax) / 2;
105 point[1] += (neway + ay) / 2;
107 // case GraphicsPath.JPI.SEG_MOVETO:
108 // case GraphicsPath.JPI.SEG_LINETO:
109 // case GraphicsPath.JPI.SEG_CLOSE:
119 int geom.PathIterator.currentSegment(double[] point) {
\r
120 int type = _iter.currentSegment(point);
\r
122 int index = GetIndex(type);
125 float ox = (float)point[index];
126 float oy = (float)point[index+1];
127 float newax = (float)java.lang.Math.floor(ox + rnd) + norm;
128 float neway = (float)java.lang.Math.floor(oy + rnd) + norm;
129 point[index] = newax;
130 point[index+1] = neway;
133 switch ((GraphicsPath.JPI)type) {
134 case GraphicsPath.JPI.SEG_CUBICTO:
140 case GraphicsPath.JPI.SEG_QUADTO:
141 point[0] += (newax + ax) / 2;
142 point[1] += (neway + ay) / 2;
144 // case GraphicsPath.JPI.SEG_MOVETO:
145 // case GraphicsPath.JPI.SEG_LINETO:
146 // case GraphicsPath.JPI.SEG_CLOSE:
156 int geom.PathIterator.getWindingRule() {
\r
157 return _iter.getWindingRule();
\r
167 readonly awt.Graphics2D _nativeObject;
\r
168 PixelOffsetMode _pixelOffsetMode = PixelOffsetMode.Default;
\r
169 int _textContrast = 4;
\r
170 readonly Image _image;
\r
172 readonly Matrix _transform;
\r
173 GraphicsUnit _pageUnit = GraphicsUnit.Display;
\r
174 float _pageScale = 1.0f;
\r
176 readonly Region _clip;
\r
177 readonly awt.Rectangle _windowRect;
\r
179 GraphicsState _nextGraphicsState = null;
\r
181 static readonly float [] _unitConversion = {
\r
185 DefaultScreenResolution / 72.0f, // Point
\r
186 DefaultScreenResolution, // Inch
\r
187 DefaultScreenResolution / 300.0f,// Document
\r
188 DefaultScreenResolution / 25.4f // Millimeter
\r
191 static int _isHeadless;
\r
192 static internal bool IsHeadless {
\r
194 if (_isHeadless == 0) {
\r
195 bool isHeadless = awt.GraphicsEnvironment.isHeadless();
\r
198 awt.Toolkit.getDefaultToolkit();
\r
205 _isHeadless = isHeadless ? 2 : 1;
\r
208 return _isHeadless > 1;
\r
215 [ComVisible(false)]
\r
216 public delegate bool EnumerateMetafileProc (EmfPlusRecordType recordType,
\r
220 PlayRecordCallback callbackData);
\r
221 [ComVisible (false)]
\r
222 public delegate bool DrawImageAbort (IntPtr callbackData);
\r
225 #region Constr. and Destr.
\r
226 private Graphics (Image image) {
\r
227 _nativeObject = (awt.Graphics2D)image.NativeObject.CurrentImage.NativeImage.getGraphics();
\r
229 _transform = new Matrix ();
\r
231 NativeObject.setStroke(new DummyStroke());
\r
232 NativeObject.setRenderingHint(awt.RenderingHints.KEY_COLOR_RENDERING, awt.RenderingHints.VALUE_COLOR_RENDER_QUALITY);
\r
234 InterpolationMode = InterpolationMode.Bilinear;
236 _windowRect = new awt.Rectangle(_image.Width, _image.Height);
237 _clip = new Region();
242 #region Internal Accessors
\r
244 static internal int DefaultScreenResolution {
\r
246 return IsHeadless ? 96 :
\r
247 awt.Toolkit.getDefaultToolkit().getScreenResolution();
\r
251 internal java.awt.Graphics2D NativeObject {
\r
253 return _nativeObject;
\r
258 #region FromImage (static accessor)
\r
259 public static Graphics FromImage (Image image) {
\r
260 return new Graphics(image);
\r
264 #region Workers [INTERNAL]
\r
265 void InternalSetBrush(Brush b) {
\r
266 java.awt.Graphics2D g = NativeObject;
\r
268 SolidBrush sb = b as SolidBrush;
\r
270 g.setColor(sb.Color.NativeObject);
\r
272 else if(b is LinearGradientBrush) {
\r
273 #if DEBUG_GRADIENT_BRUSH
\r
274 if(((LinearGradientBrush)b).dPoints != null)
\r
276 PointF []pts = ((LinearGradientBrush)b).dPoints;
\r
277 java.awt.Shape s = g.getClip();
\r
278 g.setClip(0,0,99999,99999);
\r
279 g.setPaint(new java.awt.Color(255,0,0));
\r
280 g.drawLine((int)pts[0].X,(int)pts[0].Y,(int)pts[1].X,(int)pts[1].Y);
\r
281 g.setPaint(new java.awt.Color(0,255,0));
\r
282 g.drawLine((int)pts[1].X,(int)pts[1].Y,(int)pts[2].X,(int)pts[2].Y);
\r
283 g.setPaint(new java.awt.Color(255,0,0));
\r
284 g.drawLine((int)pts[2].X,(int)pts[2].Y,(int)pts[3].X,(int)pts[3].Y);
\r
285 g.setPaint(new java.awt.Color(0,255,0));
\r
286 g.drawLine((int)pts[3].X,(int)pts[3].Y,(int)pts[0].X,(int)pts[0].Y);
\r
294 void DrawShape(Pen pen, awt.Shape shape) {
\r
296 throw new ArgumentNullException("pen");
\r
298 if (StrokeFactory.CanCreateAdvancedStroke) {
\r
299 geom.AffineTransform oldT = NativeObject.getTransform();
\r
300 NativeObject.setTransform(Matrix.IdentityTransform.NativeObject);
\r
303 geom.Area clip = _clip.NativeObject;
\r
304 geom.AffineTransform t = GetFinalTransform();
\r
305 if (!oldT.isIdentity()) {
\r
306 clip = (geom.Area)clip.clone();
\r
307 clip.transform(oldT);
\r
309 t = (geom.AffineTransform)t.clone();
\r
310 t.preConcatenate(oldT);
\r
313 double widthsquared = pen.GetSquaredTransformedWidth(t);
\r
315 bool antiAlias = (SmoothingMode == SmoothingMode.AntiAlias);
\r
317 bool thin = (widthsquared <= (antiAlias ?
318 AdvancedStroke.MinPenSizeAASquared :
319 AdvancedStroke.MinPenSizeSquared));
\r
321 if (NeedsNormalization) {
\r
324 widthsquared <= AdvancedStroke.MinPenSizeSquaredNorm;
\r
327 shape = GetNormalizedShape(shape, t);
\r
328 shape = pen.GetNativeObject(
\r
329 t, null, thin).createStrokedShape(shape);
\r
332 shape = pen.GetNativeObject(t, thin).createStrokedShape(shape);
\r
333 shape = GetNormalizedShape(shape, null);
\r
337 shape = pen.GetNativeObject(t, thin).createStrokedShape(shape);
\r
340 FillScaledShape(pen.Brush, shape, clip);
\r
343 NativeObject.setTransform(oldT);
\r
347 awt.Stroke oldStroke = NativeObject.getStroke();
\r
348 NativeObject.setStroke(pen.GetNativeObject(null, false));
\r
350 awt.Paint oldPaint = NativeObject.getPaint();
\r
351 NativeObject.setPaint(pen.Brush);
\r
353 geom.AffineTransform oldT = NativeObject.getTransform();
\r
354 NativeObject.transform(GetFinalTransform());
\r
356 shape = IntersectUserClip(shape);
\r
357 NativeObject.draw(shape);
\r
360 NativeObject.setTransform(oldT);
\r
364 NativeObject.setPaint(oldPaint);
\r
368 NativeObject.setStroke(oldStroke);
\r
372 void FillShape(awt.Paint paint, awt.Shape shape) {
\r
374 throw new ArgumentNullException("brush");
\r
376 geom.AffineTransform oldT = null;
\r
377 geom.Area clip = _clip.NativeObject;
\r
378 if (NeedsNormalization) {
\r
379 oldT = NativeObject.getTransform();
\r
380 geom.AffineTransform t = GetFinalTransform();
\r
381 if (!oldT.isIdentity()) {
\r
382 t = (geom.AffineTransform)t.clone();
\r
383 t.preConcatenate(oldT);
\r
384 clip = (geom.Area)clip.clone();
\r
385 clip.transform(oldT);
\r
387 shape = GetNormalizedShape(shape, t);
\r
390 geom.AffineTransform t = GetFinalTransform();
\r
391 if (!t.isIdentity())
\r
392 shape = t.createTransformedShape(shape);
\r
396 NativeObject.setTransform(Matrix.IdentityTransform.NativeObject);
\r
399 FillScaledShape(paint, shape, clip);
\r
403 NativeObject.setTransform(oldT);
\r
407 bool NeedsNormalization {
\r
409 return PixelOffsetMode != PixelOffsetMode.Half &&
\r
410 PixelOffsetMode != PixelOffsetMode.HighQuality;
\r
414 static awt.Shape GetNormalizedShape(awt.Shape shape, geom.AffineTransform t) {
\r
415 geom.PathIterator iter = new NormalizingPathIterator(shape.getPathIterator(t));
\r
417 geom.GeneralPath path = new geom.GeneralPath(iter.getWindingRule());
\r
418 path.append(iter, false);
\r
422 void FillScaledShape(awt.Paint paint, awt.Shape shape, geom.Area clip) {
\r
423 geom.Rectangle2D r = shape.getBounds2D();
\r
424 awt.Paint oldP = NativeObject.getPaint();
\r
425 NativeObject.setPaint(paint);
\r
427 shape = IntersectUserClip(shape, clip);
\r
428 NativeObject.fill(shape);
\r
431 NativeObject.setPaint(oldP);
\r
435 internal SizeF MeasureDraw (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format, bool fDraw) {
\r
436 SizeF retVal = new SizeF(0,0);
\r
437 awt.Graphics2D g = NativeObject;
\r
439 java.awt.Font fnt = font.NativeObject;
\r
440 if(s != null && s.Length != 0 && fnt != null) {
\r
441 float size = fnt.getSize();
\r
442 float wid = layoutRectangle.Width;
\r
443 float hei = layoutRectangle.Height;
\r
444 float x = layoutRectangle.X;
\r
445 float y = layoutRectangle.Y;
\r
446 java.text.AttributedString astr = new java.text.AttributedString(s);
\r
447 astr.addAttribute(java.awt.font.TextAttribute.FONT, fnt);
\r
448 java.text.AttributedCharacterIterator prg = astr.getIterator();
\r
449 java.awt.font.TextLayout textlayout = new java.awt.font.TextLayout(prg, g.getFontRenderContext());
\r
450 int prgStart = prg.getBeginIndex();
\r
451 int prgEnd = prg.getEndIndex();
\r
452 java.awt.font.LineBreakMeasurer lineMeasurer = new java.awt.font.LineBreakMeasurer(
\r
453 prg, new java.awt.font.FontRenderContext(null, false, false));
\r
454 lineMeasurer.setPosition(prgStart);
\r
455 float formatWidth = wid;
\r
457 //some vertical layout magic - should be reviewed
\r
458 // if(format != null)
\r
460 // StringFormatFlags formatflag = format.FormatFlags;
\r
461 // if(formatflag != StringFormatFlags.DirectionVertical)
\r
463 // if(size > (float)8 && wid > (float)13)
\r
464 // formatWidth = wid - (float)12;
\r
465 // if(formatflag == StringFormatFlags.DirectionRightToLeft && size == (float)6)
\r
466 // formatWidth = wid - (float)10;
\r
470 //now calculate number of lines and full layout height
\r
471 //this is required for LineAlignment calculations....
\r
474 float layPrevHeight=0;
\r
476 float drawPosY = y;
\r
477 //bool fSkipLastLine = false;
\r
478 java.awt.font.TextLayout layout;
\r
479 java.awt.geom.Rectangle2D bnds = new java.awt.geom.Rectangle2D.Float();
\r
480 while(lineMeasurer.getPosition() < prgEnd) {
\r
481 layout = lineMeasurer.nextLayout(formatWidth);
\r
483 bnds = bnds.createUnion(layout.getBounds());
\r
484 layPrevHeight = layHeight;
\r
485 layHeight += layout.getDescent() + layout.getLeading() + layout.getAscent();
\r
487 if((format != null) &&
\r
488 ((format.FormatFlags & StringFormatFlags.MeasureTrailingSpaces) != 0))
\r
489 advance = layout.getAdvance();
\r
491 advance = layout.getVisibleAdvance();
\r
492 if(layWidth < advance)
\r
493 layWidth = advance;
\r
494 if((format != null) && ((format.FormatFlags & StringFormatFlags.NoWrap) != 0))
\r
497 //Overhanging parts of glyphs, and unwrapped text reaching outside
\r
498 //the formatting rectangle are allowed to show. By default all text
\r
499 //and glyph parts reaching outside the formatting rectangle are clipped.
\r
500 if((lines == 1) &&
\r
501 (format != null) &&
\r
502 ((format.FormatFlags & StringFormatFlags.NoClip) != 0)) {
\r
503 formatWidth = layWidth;
\r
506 //Only entire lines are laid out in the formatting rectangle. By default layout
\r
507 //continues until the end of the text, or until no more lines are visible as a
\r
508 //result of clipping, whichever comes first. Note that the default settings allow
\r
509 //the last line to be partially obscured by a formatting rectangle that is not a
\r
510 //whole multiple of the line height. To ensure that only whole lines are seen, specify
\r
511 //this value and be careful to provide a formatting rectangle at least as tall as the
\r
512 //height of one line.
\r
513 if(format != null && ((format.FormatFlags & StringFormatFlags.LineLimit) != 0) &&
\r
514 layHeight > hei && layPrevHeight < hei) {
\r
515 layHeight = layPrevHeight;
\r
519 retVal.Height = layHeight;
\r
520 retVal.Width = layWidth+size/2.5f;
\r
524 InternalSetBrush(brush);
\r
525 g.setRenderingHint(awt.RenderingHints.KEY_TEXT_ANTIALIASING, awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
\r
529 //for draw we should probably update origins
\r
532 if(format != null) {
\r
533 StringAlignment align = format.LineAlignment;
\r
534 if(align == StringAlignment.Center) {
\r
535 drawPosY = y + (float)hei/2 - layHeight/2;
\r
537 else if(align == StringAlignment.Far) {
\r
538 drawPosY = (float)y + (float)hei - layHeight;
\r
540 //in both cases if string is not fit - switch to near
\r
545 //Horisontal... on the fly
\r
546 lineMeasurer.setPosition(prgStart);
\r
547 float drawPosX = x;
\r
548 for(int line = 0;line < lines /*lineMeasurer.getPosition() < prgEnd*/;line++, drawPosY += layout.getDescent() + layout.getLeading()) {
\r
549 layout = lineMeasurer.nextLayout(formatWidth);
\r
550 drawPosX = x + size / (float)5;//???
\r
551 drawPosY += layout.getAscent();
\r
552 if(format != null) {
\r
554 if((format.FormatFlags & StringFormatFlags.MeasureTrailingSpaces) != 0)
\r
555 advance = layout.getAdvance();
\r
557 advance = layout.getVisibleAdvance();
\r
559 if(format.Alignment == StringAlignment.Center) {
\r
560 drawPosX = (float)((double)x + ((double)formatWidth)/2 - advance/2);
\r
562 else if(format.Alignment == StringAlignment.Far) {
\r
563 drawPosX = (float)(drawPosX + formatWidth) - advance;
\r
565 if((format.FormatFlags & StringFormatFlags.DirectionVertical ) != 0) {
\r
566 java.awt.geom.AffineTransform at1 = java.awt.geom.AffineTransform.getTranslateInstance(
\r
567 drawPosX + size / (float)5, (drawPosY - layout.getAscent()) + size / (float)5);
\r
569 at1.rotate(Math.PI/2);
\r
570 awt.Shape sha = textlayout.getOutline(at1);
\r
571 geom.AffineTransform t = GetFinalTransform();
\r
572 if (!t.isIdentity())
\r
573 sha = t.createTransformedShape(sha);
\r
574 //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
\r
575 sha = IntersectUserClip(sha);
\r
579 if((format.FormatFlags & StringFormatFlags.DirectionRightToLeft) != 0) {
\r
580 drawPosX = ((drawPosX + formatWidth) - advance) + (float)9;
\r
581 IntersectScaledClipWithBase(_clip);
\r
583 layout.draw(g, drawPosX, drawPosY);
\r
591 geom.AffineTransform oldT = null;
\r
592 geom.AffineTransform ft = GetFinalTransform();
\r
594 //Draw current line
\r
595 IntersectScaledClipWithBase(_clip);
\r
597 if (!ft.isIdentity()) {
\r
598 oldT = NativeObject.getTransform();
\r
599 NativeObject.transform(ft);
\r
601 layout.draw(g, drawPosX, drawPosY);
\r
605 NativeObject.setTransform(oldT);
\r
616 public void Dispose() {
\r
617 NativeObject.dispose();
\r
622 public void Clear (Color color) {
\r
623 FillScaledShape(color.NativeObject, _clip.NativeObject, null);
\r
628 public void DrawArc (Pen pen, Rectangle rect, float startAngle, float sweepAngle) {
\r
639 public void DrawArc (Pen pen, RectangleF rect, float startAngle, float sweepAngle) {
\r
649 public void DrawArc (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
656 (float)sweepAngle);
\r
659 public void DrawArc (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
660 GraphicsPath path = new GraphicsPath();
\r
661 path.AddArc(x, y, width, height, startAngle, sweepAngle);
\r
662 DrawPath(pen, path);
\r
666 #region DrawBezier(s)
\r
667 public void DrawBezier (Pen pen, PointF pt1, PointF pt2, PointF pt3, PointF pt4) {
\r
668 DrawBezier(pen, pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);
\r
671 public void DrawBezier (Pen pen, Point pt1, Point pt2, Point pt3, Point pt4) {
\r
672 DrawBezier(pen, pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);
\r
675 public void DrawBezier (Pen pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) {
\r
676 geom.GeneralPath path = new geom.GeneralPath();
\r
677 path.moveTo(x1,y1);
\r
678 path.curveTo(x2,y2,x3,y3,x4,y4);
\r
679 DrawShape(pen, path);
\r
682 public void DrawBeziers (Pen pen, Point [] points) {
\r
683 GraphicsPath path = new GraphicsPath();
\r
684 path.AddBeziers(points);
\r
685 DrawPath(pen, path);
\r
688 public void DrawBeziers (Pen pen, PointF [] points) {
\r
689 GraphicsPath path = new GraphicsPath();
\r
690 path.AddBeziers(points);
\r
691 DrawPath(pen, path);
\r
695 #region DrawClosedCurve
\r
696 public void DrawClosedCurve (Pen pen, PointF [] points) {
\r
697 DrawClosedCurve(pen, points, 0.5f, FillMode.Alternate);
\r
700 public void DrawClosedCurve (Pen pen, Point [] points) {
\r
701 DrawClosedCurve(pen, points, 0.5f, FillMode.Alternate);
\r
704 public void DrawClosedCurve (Pen pen, Point [] points, float tension, FillMode fillmode) {
\r
705 GraphicsPath path = new GraphicsPath(fillmode);
\r
706 path.AddClosedCurve(points, tension);
\r
707 DrawPath(pen, path);
\r
710 public void DrawClosedCurve (Pen pen, PointF [] points, float tension, FillMode fillmode) {
\r
711 GraphicsPath path = new GraphicsPath(fillmode);
\r
712 path.AddClosedCurve(points, tension);
\r
713 DrawPath(pen, path);
\r
718 public void DrawCurve (Pen pen, Point [] points) {
\r
719 DrawCurve(pen, points, 0.5f);
\r
722 public void DrawCurve (Pen pen, PointF [] points) {
\r
723 DrawCurve(pen, points, 0.5f);
\r
726 public void DrawCurve (Pen pen, PointF [] points, float tension) {
\r
727 DrawCurve(pen, points, 0, points.Length-1, tension);
\r
730 public void DrawCurve (Pen pen, Point [] points, float tension) {
\r
731 DrawCurve(pen, points, 0, points.Length-1, tension);
\r
735 public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments) {
\r
736 DrawCurve(pen, points, offset, numberOfSegments, 0.5f);
\r
739 public void DrawCurve (Pen pen, Point [] points, int offset, int numberOfSegments, float tension) {
\r
740 GraphicsPath path = new GraphicsPath();
\r
741 path.AddCurve(points, offset, numberOfSegments, tension);
\r
742 DrawPath(pen, path);
\r
746 public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments, float tension) {
\r
747 GraphicsPath path = new GraphicsPath();
\r
748 path.AddCurve(points, offset, numberOfSegments, tension);
\r
749 DrawPath(pen, path);
\r
753 #region DrawEllipse
\r
754 public void DrawEllipse (Pen pen, Rectangle rect) {
\r
755 DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
\r
758 public void DrawEllipse (Pen pen, RectangleF rect) {
\r
759 DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
\r
762 public void DrawEllipse (Pen pen, int x, int y, int width, int height) {
\r
763 DrawEllipse(pen,(float)x,(float)y,(float)width,(float)height);
\r
766 public void DrawEllipse (Pen pen, float x, float y, float width, float height) {
\r
767 DrawShape(pen, new geom.Ellipse2D.Float(x,y,width,height));
\r
772 public void DrawIcon (Icon icon, Rectangle targetRect) {
\r
773 Bitmap b = icon.ToBitmap ();
\r
774 this.DrawImage (b, targetRect);
\r
777 public void DrawIcon (Icon icon, int x, int y) {
\r
778 Bitmap b = icon.ToBitmap ();
\r
779 this.DrawImage (b, x, y);
\r
782 public void DrawIconUnstretched (Icon icon, Rectangle targetRect) {
\r
783 Bitmap b = icon.ToBitmap ();
\r
784 this.DrawImageUnscaled (b, targetRect);
\r
790 public void DrawImage (Image image, Point point) {
\r
791 DrawImage(image, point.X, point.Y);
\r
794 public void DrawImage (Image image, PointF point) {
\r
795 DrawImage(image, point.X, point.Y);
\r
799 public void DrawImage (Image image, Point [] destPoints) {
\r
800 Matrix m = new Matrix(new Rectangle(0, 0, image.Width, image.Height), destPoints);
\r
801 DrawImage(image, m);
\r
804 public void DrawImage (Image image, PointF [] destPoints) {
\r
805 Matrix m = new Matrix(new RectangleF(0, 0, image.Width, image.Height), destPoints);
\r
806 DrawImage(image, m);
\r
810 public void DrawImage (Image image, Rectangle rect) {
\r
811 DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
\r
814 public void DrawImage (Image image, RectangleF rect) {
\r
815 DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
\r
819 public void DrawImage (Image image, int x, int y) {
\r
820 DrawImage(image, (float)x, (float)y);
\r
823 public void DrawImage (Image image, float x, float y) {
\r
824 if ((image.HorizontalResolution != DpiX) || (image.VerticalResolution != DpiY))
\r
825 DrawImage( image, x, y,
\r
826 (float)image.Width * (DpiX / image.HorizontalResolution),
\r
827 (float)image.Height * (DpiY / image.VerticalResolution));
\r
829 DrawImage( image, x, y, (float)image.Width, (float)image.Height );
\r
833 public void DrawImage (Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit) {
\r
837 new Point( destRect.X, destRect.Y),
\r
838 new Point( destRect.X + destRect.Width, destRect.Y),
\r
839 new Point( destRect.X, destRect.Y + destRect.Height)},
\r
844 public void DrawImage (Image image, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit) {
\r
848 new PointF( destRect.X, destRect.Y),
\r
849 new PointF( destRect.X + destRect.Width, destRect.Y),
\r
850 new PointF( destRect.X, destRect.Y + destRect.Height)},
\r
856 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit) {
\r
857 DrawImage(image, destPoints, srcRect, srcUnit, null);
\r
860 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit) {
\r
861 DrawImage(image, destPoints, srcRect, srcUnit, null);
\r
865 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
866 //TBD: ImageAttributes
\r
867 if (srcUnit != GraphicsUnit.Pixel)
\r
868 throw new NotImplementedException();
\r
869 // Like in .NET http://dotnet247.com/247reference/msgs/45/227979.aspx
\r
871 Matrix mx = new Matrix(srcRect, destPoints);
\r
873 Region region = new Region(srcRect);
\r
874 region.Transform (mx);
\r
876 geom.AffineTransform t = _transform.NativeObject;
\r
877 if (!t.isIdentity())
\r
878 region.NativeObject.transform(t);
\r
879 region.Intersect(_clip);
\r
881 DrawImage(image, mx, region);
\r
884 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
885 //TBD: ImageAttributes
\r
886 if (srcUnit != GraphicsUnit.Pixel)
\r
887 throw new NotImplementedException();
\r
888 // Like in .NET http://dotnet247.com/247reference/msgs/45/227979.aspx
\r
890 Matrix mx = new Matrix(srcRect, destPoints);
\r
892 Region region = new Region(srcRect);
\r
893 region.Transform (mx);
\r
895 geom.AffineTransform t = GetFinalTransform();
\r
896 if (!t.isIdentity())
\r
897 region.NativeObject.transform(t);
\r
898 region.Intersect(_clip);
\r
900 DrawImage(image, mx, region);
\r
904 public void DrawImage (Image image, int x, int y, int width, int height) {
\r
905 DrawImage(image, (float)x, (float)y, (float)width, (float)height);
\r
908 public void DrawImage (Image image, float x, float y, float width, float height) {
\r
909 geom.Point2D.Float pt = new geom.Point2D.Float(x, y);
\r
910 GetFinalTransform().transform(pt, pt);
\r
912 Matrix mx = new Matrix();
\r
913 mx.Translate((float)pt.getX(), (float)pt.getY());
\r
914 mx.Scale(width / (float)image.Width, height / (float)image.Height);
\r
916 DrawImage( image, mx );
\r
920 public void DrawImage (Image image, int x, int y, Rectangle srcRect, GraphicsUnit srcUnit) {
\r
921 DrawImage(image, new Rectangle(x, y, srcRect.Width, srcRect.Height), srcRect, srcUnit);
\r
924 public void DrawImage (Image image, float x, float y, RectangleF srcRect, GraphicsUnit srcUnit) {
\r
925 DrawImage(image, new RectangleF(x, y, srcRect.Width, srcRect.Height), srcRect, srcUnit);
\r
929 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit) {
\r
930 DrawImage(image, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, null);
\r
933 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit) {
\r
934 DrawImage(image, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, null);
\r
938 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
943 new Rectangle(srcX, srcY, srcWidth, srcHeight),
\r
947 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs) {
\r
952 new RectangleF(srcX, srcY, srcWidth, srcHeight),
\r
957 internal void DrawImage (Image image, Matrix m) {
\r
958 DrawImage(image, m, null);
\r
961 internal void DrawImage (Image image, Matrix m, Region clip) {
\r
962 if (clip == null) {
\r
963 clip = new Region( new RectangleF( 0, 0, image.Width, image.Height ) );
\r
964 clip.Transform( m );
\r
966 clip.Intersect(_clip);
\r
968 geom.AffineTransform oldT = NativeObject.getTransform();
\r
969 // must set clip before the base transform is altered
\r
970 if (NeedsNormalization) {
\r
971 Matrix normMatrix = ComputeClipNormalization(clip.GetBounds(this));
\r
972 clip.Transform(normMatrix);
\r
975 IntersectScaledClipWithBase(clip);
\r
978 NativeObject.transform(_transform.NativeObject);
\r
980 Matrix mm = ComputeImageNormalization(image, m);
\r
981 NativeObject.drawImage(image.NativeObject.CurrentImage.NativeImage, mm.NativeObject, null);
\r
984 NativeObject.setTransform(oldT);
\r
989 private static Matrix ComputeImageNormalization(Image img, Matrix m) {
\r
990 if ( m.IsIdentity )
\r
993 //m.Translate( -(m.Elements[0] + m.Elements[2]) / 2.0f, -(m.Elements[3] + m.Elements[1]) / 2.0f, MatrixOrder.Append);
\r
995 -(float)(m.NativeObject.getScaleX() + m.NativeObject.getShearX()) / 2.0f,
\r
996 -(float)(m.NativeObject.getScaleY() + m.NativeObject.getShearY()) / 2.0f, MatrixOrder.Append);
\r
998 PointF [] p = new PointF[] {
\r
999 new PointF( 0, 0 ),
\r
1000 new PointF( img.Width, 0 ),
\r
1001 new PointF( 0, img.Height )};
\r
1003 m.TransformPoints(p);
\r
1004 for (int i=0; i < p.Length; i++) {
\r
1005 p[i].X = (float)( p[i].X + 0.5f );
\r
1006 p[i].Y = (float)( p[i].Y + 0.5f );
\r
1009 return new Matrix( new Rectangle(0, 0, img.Width, img.Height), p );
\r
1011 private static Matrix ComputeClipNormalization(RectangleF rect) {
\r
1012 PointF [] p = new PointF[] {
\r
1013 new PointF( rect.X, rect.Y ),
\r
1014 new PointF( rect.X + rect.Width, rect.Y ),
\r
1015 new PointF( rect.X, rect.Y + rect.Height )};
\r
1017 for (int i=0; i < p.Length; i++) {
\r
1018 p[i].X = (float)Math.Round( p[i].X + 0.5f ) + 0.5f;
\r
1019 p[i].Y = (float)Math.Round( p[i].Y + 0.5f ) + 0.5f;
\r
1022 return new Matrix( rect, p );
\r
1026 #if INTPTR_SUPPORT
\r
1027 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1029 throw new NotImplementedException();
\r
1033 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1036 throw new NotImplementedException();
\r
1040 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
\r
1042 throw new NotImplementedException();
\r
1046 #if INTPTR_SUPPORT
\r
1047 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
\r
1049 throw new NotImplementedException();
\r
1053 #if INTPTR_SUPPORT
\r
1054 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1056 //TBD:units,attributes, callback
\r
1057 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1058 g.drawImage(image.NativeObject,destRect.X,destRect.Y,destRect.Width,destRect.Height,srcX,srcY,srcWidth,srcHeight,null);
\r
1061 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1063 //TBD:units,attributes, callback
\r
1064 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1065 g.drawImage(image.NativeObject,
\r
1068 (int)destRect.Width,
\r
1069 (int)destRect.Height,
\r
1073 (int)srcHeight,null);
\r
1076 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
\r
1078 //TBD:units,attributes, callback
\r
1079 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1080 g.drawImage(image.NativeObject,
\r
1083 (int)destRect.Width,
\r
1084 (int)destRect.Height,
\r
1088 (int)srcHeight,null);
\r
1091 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
\r
1093 //TBD:units,attributes, callback
\r
1094 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1095 g.drawImage(image.NativeObject,
\r
1107 public void DrawImageUnscaled (Image image, Point point)
\r
1109 DrawImageUnscaled (image, point.X, point.Y);
\r
1112 public void DrawImageUnscaled (Image image, Rectangle rect) {
\r
1113 DrawImageUnscaled (image, rect.X, rect.Y, rect.Width, rect.Height);
\r
1116 public void DrawImageUnscaled (Image image, int x, int y) {
\r
1117 DrawImage (image, x, y, image.Width, image.Height);
\r
1120 public void DrawImageUnscaled (Image image, int x, int y, int width, int height) {
\r
1121 Image tmpImg = new Bitmap (width, height);
\r
1122 Graphics g = FromImage (tmpImg);
\r
1123 g.DrawImage (image, 0, 0, image.Width, image.Height);
\r
1124 this.DrawImage (tmpImg, x, y, width, height);
\r
1125 tmpImg.Dispose ();
\r
1131 public void DrawLine (Pen pen, PointF pt1, PointF pt2) {
\r
1132 DrawLine(pen,pt1.X,pt1.Y,pt2.X,pt2.Y);
\r
1135 public void DrawLine (Pen pen, Point pt1, Point pt2) {
\r
1136 DrawLine(pen,(float)pt1.X,(float)pt1.Y,(float)pt2.X,(float)pt2.Y);
\r
1139 public void DrawLine (Pen pen, int x1, int y1, int x2, int y2) {
\r
1140 DrawLine(pen,(float)x1,(float)y1,(float)x2,(float)y2);
\r
1143 public void DrawLine (Pen pen, float x1, float y1, float x2, float y2) {
\r
1144 DrawShape(pen, new geom.Line2D.Float(x1,y1,x2,y2));
\r
1147 public void DrawLines (Pen pen, PointF [] points) {
\r
1148 GraphicsPath path = new GraphicsPath();
\r
1149 path.AddLines(points);
\r
1150 DrawShape(pen, path);
\r
1153 public void DrawLines (Pen pen, Point [] points) {
\r
1154 GraphicsPath path = new GraphicsPath();
\r
1155 path.AddLines(points);
\r
1156 DrawShape(pen, path);
\r
1161 public void DrawPath (Pen pen, GraphicsPath path) {
\r
1162 DrawShape(pen, path);
\r
1167 public void DrawPie (Pen pen, Rectangle rect, float startAngle, float sweepAngle) {
\r
1168 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
\r
1171 public void DrawPie (Pen pen, RectangleF rect, float startAngle, float sweepAngle) {
\r
1172 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
\r
1175 public void DrawPie (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
1176 GraphicsPath path = new GraphicsPath();
\r
1177 path.AddPie(x, y, width, height, startAngle, sweepAngle);
\r
1178 DrawPath(pen, path);
\r
1181 public void DrawPie (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
1182 DrawPie(pen,(float)x,(float)y,(float)width,(float)height,(float)startAngle,(float)sweepAngle);
\r
1186 #region DrawPolygon
\r
1187 public void DrawPolygon (Pen pen, Point [] points) {
\r
1188 GraphicsPath path = new GraphicsPath();
\r
1189 path.AddPolygon(points);
\r
1190 DrawPath(pen, path);
\r
1193 public void DrawPolygon (Pen pen, PointF [] points) {
\r
1194 GraphicsPath path = new GraphicsPath();
\r
1195 path.AddPolygon(points);
\r
1196 DrawPath(pen, path);
\r
1200 #region DrawRectangle(s)
\r
1201 internal void DrawRectangle (Pen pen, RectangleF rect) {
\r
1202 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1205 public void DrawRectangle (Pen pen, Rectangle rect) {
\r
1206 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1209 public void DrawRectangle (Pen pen, float x, float y, float width, float height) {
\r
1210 DrawShape(pen, new geom.Rectangle2D.Float(x,y,width,height));
\r
1213 public void DrawRectangle (Pen pen, int x, int y, int width, int height) {
\r
1214 DrawRectangle (pen,(float) x,(float) y,(float) width,(float) height);
\r
1217 public void DrawRectangles (Pen pen, RectangleF [] rects) {
\r
1218 foreach(RectangleF r in rects)
\r
1219 DrawRectangle (pen, r.Left, r.Top, r.Width, r.Height);
\r
1222 public void DrawRectangles (Pen pen, Rectangle [] rects) {
\r
1223 foreach(Rectangle r in rects)
\r
1224 DrawRectangle (pen, r.Left, r.Top, r.Width, r.Height);
\r
1228 #region DrawString
\r
1229 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle) {
\r
1230 MeasureDraw(s,font,brush,layoutRectangle,null,true);
\r
1233 public void DrawString (string s, Font font, Brush brush, PointF point) {
\r
1234 MeasureDraw(s,font,brush,new RectangleF(point.X,point.Y,99999f,99999f),null,true);
\r
1237 public void DrawString (string s, Font font, Brush brush, PointF point, StringFormat format) {
\r
1238 MeasureDraw(s,font,brush,new RectangleF(point.X,point.Y,99999f,99999f),format,true);
\r
1241 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format) {
\r
1242 MeasureDraw(s,font,brush,layoutRectangle,format,true);
\r
1246 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format)
\r
1248 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1250 java.awt.Paint oldpaint = g.getPaint();
\r
1251 g.setPaint(brush.NativeObject);
\r
1252 java.awt.Font oldfont = g.getFont();
\r
1253 g.setFont(font.NativeObject);
\r
1254 java.awt.Shape oldb = g.getClip();
\r
1255 g.setClip(new java.awt.geom.Rectangle2D.Float(layoutRectangle.X,layoutRectangle.Y,layoutRectangle.Width,layoutRectangle.Height));
\r
1257 g.drawString(s,layoutRectangle.X,layoutRectangle.Y+layoutRectangle.Height);
\r
1259 g.setPaint(oldpaint);
\r
1261 g.setFont(oldfont);
\r
1264 public void DrawString (string s, Font font, Brush brush, float x, float y) {
\r
1265 MeasureDraw(s,font,brush,new RectangleF(x,y,99999f,99999f),null,true);
\r
1268 public void DrawString (string s, Font font, Brush brush, float x, float y, StringFormat format) {
\r
1269 MeasureDraw(s,font,brush,new RectangleF(x,y,99999f,99999f),format,true);
\r
1275 void PushGraphicsState(GraphicsState state) {
\r
1276 state.Next = _nextGraphicsState;
\r
1277 _nextGraphicsState = state;
\r
1280 GraphicsState PopGraphicsState() {
\r
1281 GraphicsState state = _nextGraphicsState;
\r
1282 _nextGraphicsState = _nextGraphicsState.Next;
\r
1286 bool ContainsGraphicsState(GraphicsState state) {
\r
1287 GraphicsState gs = _nextGraphicsState;
\r
1289 while(gs != null) {
\r
1299 public void EndContainer (GraphicsContainer container) {
\r
1300 Restore(container.StateObject);
\r
1303 public GraphicsContainer BeginContainer () {
\r
1304 return new GraphicsContainer(Save(Matrix.IdentityTransform, true));
\r
1307 public GraphicsContainer BeginContainer (Rectangle dstrect, Rectangle srcrect, GraphicsUnit unit) {
\r
1308 Matrix containerTransfrom =
\r
1309 new Matrix( srcrect,
\r
1310 new Point [] { new Point (dstrect.X, dstrect.Y),
\r
1311 new Point (dstrect.X + dstrect.Width, dstrect.Y),
\r
1312 new Point (dstrect.X, dstrect.Y + dstrect.Height) });
\r
1314 float scale = 1/_unitConversion[ (int)unit ];
\r
1315 containerTransfrom.Scale(scale, scale);
\r
1317 return new GraphicsContainer(Save(containerTransfrom, true));
\r
1321 public GraphicsContainer BeginContainer (RectangleF dstrect, RectangleF srcrect, GraphicsUnit unit) {
\r
1322 Matrix containerTransfrom =
\r
1323 new Matrix( srcrect,
\r
1324 new PointF [] { new PointF (dstrect.X, dstrect.Y),
\r
1325 new PointF (dstrect.X + dstrect.Width, dstrect.Y),
\r
1326 new PointF (dstrect.X, dstrect.Y + dstrect.Height) });
\r
1328 float scale = 1/_unitConversion[ (int)unit ];
\r
1329 containerTransfrom.Scale(scale, scale);
\r
1331 return new GraphicsContainer(Save(containerTransfrom, true));
\r
1334 GraphicsState Save(Matrix matrix, bool resetState) {
\r
1335 GraphicsState graphicsState = new GraphicsState(this, matrix, resetState);
\r
1337 PushGraphicsState( graphicsState );
\r
1338 return graphicsState;
\r
1341 public GraphicsState Save () {
\r
1342 return Save(Matrix.IdentityTransform, false);
\r
1345 public void Restore (GraphicsState graphicsState) {
\r
1346 if (ContainsGraphicsState(graphicsState)) {
\r
1347 GraphicsState gs = PopGraphicsState();
\r
1348 while ( gs != graphicsState )
\r
1349 gs = PopGraphicsState();
\r
1351 graphicsState.RestoreState(this);
\r
1357 #region Metafiles Staff [TODO NotSupp]
\r
1358 public void AddMetafileComment (byte [] data) {
\r
1359 throw new NotImplementedException ();
\r
1362 #if INTPTR_SUPPORT
\r
1363 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback)
\r
1365 throw new NotImplementedException ();
\r
1368 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback)
\r
1370 throw new NotImplementedException ();
\r
1373 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback)
\r
1375 throw new NotImplementedException ();
\r
1378 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback)
\r
1380 throw new NotImplementedException ();
\r
1383 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback)
\r
1385 throw new NotImplementedException ();
\r
1388 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback)
\r
1390 throw new NotImplementedException ();
\r
1393 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1395 throw new NotImplementedException ();
\r
1398 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1400 throw new NotImplementedException ();
\r
1403 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1405 throw new NotImplementedException ();
\r
1408 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1410 throw new NotImplementedException ();
\r
1413 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1415 throw new NotImplementedException ();
\r
1418 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1420 throw new NotImplementedException ();
\r
1423 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1425 throw new NotImplementedException ();
\r
1428 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1430 throw new NotImplementedException ();
\r
1433 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1435 throw new NotImplementedException ();
\r
1438 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1440 throw new NotImplementedException ();
\r
1443 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1445 throw new NotImplementedException ();
\r
1448 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1450 throw new NotImplementedException ();
\r
1453 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1455 throw new NotImplementedException ();
\r
1458 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1460 throw new NotImplementedException ();
\r
1463 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1465 throw new NotImplementedException ();
\r
1468 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1470 throw new NotImplementedException ();
\r
1473 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1475 throw new NotImplementedException ();
\r
1478 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1480 throw new NotImplementedException ();
\r
1483 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1485 throw new NotImplementedException ();
\r
1488 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1490 throw new NotImplementedException ();
\r
1493 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1495 throw new NotImplementedException ();
\r
1498 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1500 throw new NotImplementedException ();
\r
1503 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1505 throw new NotImplementedException ();
\r
1508 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1510 throw new NotImplementedException ();
\r
1513 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1515 throw new NotImplementedException ();
\r
1518 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1520 throw new NotImplementedException ();
\r
1523 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1525 throw new NotImplementedException ();
\r
1528 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1530 throw new NotImplementedException ();
\r
1533 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1535 throw new NotImplementedException ();
\r
1538 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1540 throw new NotImplementedException ();
\r
1545 #region ExcludeClip
\r
1546 void ExcludeClip(geom.Area area) {
\r
1548 geom.AffineTransform t = GetFinalTransform();
\r
1549 if (!t.isIdentity()) {
\r
1550 area = (geom.Area)area.clone();
\r
1551 area.transform(t);
\r
1554 _clip.NativeObject.subtract(area);
\r
1557 public void ExcludeClip (Rectangle rect) {
\r
1558 ExcludeClip(new geom.Area(rect.NativeObject));
\r
1561 public void ExcludeClip (Region region) {
\r
1562 if (region == null)
\r
1563 throw new ArgumentNullException("region");
\r
1564 ExcludeClip(region.NativeObject);
\r
1568 #region FillClosedCurve
\r
1569 public void FillClosedCurve (Brush brush, PointF [] points) {
\r
1570 FillClosedCurve (brush, points, FillMode.Alternate);
\r
1574 public void FillClosedCurve (Brush brush, Point [] points) {
\r
1575 FillClosedCurve (brush, points, FillMode.Alternate);
\r
1579 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode) {
\r
1580 FillClosedCurve (brush, points, fillmode, 0.5f);
\r
1583 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode) {
\r
1584 FillClosedCurve (brush, points, fillmode, 0.5f);
\r
1587 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode, float tension) {
\r
1588 GraphicsPath path = new GraphicsPath(fillmode);
\r
1589 path.AddClosedCurve(points, tension);
\r
1590 FillPath(brush, path);
\r
1593 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode, float tension) {
\r
1594 GraphicsPath path = new GraphicsPath(fillmode);
\r
1595 path.AddClosedCurve(points, tension);
\r
1596 FillPath(brush, path);
\r
1600 #region FillEllipse
\r
1601 public void FillEllipse (Brush brush, Rectangle rect) {
\r
1602 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
\r
1605 public void FillEllipse (Brush brush, RectangleF rect) {
\r
1606 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
\r
1609 public void FillEllipse (Brush brush, float x, float y, float width, float height) {
\r
1610 FillShape(brush,new java.awt.geom.Ellipse2D.Float(x,y,width,height));
\r
1613 public void FillEllipse (Brush brush, int x, int y, int width, int height) {
\r
1614 FillEllipse (brush,(float)x,(float)y,(float)width,(float)height);
\r
1619 public void FillPath (Brush brush, GraphicsPath path) {
\r
1621 throw new ArgumentNullException("path");
\r
1623 FillShape(brush,path);
\r
1628 public void FillPie (Brush brush, Rectangle rect, float startAngle, float sweepAngle) {
\r
1629 FillPie(brush,(float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height,(float)startAngle,(float)sweepAngle);
\r
1632 public void FillPie (Brush brush, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
1633 FillPie(brush,(float)x,(float)y,(float)width,(float)height,(float)startAngle,(float)sweepAngle);
\r
1636 public void FillPie (Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
1637 GraphicsPath path = new GraphicsPath();
\r
1638 path.AddPie(x, y, width, height, startAngle, sweepAngle);
\r
1639 FillPath(brush, path);
\r
1643 #region FillPolygon
\r
1644 public void FillPolygon (Brush brush, PointF [] points) {
\r
1645 FillPolygon(brush, points, FillMode.Alternate);
\r
1648 public void FillPolygon (Brush brush, Point [] points) {
\r
1649 FillPolygon(brush, points, FillMode.Alternate);
\r
1652 public void FillPolygon (Brush brush, Point [] points, FillMode fillMode) {
\r
1653 GraphicsPath path = new GraphicsPath(fillMode);
\r
1654 path.AddPolygon(points);
\r
1655 FillPath(brush,path);
\r
1658 public void FillPolygon (Brush brush, PointF [] points, FillMode fillMode) {
\r
1659 GraphicsPath path = new GraphicsPath(fillMode);
\r
1660 path.AddPolygon(points);
\r
1661 FillPath(brush,path);
\r
1665 #region FillRectangle
\r
1666 public void FillRectangle (Brush brush, RectangleF rect) {
\r
1667 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1670 public void FillRectangle (Brush brush, Rectangle rect) {
\r
1671 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1674 public void FillRectangle (Brush brush, int x, int y, int width, int height) {
\r
1675 FillRectangle(brush,(float)x,(float)y,(float)width,(float)height);
\r
1678 public void FillRectangle (Brush brush, float x, float y, float width, float height) {
\r
1679 FillShape(brush,new java.awt.geom.Rectangle2D.Float(x,y,width,height));
\r
1682 public void FillRectangles (Brush brush, Rectangle [] rects) {
\r
1683 GraphicsPath path = new GraphicsPath();
\r
1684 path.AddRectangles(rects);
\r
1685 FillPath(brush,path);
\r
1688 public void FillRectangles (Brush brush, RectangleF [] rects) {
\r
1689 GraphicsPath path = new GraphicsPath();
\r
1690 path.AddRectangles(rects);
\r
1691 FillPath(brush,path);
\r
1695 #region FillRegion
\r
1696 public void FillRegion (Brush brush, Region region) {
\r
1697 FillShape(brush,region);
\r
1702 public void Flush () {
\r
1703 Flush (FlushIntention.Flush);
\r
1707 public void Flush (FlushIntention intention) {
\r
1708 if (_image != null)
\r
1709 _image.NativeObject.CurrentImage.NativeImage.flush();
\r
1712 #if INTPTR_SUPPORTED
\r
1713 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1714 public void ReleaseHdc (IntPtr hdc)
\r
1716 throw new NotImplementedException();
\r
1719 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1720 public void ReleaseHdcInternal (IntPtr hdc)
\r
1722 throw new NotImplementedException ();
\r
1725 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1726 public static Graphics FromHdc (IntPtr hdc)
\r
1728 throw new NotImplementedException();
\r
1731 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1732 public static Graphics FromHdc (IntPtr hdc, IntPtr hdevice)
\r
1734 throw new NotImplementedException ();
\r
1737 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1738 public static Graphics FromHdcInternal (IntPtr hdc)
\r
1740 throw new NotImplementedException ();
\r
1743 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1744 public static Graphics FromHwnd (IntPtr hwnd)
\r
1746 throw new NotImplementedException();
\r
1749 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1750 public static Graphics FromHwndInternal (IntPtr hwnd)
\r
1752 throw new NotImplementedException ();
\r
1755 internal static Graphics FromXDrawable (IntPtr drawable, IntPtr display)
\r
1757 throw new NotImplementedException();
\r
1760 public static IntPtr GetHalftonePalette ()
\r
1762 throw new NotImplementedException ();
\r
1765 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1766 public IntPtr GetHdc ()
\r
1768 throw new NotImplementedException();
\r
1772 #region GetNearestColor [TODO]
\r
1773 public Color GetNearestColor (Color color) {
\r
1774 throw new NotImplementedException();
\r
1778 #region IntersectClip
\r
1779 void IntersectClip (geom.Area area) {
\r
1781 geom.AffineTransform t = GetFinalTransform();
\r
1782 if (!t.isIdentity()) {
\r
1783 area = (geom.Area)area.clone();
\r
1784 area.transform(t);
\r
1787 _clip.NativeObject.intersect(area);
\r
1790 public void IntersectClip (Region region) {
\r
1791 if (region == null)
\r
1792 throw new ArgumentNullException("region");
\r
1794 IntersectClip(region.NativeObject);
\r
1797 public void IntersectClip (RectangleF rect) {
\r
1798 IntersectClip(new geom.Area(rect.NativeObject));
\r
1801 public void IntersectClip (Rectangle rect) {
\r
1802 IntersectClip(new geom.Area(rect.NativeObject));
\r
1807 public bool IsVisible (Point point) {
\r
1808 return IsVisible(point.X,point.Y);
\r
1812 public bool IsVisible (RectangleF rect) {
\r
1813 return IsVisible ((float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height);
\r
1816 public bool IsVisible (PointF point) {
\r
1817 return IsVisible(point.X,point.Y);
\r
1820 public bool IsVisible (Rectangle rect) {
\r
1821 return IsVisible ((float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height);
\r
1824 public bool IsVisible (float x, float y) {
\r
1827 geom.AffineTransform t = GetFinalTransform();
\r
1828 if (!t.isIdentity()) {
\r
1829 double[] p = new double[] {dx, dy};
\r
1830 t.transform(p, 0, p, 0, 1);
\r
1835 if (!_clip.NativeObject.contains(dx, dy))
\r
1838 awt.Shape clip = NativeObject.getClip();
\r
1842 return clip.contains(dx, dy);
\r
1845 public bool IsVisible (int x, int y) {
\r
1846 return IsVisible ((float)x,(float)y);
\r
1849 public bool IsVisible (float x, float y, float width, float height) {
\r
1851 geom.AffineTransform t = GetFinalTransform();
\r
1852 geom.Rectangle2D r = new geom.Rectangle2D.Float(x, y, width, height);
\r
1854 if (!t.isIdentity())
\r
1855 r = t.createTransformedShape(r).getBounds2D();
\r
1857 return NativeObject.hitClip(
\r
1858 (int)(r.getX()+0.5), (int)(r.getY()+0.5),
\r
1859 (int)(r.getWidth()+0.5), (int)(r.getHeight()+0.5))
\r
1860 && _clip.NativeObject.intersects(r);
\r
1864 public bool IsVisible (int x, int y, int width, int height) {
\r
1865 return IsVisible ((float)x,(float)y,(float)width,(float)height);
\r
1869 #region MeasureCharacterRanges [TODO]
\r
1870 public Region [] MeasureCharacterRanges (string text, Font font, RectangleF layoutRect, StringFormat stringFormat) {
\r
1871 throw new NotImplementedException();
\r
1875 #region MeasureString [1 method still TODO]
\r
1876 public SizeF MeasureString (string text, Font font) {
\r
1877 return MeasureDraw(text,font,null,new RectangleF(0,0,99999f,99999f),null,false);
\r
1881 public SizeF MeasureString (string text, Font font, SizeF layoutArea) {
\r
1882 return MeasureDraw(text,font,null,new RectangleF(0,0,layoutArea.Width,layoutArea.Height),null,false);
\r
1886 public SizeF MeasureString (string text, Font font, int width) {
\r
1887 return MeasureDraw(text,font,null,new RectangleF(0,0,(float)width,99999f),null,false);
\r
1891 public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat format) {
\r
1892 return MeasureDraw(text,font,null,new RectangleF(0,0,layoutArea.Width,layoutArea.Height),format,false);
\r
1896 public SizeF MeasureString (string text, Font font, int width, StringFormat format) {
\r
1897 return MeasureDraw(text,font,null,new RectangleF(0,0,(float)width,99999f),format,false);
\r
1901 public SizeF MeasureString (string text, Font font, PointF origin, StringFormat format) {
\r
1902 //TBD: MeasureDraw still not dealing with clipping region of dc
\r
1903 return MeasureDraw(text,font,null,new RectangleF(origin.X,origin.Y,99999f,99999f),format,false);
\r
1907 public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat stringFormat, out int charactersFitted, out int linesFilled) {
\r
1909 throw new NotImplementedException();
\r
1913 #region MultiplyTransform
\r
1914 public void MultiplyTransform (Matrix matrix) {
\r
1915 MultiplyTransform (matrix, MatrixOrder.Prepend);
\r
1918 public void MultiplyTransform (Matrix matrix, MatrixOrder order) {
\r
1919 ConcatenateTransform(matrix.NativeObject, order);
\r
1923 #region Reset (Clip and Transform)
\r
1924 public void ResetClip () {
\r
1925 _clip.MakeInfinite();
\r
1928 public void ResetTransform () {
\r
1929 _transform.Reset();
\r
1933 #region RotateTransform
\r
1934 public void RotateTransform (float angle) {
\r
1935 RotateTransform (angle, MatrixOrder.Prepend);
\r
1938 public void RotateTransform (float angle, MatrixOrder order) {
\r
1939 ConcatenateTransform(
\r
1940 geom.AffineTransform.getRotateInstance(java.lang.Math.toRadians(angle)),
\r
1945 #region ScaleTransform
\r
1946 public void ScaleTransform (float sx, float sy) {
\r
1947 ScaleTransform (sx, sy, MatrixOrder.Prepend);
\r
1950 public void ScaleTransform (float sx, float sy, MatrixOrder order) {
\r
1951 ConcatenateTransform(
\r
1952 geom.AffineTransform.getScaleInstance(sx, sy),
\r
1957 #region SetClip [Must be reviewed - more abstraction needed]
\r
1958 public void SetClip (RectangleF rect) {
\r
1959 SetClip (rect, CombineMode.Replace);
\r
1962 public void SetClip (GraphicsPath path) {
\r
1963 SetClip (path, CombineMode.Replace);
\r
1966 public void SetClip (Rectangle rect) {
\r
1967 SetClip (rect, CombineMode.Replace);
\r
1970 public void SetClip (Graphics g) {
\r
1971 SetClip (g, CombineMode.Replace);
\r
1974 public void SetClip (Graphics g, CombineMode combineMode) {
\r
1976 throw new NullReferenceException();
\r
1978 CombineClipArea(g._clip.NativeObject, combineMode);
\r
1981 public void SetClip (Rectangle rect, CombineMode combineMode) {
\r
1982 SetClip(rect.X,rect.Y,rect.Width,rect.Height,combineMode);
\r
1984 public void SetClip (RectangleF rect, CombineMode combineMode) {
\r
1985 SetClip(rect.X,rect.Y,rect.Width,rect.Height,combineMode);
\r
1988 public void SetClip (Region region, CombineMode combineMode) {
\r
1989 if(region == null)
\r
1990 throw new ArgumentNullException("region");
\r
1992 CombineClipArea((geom.Area)region.NativeObject.clone(),combineMode);
\r
1995 public void SetClip (GraphicsPath path, CombineMode combineMode) {
\r
1997 throw new ArgumentNullException("path");
\r
1999 CombineClipArea(new geom.Area(path.NativeObject), combineMode);
\r
2003 #region Clipping Staff [INTERNAL]
\r
2004 internal Region ScaledClip {
\r
2006 return _clip.Clone();
\r
2009 _clip.NativeObject.reset();
\r
2010 _clip.NativeObject.add(value.NativeObject);
\r
2013 internal void SetClip(float x,float y,float width,float height,CombineMode combineMode) {
\r
2014 CombineClipArea(new geom.Area(
\r
2015 new geom.Rectangle2D.Float(x,y,width,height)),combineMode);
\r
2018 void CombineClipArea(geom.Area area, CombineMode combineMode) {
\r
2019 geom.AffineTransform t = GetFinalTransform();
\r
2020 if (!t.isIdentity())
\r
2021 area.transform(t);
\r
2022 if (combineMode == CombineMode.Replace) {
\r
2023 _clip.NativeObject.reset();
\r
2024 _clip.NativeObject.add(area);
\r
2028 geom.Area curClip = _clip.NativeObject;
\r
2029 switch(combineMode) {
\r
2030 case CombineMode.Complement:
\r
2031 curClip.add(area);
\r
2033 case CombineMode.Exclude:
\r
2034 curClip.subtract(area);
\r
2036 case CombineMode.Intersect:
\r
2037 curClip.intersect(area);
\r
2039 case CombineMode.Union:
\r
2040 curClip.add(area);
\r
2042 case CombineMode.Xor:
\r
2043 curClip.exclusiveOr(area);
\r
2046 throw new ArgumentOutOfRangeException();
\r
2050 internal void IntersectScaledClipWithBase(awt.Shape clip) {
\r
2051 NativeObject.clip(clip);
\r
2054 awt.Shape IntersectUserClip(awt.Shape shape, geom.Area clip) {
\r
2058 geom.Area area = new geom.Area(shape);
\r
2059 area.intersect(clip);
\r
2063 awt.Shape IntersectUserClip(awt.Shape shape) {
\r
2064 return IntersectUserClip(shape, _clip.NativeObject);
\r
2067 void RestoreBaseClip() {
\r
2068 if (_nextGraphicsState == null) {
\r
2069 NativeObject.setClip(null);
\r
2073 _nextGraphicsState.RestoreBaseClip(this);
\r
2078 #region TransformPoints
\r
2079 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, PointF [] pts) {
\r
2080 //TBD:CoordinateSpace
\r
2081 java.awt.geom.AffineTransform tr = this.Transform.NativeObject;
\r
2082 float[] fpts = new float[2];
\r
2083 for(int i = 0; i< pts.Length; i++) {
\r
2084 fpts[0] = pts[i].X;
\r
2085 fpts[1] = pts[i].Y;
\r
2086 tr.transform(fpts, 0, fpts, 0, 1);
\r
2087 pts[i].X = fpts[0];
\r
2088 pts[i].Y = fpts[1];
\r
2092 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, Point [] pts) {
\r
2093 //TBD:CoordinateSpace
\r
2094 java.awt.geom.AffineTransform tr = this.Transform.NativeObject;
\r
2095 float[] fpts = new float[2];
\r
2096 for(int i = 0; i< pts.Length; i++) {
\r
2097 fpts[0] = pts[i].X;
\r
2098 fpts[1] = pts[i].Y;
\r
2099 tr.transform(fpts, 0, fpts, 0, 1);
\r
2100 pts[i].X = (int)fpts[0];
\r
2101 pts[i].Y = (int)fpts[1];
\r
2106 #region TranslateClip
\r
2107 public void TranslateClip (int dx, int dy) {
\r
2108 TranslateClip((float)dx, (float)dy);
\r
2112 public void TranslateClip (float dx, float dy) {
\r
2115 geom.AffineTransform f = GetFinalTransform();
\r
2117 if (!f.isIdentity()) {
\r
2118 double[] p = new double[] {x, y};
\r
2119 f.deltaTransform(p, 0, p, 0, 1);
\r
2125 // It seems .Net does exactly this...
\r
2126 x = Math.Floor(x+0.96875);
\r
2127 y = Math.Floor(y+0.96875);
\r
2129 geom.AffineTransform t = geom.AffineTransform.getTranslateInstance(x, y);
\r
2131 _clip.NativeObject.transform(t);
\r
2135 #region TranslateTransform
\r
2136 public void TranslateTransform (float dx, float dy) {
\r
2137 TranslateTransform (dx, dy, MatrixOrder.Prepend);
\r
2141 public void TranslateTransform (float dx, float dy, MatrixOrder order) {
\r
2142 ConcatenateTransform(
\r
2143 geom.AffineTransform.getTranslateInstance(dx, dy),
\r
2148 #region Properties [Partial TODO]
\r
2149 public Region Clip {
\r
2151 Region r = _clip.Clone();
\r
2152 geom.AffineTransform t = GetFinalTransform();
\r
2153 if (!t.isIdentity())
\r
2154 r.NativeObject.transform(t.createInverse());
\r
2159 SetClip (value, CombineMode.Replace);
\r
2163 public RectangleF ClipBounds {
\r
2165 awt.Shape shape = _clip.NativeObject;
\r
2166 if (shape == null)
\r
2167 shape = Region.InfiniteRegion.NativeObject;
\r
2169 geom.RectangularShape r = shape.getBounds2D();
\r
2170 geom.AffineTransform t = GetFinalTransform();
\r
2171 if (!t.isIdentity()) {
\r
2172 geom.AffineTransform it = t.createInverse();
\r
2173 r = it.createTransformedShape(r).getBounds2D();
\r
2176 return new RectangleF (r);
\r
2180 public CompositingMode CompositingMode {
\r
2181 //TBD:check this carefully
\r
2183 return (NativeObject.getComposite() == awt.AlphaComposite.SrcOver) ?
\r
2184 CompositingMode.SourceOver : CompositingMode.SourceCopy;
\r
2187 NativeObject.setComposite(
\r
2188 (value == CompositingMode.SourceOver) ?
\r
2189 awt.AlphaComposite.SrcOver : awt.AlphaComposite.Src);
\r
2194 public CompositingQuality CompositingQuality {
\r
2196 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2197 if(hints.containsKey(awt.RenderingHints.KEY_ALPHA_INTERPOLATION)) {
\r
2198 object value_ai = hints.get(awt.RenderingHints.KEY_ALPHA_INTERPOLATION);
\r
2200 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)
\r
2201 return CompositingQuality.HighSpeed;
\r
2202 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)
\r
2203 return CompositingQuality.HighQuality;
\r
2204 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)
\r
2205 return CompositingQuality.Default;
\r
2208 return CompositingQuality.Default;
\r
2212 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2214 case CompositingQuality.AssumeLinear:
\r
2215 case CompositingQuality.Default:
\r
2216 case CompositingQuality.GammaCorrected:
\r
2217 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2218 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
\r
2220 case CompositingQuality.HighQuality:
\r
2221 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2222 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
\r
2224 case CompositingQuality.HighSpeed:
\r
2225 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2226 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
\r
2228 // case CompositingQuality.Invalid:
\r
2229 // if(hints.containsKey(awt.RenderingHints.KEY_ALPHA_INTERPOLATION))
\r
2230 // hints.remove(awt.RenderingHints.KEY_ALPHA_INTERPOLATION);
\r
2233 NativeObject.setRenderingHints(hints);
\r
2237 public float DpiX {
\r
2239 return DefaultScreenResolution;
\r
2243 public float DpiY {
\r
2245 //TBD: assume 72 (screen) for now
\r
2250 public InterpolationMode InterpolationMode {
\r
2252 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2253 if(hints.containsKey(awt.RenderingHints.KEY_INTERPOLATION)) {
\r
2254 object value_i = hints.get(awt.RenderingHints.KEY_INTERPOLATION);
\r
2256 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR)
\r
2257 return InterpolationMode.Bilinear;
\r
2258 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC)
\r
2259 return InterpolationMode.Bicubic;
\r
2260 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)
\r
2261 return InterpolationMode.NearestNeighbor;
\r
2264 return InterpolationMode.Default;
\r
2267 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2270 case InterpolationMode.Bicubic:
\r
2271 case InterpolationMode.HighQualityBicubic:
\r
2272 case InterpolationMode.Low:
\r
2273 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC);
\r
2275 case InterpolationMode.High:
\r
2276 case InterpolationMode.Bilinear:
\r
2277 case InterpolationMode.HighQualityBilinear:
\r
2278 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR);
\r
2280 case InterpolationMode.Default:
\r
2281 if (hints.containsKey(awt.RenderingHints.KEY_INTERPOLATION))
\r
2282 hints.remove(awt.RenderingHints.KEY_INTERPOLATION);
\r
2284 case InterpolationMode.NearestNeighbor:
\r
2285 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
\r
2287 case InterpolationMode.Invalid:
\r
2288 throw new ArgumentException();
\r
2290 throw new ArgumentOutOfRangeException();
\r
2293 NativeObject.setRenderingHints(hints);
\r
2297 public bool IsClipEmpty {
\r
2299 return _clip.IsEmpty(this);
\r
2303 public bool IsVisibleClipEmpty {
\r
2305 if (_clip.IsEmpty(this))
\r
2308 return VisibleClipBounds.IsEmpty;
\r
2312 public float PageScale {
\r
2314 return _pageScale;
\r
2317 _pageScale = value;
\r
2321 public GraphicsUnit PageUnit {
\r
2326 _pageUnit = value;
\r
2330 static internal geom.AffineTransform GetFinalTransform(
\r
2331 geom.AffineTransform transform, GraphicsUnit pageUnit, float pageScale) {
\r
2332 geom.AffineTransform t = null;
\r
2333 if (pageUnit != GraphicsUnit.Display) {
\r
2334 float scale = pageScale * _unitConversion[ (int)pageUnit ];
\r
2335 if (Math.Abs(scale-1f) > float.Epsilon)
\r
2336 t = geom.AffineTransform.getScaleInstance(scale, scale);
\r
2340 t.concatenate(transform);
\r
2347 geom.AffineTransform GetFinalTransform() {
\r
2348 return GetFinalTransform(_transform.NativeObject, PageUnit, PageScale);
\r
2351 public PixelOffsetMode PixelOffsetMode {
\r
2353 return _pixelOffsetMode;
\r
2356 _pixelOffsetMode = value;
\r
2360 public Point RenderingOrigin {
\r
2362 throw new NotImplementedException();
\r
2365 throw new NotImplementedException();
\r
2369 public SmoothingMode SmoothingMode {
\r
2371 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2372 if(hints.containsKey(awt.RenderingHints.KEY_ANTIALIASING)) {
\r
2373 object value_aa = hints.get(awt.RenderingHints.KEY_ANTIALIASING);
\r
2374 if (value_aa == awt.RenderingHints.VALUE_ANTIALIAS_ON) {
\r
2375 if(hints.containsKey(awt.RenderingHints.KEY_RENDERING)) {
\r
2376 object value_render = hints.get(awt.RenderingHints.KEY_RENDERING);
\r
2377 if (value_render == awt.RenderingHints.VALUE_RENDER_QUALITY)
\r
2378 return SmoothingMode.HighQuality;
\r
2379 if (value_render == awt.RenderingHints.VALUE_RENDER_SPEED)
\r
2380 return SmoothingMode.HighSpeed;
\r
2383 return SmoothingMode.AntiAlias;
\r
2386 if (value_aa == awt.RenderingHints.VALUE_ANTIALIAS_DEFAULT)
\r
2387 return SmoothingMode.Default;
\r
2389 return SmoothingMode.None;
\r
2394 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2397 case SmoothingMode.None:
\r
2398 if(hints.containsKey(awt.RenderingHints.KEY_ANTIALIASING))
\r
2399 hints.remove(awt.RenderingHints.KEY_ANTIALIASING);
\r
2400 if(hints.containsKey(awt.RenderingHints.KEY_RENDERING))
\r
2401 hints.remove(awt.RenderingHints.KEY_RENDERING);
\r
2403 case SmoothingMode.AntiAlias:
\r
2404 hints.put(awt.RenderingHints.KEY_ANTIALIASING, awt.RenderingHints.VALUE_ANTIALIAS_ON);
\r
2406 case SmoothingMode.HighQuality:
\r
2407 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_QUALITY);
\r
2408 goto case SmoothingMode.AntiAlias;
\r
2409 case SmoothingMode.HighSpeed:
\r
2410 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_SPEED);
\r
2411 goto case SmoothingMode.None;
\r
2412 case SmoothingMode.Default:
\r
2413 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_DEFAULT);
\r
2414 goto case SmoothingMode.AntiAlias;
\r
2415 case SmoothingMode.Invalid:
\r
2416 throw new ArgumentException("Invalid parameter used.");
\r
2419 NativeObject.setRenderingHints(hints);
\r
2424 /// Java does not have similar functionality
\r
2426 public int TextContrast {
\r
2428 return _textContrast;
\r
2432 _textContrast = value;
\r
2436 public TextRenderingHint TextRenderingHint {
\r
2438 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2439 if(hints.containsKey(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING)) {
\r
2440 if(hints.get(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING) ==
\r
2441 java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
\r
2442 return TextRenderingHint.AntiAlias;
\r
2443 if(hints.get(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING) ==
\r
2444 java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)
\r
2445 return TextRenderingHint.SingleBitPerPixel;
\r
2447 return TextRenderingHint.SystemDefault;
\r
2452 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2454 case TextRenderingHint.AntiAlias:
\r
2455 case TextRenderingHint.AntiAliasGridFit:
\r
2456 case TextRenderingHint.ClearTypeGridFit:
\r
2457 case TextRenderingHint.SingleBitPerPixel:
\r
2458 case TextRenderingHint.SingleBitPerPixelGridFit:
\r
2459 case TextRenderingHint.SystemDefault:
\r
2465 public Matrix Transform {
\r
2467 return _transform.Clone();
\r
2470 if (value == null)
\r
2471 throw new ArgumentNullException("matrix");
\r
2473 if (!value.IsInvertible)
\r
2474 throw new ArgumentException("Invalid parameter used.");
\r
2476 value.CopyTo(_transform);
\r
2480 internal Matrix BaseTransform {
\r
2482 return new Matrix(NativeObject.getTransform());
\r
2485 NativeObject.setTransform(value.NativeObject);
\r
2489 internal void PrependBaseTransform(geom.AffineTransform t) {
\r
2490 NativeObject.transform(t);
\r
2493 internal awt.Shape VisibleShape {
\r
2495 return _windowRect;
\r
2499 public RectangleF VisibleClipBounds {
\r
2501 if (_clip.IsEmpty(this))
\r
2502 return RectangleF.Empty;
\r
2504 geom.Rectangle2D r = _clip.NativeObject.getBounds2D();
\r
2505 awt.Shape clip = NativeObject.getClip();
\r
2506 geom.Rectangle2D clipBounds = (clip != null) ? clip.getBounds2D() : _windowRect;
\r
2507 geom.Rectangle2D.intersect(r, clipBounds, r);
\r
2508 geom.AffineTransform t = GetFinalTransform();
\r
2509 if (!t.isIdentity()) {
\r
2510 geom.AffineTransform it = t.createInverse();
\r
2511 r = it.createTransformedShape(r).getBounds2D();
\r
2514 return new RectangleF (r);
\r
2518 void ConcatenateTransform(geom.AffineTransform transform, MatrixOrder order) {
\r
2519 geom.AffineTransform at = _transform.NativeObject;
\r
2520 Matrix.Multiply(at, transform, order);
\r