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
846 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
847 //TBD: ImageAttributes
\r
848 if (srcUnit != GraphicsUnit.Pixel)
\r
849 throw new NotImplementedException();
\r
850 // Like in .NET http://dotnet247.com/247reference/msgs/45/227979.aspx
\r
852 Matrix mx = new Matrix(srcRect, destPoints);
\r
854 Region region = new Region(srcRect);
\r
855 DrawImage(image, mx, region);
\r
859 public void DrawImage (Image image, int x, int y, int width, int height) {
\r
860 DrawImage(image, (float)x, (float)y, (float)width, (float)height);
\r
863 public void DrawImage (Image image, float x, float y, float width, float height) {
\r
864 Matrix mx = new Matrix();
\r
865 mx.Translate((float)x, (float)y);
\r
866 mx.Scale(width / (float)image.Width, height / (float)image.Height);
\r
868 DrawImage( image, mx );
\r
872 public void DrawImage (Image image, int x, int y, Rectangle srcRect, GraphicsUnit srcUnit) {
\r
873 DrawImage(image, new Rectangle(x, y, srcRect.Width, srcRect.Height), srcRect, srcUnit);
\r
876 public void DrawImage (Image image, float x, float y, RectangleF srcRect, GraphicsUnit srcUnit) {
\r
877 DrawImage(image, new RectangleF(x, y, srcRect.Width, srcRect.Height), srcRect, srcUnit);
\r
881 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit) {
\r
882 DrawImage(image, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, null);
\r
885 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit) {
\r
886 DrawImage(image, destRect, srcX, srcY, srcWidth, srcHeight, srcUnit, null);
\r
891 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr) {
\r
896 new Rectangle(srcX, srcY, srcWidth, srcHeight),
\r
901 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs) {
\r
906 new RectangleF(srcX, srcY, srcWidth, srcHeight),
\r
911 internal void DrawImage (Image image, Matrix m) {
\r
912 DrawImage(image, m, null);
\r
915 internal void DrawImage (Image image, Matrix m, Region clip) {
\r
916 if (clip == null) {
\r
917 clip = new Region( new RectangleF( 0, 0, image.Width, image.Height ) );
\r
920 geom.AffineTransform t = GetFinalTransform(_transform.NativeObject, PageUnit, 1.0f);
\r
921 if (!t.isIdentity())
\r
922 m.NativeObject.preConcatenate(t);
\r
924 clip.Transform( m );
\r
926 if (NeedsNormalization) {
\r
927 Matrix normMatrix = ComputeClipNormalization(clip.GetBounds(this));
\r
928 clip.Transform(normMatrix);
\r
931 awt.Shape oldClip = NativeObject.getClip();
\r
932 IntersectScaledClipWithBase(clip);
\r
935 Matrix mm = ComputeImageNormalization(image, m);
\r
936 NativeObject.drawImage(image.NativeObject.CurrentImage.NativeImage, mm.NativeObject, null);
\r
939 NativeObject.setClip( oldClip );
\r
943 private static Matrix ComputeImageNormalization(Image img, Matrix m) {
\r
944 if ( m.IsIdentity )
\r
947 //m.Translate( -(m.Elements[0] + m.Elements[2]) / 2.0f, -(m.Elements[3] + m.Elements[1]) / 2.0f, MatrixOrder.Append);
\r
949 -(float)(m.NativeObject.getScaleX() + m.NativeObject.getShearX()) / 2.0f,
\r
950 -(float)(m.NativeObject.getScaleY() + m.NativeObject.getShearY()) / 2.0f, MatrixOrder.Append);
\r
952 PointF [] p = new PointF[] {
\r
953 new PointF( 0, 0 ),
\r
954 new PointF( img.Width, 0 ),
\r
955 new PointF( 0, img.Height )};
\r
957 m.TransformPoints(p);
\r
958 for (int i=0; i < p.Length; i++) {
\r
959 p[i].X = (float)( p[i].X + 0.5f );
\r
960 p[i].Y = (float)( p[i].Y + 0.5f );
\r
963 return new Matrix( new Rectangle(0, 0, img.Width, img.Height), p );
\r
965 private static Matrix ComputeClipNormalization(RectangleF rect) {
\r
966 PointF [] p = new PointF[] {
\r
967 new PointF( rect.X, rect.Y ),
\r
968 new PointF( rect.X + rect.Width, rect.Y ),
\r
969 new PointF( rect.X, rect.Y + rect.Height )};
\r
971 for (int i=0; i < p.Length; i++) {
\r
972 p[i].X = (float)Math.Round( p[i].X + 0.5f ) + 0.5f;
\r
973 p[i].Y = (float)Math.Round( p[i].Y + 0.5f ) + 0.5f;
\r
976 return new Matrix( rect, p );
\r
982 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
984 throw new NotImplementedException();
\r
988 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
991 throw new NotImplementedException();
\r
995 public void DrawImage (Image image, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
\r
997 throw new NotImplementedException();
\r
1001 #if INTPTR_SUPPORT
\r
1003 public void DrawImage (Image image, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, int callbackData)
\r
1005 throw new NotImplementedException();
\r
1009 #if INTPTR_SUPPORT
\r
1010 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1012 //TBD:units,attributes, callback
\r
1013 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1014 g.drawImage(image.NativeObject,destRect.X,destRect.Y,destRect.Width,destRect.Height,srcX,srcY,srcWidth,srcHeight,null);
\r
1017 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
\r
1019 //TBD:units,attributes, callback
\r
1020 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1021 g.drawImage(image.NativeObject,
\r
1024 (int)destRect.Width,
\r
1025 (int)destRect.Height,
\r
1029 (int)srcHeight,null);
\r
1032 public void DrawImage (Image image, Rectangle destRect, float srcX, float srcY, float srcWidth, float srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
\r
1034 //TBD:units,attributes, callback
\r
1035 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1036 g.drawImage(image.NativeObject,
\r
1039 (int)destRect.Width,
\r
1040 (int)destRect.Height,
\r
1044 (int)srcHeight,null);
\r
1047 public void DrawImage (Image image, Rectangle destRect, int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, IntPtr callbackData)
\r
1049 //TBD:units,attributes, callback
\r
1050 java.awt.Graphics2D g = (java.awt.Graphics2D)nativeObject;
\r
1051 g.drawImage(image.NativeObject,
\r
1063 public void DrawImageUnscaled (Image image, Point point)
\r
1065 DrawImageUnscaled (image, point.X, point.Y);
\r
1068 public void DrawImageUnscaled (Image image, Rectangle rect) {
\r
1069 DrawImageUnscaled (image, rect.X, rect.Y, rect.Width, rect.Height);
\r
1072 public void DrawImageUnscaled (Image image, int x, int y) {
\r
1073 DrawImage (image, x, y, image.Width, image.Height);
\r
1076 public void DrawImageUnscaled (Image image, int x, int y, int width, int height) {
\r
1077 Image tmpImg = new Bitmap (width, height);
\r
1078 Graphics g = FromImage (tmpImg);
\r
1079 g.DrawImage (image, 0, 0, image.Width, image.Height);
\r
1080 this.DrawImage (tmpImg, x, y, width, height);
\r
1081 tmpImg.Dispose ();
\r
1087 public void DrawLine (Pen pen, PointF pt1, PointF pt2) {
\r
1088 DrawLine(pen,pt1.X,pt1.Y,pt2.X,pt2.Y);
\r
1091 public void DrawLine (Pen pen, Point pt1, Point pt2) {
\r
1092 DrawLine(pen,(float)pt1.X,(float)pt1.Y,(float)pt2.X,(float)pt2.Y);
\r
1095 public void DrawLine (Pen pen, int x1, int y1, int x2, int y2) {
\r
1096 DrawLine(pen,(float)x1,(float)y1,(float)x2,(float)y2);
\r
1099 public void DrawLine (Pen pen, float x1, float y1, float x2, float y2) {
\r
1100 DrawShape(pen, new geom.Line2D.Float(x1,y1,x2,y2));
\r
1103 public void DrawLines (Pen pen, PointF [] points) {
\r
1104 GraphicsPath path = new GraphicsPath();
\r
1105 path.AddLines(points);
\r
1106 DrawShape(pen, path);
\r
1109 public void DrawLines (Pen pen, Point [] points) {
\r
1110 GraphicsPath path = new GraphicsPath();
\r
1111 path.AddLines(points);
\r
1112 DrawShape(pen, path);
\r
1117 public void DrawPath (Pen pen, GraphicsPath path) {
\r
1118 DrawShape(pen, path);
\r
1123 public void DrawPie (Pen pen, Rectangle rect, float startAngle, float sweepAngle) {
\r
1124 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
\r
1127 public void DrawPie (Pen pen, RectangleF rect, float startAngle, float sweepAngle) {
\r
1128 DrawPie (pen, rect.X, rect.Y, rect.Width, rect.Height, startAngle, sweepAngle);
\r
1131 public void DrawPie (Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
1132 GraphicsPath path = new GraphicsPath();
\r
1133 path.AddPie(x, y, width, height, startAngle, sweepAngle);
\r
1134 DrawPath(pen, path);
\r
1137 public void DrawPie (Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
1138 DrawPie(pen,(float)x,(float)y,(float)width,(float)height,(float)startAngle,(float)sweepAngle);
\r
1142 #region DrawPolygon
\r
1143 public void DrawPolygon (Pen pen, Point [] points) {
\r
1144 GraphicsPath path = new GraphicsPath();
\r
1145 path.AddPolygon(points);
\r
1146 DrawPath(pen, path);
\r
1149 public void DrawPolygon (Pen pen, PointF [] points) {
\r
1150 GraphicsPath path = new GraphicsPath();
\r
1151 path.AddPolygon(points);
\r
1152 DrawPath(pen, path);
\r
1156 #region DrawRectangle(s)
\r
1157 internal void DrawRectangle (Pen pen, RectangleF rect) {
\r
1158 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1161 public void DrawRectangle (Pen pen, Rectangle rect) {
\r
1162 DrawRectangle (pen, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1165 public void DrawRectangle (Pen pen, float x, float y, float width, float height) {
\r
1166 DrawShape(pen, new geom.Rectangle2D.Float(x,y,width,height));
\r
1169 public void DrawRectangle (Pen pen, int x, int y, int width, int height) {
\r
1170 DrawRectangle (pen,(float) x,(float) y,(float) width,(float) height);
\r
1173 public void DrawRectangles (Pen pen, RectangleF [] rects) {
\r
1174 foreach(RectangleF r in rects)
\r
1175 DrawRectangle (pen, r.Left, r.Top, r.Width, r.Height);
\r
1178 public void DrawRectangles (Pen pen, Rectangle [] rects) {
\r
1179 foreach(Rectangle r in rects)
\r
1180 DrawRectangle (pen, r.Left, r.Top, r.Width, r.Height);
\r
1184 #region DrawString
\r
1185 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle) {
\r
1186 DrawString(s, font, brush, layoutRectangle.X, layoutRectangle.Y, layoutRectangle.Width, layoutRectangle.Height, null);
\r
1189 public void DrawString (string s, Font font, Brush brush, PointF point) {
\r
1190 DrawString(s, font, brush, point.X, point.Y, float.PositiveInfinity, float.PositiveInfinity, null);
\r
1193 public void DrawString (string s, Font font, Brush brush, PointF point, StringFormat format) {
\r
1194 DrawString(s, font, brush, point.X, point.Y, float.PositiveInfinity, float.PositiveInfinity, format);
\r
1197 public void DrawString (string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format) {
\r
1198 DrawString(s, font, brush, layoutRectangle.X, layoutRectangle.Y, layoutRectangle.Width, layoutRectangle.Height, format);
\r
1201 public void DrawString (string s, Font font, Brush brush, float x, float y) {
\r
1202 DrawString(s, font, brush, x, y, float.PositiveInfinity, float.PositiveInfinity, null);
\r
1205 public void DrawString (string s, Font font, Brush brush, float x, float y, StringFormat format) {
\r
1206 DrawString(s, font, brush, x, y, float.PositiveInfinity, float.PositiveInfinity, format);
\r
1209 void DrawString (string s, Font font, Brush brush,
\r
1210 float x, float y, float width, float height,
\r
1211 StringFormat format) {
\r
1212 if (brush == null)
\r
1213 throw new ArgumentNullException("brush");
\r
1216 throw new ArgumentNullException("font");
\r
1218 if (format != null && format.LineAlignment != StringAlignment.Near) {
\r
1220 SizeF sizeF = MeasureString(s, font, format, width, height, null);
\r
1222 float lineAWidth = width;
\r
1223 float lineAHeight = height;
\r
1225 if (float.IsPositiveInfinity(width))
\r
1226 lineAWidth = lineAHeight = 0;
\r
1228 float wdelta = format.IsVertical ? lineAWidth - sizeF.Width : lineAHeight - sizeF.Height;
\r
1229 float pdelta = format.LineAlignment == StringAlignment.Center ? wdelta/2 : wdelta;
\r
1230 if (format.IsVertical) {
\r
1231 if (!(format.IsRightToLeft && format.LineAlignment == StringAlignment.Far))
\r
1233 if (!float.IsPositiveInfinity(width))
\r
1238 if (!float.IsPositiveInfinity(width))
\r
1243 awt.Paint oldP = NativeObject.getPaint();
\r
1244 NativeObject.setPaint(brush);
\r
1246 geom.AffineTransform oldT = NativeObject.getTransform();
\r
1247 NativeObject.transform(GetFinalTransform());
\r
1250 bool noclip = float.IsPositiveInfinity(width) || (format != null && format.NoClip);
\r
1252 awt.Shape oldClip = null;
\r
1254 oldClip = NativeObject.getClip();
\r
1255 NativeObject.clip(new geom.Rectangle2D.Float(x, y, width, height));
\r
1258 TextLineIterator iter = new TextLineIterator(s, font, NativeObject.getFontRenderContext(), format, width, height);
\r
1259 NativeObject.transform(iter.Transform);
\r
1260 for (LineLayout layout = iter.NextLine(); layout != null; layout = iter.NextLine()) {
\r
1261 layout.Draw(NativeObject, x, y);
\r
1266 NativeObject.setClip(oldClip);
\r
1270 NativeObject.setTransform(oldT);
\r
1274 NativeObject.setPaint(oldP);
\r
1281 void PushGraphicsState(GraphicsState state) {
\r
1282 state.Next = _nextGraphicsState;
\r
1283 _nextGraphicsState = state;
\r
1286 GraphicsState PopGraphicsState() {
\r
1287 GraphicsState state = _nextGraphicsState;
\r
1288 _nextGraphicsState = _nextGraphicsState.Next;
\r
1292 bool ContainsGraphicsState(GraphicsState state) {
\r
1293 GraphicsState gs = _nextGraphicsState;
\r
1295 while(gs != null) {
\r
1305 public void EndContainer (GraphicsContainer container) {
\r
1306 Restore(container.StateObject);
\r
1309 public GraphicsContainer BeginContainer () {
\r
1310 return new GraphicsContainer(Save(Matrix.IdentityTransform, true));
\r
1313 public GraphicsContainer BeginContainer (Rectangle dstrect, Rectangle srcrect, GraphicsUnit unit) {
\r
1314 Matrix containerTransfrom =
\r
1315 new Matrix( srcrect,
\r
1316 new Point [] { new Point (dstrect.X, dstrect.Y),
\r
1317 new Point (dstrect.X + dstrect.Width, dstrect.Y),
\r
1318 new Point (dstrect.X, dstrect.Y + dstrect.Height) });
\r
1320 float scale = _unitConversion[ (int)PageUnit ] / _unitConversion[ (int)unit ];
\r
1321 containerTransfrom.Scale(scale, scale);
\r
1323 return new GraphicsContainer(Save(containerTransfrom, true));
\r
1327 public GraphicsContainer BeginContainer (RectangleF dstrect, RectangleF srcrect, GraphicsUnit unit) {
\r
1328 Matrix containerTransfrom =
\r
1329 new Matrix( srcrect,
\r
1330 new PointF [] { new PointF (dstrect.X, dstrect.Y),
\r
1331 new PointF (dstrect.X + dstrect.Width, dstrect.Y),
\r
1332 new PointF (dstrect.X, dstrect.Y + dstrect.Height) });
\r
1334 float scale = _unitConversion[ (int)PageUnit ] / _unitConversion[ (int)unit ];
\r
1335 containerTransfrom.Scale(scale, scale);
\r
1337 return new GraphicsContainer(Save(containerTransfrom, true));
\r
1340 GraphicsState Save(Matrix matrix, bool resetState) {
\r
1341 GraphicsState graphicsState = new GraphicsState(this, matrix, resetState);
\r
1343 PushGraphicsState( graphicsState );
\r
1344 return graphicsState;
\r
1347 public GraphicsState Save () {
\r
1348 return Save(Matrix.IdentityTransform, false);
\r
1351 public void Restore (GraphicsState graphicsState) {
\r
1352 if (ContainsGraphicsState(graphicsState)) {
\r
1353 GraphicsState gs = PopGraphicsState();
\r
1354 while ( gs != graphicsState )
\r
1355 gs = PopGraphicsState();
\r
1357 graphicsState.RestoreState(this);
\r
1363 #region Metafiles Staff
\r
1365 public void AddMetafileComment (byte [] data) {
\r
1366 throw new NotImplementedException ();
\r
1369 #if INTPTR_SUPPORT
\r
1371 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback)
\r
1373 throw new NotImplementedException ();
\r
1377 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback)
\r
1379 throw new NotImplementedException ();
\r
1383 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback)
\r
1385 throw new NotImplementedException ();
\r
1389 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback)
\r
1391 throw new NotImplementedException ();
\r
1395 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback)
\r
1397 throw new NotImplementedException ();
\r
1401 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback)
\r
1403 throw new NotImplementedException ();
\r
1407 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1409 throw new NotImplementedException ();
\r
1413 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1415 throw new NotImplementedException ();
\r
1419 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1421 throw new NotImplementedException ();
\r
1425 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1427 throw new NotImplementedException ();
\r
1431 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1433 throw new NotImplementedException ();
\r
1437 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1439 throw new NotImplementedException ();
\r
1443 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1445 throw new NotImplementedException ();
\r
1449 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1451 throw new NotImplementedException ();
\r
1455 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1457 throw new NotImplementedException ();
\r
1461 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1463 throw new NotImplementedException ();
\r
1467 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1469 throw new NotImplementedException ();
\r
1473 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback)
\r
1475 throw new NotImplementedException ();
\r
1479 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1481 throw new NotImplementedException ();
\r
1485 public void EnumerateMetafile (Metafile metafile, Point destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1487 throw new NotImplementedException ();
\r
1491 public void EnumerateMetafile (Metafile metafile, PointF destPoint, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1493 throw new NotImplementedException ();
\r
1497 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1499 throw new NotImplementedException ();
\r
1503 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1505 throw new NotImplementedException ();
\r
1509 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1511 throw new NotImplementedException ();
\r
1515 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1517 throw new NotImplementedException ();
\r
1521 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1523 throw new NotImplementedException ();
\r
1527 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1529 throw new NotImplementedException ();
\r
1533 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1535 throw new NotImplementedException ();
\r
1539 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1541 throw new NotImplementedException ();
\r
1545 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit srcUnit, EnumerateMetafileProc callback, IntPtr callbackData)
\r
1547 throw new NotImplementedException ();
\r
1551 public void EnumerateMetafile (Metafile metafile, Point [] destPoints, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1553 throw new NotImplementedException ();
\r
1557 public void EnumerateMetafile (Metafile metafile, Rectangle destRect, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1559 throw new NotImplementedException ();
\r
1563 public void EnumerateMetafile (Metafile metafile, Point destPoint, Rectangle srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1565 throw new NotImplementedException ();
\r
1569 public void EnumerateMetafile (Metafile metafile, RectangleF destRect, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1571 throw new NotImplementedException ();
\r
1575 public void EnumerateMetafile (Metafile metafile, PointF [] destPoints, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1577 throw new NotImplementedException ();
\r
1581 public void EnumerateMetafile (Metafile metafile, PointF destPoint, RectangleF srcRect, GraphicsUnit unit, EnumerateMetafileProc callback, IntPtr callbackData, ImageAttributes imageAttr)
\r
1583 throw new NotImplementedException ();
\r
1588 #region ExcludeClip
\r
1589 void ExcludeClip(geom.Area area) {
\r
1591 geom.AffineTransform t = GetFinalTransform();
\r
1592 if (!t.isIdentity()) {
\r
1593 area = (geom.Area)area.clone();
\r
1594 area.transform(t);
\r
1597 _clip.NativeObject.subtract(area);
\r
1598 RestoreBaseClip();
\r
1599 NativeObject.clip(_clip);
\r
1602 public void ExcludeClip (Rectangle rect) {
\r
1603 ExcludeClip(new geom.Area(rect.NativeObject));
\r
1606 public void ExcludeClip (Region region) {
\r
1607 if (region == null)
\r
1608 throw new ArgumentNullException("region");
\r
1609 ExcludeClip(region.NativeObject);
\r
1613 #region FillClosedCurve
\r
1614 public void FillClosedCurve (Brush brush, PointF [] points) {
\r
1615 FillClosedCurve (brush, points, FillMode.Alternate);
\r
1619 public void FillClosedCurve (Brush brush, Point [] points) {
\r
1620 FillClosedCurve (brush, points, FillMode.Alternate);
\r
1624 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode) {
\r
1625 FillClosedCurve (brush, points, fillmode, 0.5f);
\r
1628 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode) {
\r
1629 FillClosedCurve (brush, points, fillmode, 0.5f);
\r
1632 public void FillClosedCurve (Brush brush, PointF [] points, FillMode fillmode, float tension) {
\r
1633 GraphicsPath path = new GraphicsPath(fillmode);
\r
1634 path.AddClosedCurve(points, tension);
\r
1635 FillPath(brush, path);
\r
1638 public void FillClosedCurve (Brush brush, Point [] points, FillMode fillmode, float tension) {
\r
1639 GraphicsPath path = new GraphicsPath(fillmode);
\r
1640 path.AddClosedCurve(points, tension);
\r
1641 FillPath(brush, path);
\r
1645 #region FillEllipse
\r
1646 public void FillEllipse (Brush brush, Rectangle rect) {
\r
1647 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
\r
1650 public void FillEllipse (Brush brush, RectangleF rect) {
\r
1651 FillEllipse (brush, rect.X, rect.Y, rect.Width, rect.Height);
\r
1654 public void FillEllipse (Brush brush, float x, float y, float width, float height) {
\r
1655 FillShape(brush,new java.awt.geom.Ellipse2D.Float(x,y,width,height));
\r
1658 public void FillEllipse (Brush brush, int x, int y, int width, int height) {
\r
1659 FillEllipse (brush,(float)x,(float)y,(float)width,(float)height);
\r
1664 public void FillPath (Brush brush, GraphicsPath path) {
\r
1666 throw new ArgumentNullException("path");
\r
1668 FillShape(brush,path);
\r
1673 public void FillPie (Brush brush, Rectangle rect, float startAngle, float sweepAngle) {
\r
1674 FillPie(brush,(float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height,(float)startAngle,(float)sweepAngle);
\r
1677 public void FillPie (Brush brush, int x, int y, int width, int height, int startAngle, int sweepAngle) {
\r
1678 FillPie(brush,(float)x,(float)y,(float)width,(float)height,(float)startAngle,(float)sweepAngle);
\r
1681 public void FillPie (Brush brush, float x, float y, float width, float height, float startAngle, float sweepAngle) {
\r
1682 GraphicsPath path = new GraphicsPath();
\r
1683 path.AddPie(x, y, width, height, startAngle, sweepAngle);
\r
1684 FillPath(brush, path);
\r
1688 #region FillPolygon
\r
1689 public void FillPolygon (Brush brush, PointF [] points) {
\r
1690 FillPolygon(brush, points, FillMode.Alternate);
\r
1693 public void FillPolygon (Brush brush, Point [] points) {
\r
1694 FillPolygon(brush, points, FillMode.Alternate);
\r
1697 public void FillPolygon (Brush brush, Point [] points, FillMode fillMode) {
\r
1698 GraphicsPath path = new GraphicsPath(fillMode);
\r
1699 path.AddPolygon(points);
\r
1700 FillPath(brush,path);
\r
1703 public void FillPolygon (Brush brush, PointF [] points, FillMode fillMode) {
\r
1704 GraphicsPath path = new GraphicsPath(fillMode);
\r
1705 path.AddPolygon(points);
\r
1706 FillPath(brush,path);
\r
1710 #region FillRectangle
\r
1711 public void FillRectangle (Brush brush, RectangleF rect) {
\r
1712 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1715 public void FillRectangle (Brush brush, Rectangle rect) {
\r
1716 FillRectangle (brush, rect.Left, rect.Top, rect.Width, rect.Height);
\r
1719 public void FillRectangle (Brush brush, int x, int y, int width, int height) {
\r
1720 FillRectangle(brush,(float)x,(float)y,(float)width,(float)height);
\r
1723 public void FillRectangle (Brush brush, float x, float y, float width, float height) {
\r
1724 FillShape(brush,new java.awt.geom.Rectangle2D.Float(x,y,width,height));
\r
1727 public void FillRectangles (Brush brush, Rectangle [] rects) {
\r
1728 GraphicsPath path = new GraphicsPath();
\r
1729 path.AddRectangles(rects);
\r
1730 FillPath(brush,path);
\r
1733 public void FillRectangles (Brush brush, RectangleF [] rects) {
\r
1734 GraphicsPath path = new GraphicsPath();
\r
1735 path.AddRectangles(rects);
\r
1736 FillPath(brush,path);
\r
1740 #region FillRegion
\r
1741 public void FillRegion (Brush brush, Region region) {
\r
1742 FillShape(brush,region);
\r
1747 public void Flush () {
\r
1748 Flush (FlushIntention.Flush);
\r
1752 public void Flush (FlushIntention intention) {
\r
1753 if (_image != null)
\r
1754 _image.NativeObject.CurrentImage.NativeImage.flush();
\r
1757 #if INTPTR_SUPPORTED
\r
1758 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1760 public void ReleaseHdc (IntPtr hdc)
\r
1762 throw new NotImplementedException();
\r
1765 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1767 public void ReleaseHdcInternal (IntPtr hdc)
\r
1769 throw new NotImplementedException ();
\r
1772 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1774 public static Graphics FromHdc (IntPtr hdc)
\r
1776 throw new NotImplementedException();
\r
1779 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1781 public static Graphics FromHdc (IntPtr hdc, IntPtr hdevice)
\r
1783 throw new NotImplementedException ();
\r
1786 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1788 public static Graphics FromHdcInternal (IntPtr hdc)
\r
1790 throw new NotImplementedException ();
\r
1793 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1795 public static Graphics FromHwnd (IntPtr hwnd)
\r
1797 throw new NotImplementedException();
\r
1800 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1802 public static Graphics FromHwndInternal (IntPtr hwnd)
\r
1804 throw new NotImplementedException ();
\r
1808 internal static Graphics FromXDrawable (IntPtr drawable, IntPtr display)
\r
1810 throw new NotImplementedException();
\r
1814 public static IntPtr GetHalftonePalette ()
\r
1816 throw new NotImplementedException ();
\r
1819 [EditorBrowsable (EditorBrowsableState.Advanced)]
\r
1821 public IntPtr GetHdc ()
\r
1823 throw new NotImplementedException();
\r
1827 #region GetNearestColor
\r
1829 public Color GetNearestColor (Color color) {
\r
1830 throw new NotImplementedException();
\r
1834 #region IntersectClip
\r
1835 void IntersectClip (geom.Area area) {
\r
1837 geom.AffineTransform t = GetFinalTransform();
\r
1838 if (!t.isIdentity()) {
\r
1839 area = (geom.Area)area.clone();
\r
1840 area.transform(t);
\r
1843 _clip.NativeObject.intersect(area);
\r
1844 RestoreBaseClip();
\r
1845 NativeObject.clip(_clip);
\r
1848 public void IntersectClip (Region region) {
\r
1849 if (region == null)
\r
1850 throw new ArgumentNullException("region");
\r
1852 IntersectClip(region.NativeObject);
\r
1855 public void IntersectClip (RectangleF rect) {
\r
1856 IntersectClip(new geom.Area(rect.NativeObject));
\r
1859 public void IntersectClip (Rectangle rect) {
\r
1860 IntersectClip(new geom.Area(rect.NativeObject));
\r
1865 public bool IsVisible (Point point) {
\r
1866 return IsVisible(point.X,point.Y);
\r
1870 public bool IsVisible (RectangleF rect) {
\r
1871 return IsVisible ((float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height);
\r
1874 public bool IsVisible (PointF point) {
\r
1875 return IsVisible(point.X,point.Y);
\r
1878 public bool IsVisible (Rectangle rect) {
\r
1879 return IsVisible ((float)rect.X,(float)rect.Y,(float)rect.Width,(float)rect.Height);
\r
1882 public bool IsVisible (float x, float y) {
\r
1885 geom.AffineTransform t = GetFinalTransform();
\r
1886 if (!t.isIdentity()) {
\r
1887 double[] p = new double[] {dx, dy};
\r
1888 t.transform(p, 0, p, 0, 1);
\r
1893 if (!_clip.NativeObject.contains(dx, dy))
\r
1896 awt.Shape clip = NativeObject.getClip();
\r
1900 return clip.contains(dx, dy);
\r
1903 public bool IsVisible (int x, int y) {
\r
1904 return IsVisible ((float)x,(float)y);
\r
1907 public bool IsVisible (float x, float y, float width, float height) {
\r
1909 geom.AffineTransform t = GetFinalTransform();
\r
1910 geom.Rectangle2D r = new geom.Rectangle2D.Float(x, y, width, height);
\r
1912 if (!t.isIdentity())
\r
1913 r = t.createTransformedShape(r).getBounds2D();
\r
1915 return NativeObject.hitClip(
\r
1916 (int)(r.getX()+0.5), (int)(r.getY()+0.5),
\r
1917 (int)(r.getWidth()+0.5), (int)(r.getHeight()+0.5))
\r
1918 && _clip.NativeObject.intersects(r);
\r
1922 public bool IsVisible (int x, int y, int width, int height) {
\r
1923 return IsVisible ((float)x,(float)y,(float)width,(float)height);
\r
1927 #region MeasureCharacterRanges
\r
1928 public Region [] MeasureCharacterRanges (string text, Font font, RectangleF layoutRect, StringFormat stringFormat) {
\r
1929 if (stringFormat == null)
\r
1930 throw new ArgumentException("stringFormat");
\r
1932 CharacterRange[] ranges = stringFormat.CharRanges;
\r
1933 if (ranges == null || ranges.Length == 0)
\r
1934 return new Region[0];
\r
1936 GraphicsPath[] pathes = new GraphicsPath[ranges.Length];
\r
1937 for (int i = 0; i < pathes.Length; i++)
\r
1938 pathes[i] = new GraphicsPath();
\r
1940 TextLineIterator iter = new TextLineIterator(text, font, NativeObject.getFontRenderContext(),
\r
1941 stringFormat, layoutRect.Width, layoutRect.Height);
\r
1943 for (LineLayout layout = iter.NextLine(); layout != null; layout = iter.NextLine()) {
\r
1945 for (int i = 0; i < ranges.Length; i++) {
\r
1946 int start = ranges[i].First;
\r
1947 int length = ranges[i].Length;
\r
1948 start -= iter.CharsConsumed;
\r
1949 int limit = start + length;
\r
1950 int layoutStart = iter.CurrentPosition - layout.CharacterCount;
\r
1951 if (start < iter.CurrentPosition && limit > layoutStart) {
\r
1953 float layoutOffset;
\r
1954 if (start > layoutStart)
\r
1955 layoutOffset = iter.GetAdvanceBetween(layoutStart, start);
\r
1958 start = layoutStart;
\r
1961 float width = (limit < iter.CurrentPosition) ?
\r
1962 iter.GetAdvanceBetween(start, limit) :
\r
1963 layout.Width - layoutOffset;
\r
1965 float height = layout.Ascent + layout.Descent;
\r
1967 float x = layout.NativeX;
\r
1968 float y = layout.NativeY;
\r
1970 if (stringFormat.IsVertical) {
\r
1971 y += layoutOffset;
\r
1972 x -= layout.Descent;
\r
1975 x += layoutOffset;
\r
1976 y -= layout.Ascent;
\r
1979 if (layout.AccumulatedHeight + height > iter.WrapHeight) {
\r
1980 float diff = iter.WrapHeight - layout.AccumulatedHeight;
\r
1981 if (stringFormat.IsVertical && stringFormat.IsRightToLeft) {
\r
1989 if (stringFormat.IsVertical)
\r
1990 pathes[i].AddRectangle(x + layoutRect.X, y + layoutRect.Y, height, width);
\r
1992 pathes[i].AddRectangle(x + layoutRect.X, y + layoutRect.Y, width, height);
\r
1997 geom.AffineTransform lineAlignT = iter.CalcLineAlignmentTransform();
\r
1998 if (lineAlignT != null) {
\r
1999 for (int i = 0; i < pathes.Length; i++)
\r
2000 pathes[i].NativeObject.transform(lineAlignT);
\r
2003 Region[] regions = new Region[ranges.Length];
\r
2004 for (int i = 0; i < regions.Length; i++)
\r
2005 regions[i] = new Region(pathes[i]);
\r
2011 #region MeasureString
\r
2012 public SizeF MeasureString (string text, Font font) {
\r
2013 return MeasureString(text, font, null, float.PositiveInfinity, float.PositiveInfinity, null);
\r
2017 public SizeF MeasureString (string text, Font font, SizeF layoutArea) {
\r
2018 return MeasureString(text, font, layoutArea, null);
\r
2022 public SizeF MeasureString (string text, Font font, int width) {
\r
2023 return MeasureString(text, font, width, null);
\r
2027 public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat format) {
\r
2028 return MeasureString(text, font, format, layoutArea.Width, layoutArea.Height, null);
\r
2032 public SizeF MeasureString (string text, Font font, int width, StringFormat format) {
\r
2033 return MeasureString(text, font, format, width, float.PositiveInfinity, null);
\r
2037 public SizeF MeasureString (string text, Font font, PointF origin, StringFormat format) {
\r
2038 return MeasureString(text, font, format, float.PositiveInfinity, float.PositiveInfinity, null);
\r
2041 SizeF MeasureString (string text, Font font, StringFormat format, float width, float height, int[] statistics) {
\r
2043 if (statistics != null) {
\r
2044 statistics[0] = 0;
\r
2045 statistics[1] = 0;
\r
2048 TextLineIterator iter = new TextLineIterator(text, font, NativeObject.getFontRenderContext(), format, width, height);
\r
2051 int linesFilled = 0;
\r
2052 for (LineLayout layout = iter.NextLine(); layout != null; layout = iter.NextLine()) {
\r
2055 float w = layout.MeasureWidth;
\r
2061 if (linesFilled == 0)
\r
2062 return SizeF.Empty;
\r
2064 float mheight = iter.AccumulatedHeight;
\r
2066 if (format != null) {
\r
2067 if (format.IsVertical) {
\r
2068 float temp = mheight;
\r
2074 if (!(format != null && format.NoClip)) {
\r
2075 if (mwidth > width)
\r
2077 if (mheight > height)
\r
2081 if (statistics != null) {
\r
2082 statistics[0] = linesFilled;
\r
2083 statistics[1] = iter.CharsConsumed;
\r
2086 return new SizeF(mwidth, mheight);
\r
2090 public SizeF MeasureString (string text, Font font, SizeF layoutArea, StringFormat stringFormat, out int charactersFitted, out int linesFilled) {
\r
2092 charactersFitted = 0;
\r
2094 int[] statistics = new int[2];
\r
2095 SizeF sz = MeasureString(text, font, stringFormat, layoutArea.Width, layoutArea.Height, statistics);
\r
2096 linesFilled = statistics[0];
\r
2097 charactersFitted = statistics[1];
\r
2102 #region MultiplyTransform
\r
2103 public void MultiplyTransform (Matrix matrix) {
\r
2104 MultiplyTransform (matrix, MatrixOrder.Prepend);
\r
2107 public void MultiplyTransform (Matrix matrix, MatrixOrder order) {
\r
2108 ConcatenateTransform(matrix.NativeObject, order);
\r
2112 #region Reset (Clip and Transform)
\r
2113 public void ResetClip () {
\r
2114 _clip.MakeInfinite();
\r
2115 RestoreBaseClip();
\r
2116 NativeObject.clip(_clip);
\r
2119 public void ResetTransform () {
\r
2120 _transform.Reset();
\r
2124 #region RotateTransform
\r
2125 public void RotateTransform (float angle) {
\r
2126 RotateTransform (angle, MatrixOrder.Prepend);
\r
2129 public void RotateTransform (float angle, MatrixOrder order) {
\r
2130 ConcatenateTransform(
\r
2131 geom.AffineTransform.getRotateInstance(java.lang.Math.toRadians(angle)),
\r
2136 #region ScaleTransform
\r
2137 public void ScaleTransform (float sx, float sy) {
\r
2138 ScaleTransform (sx, sy, MatrixOrder.Prepend);
\r
2141 public void ScaleTransform (float sx, float sy, MatrixOrder order) {
\r
2142 ConcatenateTransform(
\r
2143 geom.AffineTransform.getScaleInstance(sx, sy),
\r
2148 #region SetClip [Must be reviewed - more abstraction needed]
\r
2149 public void SetClip (RectangleF rect) {
\r
2150 SetClip (rect, CombineMode.Replace);
\r
2153 public void SetClip (GraphicsPath path) {
\r
2154 SetClip (path, CombineMode.Replace);
\r
2157 public void SetClip (Rectangle rect) {
\r
2158 SetClip (rect, CombineMode.Replace);
\r
2161 public void SetClip (Graphics g) {
\r
2162 SetClip (g, CombineMode.Replace);
\r
2165 public void SetClip (Graphics g, CombineMode combineMode) {
\r
2167 throw new NullReferenceException();
\r
2169 CombineClipArea(g._clip.NativeObject, combineMode);
\r
2172 public void SetClip (Rectangle rect, CombineMode combineMode) {
\r
2173 SetClip(rect.X,rect.Y,rect.Width,rect.Height,combineMode);
\r
2175 public void SetClip (RectangleF rect, CombineMode combineMode) {
\r
2176 SetClip(rect.X,rect.Y,rect.Width,rect.Height,combineMode);
\r
2179 public void SetClip (Region region, CombineMode combineMode) {
\r
2180 if(region == null)
\r
2181 throw new ArgumentNullException("region");
\r
2183 CombineClipArea((geom.Area)region.NativeObject.clone(),combineMode);
\r
2186 public void SetClip (GraphicsPath path, CombineMode combineMode) {
\r
2188 throw new ArgumentNullException("path");
\r
2190 CombineClipArea(new geom.Area(path.NativeObject), combineMode);
\r
2194 #region Clipping Staff [INTERNAL]
\r
2195 internal Region ScaledClip {
\r
2197 return _clip.Clone();
\r
2200 _clip.NativeObject.reset();
\r
2201 _clip.NativeObject.add(value.NativeObject);
\r
2204 internal void SetClip(float x,float y,float width,float height,CombineMode combineMode) {
\r
2205 CombineClipArea(new geom.Area(
\r
2206 new geom.Rectangle2D.Float(x,y,width,height)),combineMode);
\r
2209 void CombineClipArea(geom.Area area, CombineMode combineMode) {
\r
2210 geom.AffineTransform t = GetFinalTransform();
\r
2211 if (!t.isIdentity())
\r
2212 area.transform(t);
\r
2213 if (combineMode == CombineMode.Replace) {
\r
2214 _clip.NativeObject.reset();
\r
2215 _clip.NativeObject.add(area);
\r
2218 geom.Area curClip = _clip.NativeObject;
\r
2219 switch(combineMode) {
\r
2220 case CombineMode.Complement:
\r
2221 curClip.add(area);
\r
2223 case CombineMode.Exclude:
\r
2224 curClip.subtract(area);
\r
2226 case CombineMode.Intersect:
\r
2227 curClip.intersect(area);
\r
2229 case CombineMode.Union:
\r
2230 curClip.add(area);
\r
2232 case CombineMode.Xor:
\r
2233 curClip.exclusiveOr(area);
\r
2236 throw new ArgumentOutOfRangeException();
\r
2240 RestoreBaseClip();
\r
2241 NativeObject.clip(_clip);
\r
2244 internal void IntersectScaledClipWithBase(awt.Shape clip) {
\r
2245 NativeObject.clip(clip);
\r
2248 void RestoreBaseClip() {
\r
2249 if (_nextGraphicsState == null) {
\r
2250 NativeObject.setClip(_windowRect);
\r
2254 _nextGraphicsState.RestoreBaseClip(this);
\r
2259 #region TransformPoints
\r
2261 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, PointF [] pts) {
\r
2262 //TBD:CoordinateSpace
\r
2263 java.awt.geom.AffineTransform tr = this.Transform.NativeObject;
\r
2264 float[] fpts = new float[2];
\r
2265 for(int i = 0; i< pts.Length; i++) {
\r
2266 fpts[0] = pts[i].X;
\r
2267 fpts[1] = pts[i].Y;
\r
2268 tr.transform(fpts, 0, fpts, 0, 1);
\r
2269 pts[i].X = fpts[0];
\r
2270 pts[i].Y = fpts[1];
\r
2275 public void TransformPoints (CoordinateSpace destSpace, CoordinateSpace srcSpace, Point [] pts) {
\r
2276 //TBD:CoordinateSpace
\r
2277 java.awt.geom.AffineTransform tr = this.Transform.NativeObject;
\r
2278 float[] fpts = new float[2];
\r
2279 for(int i = 0; i< pts.Length; i++) {
\r
2280 fpts[0] = pts[i].X;
\r
2281 fpts[1] = pts[i].Y;
\r
2282 tr.transform(fpts, 0, fpts, 0, 1);
\r
2283 pts[i].X = (int)fpts[0];
\r
2284 pts[i].Y = (int)fpts[1];
\r
2289 #region TranslateClip
\r
2290 public void TranslateClip (int dx, int dy) {
\r
2291 TranslateClip((float)dx, (float)dy);
\r
2295 public void TranslateClip (float dx, float dy) {
\r
2298 geom.AffineTransform f = GetFinalTransform();
\r
2300 if (!f.isIdentity()) {
\r
2301 double[] p = new double[] {x, y};
\r
2302 f.deltaTransform(p, 0, p, 0, 1);
\r
2308 // It seems .Net does exactly this...
\r
2309 x = Math.Floor(x+0.96875);
\r
2310 y = Math.Floor(y+0.96875);
\r
2312 geom.AffineTransform t = geom.AffineTransform.getTranslateInstance(x, y);
\r
2314 _clip.NativeObject.transform(t);
\r
2315 RestoreBaseClip();
\r
2316 NativeObject.clip(_clip);
\r
2320 #region TranslateTransform
\r
2321 public void TranslateTransform (float dx, float dy) {
\r
2322 TranslateTransform (dx, dy, MatrixOrder.Prepend);
\r
2326 public void TranslateTransform (float dx, float dy, MatrixOrder order) {
\r
2327 ConcatenateTransform(
\r
2328 geom.AffineTransform.getTranslateInstance(dx, dy),
\r
2333 #region Properties [Partial TODO]
\r
2334 public Region Clip {
\r
2336 Region r = _clip.Clone();
\r
2337 geom.AffineTransform t = GetFinalTransform();
\r
2338 if (!t.isIdentity())
\r
2339 r.NativeObject.transform(t.createInverse());
\r
2344 SetClip (value, CombineMode.Replace);
\r
2348 public RectangleF ClipBounds {
\r
2350 awt.Shape shape = _clip.NativeObject;
\r
2351 if (shape == null)
\r
2352 shape = Region.InfiniteRegion.NativeObject;
\r
2354 geom.RectangularShape r = shape.getBounds2D();
\r
2355 geom.AffineTransform t = GetFinalTransform();
\r
2356 if (!t.isIdentity()) {
\r
2357 geom.AffineTransform it = t.createInverse();
\r
2358 r = it.createTransformedShape(r).getBounds2D();
\r
2361 return new RectangleF (r);
\r
2365 public CompositingMode CompositingMode {
\r
2366 //TBD:check this carefully
\r
2368 return (NativeObject.getComposite() == awt.AlphaComposite.SrcOver) ?
\r
2369 CompositingMode.SourceOver : CompositingMode.SourceCopy;
\r
2372 NativeObject.setComposite(
\r
2373 (value == CompositingMode.SourceOver) ?
\r
2374 awt.AlphaComposite.SrcOver : awt.AlphaComposite.Src);
\r
2379 public CompositingQuality CompositingQuality {
\r
2381 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2382 if(hints.containsKey(awt.RenderingHints.KEY_ALPHA_INTERPOLATION)) {
\r
2383 object value_ai = hints.get(awt.RenderingHints.KEY_ALPHA_INTERPOLATION);
\r
2385 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED)
\r
2386 return CompositingQuality.HighSpeed;
\r
2387 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY)
\r
2388 return CompositingQuality.HighQuality;
\r
2389 if (value_ai == awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT)
\r
2390 return CompositingQuality.Default;
\r
2393 return CompositingQuality.Default;
\r
2397 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2399 case CompositingQuality.AssumeLinear:
\r
2400 case CompositingQuality.Default:
\r
2401 case CompositingQuality.GammaCorrected:
\r
2402 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2403 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);
\r
2405 case CompositingQuality.HighQuality:
\r
2406 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2407 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
\r
2409 case CompositingQuality.HighSpeed:
\r
2410 hints.put(awt.RenderingHints.KEY_ALPHA_INTERPOLATION,
\r
2411 awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_SPEED);
\r
2413 // case CompositingQuality.Invalid:
\r
2414 // if(hints.containsKey(awt.RenderingHints.KEY_ALPHA_INTERPOLATION))
\r
2415 // hints.remove(awt.RenderingHints.KEY_ALPHA_INTERPOLATION);
\r
2418 NativeObject.setRenderingHints(hints);
\r
2422 public float DpiX {
\r
2424 return DefaultScreenResolution;
\r
2428 public float DpiY {
\r
2430 //TBD: assume 72 (screen) for now
\r
2435 public InterpolationMode InterpolationMode {
\r
2437 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2438 if(hints.containsKey(awt.RenderingHints.KEY_INTERPOLATION)) {
\r
2439 object value_i = hints.get(awt.RenderingHints.KEY_INTERPOLATION);
\r
2441 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR)
\r
2442 return InterpolationMode.Bilinear;
\r
2443 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC)
\r
2444 return InterpolationMode.Bicubic;
\r
2445 if (value_i == awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)
\r
2446 return InterpolationMode.NearestNeighbor;
\r
2449 return InterpolationMode.Default;
\r
2452 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2455 case InterpolationMode.Bicubic:
\r
2456 case InterpolationMode.HighQualityBicubic:
\r
2457 case InterpolationMode.Low:
\r
2458 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC);
\r
2460 case InterpolationMode.High:
\r
2461 case InterpolationMode.Bilinear:
\r
2462 case InterpolationMode.HighQualityBilinear:
\r
2463 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR);
\r
2465 case InterpolationMode.Default:
\r
2466 if (hints.containsKey(awt.RenderingHints.KEY_INTERPOLATION))
\r
2467 hints.remove(awt.RenderingHints.KEY_INTERPOLATION);
\r
2469 case InterpolationMode.NearestNeighbor:
\r
2470 hints.put(awt.RenderingHints.KEY_INTERPOLATION, awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
\r
2472 case InterpolationMode.Invalid:
\r
2473 throw new ArgumentException();
\r
2475 throw new ArgumentOutOfRangeException();
\r
2478 NativeObject.setRenderingHints(hints);
\r
2482 public bool IsClipEmpty {
\r
2484 return _clip.IsEmpty(this);
\r
2488 public bool IsVisibleClipEmpty {
\r
2490 if (_clip.IsEmpty(this))
\r
2493 return VisibleClipBounds.IsEmpty;
\r
2497 public float PageScale {
\r
2499 return _pageScale;
\r
2502 _pageScale = value;
\r
2506 public GraphicsUnit PageUnit {
\r
2511 _pageUnit = value;
\r
2515 static internal geom.AffineTransform GetFinalTransform(
\r
2516 geom.AffineTransform transform, GraphicsUnit pageUnit, float pageScale) {
\r
2517 geom.AffineTransform t = null;
\r
2518 if (pageUnit != GraphicsUnit.Display) {
\r
2519 float scale = pageScale * _unitConversion[ (int)pageUnit ];
\r
2520 if (Math.Abs(scale-1f) > float.Epsilon)
\r
2521 t = geom.AffineTransform.getScaleInstance(scale, scale);
\r
2525 t.concatenate(transform);
\r
2532 geom.AffineTransform GetFinalTransform() {
\r
2533 return GetFinalTransform(_transform.NativeObject, PageUnit, PageScale);
\r
2536 public PixelOffsetMode PixelOffsetMode {
\r
2538 return _pixelOffsetMode;
\r
2541 _pixelOffsetMode = value;
\r
2546 public Point RenderingOrigin {
\r
2548 throw new NotImplementedException();
\r
2551 throw new NotImplementedException();
\r
2555 public SmoothingMode SmoothingMode {
\r
2557 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2558 if(hints.containsKey(awt.RenderingHints.KEY_ANTIALIASING)) {
\r
2559 object value_aa = hints.get(awt.RenderingHints.KEY_ANTIALIASING);
\r
2560 if (value_aa == awt.RenderingHints.VALUE_ANTIALIAS_ON) {
\r
2561 if(hints.containsKey(awt.RenderingHints.KEY_RENDERING)) {
\r
2562 object value_render = hints.get(awt.RenderingHints.KEY_RENDERING);
\r
2563 if (value_render == awt.RenderingHints.VALUE_RENDER_QUALITY)
\r
2564 return SmoothingMode.HighQuality;
\r
2565 if (value_render == awt.RenderingHints.VALUE_RENDER_SPEED)
\r
2566 return SmoothingMode.HighSpeed;
\r
2569 return SmoothingMode.AntiAlias;
\r
2572 if (value_aa == awt.RenderingHints.VALUE_ANTIALIAS_DEFAULT)
\r
2573 return SmoothingMode.Default;
\r
2575 return SmoothingMode.None;
\r
2580 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2583 case SmoothingMode.None:
\r
2584 if(hints.containsKey(awt.RenderingHints.KEY_ANTIALIASING))
\r
2585 hints.remove(awt.RenderingHints.KEY_ANTIALIASING);
\r
2586 if(hints.containsKey(awt.RenderingHints.KEY_RENDERING))
\r
2587 hints.remove(awt.RenderingHints.KEY_RENDERING);
\r
2589 case SmoothingMode.AntiAlias:
\r
2590 hints.put(awt.RenderingHints.KEY_ANTIALIASING, awt.RenderingHints.VALUE_ANTIALIAS_ON);
\r
2592 case SmoothingMode.HighQuality:
\r
2593 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_QUALITY);
\r
2594 goto case SmoothingMode.AntiAlias;
\r
2595 case SmoothingMode.HighSpeed:
\r
2596 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_SPEED);
\r
2597 goto case SmoothingMode.None;
\r
2598 case SmoothingMode.Default:
\r
2599 hints.put(awt.RenderingHints.KEY_RENDERING, awt.RenderingHints.VALUE_RENDER_DEFAULT);
\r
2600 goto case SmoothingMode.AntiAlias;
\r
2601 case SmoothingMode.Invalid:
\r
2602 throw new ArgumentException("Invalid parameter used.");
\r
2605 NativeObject.setRenderingHints(hints);
\r
2610 /// Java does not have similar functionality
\r
2612 public int TextContrast {
\r
2614 return _textContrast;
\r
2618 _textContrast = value;
\r
2622 public TextRenderingHint TextRenderingHint {
\r
2624 return _textRenderingHint;
\r
2625 // awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2626 // if(hints.containsKey(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING)) {
\r
2627 // if(hints.get(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING) ==
\r
2628 // java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
\r
2629 // return TextRenderingHint.AntiAlias;
\r
2630 // if(hints.get(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING) ==
\r
2631 // java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)
\r
2632 // return TextRenderingHint.SingleBitPerPixel;
\r
2634 // //return TextRenderingHint.SystemDefault;
\r
2635 // return TextRenderingHint.SingleBitPerPixelGridFit;
\r
2639 _textRenderingHint = value;
\r
2640 awt.RenderingHints hints = NativeObject.getRenderingHints();
\r
2642 case TextRenderingHint.AntiAlias:
\r
2643 case TextRenderingHint.AntiAliasGridFit:
\r
2644 case TextRenderingHint.ClearTypeGridFit:
\r
2645 // case TextRenderingHint.SystemDefault:
\r
2646 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2647 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
\r
2650 case TextRenderingHint.SingleBitPerPixelGridFit:
\r
2651 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2652 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
\r
2655 case TextRenderingHint.SingleBitPerPixel:
\r
2656 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2657 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
\r
2660 case TextRenderingHint.SystemDefault:
\r
2661 hints.put(awt.RenderingHints.KEY_TEXT_ANTIALIASING,
\r
2662 awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
\r
2666 NativeObject.setRenderingHints(hints);
\r
2670 public Matrix Transform {
\r
2672 return _transform.Clone();
\r
2675 if (value == null)
\r
2676 throw new ArgumentNullException("matrix");
\r
2678 if (!value.IsInvertible)
\r
2679 throw new ArgumentException("Invalid parameter used.");
\r
2681 value.CopyTo(_transform);
\r
2685 internal Matrix BaseTransform {
\r
2687 return new Matrix(NativeObject.getTransform());
\r
2690 NativeObject.setTransform(value.NativeObject);
\r
2694 internal void PrependBaseTransform(geom.AffineTransform t) {
\r
2695 NativeObject.transform(t);
\r
2698 internal awt.Shape VisibleShape {
\r
2700 return _windowRect;
\r
2704 public RectangleF VisibleClipBounds {
\r
2706 if (_clip.IsEmpty(this))
\r
2707 return RectangleF.Empty;
\r
2709 geom.Rectangle2D r = _clip.NativeObject.getBounds2D();
\r
2710 awt.Shape clip = NativeObject.getClip();
\r
2711 geom.Rectangle2D clipBounds = (clip != null) ? clip.getBounds2D() : _windowRect;
\r
2712 geom.Rectangle2D.intersect(r, clipBounds, r);
\r
2713 if ((r.getWidth() <= 0) || (r.getHeight() <= 0))
\r
2714 return RectangleF.Empty;
\r
2716 geom.AffineTransform t = GetFinalTransform();
\r
2717 if (!t.isIdentity()) {
\r
2718 geom.AffineTransform it = t.createInverse();
\r
2719 r = it.createTransformedShape(r).getBounds2D();
\r
2722 return new RectangleF (r);
\r
2726 void ConcatenateTransform(geom.AffineTransform transform, MatrixOrder order) {
\r
2727 geom.AffineTransform at = _transform.NativeObject;
\r
2728 Matrix.Multiply(at, transform, order);
\r