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);
\r
40 public NormalizingPathIterator(geom.PathIterator iter) {
\r
48 static int GetIndex(int type) {
\r
50 switch ((GraphicsPath.JPI)type) {
\r
51 case GraphicsPath.JPI.SEG_CUBICTO:
\r
54 case GraphicsPath.JPI.SEG_QUADTO:
\r
57 case GraphicsPath.JPI.SEG_MOVETO:
\r
58 case GraphicsPath.JPI.SEG_LINETO:
\r
61 case GraphicsPath.JPI.SEG_CLOSE:
\r
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);
\r
88 float ox = point[index];
\r
89 float oy = point[index+1];
\r
90 float newax = (float) java.lang.Math.floor(ox + rnd) + norm;
\r
91 float neway = (float) java.lang.Math.floor(oy + rnd) + norm;
\r
92 point[index] = newax;
\r
93 point[index+1] = neway;
\r
96 switch ((GraphicsPath.JPI)type) {
\r
97 case GraphicsPath.JPI.SEG_CUBICTO:
\r
103 case GraphicsPath.JPI.SEG_QUADTO:
\r
104 point[0] += (newax + ax) / 2;
\r
105 point[1] += (neway + ay) / 2;
\r
107 // case GraphicsPath.JPI.SEG_MOVETO:
\r
108 // case GraphicsPath.JPI.SEG_LINETO:
\r
109 // case GraphicsPath.JPI.SEG_CLOSE:
\r
119 int geom.PathIterator.currentSegment(double[] point) {
\r
120 int type = _iter.currentSegment(point);
\r
122 int index = GetIndex(type);
\r
125 float ox = (float)point[index];
\r
126 float oy = (float)point[index+1];
\r
127 float newax = (float)java.lang.Math.floor(ox + rnd) + norm;
\r
128 float neway = (float)java.lang.Math.floor(oy + rnd) + norm;
\r
129 point[index] = newax;
\r
130 point[index+1] = neway;
\r
133 switch ((GraphicsPath.JPI)type) {
\r
134 case GraphicsPath.JPI.SEG_CUBICTO:
\r
140 case GraphicsPath.JPI.SEG_QUADTO:
\r
141 point[0] += (newax + ax) / 2;
\r
142 point[1] += (neway + ay) / 2;
\r
144 // case GraphicsPath.JPI.SEG_MOVETO:
\r
145 // case GraphicsPath.JPI.SEG_LINETO:
\r
146 // case GraphicsPath.JPI.SEG_CLOSE:
\r
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 TextRenderingHint _textRenderingHint;
\r
171 readonly Image _image;
\r
173 readonly Matrix _transform;
\r
174 GraphicsUnit _pageUnit = GraphicsUnit.Display;
\r
175 float _pageScale = 1.0f;
\r
177 readonly Region _clip;
\r
178 readonly awt.Rectangle _windowRect;
\r
180 GraphicsState _nextGraphicsState = null;
\r
182 static readonly float [] _unitConversion = {
\r
186 DefaultScreenResolution / 72.0f, // Point
\r
187 DefaultScreenResolution, // Inch
\r
188 DefaultScreenResolution / 300.0f,// Document
\r
189 DefaultScreenResolution / 25.4f // Millimeter
\r
192 static int _isHeadless;
\r
193 static internal bool IsHeadless {
\r
195 if (_isHeadless == 0) {
\r
196 bool isHeadless = awt.GraphicsEnvironment.isHeadless();
\r
199 awt.Toolkit.getDefaultToolkit();
\r
206 _isHeadless = isHeadless ? 2 : 1;
\r
209 return _isHeadless > 1;
\r
216 [ComVisible(false)]
\r
217 public delegate bool EnumerateMetafileProc (EmfPlusRecordType recordType,
\r
221 PlayRecordCallback callbackData);
\r
222 [ComVisible (false)]
\r
223 public delegate bool DrawImageAbort (IntPtr callbackData);
\r
226 #region Constr. and Destr.
\r
227 private Graphics (Image image) {
\r
228 _nativeObject = (awt.Graphics2D)image.NativeObject.CurrentImage.NativeImage.getGraphics();
\r
230 _transform = new Matrix ();
\r
232 NativeObject.setStroke(new DummyStroke());
\r
233 NativeObject.setRenderingHint(awt.RenderingHints.KEY_COLOR_RENDERING, awt.RenderingHints.VALUE_COLOR_RENDER_QUALITY);
\r
235 InterpolationMode = InterpolationMode.Bilinear;
\r
236 TextRenderingHint = TextRenderingHint.SystemDefault;
\r
238 _windowRect = new awt.Rectangle(_image.Width, _image.Height);
\r
239 _clip = new Region();
\r
244 #region Internal Accessors
\r
246 static internal float [] UnitConversion {
\r
248 return _unitConversion;
\r
252 static internal int DefaultScreenResolution {
\r
254 return IsHeadless ? 96 :
\r
255 awt.Toolkit.getDefaultToolkit().getScreenResolution();
\r
259 internal java.awt.Graphics2D NativeObject {
\r
261 return _nativeObject;
\r
266 #region FromImage (static accessor)
\r
267 public static Graphics FromImage (Image image) {
\r
268 return new Graphics(image);
\r
273 #region Workers [INTERNAL]
\r
274 void DrawShape(Pen pen, awt.Shape shape) {
\r
276 throw new ArgumentNullException("pen");
\r
278 if (StrokeFactory.CanCreateAdvancedStroke &&
\r
279 (!pen.CanCreateBasicStroke || !NeedsNormalization)) {
\r
280 geom.AffineTransform oldT = NativeObject.getTransform();
\r
281 NativeObject.setTransform(Matrix.IdentityTransform.NativeObject);
\r
284 geom.AffineTransform t = GetFinalTransform();
\r
285 if (!oldT.isIdentity()) {
\r
286 t = (geom.AffineTransform)t.clone();
\r
287 t.preConcatenate(oldT);
\r
290 double widthsquared = pen.GetSquaredTransformedWidth(t);
\r
292 bool antiAlias = (SmoothingMode == SmoothingMode.AntiAlias);
\r
294 bool thin = (widthsquared <= (antiAlias ?
\r
295 AdvancedStroke.MinPenSizeAASquared :
\r
296 AdvancedStroke.MinPenSizeSquared));
\r
298 PenFit penFit = thin ? (antiAlias ? PenFit.ThinAntiAlias : PenFit.Thin) : PenFit.NotThin;
\r
300 if (NeedsNormalization) {
\r
303 widthsquared <= AdvancedStroke.MinPenSizeSquaredNorm;
\r
306 shape = GetNormalizedShape(shape, t);
\r
307 shape = pen.GetNativeObject(
\r
308 t, null, penFit).createStrokedShape(shape);
\r
311 shape = pen.GetNativeObject(t, penFit).createStrokedShape(shape);
\r
312 shape = GetNormalizedShape(shape, null);
\r
316 shape = pen.GetNativeObject(t, penFit).createStrokedShape(shape);
\r
319 FillScaledShape(pen.Brush, shape);
\r
322 NativeObject.setTransform(oldT);
\r
326 awt.Stroke oldStroke = NativeObject.getStroke();
\r
327 NativeObject.setStroke(pen.GetNativeObject(null, PenFit.NotThin));
\r
330 NativeObject.setPaint(pen.Brush);
\r
332 geom.AffineTransform oldT = NativeObject.getTransform();
\r
333 NativeObject.transform(GetFinalTransform());
\r
335 NativeObject.draw(shape);
\r
338 NativeObject.setTransform(oldT);
\r
342 NativeObject.setStroke(oldStroke);
\r
346 void FillShape(Brush paint, awt.Shape shape) {
\r
348 throw new ArgumentNullException("brush");
\r
350 geom.AffineTransform oldT = null;
\r
351 if (NeedsNormalization) {
\r
352 oldT = NativeObject.getTransform();
\r
353 geom.AffineTransform t = GetFinalTransform();
\r
354 if (!oldT.isIdentity()) {
\r
355 t = (geom.AffineTransform)t.clone();
\r
356 t.preConcatenate(oldT);
\r
358 shape = GetNormalizedShape(shape, t);
\r
361 geom.AffineTransform t = GetFinalTransform();
\r
362 if (!t.isIdentity())
\r
363 shape = t.createTransformedShape(shape);
\r
367 NativeObject.setTransform(Matrix.IdentityTransform.NativeObject);
\r
370 FillScaledShape(paint, shape);
\r
374 NativeObject.setTransform(oldT);
\r
378 bool NeedsNormalization {
\r
380 return PixelOffsetMode != PixelOffsetMode.Half &&
\r
381 PixelOffsetMode != PixelOffsetMode.HighQuality;
\r
385 static awt.Shape GetNormalizedShape(awt.Shape shape, geom.AffineTransform t) {
\r
386 geom.PathIterator iter = new NormalizingPathIterator(shape.getPathIterator(t));
\r
388 geom.GeneralPath path = new geom.GeneralPath(iter.getWindingRule());
\r
389 path.append(iter, false);
\r
393 void FillScaledShape(Brush paint, awt.Shape shape) {
\r
395 if (!(paint is SolidBrush || paint is HatchBrush) && !_transform.IsIdentity) {
\r
396 m = paint.BrushTransform;
\r
397 paint.BrushMultiplyTransform( _transform );
\r
401 NativeObject.setPaint(paint);
\r
402 NativeObject.fill(shape);
\r
406 paint.BrushTransform = m;
\r
410 internal SizeF MeasureDraw (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format, bool fDraw) {
\r
411 SizeF retVal = new SizeF(0,0);
\r
412 awt.Graphics2D g = NativeObject;
\r
414 java.awt.Font fnt = font.NativeObject;
\r
415 if(s != null && s.Length != 0 && fnt != null) {
\r
416 float size = fnt.getSize();
\r
417 float wid = layoutRectangle.Width;
\r
418 float hei = layoutRectangle.Height;
\r
419 float x = layoutRectangle.X;
\r
420 float y = layoutRectangle.Y;
\r
421 java.text.AttributedString astr = new java.text.AttributedString(s);
\r
422 astr.addAttribute(java.awt.font.TextAttribute.FONT, fnt);
\r
423 java.text.AttributedCharacterIterator prg = astr.getIterator();
\r
424 java.awt.font.TextLayout textlayout = new java.awt.font.TextLayout(prg, g.getFontRenderContext());
\r
425 int prgStart = prg.getBeginIndex();
\r
426 int prgEnd = prg.getEndIndex();
\r
427 java.awt.font.LineBreakMeasurer lineMeasurer = new java.awt.font.LineBreakMeasurer(
\r
428 prg, new java.awt.font.FontRenderContext(null, false, false));
\r
429 lineMeasurer.setPosition(prgStart);
\r
430 float formatWidth = wid;
\r
432 //some vertical layout magic - should be reviewed
\r
433 // if(format != null)
\r
435 // StringFormatFlags formatflag = format.FormatFlags;
\r
436 // if(formatflag != StringFormatFlags.DirectionVertical)
\r
438 // if(size > (float)8 && wid > (float)13)
\r
439 // formatWidth = wid - (float)12;
\r
440 // if(formatflag == StringFormatFlags.DirectionRightToLeft && size == (float)6)
\r
441 // formatWidth = wid - (float)10;
\r
445 //now calculate number of lines and full layout height
\r
446 //this is required for LineAlignment calculations....
\r
449 float layPrevHeight=0;
\r
451 float drawPosY = y;
\r
452 //bool fSkipLastLine = false;
\r
453 java.awt.font.TextLayout layout;
\r
454 java.awt.geom.Rectangle2D bnds = new java.awt.geom.Rectangle2D.Float();
\r
455 while(lineMeasurer.getPosition() < prgEnd) {
\r
456 layout = lineMeasurer.nextLayout(formatWidth);
\r
458 bnds = bnds.createUnion(layout.getBounds());
\r
459 layPrevHeight = layHeight;
\r
460 layHeight += layout.getDescent() + layout.getLeading() + layout.getAscent();
\r
462 if((format != null) &&
\r
463 ((format.FormatFlags & StringFormatFlags.MeasureTrailingSpaces) != 0))
\r
464 advance = layout.getAdvance();
\r
466 advance = layout.getVisibleAdvance();
\r
467 if(layWidth < advance)
\r
468 layWidth = advance;
\r
469 if((format != null) && ((format.FormatFlags & StringFormatFlags.NoWrap) != 0))
\r
472 //Overhanging parts of glyphs, and unwrapped text reaching outside
\r
473 //the formatting rectangle are allowed to show. By default all text
\r
474 //and glyph parts reaching outside the formatting rectangle are clipped.
\r
475 if((lines == 1) &&
\r
476 (format != null) &&
\r
477 ((format.FormatFlags & StringFormatFlags.NoClip) != 0)) {
\r
478 formatWidth = layWidth;
\r
481 //Only entire lines are laid out in the formatting rectangle. By default layout
\r
482 //continues until the end of the text, or until no more lines are visible as a
\r
483 //result of clipping, whichever comes first. Note that the default settings allow
\r
484 //the last line to be partially obscured by a formatting rectangle that is not a
\r
485 //whole multiple of the line height. To ensure that only whole lines are seen, specify
\r
486 //this value and be careful to provide a formatting rectangle at least as tall as the
\r
487 //height of one line.
\r
488 if(format != null && ((format.FormatFlags & StringFormatFlags.LineLimit) != 0) &&
\r
489 layHeight > hei && layPrevHeight < hei) {
\r
490 layHeight = layPrevHeight;
\r
494 retVal.Height = layHeight;
\r
495 retVal.Width = layWidth+size/2.5f;
\r
499 NativeObject.setPaint(brush);
\r
500 g.setRenderingHint(awt.RenderingHints.KEY_TEXT_ANTIALIASING, awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
\r
504 //for draw we should probably update origins
\r
507 if(format != null) {
\r
508 StringAlignment align = format.LineAlignment;
\r
509 if(align == StringAlignment.Center) {
\r
510 drawPosY = y + (float)hei/2 - layHeight/2;
\r
512 else if(align == StringAlignment.Far) {
\r
513 drawPosY = (float)y + (float)hei - layHeight;
\r
515 //in both cases if string is not fit - switch to near
\r
520 //Horisontal... on the fly
\r
521 lineMeasurer.setPosition(prgStart);
\r
522 float drawPosX = x;
\r
523 for(int line = 0;line < lines /*lineMeasurer.getPosition() < prgEnd*/;line++, drawPosY += layout.getDescent() + layout.getLeading()) {
\r
524 layout = lineMeasurer.nextLayout(formatWidth);
\r
525 drawPosX = x + size / (float)5;//???
\r
526 drawPosY += layout.getAscent();
\r
527 if(format != null) {
\r
529 if((format.FormatFlags & StringFormatFlags.MeasureTrailingSpaces) != 0)
\r
530 advance = layout.getAdvance();
\r
532 advance = layout.getVisibleAdvance();
\r
534 if(format.Alignment == StringAlignment.Center) {
\r
535 drawPosX = (float)((double)x + ((double)formatWidth)/2 - advance/2);
\r
537 else if(format.Alignment == StringAlignment.Far) {
\r
538 drawPosX = (float)(drawPosX + formatWidth) - advance;
\r
540 if((format.FormatFlags & StringFormatFlags.DirectionVertical ) != 0) {
\r
541 java.awt.geom.AffineTransform at1 = java.awt.geom.AffineTransform.getTranslateInstance(
\r
542 drawPosX + size / (float)5, (drawPosY - layout.getAscent()) + size / (float)5);
\r
544 at1.rotate(Math.PI/2);
\r
545 awt.Shape sha = textlayout.getOutline(at1);
\r
546 geom.AffineTransform t = GetFinalTransform();
\r
547 if (!t.isIdentity())
\r
548 sha = t.createTransformedShape(sha);
\r
549 //g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
\r
553 if((format.FormatFlags & StringFormatFlags.DirectionRightToLeft) != 0) {
\r
554 drawPosX = ((drawPosX + formatWidth) - advance) + (float)9;
\r
555 layout.draw(g, drawPosX, drawPosY);
\r
559 geom.AffineTransform oldT = null;
\r
560 geom.AffineTransform ft = GetFinalTransform();
\r
562 //Draw current line
\r
564 if (!ft.isIdentity()) {
\r
565 oldT = NativeObject.getTransform();
\r
566 NativeObject.transform(ft);
\r
568 layout.draw(g, drawPosX, drawPosY);
\r
572 NativeObject.setTransform(oldT);
\r
582 public void Dispose() {
\r
583 NativeObject.dispose();
\r
588 public void Clear (Color color) {
\r
589 FillScaledShape(new SolidBrush( color ), _clip.NativeObject);
\r
594 public void DrawArc (Pen pen, Rectangle rect, float startAngle, float sweepAngle) {
\r
605 public void DrawArc (Pen pen, RectangleF rect, float startAngle, float sweepAngle) {
\r
615 public void DrawArc (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
622 (float)sweepAngle);
\r
625 public void DrawArc (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
626 GraphicsPath path = new GraphicsPath();
\r
627 path.AddArc(x, y, width, height, startAngle, sweepAngle);
\r
628 DrawPath(pen, path);
\r
632 #region DrawBezier(s)
\r
633 public void DrawBezier (Pen pen, PointF pt1, PointF pt2, PointF pt3, PointF pt4) {
\r
634 DrawBezier(pen, pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);
\r
637 public void DrawBezier (Pen pen, Point pt1, Point pt2, Point pt3, Point pt4) {
\r
638 DrawBezier(pen, pt1.X, pt1.Y, pt2.X, pt2.Y, pt3.X, pt3.Y, pt4.X, pt4.Y);
\r
641 public void DrawBezier (Pen pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) {
\r
642 geom.GeneralPath path = new geom.GeneralPath();
\r
643 path.moveTo(x1,y1);
\r
644 path.curveTo(x2,y2,x3,y3,x4,y4);
\r
645 DrawShape(pen, path);
\r
648 public void DrawBeziers (Pen pen, Point [] points) {
\r
649 GraphicsPath path = new GraphicsPath();
\r
650 path.AddBeziers(points);
\r
651 DrawPath(pen, path);
\r
654 public void DrawBeziers (Pen pen, PointF [] points) {
\r
655 GraphicsPath path = new GraphicsPath();
\r
656 path.AddBeziers(points);
\r
657 DrawPath(pen, path);
\r
661 #region DrawClosedCurve
\r
662 public void DrawClosedCurve (Pen pen, PointF [] points) {
\r
663 DrawClosedCurve(pen, points, 0.5f, FillMode.Alternate);
\r
666 public void DrawClosedCurve (Pen pen, Point [] points) {
\r
667 DrawClosedCurve(pen, points, 0.5f, FillMode.Alternate);
\r
670 public void DrawClosedCurve (Pen pen, Point [] points, float tension, FillMode fillmode) {
\r
671 GraphicsPath path = new GraphicsPath(fillmode);
\r
672 path.AddClosedCurve(points, tension);
\r
673 DrawPath(pen, path);
\r
676 public void DrawClosedCurve (Pen pen, PointF [] points, float tension, FillMode fillmode) {
\r
677 GraphicsPath path = new GraphicsPath(fillmode);
\r
678 path.AddClosedCurve(points, tension);
\r
679 DrawPath(pen, path);
\r
684 public void DrawCurve (Pen pen, Point [] points) {
\r
685 DrawCurve(pen, points, 0.5f);
\r
688 public void DrawCurve (Pen pen, PointF [] points) {
\r
689 DrawCurve(pen, points, 0.5f);
\r
692 public void DrawCurve (Pen pen, PointF [] points, float tension) {
\r
693 DrawCurve(pen, points, 0, points.Length-1, tension);
\r
696 public void DrawCurve (Pen pen, Point [] points, float tension) {
\r
697 DrawCurve(pen, points, 0, points.Length-1, tension);
\r
701 public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments) {
\r
702 DrawCurve(pen, points, offset, numberOfSegments, 0.5f);
\r
705 public void DrawCurve (Pen pen, Point [] points, int offset, int numberOfSegments, float tension) {
\r
706 GraphicsPath path = new GraphicsPath();
\r
707 path.AddCurve(points, offset, numberOfSegments, tension);
\r
708 DrawPath(pen, path);
\r
712 public void DrawCurve (Pen pen, PointF [] points, int offset, int numberOfSegments, float tension) {
\r
713 GraphicsPath path = new GraphicsPath();
\r
714 path.AddCurve(points, offset, numberOfSegments, tension);
\r
715 DrawPath(pen, path);
\r
719 #region DrawEllipse
\r
720 public void DrawEllipse (Pen pen, Rectangle rect) {
\r
721 DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
\r
724 public void DrawEllipse (Pen pen, RectangleF rect) {
\r
725 DrawEllipse (pen, rect.X, rect.Y, rect.Width, rect.Height);
\r
728 public void DrawEllipse (Pen pen, int x, int y, int width, int height) {
\r
729 DrawEllipse(pen,(float)x,(float)y,(float)width,(float)height);
\r
732 public void DrawEllipse (Pen pen, float x, float y, float width, float height) {
\r
733 DrawShape(pen, new geom.Ellipse2D.Float(x,y,width,height));
\r
738 public void DrawIcon (Icon icon, Rectangle targetRect) {
\r
739 Bitmap b = icon.ToBitmap ();
\r
740 this.DrawImage (b, targetRect);
\r
743 public void DrawIcon (Icon icon, int x, int y) {
\r
744 Bitmap b = icon.ToBitmap ();
\r
745 this.DrawImage (b, x, y);
\r
748 public void DrawIconUnstretched (Icon icon, Rectangle targetRect) {
\r
749 Bitmap b = icon.ToBitmap ();
\r
750 this.DrawImageUnscaled (b, targetRect);
\r
756 public void DrawImage (Image image, Point point) {
\r
757 DrawImage(image, point.X, point.Y);
\r
760 public void DrawImage (Image image, PointF point) {
\r
761 DrawImage(image, point.X, point.Y);
\r
765 public void DrawImage (Image image, Point [] destPoints) {
\r
766 Matrix m = new Matrix(new Rectangle(0, 0, image.Width, image.Height), destPoints);
\r
767 DrawImage(image, m);
\r
770 public void DrawImage (Image image, PointF [] destPoints) {
\r
771 Matrix m = new Matrix(new RectangleF(0, 0, image.Width, image.Height), destPoints);
\r
772 DrawImage(image, m);
\r
776 public void DrawImage (Image image, Rectangle rect) {
\r
777 DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
\r
780 public void DrawImage (Image image, RectangleF rect) {
\r
781 DrawImage(image, rect.X, rect.Y, rect.Width, rect.Height);
\r
785 public void DrawImage (Image image, int x, int y) {
\r
786 DrawImage(image, (float)x, (float)y);
\r
789 public void DrawImage (Image image, float x, float y) {
\r
790 if ((image.HorizontalResolution != DpiX) || (image.VerticalResolution != DpiY))
\r
791 DrawImage( image, x, y,
\r
792 (float)image.Width * (DpiX / image.HorizontalResolution) / _unitConversion[(int)PageUnit],
\r
793 (float)image.Height * (DpiY / image.VerticalResolution) / _unitConversion[(int)PageUnit]) ;
\r
795 DrawImage( image, x, y,
\r
796 (float)image.Width / _unitConversion[(int)PageUnit],
\r
797 (float)image.Height / _unitConversion[(int)PageUnit] );
\r
801 public void DrawImage (Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit) {
\r
805 new Point( destRect.X, destRect.Y),
\r
806 new Point( destRect.X + destRect.Width, destRect.Y),
\r
807 new Point( destRect.X, destRect.Y + destRect.Height)},
\r
812 public void DrawImage (Image image, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit) {
\r
816 new PointF( destRect.X, destRect.Y),
\r
817 new PointF( destRect.X + destRect.Width, destRect.Y),
\r
818 new PointF( destRect.X, destRect.Y + destRect.Height)},
\r
824 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit) {
\r
825 DrawImage(image, destPoints, srcRect, srcUnit, null);
\r
828 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit) {
\r
829 DrawImage(image, destPoints, srcRect, srcUnit, null);
\r
833 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
834 //TBD: ImageAttributes
\r
835 if (srcUnit != GraphicsUnit.Pixel)
\r
836 throw new NotImplementedException();
\r
837 // Like in .NET http://dotnet247.com/247reference/msgs/45/227979.aspx
\r
839 Matrix mx = new Matrix(srcRect, destPoints);
\r
841 Region region = new Region(srcRect);
\r
842 DrawImage(image, mx, region);
\r
845 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
846 //TBD: ImageAttributes
\r
847 if (srcUnit != GraphicsUnit.Pixel)
\r
848 throw new NotImplementedException();
\r
849 // Like in .NET http://dotnet247.com/247reference/msgs/45/227979.aspx
\r
851 Matrix mx = new Matrix(srcRect, destPoints);
\r
853 Region region = new Region(srcRect);
\r
854 DrawImage(image, mx, region);
\r
858 public void DrawImage (Image image, int x, int y, int width, int height) {
\r
859 DrawImage(image, (float)x, (float)y, (float)width, (float)height);
\r
862 public void DrawImage (Image image, float x, float y, float width, float height) {
\r
863 Matrix mx = new Matrix();
\r
864 mx.Translate((float)x, (float)y);
\r
865 mx.Scale(width / (float)image.Width, height / (float)image.Height);
\r
867 DrawImage( image, mx );
\r
871 public void DrawImage (Image image, int x, int y, Rectangle srcRect, GraphicsUnit srcUnit) {
\r
872 DrawImage(image, new Rectangle(x, y, srcRect.Width, srcRect.Height), srcRect, srcUnit);
\r
875 public void DrawImage (Image image, float x, float y, RectangleF srcRect, GraphicsUnit srcUnit) {
\r
876 DrawImage(image, new RectangleF(x, y, srcRect.Width, srcRect.Height), srcRect, srcUnit);
\r
880 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit) {
\r
881 DrawImage(image, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, null);
\r
884 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit) {
\r
885 DrawImage(image, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, null);
\r
889 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
894 new Rectangle(srcX, srcY, srcWidth, srcHeight),
\r
898 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs) {
\r
903 new RectangleF(srcX, srcY, srcWidth, srcHeight),
\r
908 internal void DrawImage (Image image, Matrix m) {
\r
909 DrawImage(image, m, null);
\r
912 internal void DrawImage (Image image, Matrix m, Region clip) {
\r
913 if (clip == null) {
\r
914 clip = new Region( new RectangleF( 0, 0, image.Width, image.Height ) );
\r
917 geom.AffineTransform t = GetFinalTransform(_transform.NativeObject, PageUnit, 1.0f);
\r
918 if (!t.isIdentity())
\r
919 m.NativeObject.preConcatenate(t);
\r
921 clip.Transform( m );
\r
923 if (NeedsNormalization) {
\r
924 Matrix normMatrix = ComputeClipNormalization(clip.GetBounds(this));
\r
925 clip.Transform(normMatrix);
\r
928 awt.Shape oldClip = NativeObject.getClip();
\r
929 IntersectScaledClipWithBase(clip);
\r
932 Matrix mm = ComputeImageNormalization(image, m);
\r
933 NativeObject.drawImage(image.NativeObject.CurrentImage.NativeImage, mm.NativeObject, null);
\r
936 NativeObject.setClip( oldClip );
\r
940 private static Matrix ComputeImageNormalization(Image img, Matrix m) {
\r
941 if ( m.IsIdentity )
\r
944 //m.Translate( -(m.Elements[0] + m.Elements[2]) / 2.0f, -(m.Elements[3] + m.Elements[1]) / 2.0f, MatrixOrder.Append);
\r
946 -(float)(m.NativeObject.getScaleX() + m.NativeObject.getShearX()) / 2.0f,
\r
947 -(float)(m.NativeObject.getScaleY() + m.NativeObject.getShearY()) / 2.0f, MatrixOrder.Append);
\r
949 PointF [] p = new PointF[] {
\r
950 new PointF( 0, 0 ),
\r
951 new PointF( img.Width, 0 ),
\r
952 new PointF( 0, img.Height )};
\r
954 m.TransformPoints(p);
\r
955 for (int i=0; i < p.Length; i++) {
\r
956 p[i].X = (float)( p[i].X + 0.5f );
\r
957 p[i].Y = (float)( p[i].Y + 0.5f );
\r
960 return new Matrix( new Rectangle(0, 0, img.Width, img.Height), p );
\r
962 private static Matrix ComputeClipNormalization(RectangleF rect) {
\r
963 PointF [] p = new PointF[] {
\r
964 new PointF( rect.X, rect.Y ),
\r
965 new PointF( rect.X + rect.Width, rect.Y ),
\r
966 new PointF( rect.X, rect.Y + rect.Height )};
\r
968 for (int i=0; i < p.Length; i++) {
\r
969 p[i].X = (float)Math.Round( p[i].X + 0.5f ) + 0.5f;
\r
970 p[i].Y = (float)Math.Round( p[i].Y + 0.5f ) + 0.5f;
\r
973 return new Matrix( rect, p );
\r
978 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
980 throw new NotImplementedException();
\r
984 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
987 throw new NotImplementedException();
\r
991 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
\r
993 throw new NotImplementedException();
\r
997 #if INTPTR_SUPPORT
\r
998 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
\r
1000 throw new NotImplementedException();
\r
1004 #if INTPTR_SUPPORT
\r
1005 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1007 //TBD:units,attributes, callback
\r
1008 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1009 g.drawImage(image.NativeObject,destRect.X,destRect.Y,destRect.Width,destRect.Height,srcX,srcY,srcWidth,srcHeight,null);
\r
1012 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1014 //TBD:units,attributes, callback
\r
1015 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1016 g.drawImage(image.NativeObject,
\r
1019 (int)destRect.Width,
\r
1020 (int)destRect.Height,
\r
1024 (int)srcHeight,null);
\r
1027 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
\r
1029 //TBD:units,attributes, callback
\r
1030 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1031 g.drawImage(image.NativeObject,
\r
1034 (int)destRect.Width,
\r
1035 (int)destRect.Height,
\r
1039 (int)srcHeight,null);
\r
1042 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
\r
1044 //TBD:units,attributes, callback
\r
1045 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1046 g.drawImage(image.NativeObject,
\r
1058 public void DrawImageUnscaled (Image image, Point point)
\r
1060 DrawImageUnscaled (image, point.X, point.Y);
\r
1063 public void DrawImageUnscaled (Image image, Rectangle rect) {
\r
1064 DrawImageUnscaled (image, rect.X, rect.Y, rect.Width, rect.Height);
\r
1067 public void DrawImageUnscaled (Image image, int x, int y) {
\r
1068 DrawImage (image, x, y, image.Width, image.Height);
\r
1071 public void DrawImageUnscaled (Image image, int x, int y, int width, int height) {
\r
1072 Image tmpImg = new Bitmap (width, height);
\r
1073 Graphics g = FromImage (tmpImg);
\r
1074 g.DrawImage (image, 0, 0, image.Width, image.Height);
\r
1075 this.DrawImage (tmpImg, x, y, width, height);
\r
1076 tmpImg.Dispose ();
\r
1082 public void DrawLine (Pen pen, PointF pt1, PointF pt2) {
\r
1083 DrawLine(pen,pt1.X,pt1.Y,pt2.X,pt2.Y);
\r
1086 public void DrawLine (Pen pen, Point pt1, Point pt2) {
\r
1087 DrawLine(pen,(float)pt1.X,(float)pt1.Y,(float)pt2.X,(float)pt2.Y);
\r
1090 public void DrawLine (Pen pen, int x1, int y1, int x2, int y2) {
\r
1091 DrawLine(pen,(float)x1,(float)y1,(float)x2,(float)y2);
\r
1094 public void DrawLine (Pen pen, float x1, float y1, float x2, float y2) {
\r
1095 DrawShape(pen, new geom.Line2D.Float(x1,y1,x2,y2));
\r
1098 public void DrawLines (Pen pen, PointF [] points) {
\r
1099 GraphicsPath path = new GraphicsPath();
\r
1100 path.AddLines(points);
\r
1101 DrawShape(pen, path);
\r
1104 public void DrawLines (Pen pen, Point [] points) {
\r
1105 GraphicsPath path = new GraphicsPath();
\r
1106 path.AddLines(points);
\r
1107 DrawShape(pen, path);
\r
1112 public void DrawPath (Pen pen, GraphicsPath path) {
\r
1113 DrawShape(pen, path);
\r
1118 public void DrawPie (Pen pen, Rectangle rect, float startAngle, float sweepAngle) {
\r
1119 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
\r
1122 public void DrawPie (Pen pen, RectangleF rect, float startAngle, float sweepAngle) {
\r
1123 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
\r
1126 public void DrawPie (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
1127 GraphicsPath path = new GraphicsPath();
\r
1128 path.AddPie(x, y, width, height, startAngle, sweepAngle);
\r
1129 DrawPath(pen, path);
\r
1132 public void DrawPie (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
1133 DrawPie(pen,(float)x,(float)y,(float)width,(float)height,(float)startAngle,(float)sweepAngle);
\r
1137 #region DrawPolygon
\r
1138 public void DrawPolygon (Pen pen, Point [] points) {
\r
1139 GraphicsPath path = new GraphicsPath();
\r
1140 path.AddPolygon(points);
\r
1141 DrawPath(pen, path);
\r
1144 public void DrawPolygon (Pen pen, PointF [] points) {
\r
1145 GraphicsPath path = new GraphicsPath();
\r
1146 path.AddPolygon(points);
\r
1147 DrawPath(pen, path);
\r
1151 #region DrawRectangle(s)
\r
1152 internal void DrawRectangle (Pen pen, RectangleF rect) {
\r
1153 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1156 public void DrawRectangle (Pen pen, Rectangle rect) {
\r
1157 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1160 public void DrawRectangle (Pen pen, float x, float y, float width, float height) {
\r
1161 DrawShape(pen, new geom.Rectangle2D.Float(x,y,width,height));
\r
1164 public void DrawRectangle (Pen pen, int x, int y, int width, int height) {
\r
1165 DrawRectangle (pen,(float) x,(float) y,(float) width,(float) height);
\r
1168 public void DrawRectangles (Pen pen, RectangleF [] rects) {
\r
1169 foreach(RectangleF r in rects)
\r
1170 DrawRectangle (pen, r.Left, r.Top, r.Width, r.Height);
\r
1173 public void DrawRectangles (Pen pen, Rectangle [] rects) {
\r
1174 foreach(Rectangle r in rects)
\r
1175 DrawRectangle (pen, r.Left, r.Top, r.Width, r.Height);
\r
1179 #region DrawString
\r
1180 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle) {
\r
1181 DrawString(s, font, brush, layoutRectangle.X, layoutRectangle.Y, layoutRectangle.Width, layoutRectangle.Height, null);
\r
1184 public void DrawString (string s, Font font, Brush brush, PointF point) {
\r
1185 DrawString(s, font, brush, point.X, point.Y, float.PositiveInfinity, float.PositiveInfinity, null);
\r
1188 public void DrawString (string s, Font font, Brush brush, PointF point, StringFormat format) {
\r
1189 DrawString(s, font, brush, point.X, point.Y, float.PositiveInfinity, float.PositiveInfinity, format);
\r
1192 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format) {
\r
1193 DrawString(s, font, brush, layoutRectangle.X, layoutRectangle.Y, layoutRectangle.Width, layoutRectangle.Height, format);
\r
1196 public void DrawString (string s, Font font, Brush brush, float x, float y) {
\r
1197 DrawString(s, font, brush, x, y, float.PositiveInfinity, float.PositiveInfinity, null);
\r
1200 public void DrawString (string s, Font font, Brush brush, float x, float y, StringFormat format) {
\r
1201 DrawString(s, font, brush, x, y, float.PositiveInfinity, float.PositiveInfinity, format);
\r
1204 void DrawString (string s, Font font, Brush brush,
\r
1205 float x, float y, float width, float height,
\r
1206 StringFormat format) {
\r
1207 if (brush == null)
\r
1208 throw new ArgumentNullException("brush");
\r
1211 throw new ArgumentNullException("font");
\r
1213 if (format != null && format.LineAlignment != StringAlignment.Near) {
\r
1215 SizeF sizeF = MeasureString(s, font, format, width, height, null);
\r
1217 float lineAWidth = width;
\r
1218 float lineAHeight = height;
\r
1220 if (float.IsPositiveInfinity(width))
\r
1221 lineAWidth = lineAHeight = 0;
\r
1223 float wdelta = format.IsVertical ? lineAWidth - sizeF.Width : lineAHeight - sizeF.Height;
\r
1224 float pdelta = format.LineAlignment == StringAlignment.Center ? wdelta/2 : wdelta;
\r
1225 if (format.IsVertical) {
\r
1226 if (!(format.IsRightToLeft && format.LineAlignment == StringAlignment.Far))
\r
1228 if (!float.IsPositiveInfinity(width))
\r
1233 if (!float.IsPositiveInfinity(width))
\r
1238 awt.Paint oldP = NativeObject.getPaint();
\r
1239 NativeObject.setPaint(brush);
\r
1241 geom.AffineTransform oldT = NativeObject.getTransform();
\r
1242 NativeObject.transform(GetFinalTransform());
\r
1245 bool noclip = float.IsPositiveInfinity(width) || (format != null && format.NoClip);
\r
1247 awt.Shape oldClip = null;
\r
1249 oldClip = NativeObject.getClip();
\r
1250 NativeObject.clip(new geom.Rectangle2D.Float(x, y, width, height));
\r
1253 TextLineIterator iter = new TextLineIterator(s, font, NativeObject.getFontRenderContext(), format, width, height);
\r
1254 NativeObject.transform(iter.Transform);
\r
1255 for (LineLayout layout = iter.NextLine(); layout != null; layout = iter.NextLine()) {
\r
1256 layout.Draw(NativeObject, x, y);
\r
1261 NativeObject.setClip(oldClip);
\r
1265 NativeObject.setTransform(oldT);
\r
1269 NativeObject.setPaint(oldP);
\r
1276 void PushGraphicsState(GraphicsState state) {
\r
1277 state.Next = _nextGraphicsState;
\r
1278 _nextGraphicsState = state;
\r
1281 GraphicsState PopGraphicsState() {
\r
1282 GraphicsState state = _nextGraphicsState;
\r
1283 _nextGraphicsState = _nextGraphicsState.Next;
\r
1287 bool ContainsGraphicsState(GraphicsState state) {
\r
1288 GraphicsState gs = _nextGraphicsState;
\r
1290 while(gs != null) {
\r
1300 public void EndContainer (GraphicsContainer container) {
\r
1301 Restore(container.StateObject);
\r
1304 public GraphicsContainer BeginContainer () {
\r
1305 return new GraphicsContainer(Save(Matrix.IdentityTransform, true));
\r
1308 public GraphicsContainer BeginContainer (Rectangle dstrect, Rectangle srcrect, GraphicsUnit unit) {
\r
1309 Matrix containerTransfrom =
\r
1310 new Matrix( srcrect,
\r
1311 new Point [] { new Point (dstrect.X, dstrect.Y),
\r
1312 new Point (dstrect.X + dstrect.Width, dstrect.Y),
\r
1313 new Point (dstrect.X, dstrect.Y + dstrect.Height) });
\r
1315 float scale = _unitConversion[ (int)PageUnit ] / _unitConversion[ (int)unit ];
\r
1316 containerTransfrom.Scale(scale, scale);
\r
1318 return new GraphicsContainer(Save(containerTransfrom, true));
\r
1322 public GraphicsContainer BeginContainer (RectangleF dstrect, RectangleF srcrect, GraphicsUnit unit) {
\r
1323 Matrix containerTransfrom =
\r
1324 new Matrix( srcrect,
\r
1325 new PointF [] { new PointF (dstrect.X, dstrect.Y),
\r
1326 new PointF (dstrect.X + dstrect.Width, dstrect.Y),
\r
1327 new PointF (dstrect.X, dstrect.Y + dstrect.Height) });
\r
1329 float scale = _unitConversion[ (int)PageUnit ] / _unitConversion[ (int)unit ];
\r
1330 containerTransfrom.Scale(scale, scale);
\r
1332 return new GraphicsContainer(Save(containerTransfrom, true));
\r
1335 GraphicsState Save(Matrix matrix, bool resetState) {
\r
1336 GraphicsState graphicsState = new GraphicsState(this, matrix, resetState);
\r
1338 PushGraphicsState( graphicsState );
\r
1339 return graphicsState;
\r
1342 public GraphicsState Save () {
\r
1343 return Save(Matrix.IdentityTransform, false);
\r
1346 public void Restore (GraphicsState graphicsState) {
\r
1347 if (ContainsGraphicsState(graphicsState)) {
\r
1348 GraphicsState gs = PopGraphicsState();
\r
1349 while ( gs != graphicsState )
\r
1350 gs = PopGraphicsState();
\r
1352 graphicsState.RestoreState(this);
\r
1358 #region Metafiles Staff [TODO NotSupp]
\r
1359 public void AddMetafileComment (byte [] data) {
\r
1360 throw new NotImplementedException ();
\r
1363 #if INTPTR_SUPPORT
\r
1364 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback)
\r
1366 throw new NotImplementedException ();
\r
1369 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback)
\r
1371 throw new NotImplementedException ();
\r
1374 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback)
\r
1376 throw new NotImplementedException ();
\r
1379 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback)
\r
1381 throw new NotImplementedException ();
\r
1384 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback)
\r
1386 throw new NotImplementedException ();
\r
1389 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback)
\r
1391 throw new NotImplementedException ();
\r
1394 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1396 throw new NotImplementedException ();
\r
1399 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1401 throw new NotImplementedException ();
\r
1404 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1406 throw new NotImplementedException ();
\r
1409 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1411 throw new NotImplementedException ();
\r
1414 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1416 throw new NotImplementedException ();
\r
1419 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1421 throw new NotImplementedException ();
\r
1424 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1426 throw new NotImplementedException ();
\r
1429 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1431 throw new NotImplementedException ();
\r
1434 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1436 throw new NotImplementedException ();
\r
1439 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1441 throw new NotImplementedException ();
\r
1444 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1446 throw new NotImplementedException ();
\r
1449 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1451 throw new NotImplementedException ();
\r
1454 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1456 throw new NotImplementedException ();
\r
1459 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1461 throw new NotImplementedException ();
\r
1464 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1466 throw new NotImplementedException ();
\r
1469 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1471 throw new NotImplementedException ();
\r
1474 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1476 throw new NotImplementedException ();
\r
1479 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1481 throw new NotImplementedException ();
\r
1484 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1486 throw new NotImplementedException ();
\r
1489 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1491 throw new NotImplementedException ();
\r
1494 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1496 throw new NotImplementedException ();
\r
1499 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1501 throw new NotImplementedException ();
\r
1504 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1506 throw new NotImplementedException ();
\r
1509 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1511 throw new NotImplementedException ();
\r
1514 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1516 throw new NotImplementedException ();
\r
1519 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1521 throw new NotImplementedException ();
\r
1524 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1526 throw new NotImplementedException ();
\r
1529 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1531 throw new NotImplementedException ();
\r
1534 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1536 throw new NotImplementedException ();
\r
1539 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1541 throw new NotImplementedException ();
\r
1546 #region ExcludeClip
\r
1547 void ExcludeClip(geom.Area area) {
\r
1549 geom.AffineTransform t = GetFinalTransform();
\r
1550 if (!t.isIdentity()) {
\r
1551 area = (geom.Area)area.clone();
\r
1552 area.transform(t);
\r
1555 _clip.NativeObject.subtract(area);
\r
1556 RestoreBaseClip();
\r
1557 NativeObject.clip(_clip);
\r
1560 public void ExcludeClip (Rectangle rect) {
\r
1561 ExcludeClip(new geom.Area(rect.NativeObject));
\r
1564 public void ExcludeClip (Region region) {
\r
1565 if (region == null)
\r
1566 throw new ArgumentNullException("region");
\r
1567 ExcludeClip(region.NativeObject);
\r
1571 #region FillClosedCurve
\r
1572 public void FillClosedCurve (Brush brush, PointF [] points) {
\r
1573 FillClosedCurve (brush, points, FillMode.Alternate);
\r
1577 public void FillClosedCurve (Brush brush, Point [] points) {
\r
1578 FillClosedCurve (brush, points, FillMode.Alternate);
\r
1582 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode) {
\r
1583 FillClosedCurve (brush, points, fillmode, 0.5f);
\r
1586 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode) {
\r
1587 FillClosedCurve (brush, points, fillmode, 0.5f);
\r
1590 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode, float tension) {
\r
1591 GraphicsPath path = new GraphicsPath(fillmode);
\r
1592 path.AddClosedCurve(points, tension);
\r
1593 FillPath(brush, path);
\r
1596 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode, float tension) {
\r
1597 GraphicsPath path = new GraphicsPath(fillmode);
\r
1598 path.AddClosedCurve(points, tension);
\r
1599 FillPath(brush, path);
\r
1603 #region FillEllipse
\r
1604 public void FillEllipse (Brush brush, Rectangle rect) {
\r
1605 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
\r
1608 public void FillEllipse (Brush brush, RectangleF rect) {
\r
1609 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
\r
1612 public void FillEllipse (Brush brush, float x, float y, float width, float height) {
\r
1613 FillShape(brush,new java.awt.geom.Ellipse2D.Float(x,y,width,height));
\r
1616 public void FillEllipse (Brush brush, int x, int y, int width, int height) {
\r
1617 FillEllipse (brush,(float)x,(float)y,(float)width,(float)height);
\r
1622 public void FillPath (Brush brush, GraphicsPath path) {
\r
1624 throw new ArgumentNullException("path");
\r
1626 FillShape(brush,path);
\r
1631 public void FillPie (Brush brush, Rectangle rect, float startAngle, float sweepAngle) {
\r
1632 FillPie(brush,(float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height,(float)startAngle,(float)sweepAngle);
\r
1635 public void FillPie (Brush brush, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
1636 FillPie(brush,(float)x,(float)y,(float)width,(float)height,(float)startAngle,(float)sweepAngle);
\r
1639 public void FillPie (Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
1640 GraphicsPath path = new GraphicsPath();
\r
1641 path.AddPie(x, y, width, height, startAngle, sweepAngle);
\r
1642 FillPath(brush, path);
\r
1646 #region FillPolygon
\r
1647 public void FillPolygon (Brush brush, PointF [] points) {
\r
1648 FillPolygon(brush, points, FillMode.Alternate);
\r
1651 public void FillPolygon (Brush brush, Point [] points) {
\r
1652 FillPolygon(brush, points, FillMode.Alternate);
\r
1655 public void FillPolygon (Brush brush, Point [] points, FillMode fillMode) {
\r
1656 GraphicsPath path = new GraphicsPath(fillMode);
\r
1657 path.AddPolygon(points);
\r
1658 FillPath(brush,path);
\r
1661 public void FillPolygon (Brush brush, PointF [] points, FillMode fillMode) {
\r
1662 GraphicsPath path = new GraphicsPath(fillMode);
\r
1663 path.AddPolygon(points);
\r
1664 FillPath(brush,path);
\r
1668 #region FillRectangle
\r
1669 public void FillRectangle (Brush brush, RectangleF rect) {
\r
1670 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1673 public void FillRectangle (Brush brush, Rectangle rect) {
\r
1674 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1677 public void FillRectangle (Brush brush, int x, int y, int width, int height) {
\r
1678 FillRectangle(brush,(float)x,(float)y,(float)width,(float)height);
\r
1681 public void FillRectangle (Brush brush, float x, float y, float width, float height) {
\r
1682 FillShape(brush,new java.awt.geom.Rectangle2D.Float(x,y,width,height));
\r
1685 public void FillRectangles (Brush brush, Rectangle [] rects) {
\r
1686 GraphicsPath path = new GraphicsPath();
\r
1687 path.AddRectangles(rects);
\r
1688 FillPath(brush,path);
\r
1691 public void FillRectangles (Brush brush, RectangleF [] rects) {
\r
1692 GraphicsPath path = new GraphicsPath();
\r
1693 path.AddRectangles(rects);
\r
1694 FillPath(brush,path);
\r
1698 #region FillRegion
\r
1699 public void FillRegion (Brush brush, Region region) {
\r
1700 FillShape(brush,region);
\r
1705 public void Flush () {
\r
1706 Flush (FlushIntention.Flush);
\r
1710 public void Flush (FlushIntention intention) {
\r
1711 if (_image != null)
\r
1712 _image.NativeObject.CurrentImage.NativeImage.flush();
\r
1715 #if INTPTR_SUPPORTED
\r
1716 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1717 public void ReleaseHdc (IntPtr hdc)
\r
1719 throw new NotImplementedException();
\r
1722 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1723 public void ReleaseHdcInternal (IntPtr hdc)
\r
1725 throw new NotImplementedException ();
\r
1728 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1729 public static Graphics FromHdc (IntPtr hdc)
\r
1731 throw new NotImplementedException();
\r
1734 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1735 public static Graphics FromHdc (IntPtr hdc, IntPtr hdevice)
\r
1737 throw new NotImplementedException ();
\r
1740 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1741 public static Graphics FromHdcInternal (IntPtr hdc)
\r
1743 throw new NotImplementedException ();
\r
1746 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1747 public static Graphics FromHwnd (IntPtr hwnd)
\r
1749 throw new NotImplementedException();
\r
1752 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1753 public static Graphics FromHwndInternal (IntPtr hwnd)
\r
1755 throw new NotImplementedException ();
\r
1758 internal static Graphics FromXDrawable (IntPtr drawable, IntPtr display)
\r
1760 throw new NotImplementedException();
\r
1763 public static IntPtr GetHalftonePalette ()
\r
1765 throw new NotImplementedException ();
\r
1768 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1769 public IntPtr GetHdc ()
\r
1771 throw new NotImplementedException();
\r
1775 #region GetNearestColor [TODO]
\r
1776 public Color GetNearestColor (Color color) {
\r
1777 throw new NotImplementedException();
\r
1781 #region IntersectClip
\r
1782 void IntersectClip (geom.Area area) {
\r
1784 geom.AffineTransform t = GetFinalTransform();
\r
1785 if (!t.isIdentity()) {
\r
1786 area = (geom.Area)area.clone();
\r
1787 area.transform(t);
\r
1790 _clip.NativeObject.intersect(area);
\r
1791 RestoreBaseClip();
\r
1792 NativeObject.clip(_clip);
\r
1795 public void IntersectClip (Region region) {
\r
1796 if (region == null)
\r
1797 throw new ArgumentNullException("region");
\r
1799 IntersectClip(region.NativeObject);
\r
1802 public void IntersectClip (RectangleF rect) {
\r
1803 IntersectClip(new geom.Area(rect.NativeObject));
\r
1806 public void IntersectClip (Rectangle rect) {
\r
1807 IntersectClip(new geom.Area(rect.NativeObject));
\r
1812 public bool IsVisible (Point point) {
\r
1813 return IsVisible(point.X,point.Y);
\r
1817 public bool IsVisible (RectangleF rect) {
\r
1818 return IsVisible ((float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height);
\r
1821 public bool IsVisible (PointF point) {
\r
1822 return IsVisible(point.X,point.Y);
\r
1825 public bool IsVisible (Rectangle rect) {
\r
1826 return IsVisible ((float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height);
\r
1829 public bool IsVisible (float x, float y) {
\r
1832 geom.AffineTransform t = GetFinalTransform();
\r
1833 if (!t.isIdentity()) {
\r
1834 double[] p = new double[] {dx, dy};
\r
1835 t.transform(p, 0, p, 0, 1);
\r
1840 if (!_clip.NativeObject.contains(dx, dy))
\r
1843 awt.Shape clip = NativeObject.getClip();
\r
1847 return clip.contains(dx, dy);
\r
1850 public bool IsVisible (int x, int y) {
\r
1851 return IsVisible ((float)x,(float)y);
\r
1854 public bool IsVisible (float x, float y, float width, float height) {
\r
1856 geom.AffineTransform t = GetFinalTransform();
\r
1857 geom.Rectangle2D r = new geom.Rectangle2D.Float(x, y, width, height);
\r
1859 if (!t.isIdentity())
\r
1860 r = t.createTransformedShape(r).getBounds2D();
\r
1862 return NativeObject.hitClip(
\r
1863 (int)(r.getX()+0.5), (int)(r.getY()+0.5),
\r
1864 (int)(r.getWidth()+0.5), (int)(r.getHeight()+0.5))
\r
1865 && _clip.NativeObject.intersects(r);
\r
1869 public bool IsVisible (int x, int y, int width, int height) {
\r
1870 return IsVisible ((float)x,(float)y,(float)width,(float)height);
\r
1874 #region MeasureCharacterRanges
\r
1875 public Region [] MeasureCharacterRanges (string text, Font font, RectangleF layoutRect, StringFormat stringFormat) {
\r
1876 if (stringFormat == null)
\r
1877 throw new ArgumentException("stringFormat");
\r
1879 CharacterRange[] ranges = stringFormat.CharRanges;
\r
1880 if (ranges == null || ranges.Length == 0)
\r
1881 return new Region[0];
\r
1883 GraphicsPath[] pathes = new GraphicsPath[ranges.Length];
\r
1884 for (int i = 0; i < pathes.Length; i++)
\r
1885 pathes[i] = new GraphicsPath();
\r
1887 TextLineIterator iter = new TextLineIterator(text, font, NativeObject.getFontRenderContext(),
\r
1888 stringFormat, layoutRect.Width, layoutRect.Height);
\r
1890 for (LineLayout layout = iter.NextLine(); layout != null; layout = iter.NextLine()) {
\r
1892 for (int i = 0; i < ranges.Length; i++) {
\r
1893 int start = ranges[i].First;
\r
1894 int length = ranges[i].Length;
\r
1895 start -= iter.CharsConsumed;
\r
1896 int limit = start + length;
\r
1897 int layoutStart = iter.CurrentPosition - layout.CharacterCount;
\r
1898 if (start < iter.CurrentPosition && limit > layoutStart) {
\r
1900 float layoutOffset;
\r
1901 if (start > layoutStart)
\r
1902 layoutOffset = iter.GetAdvanceBetween(layoutStart, start);
\r
1905 start = layoutStart;
\r
1908 float width = (limit < iter.CurrentPosition) ?
\r
1909 iter.GetAdvanceBetween(start, limit) :
\r
1910 layout.Width - layoutOffset;
\r
1912 float height = layout.Ascent + layout.Descent;
\r
1914 float x = layout.NativeX;
\r
1915 float y = layout.NativeY;
\r
1917 if (stringFormat.IsVertical) {
\r
1918 y += layoutOffset;
\r
1919 x -= layout.Descent;
\r
1922 x += layoutOffset;
\r
1923 y -= layout.Ascent;
\r
1926 if (layout.AccumulatedHeight + height > iter.WrapHeight) {
\r
1927 float diff = iter.WrapHeight - layout.AccumulatedHeight;
\r
1928 if (stringFormat.IsVertical && stringFormat.IsRightToLeft) {
\r
1936 if (stringFormat.IsVertical)
\r
1937 pathes[i].AddRectangle(x + layoutRect.X, y + layoutRect.Y, height, width);
\r
1939 pathes[i].AddRectangle(x + layoutRect.X, y + layoutRect.Y, width, height);
\r
1944 geom.AffineTransform lineAlignT = iter.CalcLineAlignmentTransform();
\r
1945 if (lineAlignT != null) {
\r
1946 for (int i = 0; i < pathes.Length; i++)
\r
1947 pathes[i].NativeObject.transform(lineAlignT);
\r
1950 Region[] regions = new Region[ranges.Length];
\r
1951 for (int i = 0; i < regions.Length; i++)
\r
1952 regions[i] = new Region(pathes[i]);
\r
1958 #region MeasureString
\r
1959 public SizeF MeasureString (string text, Font font) {
\r
1960 return MeasureString(text, font, null, float.PositiveInfinity, float.PositiveInfinity, null);
\r
1964 public SizeF MeasureString (string text, Font font, SizeF layoutArea) {
\r
1965 return MeasureString(text, font, layoutArea, null);
\r
1969 public SizeF MeasureString (string text, Font font, int width) {
\r
1970 return MeasureString(text, font, width, null);
\r
1974 public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat format) {
\r
1975 return MeasureString(text, font, format, layoutArea.Width, layoutArea.Height, null);
\r
1979 public SizeF MeasureString (string text, Font font, int width, StringFormat format) {
\r
1980 return MeasureString(text, font, format, width, float.PositiveInfinity, null);
\r
1984 public SizeF MeasureString (string text, Font font, PointF origin, StringFormat format) {
\r
1985 return MeasureString(text, font, format, float.PositiveInfinity, float.PositiveInfinity, null);
\r
1988 SizeF MeasureString (string text, Font font, StringFormat format, float width, float height, int[] statistics) {
\r
1990 if (statistics != null) {
\r
1991 statistics[0] = 0;
\r
1992 statistics[1] = 0;
\r
1995 TextLineIterator iter = new TextLineIterator(text, font, NativeObject.getFontRenderContext(), format, width, height);
\r
1998 int linesFilled = 0;
\r
1999 for (LineLayout layout = iter.NextLine(); layout != null; layout = iter.NextLine()) {
\r
2002 float w = layout.MeasureWidth;
\r
2008 if (linesFilled == 0)
\r
2009 return SizeF.Empty;
\r
2011 float mheight = iter.AccumulatedHeight;
\r
2013 if (format != null) {
\r
2014 if (format.IsVertical) {
\r
2015 float temp = mheight;
\r
2021 if (!(format != null && format.NoClip)) {
\r
2022 if (mwidth > width)
\r
2024 if (mheight > height)
\r
2028 if (statistics != null) {
\r
2029 statistics[0] = linesFilled;
\r
2030 statistics[1] = iter.CharsConsumed;
\r
2033 return new SizeF(mwidth, mheight);
\r
2037 public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat stringFormat, out int charactersFitted, out int linesFilled) {
\r
2039 charactersFitted = 0;
\r
2041 int[] statistics = new int[2];
\r
2042 SizeF sz = MeasureString(text, font, stringFormat, layoutArea.Width, layoutArea.Height, statistics);
\r
2043 linesFilled = statistics[0];
\r
2044 charactersFitted = statistics[1];
\r
2049 #region MultiplyTransform
\r
2050 public void MultiplyTransform (Matrix matrix) {
\r
2051 MultiplyTransform (matrix, MatrixOrder.Prepend);
\r
2054 public void MultiplyTransform (Matrix matrix, MatrixOrder order) {
\r
2055 ConcatenateTransform(matrix.NativeObject, order);
\r
2059 #region Reset (Clip and Transform)
\r
2060 public void ResetClip () {
\r
2061 _clip.MakeInfinite();
\r
2062 RestoreBaseClip();
\r
2063 NativeObject.clip(_clip);
\r
2066 public void ResetTransform () {
\r
2067 _transform.Reset();
\r
2071 #region RotateTransform
\r
2072 public void RotateTransform (float angle) {
\r
2073 RotateTransform (angle, MatrixOrder.Prepend);
\r
2076 public void RotateTransform (float angle, MatrixOrder order) {
\r
2077 ConcatenateTransform(
\r
2078 geom.AffineTransform.getRotateInstance(java.lang.Math.toRadians(angle)),
\r
2083 #region ScaleTransform
\r
2084 public void ScaleTransform (float sx, float sy) {
\r
2085 ScaleTransform (sx, sy, MatrixOrder.Prepend);
\r
2088 public void ScaleTransform (float sx, float sy, MatrixOrder order) {
\r
2089 ConcatenateTransform(
\r
2090 geom.AffineTransform.getScaleInstance(sx, sy),
\r
2095 #region SetClip [Must be reviewed - more abstraction needed]
\r
2096 public void SetClip (RectangleF rect) {
\r
2097 SetClip (rect, CombineMode.Replace);
\r
2100 public void SetClip (GraphicsPath path) {
\r
2101 SetClip (path, CombineMode.Replace);
\r
2104 public void SetClip (Rectangle rect) {
\r
2105 SetClip (rect, CombineMode.Replace);
\r
2108 public void SetClip (Graphics g) {
\r
2109 SetClip (g, CombineMode.Replace);
\r
2112 public void SetClip (Graphics g, CombineMode combineMode) {
\r
2114 throw new NullReferenceException();
\r
2116 CombineClipArea(g._clip.NativeObject, combineMode);
\r
2119 public void SetClip (Rectangle rect, CombineMode combineMode) {
\r
2120 SetClip(rect.X,rect.Y,rect.Width,rect.Height,combineMode);
\r
2122 public void SetClip (RectangleF rect, CombineMode combineMode) {
\r
2123 SetClip(rect.X,rect.Y,rect.Width,rect.Height,combineMode);
\r
2126 public void SetClip (Region region, CombineMode combineMode) {
\r
2127 if(region == null)
\r
2128 throw new ArgumentNullException("region");
\r
2130 CombineClipArea((geom.Area)region.NativeObject.clone(),combineMode);
\r
2133 public void SetClip (GraphicsPath path, CombineMode combineMode) {
\r
2135 throw new ArgumentNullException("path");
\r
2137 CombineClipArea(new geom.Area(path.NativeObject), combineMode);
\r
2141 #region Clipping Staff [INTERNAL]
\r
2142 internal Region ScaledClip {
\r
2144 return _clip.Clone();
\r
2147 _clip.NativeObject.reset();
\r
2148 _clip.NativeObject.add(value.NativeObject);
\r
2151 internal void SetClip(float x,float y,float width,float height,CombineMode combineMode) {
\r
2152 CombineClipArea(new geom.Area(
\r
2153 new geom.Rectangle2D.Float(x,y,width,height)),combineMode);
\r
2156 void CombineClipArea(geom.Area area, CombineMode combineMode) {
\r
2157 geom.AffineTransform t = GetFinalTransform();
\r
2158 if (!t.isIdentity())
\r
2159 area.transform(t);
\r
2160 if (combineMode == CombineMode.Replace) {
\r
2161 _clip.NativeObject.reset();
\r
2162 _clip.NativeObject.add(area);
\r
2165 geom.Area curClip = _clip.NativeObject;
\r
2166 switch(combineMode) {
\r
2167 case CombineMode.Complement:
\r
2168 curClip.add(area);
\r
2170 case CombineMode.Exclude:
\r
2171 curClip.subtract(area);
\r
2173 case CombineMode.Intersect:
\r
2174 curClip.intersect(area);
\r
2176 case CombineMode.Union:
\r
2177 curClip.add(area);
\r
2179 case CombineMode.Xor:
\r
2180 curClip.exclusiveOr(area);
\r
2183 throw new ArgumentOutOfRangeException();
\r
2187 RestoreBaseClip();
\r
2188 NativeObject.clip(_clip);
\r
2191 internal void IntersectScaledClipWithBase(awt.Shape clip) {
\r
2192 NativeObject.clip(clip);
\r
2195 void RestoreBaseClip() {
\r
2196 if (_nextGraphicsState == null) {
\r
2197 NativeObject.setClip(_windowRect);
\r
2201 _nextGraphicsState.RestoreBaseClip(this);
\r
2206 #region TransformPoints
\r
2207 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, PointF [] pts) {
\r
2208 //TBD:CoordinateSpace
\r
2209 java.awt.geom.AffineTransform tr = this.Transform.NativeObject;
\r
2210 float[] fpts = new float[2];
\r
2211 for(int i = 0; i< pts.Length; i++) {
\r
2212 fpts[0] = pts[i].X;
\r
2213 fpts[1] = pts[i].Y;
\r
2214 tr.transform(fpts, 0, fpts, 0, 1);
\r
2215 pts[i].X = fpts[0];
\r
2216 pts[i].Y = fpts[1];
\r
2220 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, Point [] pts) {
\r
2221 //TBD:CoordinateSpace
\r
2222 java.awt.geom.AffineTransform tr = this.Transform.NativeObject;
\r
2223 float[] fpts = new float[2];
\r
2224 for(int i = 0; i< pts.Length; i++) {
\r
2225 fpts[0] = pts[i].X;
\r
2226 fpts[1] = pts[i].Y;
\r
2227 tr.transform(fpts, 0, fpts, 0, 1);
\r
2228 pts[i].X = (int)fpts[0];
\r
2229 pts[i].Y = (int)fpts[1];
\r
2234 #region TranslateClip
\r
2235 public void TranslateClip (int dx, int dy) {
\r
2236 TranslateClip((float)dx, (float)dy);
\r
2240 public void TranslateClip (float dx, float dy) {
\r
2243 geom.AffineTransform f = GetFinalTransform();
\r
2245 if (!f.isIdentity()) {
\r
2246 double[] p = new double[] {x, y};
\r
2247 f.deltaTransform(p, 0, p, 0, 1);
\r
2253 // It seems .Net does exactly this...
\r
2254 x = Math.Floor(x+0.96875);
\r
2255 y = Math.Floor(y+0.96875);
\r
2257 geom.AffineTransform t = geom.AffineTransform.getTranslateInstance(x, y);
\r
2259 _clip.NativeObject.transform(t);
\r
2260 RestoreBaseClip();
\r
2261 NativeObject.clip(_clip);
\r
2265 #region TranslateTransform
\r
2266 public void TranslateTransform (float dx, float dy) {
\r
2267 TranslateTransform (dx, dy, MatrixOrder.Prepend);
\r
2271 public void TranslateTransform (float dx, float dy, MatrixOrder order) {
\r
2272 ConcatenateTransform(
\r
2273 geom.AffineTransform.getTranslateInstance(dx, dy),
\r
2278 #region Properties [Partial TODO]
\r
2279 public Region Clip {
\r
2281 Region r = _clip.Clone();
\r
2282 geom.AffineTransform t = GetFinalTransform();
\r
2283 if (!t.isIdentity())
\r
2284 r.NativeObject.transform(t.createInverse());
\r
2289 SetClip (value, CombineMode.Replace);
\r
2293 public RectangleF ClipBounds {
\r
2295 awt.Shape shape = _clip.NativeObject;
\r
2296 if (shape == null)
\r
2297 shape = Region.InfiniteRegion.NativeObject;
\r
2299 geom.RectangularShape r = shape.getBounds2D();
\r
2300 geom.AffineTransform t = GetFinalTransform();
\r
2301 if (!t.isIdentity()) {
\r
2302 geom.AffineTransform it = t.createInverse();
\r
2303 r = it.createTransformedShape(r).getBounds2D();
\r
2306 return new RectangleF (r);
\r
2310 public CompositingMode CompositingMode {
\r
2311 //TBD:check this carefully
\r
2313 return (NativeObject.getComposite() == awt.AlphaComposite.SrcOver) ?
\r
2314 CompositingMode.SourceOver : CompositingMode.SourceCopy;
\r
2317 NativeObject.setComposite(
\r
2318 (value == CompositingMode.SourceOver) ?
\r
2319 awt.AlphaComposite.SrcOver : awt.AlphaComposite.Src);
\r
2324 public CompositingQuality CompositingQuality {
\r
2326 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2327 if(hints.containsKey(awt.RenderingHints.KEY_ALPHA_INTERPOLATION)) {
\r
2328 object value_ai = hints.get(awt.RenderingHints.KEY_ALPHA_INTERPOLATION);
\r
2330 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)
\r
2331 return CompositingQuality.HighSpeed;
\r
2332 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)
\r
2333 return CompositingQuality.HighQuality;
\r
2334 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)
\r
2335 return CompositingQuality.Default;
\r
2338 return CompositingQuality.Default;
\r
2342 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2344 case CompositingQuality.AssumeLinear:
\r
2345 case CompositingQuality.Default:
\r
2346 case CompositingQuality.GammaCorrected:
\r
2347 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2348 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
\r
2350 case CompositingQuality.HighQuality:
\r
2351 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2352 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
\r
2354 case CompositingQuality.HighSpeed:
\r
2355 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2356 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
\r
2358 // case CompositingQuality.Invalid:
\r
2359 // if(hints.containsKey(awt.RenderingHints.KEY_ALPHA_INTERPOLATION))
\r
2360 // hints.remove(awt.RenderingHints.KEY_ALPHA_INTERPOLATION);
\r
2363 NativeObject.setRenderingHints(hints);
\r
2367 public float DpiX {
\r
2369 return DefaultScreenResolution;
\r
2373 public float DpiY {
\r
2375 //TBD: assume 72 (screen) for now
\r
2380 public InterpolationMode InterpolationMode {
\r
2382 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2383 if(hints.containsKey(awt.RenderingHints.KEY_INTERPOLATION)) {
\r
2384 object value_i = hints.get(awt.RenderingHints.KEY_INTERPOLATION);
\r
2386 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR)
\r
2387 return InterpolationMode.Bilinear;
\r
2388 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC)
\r
2389 return InterpolationMode.Bicubic;
\r
2390 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)
\r
2391 return InterpolationMode.NearestNeighbor;
\r
2394 return InterpolationMode.Default;
\r
2397 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2400 case InterpolationMode.Bicubic:
\r
2401 case InterpolationMode.HighQualityBicubic:
\r
2402 case InterpolationMode.Low:
\r
2403 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC);
\r
2405 case InterpolationMode.High:
\r
2406 case InterpolationMode.Bilinear:
\r
2407 case InterpolationMode.HighQualityBilinear:
\r
2408 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR);
\r
2410 case InterpolationMode.Default:
\r
2411 if (hints.containsKey(awt.RenderingHints.KEY_INTERPOLATION))
\r
2412 hints.remove(awt.RenderingHints.KEY_INTERPOLATION);
\r
2414 case InterpolationMode.NearestNeighbor:
\r
2415 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
\r
2417 case InterpolationMode.Invalid:
\r
2418 throw new ArgumentException();
\r
2420 throw new ArgumentOutOfRangeException();
\r
2423 NativeObject.setRenderingHints(hints);
\r
2427 public bool IsClipEmpty {
\r
2429 return _clip.IsEmpty(this);
\r
2433 public bool IsVisibleClipEmpty {
\r
2435 if (_clip.IsEmpty(this))
\r
2438 return VisibleClipBounds.IsEmpty;
\r
2442 public float PageScale {
\r
2444 return _pageScale;
\r
2447 _pageScale = value;
\r
2451 public GraphicsUnit PageUnit {
\r
2456 _pageUnit = value;
\r
2460 static internal geom.AffineTransform GetFinalTransform(
\r
2461 geom.AffineTransform transform, GraphicsUnit pageUnit, float pageScale) {
\r
2462 geom.AffineTransform t = null;
\r
2463 if (pageUnit != GraphicsUnit.Display) {
\r
2464 float scale = pageScale * _unitConversion[ (int)pageUnit ];
\r
2465 if (Math.Abs(scale-1f) > float.Epsilon)
\r
2466 t = geom.AffineTransform.getScaleInstance(scale, scale);
\r
2470 t.concatenate(transform);
\r
2477 geom.AffineTransform GetFinalTransform() {
\r
2478 return GetFinalTransform(_transform.NativeObject, PageUnit, PageScale);
\r
2481 public PixelOffsetMode PixelOffsetMode {
\r
2483 return _pixelOffsetMode;
\r
2486 _pixelOffsetMode = value;
\r
2490 public Point RenderingOrigin {
\r
2492 throw new NotImplementedException();
\r
2495 throw new NotImplementedException();
\r
2499 public SmoothingMode SmoothingMode {
\r
2501 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2502 if(hints.containsKey(awt.RenderingHints.KEY_ANTIALIASING)) {
\r
2503 object value_aa = hints.get(awt.RenderingHints.KEY_ANTIALIASING);
\r
2504 if (value_aa == awt.RenderingHints.VALUE_ANTIALIAS_ON) {
\r
2505 if(hints.containsKey(awt.RenderingHints.KEY_RENDERING)) {
\r
2506 object value_render = hints.get(awt.RenderingHints.KEY_RENDERING);
\r
2507 if (value_render == awt.RenderingHints.VALUE_RENDER_QUALITY)
\r
2508 return SmoothingMode.HighQuality;
\r
2509 if (value_render == awt.RenderingHints.VALUE_RENDER_SPEED)
\r
2510 return SmoothingMode.HighSpeed;
\r
2513 return SmoothingMode.AntiAlias;
\r
2516 if (value_aa == awt.RenderingHints.VALUE_ANTIALIAS_DEFAULT)
\r
2517 return SmoothingMode.Default;
\r
2519 return SmoothingMode.None;
\r
2524 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2527 case SmoothingMode.None:
\r
2528 if(hints.containsKey(awt.RenderingHints.KEY_ANTIALIASING))
\r
2529 hints.remove(awt.RenderingHints.KEY_ANTIALIASING);
\r
2530 if(hints.containsKey(awt.RenderingHints.KEY_RENDERING))
\r
2531 hints.remove(awt.RenderingHints.KEY_RENDERING);
\r
2533 case SmoothingMode.AntiAlias:
\r
2534 hints.put(awt.RenderingHints.KEY_ANTIALIASING, awt.RenderingHints.VALUE_ANTIALIAS_ON);
\r
2536 case SmoothingMode.HighQuality:
\r
2537 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_QUALITY);
\r
2538 goto case SmoothingMode.AntiAlias;
\r
2539 case SmoothingMode.HighSpeed:
\r
2540 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_SPEED);
\r
2541 goto case SmoothingMode.None;
\r
2542 case SmoothingMode.Default:
\r
2543 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_DEFAULT);
\r
2544 goto case SmoothingMode.AntiAlias;
\r
2545 case SmoothingMode.Invalid:
\r
2546 throw new ArgumentException("Invalid parameter used.");
\r
2549 NativeObject.setRenderingHints(hints);
\r
2554 /// Java does not have similar functionality
\r
2556 public int TextContrast {
\r
2558 return _textContrast;
\r
2562 _textContrast = value;
\r
2566 public TextRenderingHint TextRenderingHint {
\r
2568 return _textRenderingHint;
\r
2569 // awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2570 // if(hints.containsKey(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING)) {
\r
2571 // if(hints.get(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING) ==
\r
2572 // java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
\r
2573 // return TextRenderingHint.AntiAlias;
\r
2574 // if(hints.get(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING) ==
\r
2575 // java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)
\r
2576 // return TextRenderingHint.SingleBitPerPixel;
\r
2578 // //return TextRenderingHint.SystemDefault;
\r
2579 // return TextRenderingHint.SingleBitPerPixelGridFit;
\r
2583 _textRenderingHint = value;
\r
2584 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2586 case TextRenderingHint.AntiAlias:
\r
2587 case TextRenderingHint.AntiAliasGridFit:
\r
2588 case TextRenderingHint.ClearTypeGridFit:
\r
2589 // case TextRenderingHint.SystemDefault:
\r
2590 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2591 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
\r
2594 case TextRenderingHint.SingleBitPerPixelGridFit:
\r
2595 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2596 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
\r
2599 case TextRenderingHint.SingleBitPerPixel:
\r
2600 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2601 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
\r
2604 case TextRenderingHint.SystemDefault:
\r
2605 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2606 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
\r
2610 NativeObject.setRenderingHints(hints);
\r
2614 public Matrix Transform {
\r
2616 return _transform.Clone();
\r
2619 if (value == null)
\r
2620 throw new ArgumentNullException("matrix");
\r
2622 if (!value.IsInvertible)
\r
2623 throw new ArgumentException("Invalid parameter used.");
\r
2625 value.CopyTo(_transform);
\r
2629 internal Matrix BaseTransform {
\r
2631 return new Matrix(NativeObject.getTransform());
\r
2634 NativeObject.setTransform(value.NativeObject);
\r
2638 internal void PrependBaseTransform(geom.AffineTransform t) {
\r
2639 NativeObject.transform(t);
\r
2642 internal awt.Shape VisibleShape {
\r
2644 return _windowRect;
\r
2648 public RectangleF VisibleClipBounds {
\r
2650 if (_clip.IsEmpty(this))
\r
2651 return RectangleF.Empty;
\r
2653 geom.Rectangle2D r = _clip.NativeObject.getBounds2D();
\r
2654 awt.Shape clip = NativeObject.getClip();
\r
2655 geom.Rectangle2D clipBounds = (clip != null) ? clip.getBounds2D() : _windowRect;
\r
2656 geom.Rectangle2D.intersect(r, clipBounds, r);
\r
2657 if ((r.getWidth() <= 0) || (r.getHeight() <= 0))
\r
2658 return RectangleF.Empty;
\r
2660 geom.AffineTransform t = GetFinalTransform();
\r
2661 if (!t.isIdentity()) {
\r
2662 geom.AffineTransform it = t.createInverse();
\r
2663 r = it.createTransformedShape(r).getBounds2D();
\r
2666 return new RectangleF (r);
\r
2670 void ConcatenateTransform(geom.AffineTransform transform, MatrixOrder order) {
\r
2671 geom.AffineTransform at = _transform.NativeObject;
\r
2672 Matrix.Multiply(at, transform, order);
\r