2
Copyright (C) 2002, 2004, 2005, 2006, 2007 Jeroen Frijters
3
Copyright (C) 2006 Active Endpoints, Inc.
4
Copyright (C) 2006 - 2011 Volker Berlin (i-net software)
5
Copyright (C) 2011 Karsten Heinrich (i-net software)
7
This software is provided 'as-is', without any express or implied
8
warranty. In no event will the authors be held liable for any damages
9
arising from the use of this software.
11
Permission is granted to anyone to use this software for any purpose,
12
including commercial applications, and to alter it and redistribute it
13
freely, subject to the following restrictions:
15
1. The origin of this software must not be misrepresented; you must not
16
claim that you wrote the original software. If you use this software
17
in a product, an acknowledgment in the product documentation would be
18
appreciated but is not required.
19
2. Altered source versions must be plainly marked as such, and must not be
20
misrepresented as being the original software.
21
3. This notice may not be removed or altered from any source distribution.
30
using System.Drawing.Drawing2D;
31
using System.Drawing.Text;
32
using System.Globalization;
33
using System.Windows.Forms;
40
internal class BitmapGraphics : NetGraphics
42
private readonly Bitmap bitmap;
44
internal BitmapGraphics(Bitmap bitmap, java.awt.Font font, Color fgcolor, Color bgcolor)
45
: base(createGraphics(bitmap), font, fgcolor, bgcolor)
50
internal BitmapGraphics(Bitmap bitmap)
51
: base(createGraphics(bitmap), null, Color.White, Color.Black)
56
protected override SizeF GetSize() {
60
private static Graphics createGraphics(Bitmap bitmap)
62
// lock to prevent the exception
63
// System.InvalidOperationException: Object is currently in use elsewhere
66
return Graphics.FromImage(bitmap);
70
public override java.awt.Graphics create()
72
BitmapGraphics newGraphics = (BitmapGraphics)MemberwiseClone();
73
newGraphics.init(createGraphics(bitmap));
77
public override void copyArea(int x, int y, int width, int height, int dx, int dy)
79
Bitmap copy = new Bitmap(width, height);
80
using (Graphics gCopy = Graphics.FromImage(copy))
82
gCopy.DrawImage(bitmap, new Rectangle(0, 0, width, height), x, y, width, height, GraphicsUnit.Pixel);
84
g.DrawImageUnscaled(copy, x + dx, y + dy);
88
internal class ComponentGraphics : NetGraphics
90
private readonly Control control;
92
internal ComponentGraphics(Control control, java.awt.Color fgColor, java.awt.Color bgColor, java.awt.Font font)
93
: base(control.CreateGraphics(), font, J2C.ConvertColor(fgColor), J2C.ConvertColor(bgColor))
95
this.control = control;
98
protected override SizeF GetSize() {
102
public override java.awt.Graphics create()
104
ComponentGraphics newGraphics = (ComponentGraphics)MemberwiseClone();
105
newGraphics.init(control.CreateGraphics());
109
private Point getPointToScreenImpl(Point point)
111
return this.control.PointToScreen(point);
114
private Point getPointToScreen(Point point)
116
return (Point)this.control.Invoke(new Converter<Point,Point>(getPointToScreenImpl),point);
119
public override void copyArea(int x, int y, int width, int height, int dx, int dy)
121
Point src = getPointToScreen(new Point(x + (int)this.g.Transform.OffsetX, y + (int)this.g.Transform.OffsetY));
122
Point dest = new Point(x + (int)this.g.Transform.OffsetX + dx, y + (int)this.g.Transform.OffsetY + dy);
123
this.g.CopyFromScreen(src, dest, new Size(width, height));
126
public override void clip(java.awt.Shape shape)
130
// the API specification says that this will clear
131
// the clip, but in fact the reference implementation throws a
132
// NullPointerException - see the following entry in the bug parade:
133
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6206189
134
throw new java.lang.NullPointerException();
140
internal class PrintGraphicsContext
142
internal PrintGraphics Current;
145
internal class PrintGraphics : NetGraphics
147
private NetGraphicsState myState;
148
private PrintGraphicsContext baseContext;
149
private bool disposed = false;
150
private bool isBase = true;
152
internal PrintGraphics(Graphics g)
153
: base(g, null, Color.White, Color.Black)
155
baseContext = new PrintGraphicsContext();
156
baseContext.Current = this;
159
public override java.awt.Graphics create()
162
myState = new NetGraphicsState();
163
myState.saveGraphics(this);
164
PrintGraphics newGraphics = (PrintGraphics)MemberwiseClone();
165
newGraphics.myState = null;
166
newGraphics.isBase = false;
167
newGraphics.baseContext = baseContext;
168
baseContext.Current = newGraphics; // since it is very likely that the next op will be on that graphics
169
// this is similar to init
170
myState.restoreGraphics(newGraphics);
175
/// Checks whether the properties of this instance are set to the bse Graphics. If not, the context
176
/// of the currently PrintGraphics is saved and the context if this instance is restored.
178
private void checkState()
180
// this is required to simulate Graphics.create(), which is not possible in .NET
181
// we simply call Save on create() an restore this state, if any method is called
182
// on the current graphics. This will work for almost any use case of create()
183
if (baseContext != null && baseContext.Current != this)
185
if (!baseContext.Current.disposed)
187
if (baseContext.Current.myState == null)
189
baseContext.Current.myState = new NetGraphicsState(baseContext.Current);
193
baseContext.Current.myState.saveGraphics(baseContext.Current);
196
baseContext.Current = this;
197
if (myState != null) // is only null, if this instance was already disposed
199
myState.restoreGraphics(this);
204
public override void copyArea(int x, int y, int width, int height, int dx, int dy)
206
throw new NotImplementedException();
209
public override void clearRect(int x, int y, int width, int height)
212
base.clearRect(x, y, width, height);
215
public override void clipRect(int x, int y, int w, int h)
218
base.clearRect(x, y, w, h);
221
public override void clip(java.awt.Shape shape)
227
public override void dispose()
230
if (pen != null) pen.Dispose();
231
if (brush != null) brush.Dispose();
235
// only dispose the underlying Graphics if this is the base PrintGraphics!
241
public override void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
244
base.drawArc(x, y, width, height, startAngle, arcAngle);
247
public override void drawBytes(byte[] data, int offset, int length, int x, int y)
250
base.drawBytes(data, offset, length, x, y);
253
public override void drawChars(char[] data, int offset, int length, int x, int y)
256
base.drawChars(data, offset, length, x, y);
259
public override bool drawImage(java.awt.Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, java.awt.Color color, java.awt.image.ImageObserver observer)
262
return base.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, color, observer);
265
public override bool drawImage(java.awt.Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, java.awt.image.ImageObserver observer)
268
return base.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer);
271
public override bool drawImage(java.awt.Image img, int x, int y, int width, int height, java.awt.Color bgcolor, java.awt.image.ImageObserver observer)
274
return base.drawImage( img, x, y, width, height, bgcolor, observer);
277
public override bool drawImage(java.awt.Image img, int x, int y, java.awt.Color bgcolor, java.awt.image.ImageObserver observer)
280
return base.drawImage(img, x, y, bgcolor, observer);
283
public override bool drawImage(java.awt.Image img, int x, int y, int width, int height, java.awt.image.ImageObserver observer)
286
return base.drawImage( img, x, y, width, height, observer);
289
public override bool drawImage(java.awt.Image img, int x, int y, java.awt.image.ImageObserver observer)
292
return base.drawImage(img, x, y, observer);
295
public override void drawLine(int x1, int y1, int x2, int y2)
298
base.drawLine(x1, y1, x2, y2);
301
public override void drawOval(int x, int y, int w, int h)
304
base.drawOval(x, y, w, h);
307
public override void drawPolygon(java.awt.Polygon polygon)
310
base.drawPolygon(polygon);
313
public override void drawPolygon(int[] aX, int[] aY, int aLength)
316
base.drawPolygon(aX, aY, aLength);
319
public override void drawPolyline(int[] aX, int[] aY, int aLength)
322
base.drawPolyline(aX, aY, aLength);
325
public override void drawRect(int x, int y, int width, int height)
328
base.drawRect(x, y, width, height);
331
public override void drawRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight)
334
base.drawRoundRect(x, y, w, h, arcWidth, arcHeight);
337
public override void fill3DRect(int x, int y, int width, int height, bool raised)
340
base.fill3DRect(x, y, width, height, raised);
343
public override void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
346
base.fillArc(x, y, width, height, startAngle, arcAngle);
349
public override void fillOval(int x, int y, int w, int h)
352
base.fillOval(x, y, w, h);
355
public override void fillPolygon(java.awt.Polygon polygon)
358
base.fillPolygon(polygon);
361
public override void fillPolygon(int[] aX, int[] aY, int aLength)
364
base.fillPolygon(aX, aY, aLength);
367
public override void fillRect(int x, int y, int width, int height)
370
base.fillRect(x, y, width, height);
373
public override void fillRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight)
376
base.fillRoundRect(x, y, w, h, arcWidth, arcHeight);
379
public override java.awt.Shape getClip()
382
return base.getClip();
385
public override java.awt.Rectangle getClipBounds(java.awt.Rectangle r)
388
return base.getClipBounds( r );
391
public override java.awt.Rectangle getClipBounds()
394
return base.getClipBounds();
398
public override java.awt.Rectangle getClipRect()
401
return base.getClipRect();
404
public override java.awt.Color getColor()
407
return base.getColor();
410
public override java.awt.Font getFont()
413
return base.getFont();
416
public override java.awt.FontMetrics getFontMetrics(java.awt.Font f)
419
return base.getFontMetrics(f);
422
public override java.awt.FontMetrics getFontMetrics()
425
return base.getFontMetrics();
428
public override void setClip(int x, int y, int width, int height)
431
base.setClip(x,y,width,height);
434
public override void setClip(java.awt.Shape shape)
440
public override void setColor(java.awt.Color color)
443
base.setColor(color);
446
public override void setFont(java.awt.Font f)
452
public override void setPaintMode()
458
public override void setXORMode(java.awt.Color param)
461
base.setXORMode(param);
464
public override void translate(int x, int y)
467
base.translate(x, y);
470
public override void draw(java.awt.Shape shape)
476
public override bool drawImage(java.awt.Image img, java.awt.geom.AffineTransform xform, ImageObserver observer)
479
return base.drawImage(img, xform, observer);
482
public override void drawImage(java.awt.image.BufferedImage image, BufferedImageOp op, int x, int y)
485
base.drawImage(image, op, x, y);
488
public override void drawRenderedImage(java.awt.image.RenderedImage img, java.awt.geom.AffineTransform xform)
491
base.drawRenderedImage(img, xform);
494
public override void drawRenderableImage(java.awt.image.renderable.RenderableImage image, java.awt.geom.AffineTransform xform)
497
base.drawRenderableImage(image, xform);
500
public override void drawString(string str, int x, int y)
503
base.drawString(str, x, y);
506
public override void drawString(string text, float x, float y)
509
base.drawString(text, x, y);
512
public override void drawString(java.text.AttributedCharacterIterator iterator, int x, int y)
515
base.drawString(iterator, x, y);
518
public override void drawString(java.text.AttributedCharacterIterator iterator, float x, float y)
521
base.drawString(iterator, x, y);
524
public override void fill(java.awt.Shape shape)
530
public override bool hit(java.awt.Rectangle rect, java.awt.Shape s, bool onStroke)
533
return base.hit(rect, s, onStroke);
536
public override java.awt.GraphicsConfiguration getDeviceConfiguration()
538
// no check here, since invariant
539
return base.getDeviceConfiguration();
542
public override void setComposite(java.awt.Composite comp)
545
base.setComposite(comp);
548
public override void setPaint(java.awt.Paint paint)
551
base.setPaint(paint);
554
public override void setStroke(java.awt.Stroke stroke)
557
base.setStroke(stroke);
560
public override void setRenderingHint(java.awt.RenderingHints.Key hintKey, Object hintValue)
563
base.setRenderingHint(hintKey, hintValue);
566
public override object getRenderingHint(java.awt.RenderingHints.Key hintKey)
569
return base.getRenderingHint(hintKey);
572
public override void setRenderingHints(java.util.Map hints)
575
base.setRenderingHints(hints);
578
public override void addRenderingHints(java.util.Map hints)
581
base.addRenderingHints(hints);
584
public override java.awt.RenderingHints getRenderingHints()
587
return base.getRenderingHints();
590
public override void translate(double x, double y)
593
base.translate(x, y);
596
public override void rotate(double theta)
602
public override void rotate(double theta, double x, double y)
605
base.rotate(theta, x, y);
608
public override void scale(double scaleX, double scaleY)
611
base.scale(scaleX, scaleY);
614
public override void shear(double shearX, double shearY)
617
base.shear(shearX, shearY);
620
public override void transform(java.awt.geom.AffineTransform tx)
626
public override void setTransform(java.awt.geom.AffineTransform tx)
629
base.setTransform(tx);
632
public override java.awt.geom.AffineTransform getTransform()
635
return base.getTransform();
638
public override java.awt.Paint getPaint()
641
return base.getPaint();
644
public override java.awt.Composite getComposite()
647
return base.getComposite();
650
public override void setBackground(java.awt.Color color)
653
base.setBackground(color);
656
public override java.awt.Color getBackground()
659
return base.getBackground();
662
public override java.awt.Stroke getStroke()
665
return base.getStroke();
668
public override java.awt.font.FontRenderContext getFontRenderContext()
671
return base.getFontRenderContext();
674
public override void drawGlyphVector(java.awt.font.GlyphVector gv, float x, float y)
677
base.drawGlyphVector(gv, x, y);
682
/// State to store/restore the state of a NetGraphics/Graphics object
684
internal class NetGraphicsState
690
private Matrix Transform;
692
private SmoothingMode SmoothingMode;
693
private PixelOffsetMode PixelOffsetMode;
694
private TextRenderingHint TextRenderingHint;
695
private InterpolationMode InterpolationMode;
696
private CompositingMode CompositingMode;
698
private bool savedGraphics = false;
700
public NetGraphicsState()
704
public NetGraphicsState( NetGraphics netG )
709
public void saveGraphics(NetGraphics netG)
717
this.Transform = netG.g.Transform;
718
this.Clip = netG.g.Clip;
719
this.SmoothingMode = netG.g.SmoothingMode;
720
this.PixelOffsetMode = netG.g.PixelOffsetMode;
721
this.TextRenderingHint = netG.g.TextRenderingHint;
722
this.InterpolationMode = netG.g.InterpolationMode;
723
this.CompositingMode = netG.g.CompositingMode;
724
savedGraphics = true;
726
if (netG.pen != null && netG.brush != null)
728
pen = (Pen)netG.pen.Clone();
729
brush = (Brush)netG.brush.Clone();
733
public void restoreGraphics(NetGraphics netG)
743
netG.g.Transform = Transform;
745
netG.g.SmoothingMode = SmoothingMode;
746
netG.g.PixelOffsetMode = PixelOffsetMode;
747
netG.g.TextRenderingHint = TextRenderingHint;
748
netG.g.InterpolationMode = InterpolationMode;
749
netG.g.CompositingMode = CompositingMode;
753
// default values that Java used
754
netG.g.InterpolationMode = InterpolationMode.NearestNeighbor;
757
if ( pen != null && brush != null )
759
netG.pen = (Pen)pen.Clone();
760
netG.brush = (Brush)brush.Clone();
764
netG.pen = new Pen(netG.color);
765
netG.brush = new SolidBrush(netG.color);
766
netG.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
771
internal abstract class NetGraphics : java.awt.Graphics2D
774
internal Graphics JGraphics { get { return g; } }
775
private java.awt.Color javaColor;
776
private java.awt.Paint javaPaint;
777
internal Color color;
778
private Color bgcolor;
779
private java.awt.Font font;
780
private java.awt.Stroke stroke;
781
private static java.awt.BasicStroke defaultStroke = new java.awt.BasicStroke();
782
private Font netfont;
783
internal Brush brush;
785
private CompositeHelper composite;
786
private java.awt.Composite javaComposite = java.awt.AlphaComposite.SrcOver;
787
private Object textAntialiasHint;
788
private Object fractionalHint = java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT;
790
protected NetGraphics(Graphics g, java.awt.Font font, Color fgcolor, Color bgcolor)
794
font = new java.awt.Font("Dialog", java.awt.Font.PLAIN, 12);
797
netfont = font.getNetFont();
798
this.color = fgcolor;
799
this.bgcolor = bgcolor;
800
composite = CompositeHelper.Create(javaComposite, g);
804
protected void init(Graphics graphics)
806
NetGraphicsState state = new NetGraphicsState();
807
state.saveGraphics(this);
809
state.restoreGraphics(this);
813
/// Get the size of the graphics. This is used as a hind for some hacks.
815
/// <returns></returns>
816
protected virtual SizeF GetSize() {
817
return g.ClipBounds.Size;
820
public override void clearRect(int x, int y, int width, int height)
822
using (Brush br = bgcolor != Color.Empty ? new SolidBrush(bgcolor) : brush)
824
CompositingMode tempMode = g.CompositingMode;
825
g.CompositingMode = CompositingMode.SourceCopy;
826
g.FillRectangle(br, x, y, width, height);
827
g.CompositingMode = tempMode;
831
public override void clipRect(int x, int y, int w, int h)
833
g.IntersectClip(new Rectangle(x, y, w, h));
836
public override void clip(java.awt.Shape shape)
840
// note that ComponentGraphics overrides clip() to throw a NullPointerException when shape is null
845
g.IntersectClip(new Region(J2C.ConvertShape(shape)));
849
public override void dispose()
851
if (pen!=null) pen.Dispose();
852
if (brush!=null) brush.Dispose();
856
public override void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
858
g.DrawArc(pen, x, y, width, height, 360 - startAngle - arcAngle, arcAngle);
861
public override void drawBytes(byte[] data, int offset, int length, int x, int y)
863
char[] chars = new char[length];
864
for (int i = 0; i < length; i++)
866
chars[i] = (char)data[offset + i];
868
drawChars(chars, 0, length, x, y);
871
public override void drawChars(char[] data, int offset, int length, int x, int y)
873
drawString(new String(data, offset, length), x, y);
876
public override bool drawImage(java.awt.Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, java.awt.Color color, java.awt.image.ImageObserver observer)
878
Image image = J2C.ConvertImage(img);
883
Rectangle destRect = new Rectangle(dx1, dy1, dx2 - dx1, dy2 - dy1);
884
using (Brush brush = new SolidBrush(composite.GetColor(color))) {
885
g.FillRectangle(brush, destRect);
889
g.DrawImage(image, destRect, sx1, sy1, sx2 - sx1, sy2 - sy1, GraphicsUnit.Pixel, composite.GetImageAttributes());
894
public override bool drawImage(java.awt.Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, java.awt.image.ImageObserver observer)
896
Image image = J2C.ConvertImage(img);
901
Rectangle destRect = new Rectangle(dx1, dy1, dx2 - dx1, dy2 - dy1);
904
g.DrawImage(image, destRect, sx1, sy1, sx2 - sx1, sy2 - sy1, GraphicsUnit.Pixel, composite.GetImageAttributes());
909
public override bool drawImage(java.awt.Image img, int x, int y, int width, int height, java.awt.Color bgcolor, java.awt.image.ImageObserver observer)
911
Image image = J2C.ConvertImage(img);
916
using (Brush brush = new SolidBrush(composite.GetColor(bgcolor))) {
917
g.FillRectangle(brush, x, y, width, height);
921
g.DrawImage(image, new Rectangle( x, y, width, height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, composite.GetImageAttributes());
926
public override bool drawImage(java.awt.Image img, int x, int y, java.awt.Color bgcolor, java.awt.image.ImageObserver observer)
931
return drawImage(img, x, y, img.getWidth(observer), img.getHeight(observer), bgcolor, observer);
934
public override bool drawImage(java.awt.Image img, int x, int y, int width, int height, java.awt.image.ImageObserver observer)
936
Image image = J2C.ConvertImage(img);
943
g.DrawImage(image, new Rectangle(x, y, width, height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, composite.GetImageAttributes());
948
public override bool drawImage(java.awt.Image img, int x, int y, java.awt.image.ImageObserver observer)
953
return drawImage(img, x, y, img.getWidth(observer), img.getHeight(observer), observer);
956
public override void drawLine(int x1, int y1, int x2, int y2)
958
// HACK DrawLine doesn't appear to draw the last pixel, so for single pixel lines, we have
959
// a freaky workaround
960
if (x1 == x2 && y1 == y2)
962
g.DrawLine(pen, x1, y1, x1 + 0.01f, y2 + 0.01f);
966
g.DrawLine(pen, x1, y1, x2, y2);
970
public override void drawOval(int x, int y, int w, int h)
972
g.DrawEllipse(pen, x, y, w, h);
975
public override void drawPolygon(java.awt.Polygon polygon)
977
drawPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints);
980
public override void drawPolygon(int[] aX, int[] aY, int aLength)
982
Point[] points = new Point[aLength];
983
for (int i = 0; i < aLength; i++)
988
g.DrawPolygon(pen, points);
992
/// Draw a sequence of connected lines
994
/// <param name="aX">Array of x coordinates</param>
995
/// <param name="aY">Array of y coordinates</param>
996
/// <param name="aLength">Length of coordinate arrays</param>
997
public override void drawPolyline(int[] aX, int[] aY, int aLength)
999
for (int i = 0; i < aLength - 1; i++)
1001
Point point1 = new Point(aX[i], aY[i]);
1002
Point point2 = new Point(aX[i + 1], aY[i + 1]);
1003
g.DrawLine(pen, point1, point2);
1007
public override void drawRect(int x, int y, int width, int height)
1009
g.DrawRectangle(pen, x, y, width, height);
1013
/// Apparently there is no rounded rec function in .Net. Draw the
1014
/// rounded rectangle by using lines and arcs.
1016
public override void drawRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight)
1018
using (GraphicsPath gp = J2C.ConvertRoundRect(x, y, w, h, arcWidth, arcHeight))
1019
g.DrawPath(pen, gp);
1022
public override void fill3DRect(int x, int y, int width, int height, bool raised)
1024
java.awt.Paint p = getPaint();
1025
java.awt.Color c = getColor();
1026
java.awt.Color brighter = c.brighter();
1027
java.awt.Color darker = c.darker();
1031
} else if( p != c ) {
1034
fillRect(x + 1, y + 1, width - 2, height - 2);
1035
setColor(raised ? brighter : darker);
1036
fillRect(x, y, 1, height);
1037
fillRect(x + 1, y, width - 2, 1);
1038
setColor(raised ? darker : brighter);
1039
fillRect(x + 1, y + height - 1, width - 1, 1);
1040
fillRect(x + width - 1, y, 1, height - 1);
1044
public override void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
1046
g.FillPie(brush, x, y, width, height, 360 - startAngle - arcAngle, arcAngle);
1049
public override void fillOval(int x, int y, int w, int h)
1051
g.FillEllipse(brush, x, y, w, h);
1054
public override void fillPolygon(java.awt.Polygon polygon)
1056
fillPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints);
1059
public override void fillPolygon(int[] aX, int[] aY, int aLength)
1061
Point[] points = new Point[aLength];
1062
for (int i = 0; i < aLength; i++)
1064
points[i].X = aX[i];
1065
points[i].Y = aY[i];
1067
g.FillPolygon(brush, points);
1070
public override void fillRect(int x, int y, int width, int height)
1072
g.FillRectangle(brush, x, y, width, height);
1075
public override void fillRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight)
1077
GraphicsPath gp = J2C.ConvertRoundRect(x, y, w, h, arcWidth, arcHeight);
1078
g.FillPath(brush, gp);
1082
public override java.awt.Shape getClip()
1084
return getClipBounds();
1087
public override java.awt.Rectangle getClipBounds(java.awt.Rectangle r)
1089
using (Region clip = g.Clip)
1091
if (!clip.IsInfinite(g))
1093
RectangleF rec = clip.GetBounds(g);
1096
r.width = (int) rec.Width;
1097
r.height = (int) rec.Height;
1103
public override java.awt.Rectangle getClipBounds()
1105
using (Region clip = g.Clip)
1107
if (clip.IsInfinite(g))
1111
RectangleF rec = clip.GetBounds(g);
1112
return C2J.ConvertRectangle(rec);
1117
public override java.awt.Rectangle getClipRect()
1119
return getClipBounds();
1122
public override java.awt.Color getColor()
1124
if (javaColor == null)
1126
javaColor = composite.GetColor(color);
1131
public override java.awt.Font getFont()
1136
public override java.awt.FontMetrics getFontMetrics(java.awt.Font f)
1138
return sun.font.FontDesignMetrics.getMetrics(f);
1141
public override java.awt.FontMetrics getFontMetrics()
1143
return sun.font.FontDesignMetrics.getMetrics(font);
1146
public override void setClip(int x, int y, int width, int height)
1148
g.Clip = new Region(new Rectangle(x, y, width, height));
1151
public override void setClip(java.awt.Shape shape)
1155
Region clip = g.Clip;
1156
clip.MakeInfinite();
1161
g.Clip = new Region(J2C.ConvertShape(shape));
1165
public override void setColor(java.awt.Color color)
1167
if (color == null || color == this.javaPaint)
1169
// Does not change the color, if it is null like in SunGraphics2D
1172
this.javaPaint = this.javaColor = color;
1173
this.color = composite.GetColor(color);
1174
if (brush is SolidBrush)
1176
((SolidBrush)brush).Color = this.color;
1181
brush = new SolidBrush(this.color);
1183
pen.Color = this.color;
1187
public override void setFont(java.awt.Font f)
1189
if (f != null && f != font)
1191
netfont = f.getNetFont();
1196
public override void setPaintMode()
1198
throw new NotImplementedException();
1201
public override void setXORMode(java.awt.Color param)
1203
if( param == null ) {
1204
throw new java.lang.IllegalArgumentException("null XORColor");
1206
throw new NotImplementedException();
1209
public override void translate(int x, int y)
1211
Matrix transform = g.Transform;
1212
transform.Translate(x, y);
1213
g.Transform = transform;
1216
public override void draw(java.awt.Shape shape)
1218
using (GraphicsPath gp = J2C.ConvertShape(shape))
1220
g.DrawPath(pen, gp);
1224
public override bool drawImage(java.awt.Image img, java.awt.geom.AffineTransform xform, ImageObserver observer)
1230
if (xform == null || xform.isIdentity()) {
1231
return drawImage(img, 0, 0, null, observer);
1234
NetGraphics clone = (NetGraphics)create();
1235
clone.transform(xform);
1236
bool rendered = clone.drawImage(img, 0, 0, null, observer);
1241
public override void drawImage(java.awt.image.BufferedImage image, BufferedImageOp op, int x, int y)
1245
drawImage(image, x, y, null);
1247
if( !(op is AffineTransformOp) ) {
1248
drawImage(op.filter(image, null), x, y, null);
1250
Console.WriteLine(new System.Diagnostics.StackTrace());
1251
throw new NotImplementedException();
1256
public override void drawRenderedImage(java.awt.image.RenderedImage img, java.awt.geom.AffineTransform xform)
1262
// BufferedImage case: use a simple drawImage call
1263
if (img is BufferedImage) {
1264
BufferedImage bufImg = (BufferedImage)img;
1265
drawImage(bufImg,xform,null);
1268
throw new NotImplementedException("drawRenderedImage not implemented for images which are not BufferedImages.");
1271
public override void drawRenderableImage(java.awt.image.renderable.RenderableImage image, java.awt.geom.AffineTransform xform)
1273
throw new NotImplementedException();
1276
public override void drawString(string str, int x, int y)
1278
drawString(str, (float)x, (float)y);
1281
public override void drawString(String text, float x, float y)
1283
if (text.Length == 0)
1287
bool fractional = isFractionalMetrics();
1288
StringFormat format = new StringFormat(StringFormat.GenericTypographic);
1289
format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox;
1290
format.Trimming = StringTrimming.None;
1291
if (fractional || !sun.font.StandardGlyphVector.isSimpleString(font, text))
1293
g.DrawString(text, netfont, brush, x, y - font.getSize(), format);
1297
// fixed metric for simple text, we position every character to simulate the Java behaviour
1298
java.awt.font.FontRenderContext frc = new java.awt.font.FontRenderContext(null, isAntiAlias(), fractional);
1299
sun.font.FontDesignMetrics metrics = sun.font.FontDesignMetrics.getMetrics(font, frc);
1300
y -= font.getSize();
1301
for (int i = 0; i < text.Length; i++)
1303
g.DrawString(text.Substring(i, 1), netfont, brush, x, y, format);
1304
x += metrics.charWidth(text[i]);
1309
public override void drawString(java.text.AttributedCharacterIterator iterator, int x, int y)
1311
drawString(iterator, (float) x, (float) y);
1314
public override void drawString(java.text.AttributedCharacterIterator iterator, float x, float y)
1316
if( iterator == null ) {
1317
throw new java.lang.NullPointerException("AttributedCharacterIterator is null");
1319
if( iterator.getBeginIndex() == iterator.getEndIndex() ) {
1320
return; /* nothing to draw */
1322
java.awt.font.TextLayout tl = new java.awt.font.TextLayout(iterator, getFontRenderContext());
1323
tl.draw(this, x, y);
1326
public override void fill(java.awt.Shape shape)
1328
g.FillPath(brush, J2C.ConvertShape(shape));
1331
public override bool hit(java.awt.Rectangle rect, java.awt.Shape s, bool onStroke)
1336
//s = stroke.createStrokedShape(s);
1338
return s.intersects(rect);
1341
public override java.awt.GraphicsConfiguration getDeviceConfiguration()
1343
return new NetGraphicsConfiguration(Screen.PrimaryScreen);
1346
public override void setComposite(java.awt.Composite comp)
1350
throw new java.lang.IllegalArgumentException("null Composite");
1352
this.javaComposite = comp;
1353
composite = CompositeHelper.Create(comp,g);
1354
java.awt.Paint oldPaint = javaPaint;
1359
public override void setPaint(java.awt.Paint paint)
1361
if (paint is java.awt.Color)
1363
setColor((java.awt.Color)paint);
1367
if (paint == null || this.javaPaint == paint)
1371
this.javaPaint = paint;
1373
if (paint is java.awt.GradientPaint)
1375
java.awt.GradientPaint gradient = (java.awt.GradientPaint)paint;
1376
LinearGradientBrush linear;
1377
if (gradient.isCyclic())
1379
linear = new LinearGradientBrush(
1380
J2C.ConvertPoint(gradient.getPoint1()),
1381
J2C.ConvertPoint(gradient.getPoint2()),
1382
composite.GetColor(gradient.getColor1()),
1383
composite.GetColor(gradient.getColor2()));
1387
//HACK because .NET does not support continue gradient like Java else Tile Gradient
1388
//that we receize the rectangle very large (factor z) and set 4 color values
1389
// a exact solution will calculate the size of the Graphics with the current transform
1390
Color color1 = composite.GetColor(gradient.getColor1());
1391
Color color2 = composite.GetColor(gradient.getColor2());
1392
float x1 = (float)gradient.getPoint1().getX();
1393
float x2 = (float)gradient.getPoint2().getX();
1394
float y1 = (float)gradient.getPoint1().getY();
1395
float y2 = (float)gradient.getPoint2().getY();
1396
float diffX = x2 - x1;
1397
float diffY = y2 - y1;
1398
const float z = 60; //HACK zoom factor, with a larger factor .NET will make the gradient wider.
1399
linear = new LinearGradientBrush(
1400
new PointF(x1 - z * diffX, y1 - z * diffY),
1401
new PointF(x2 + z * diffX, y2 + z * diffY),
1404
ColorBlend colorBlend = new ColorBlend(4);
1405
Color[] colors = colorBlend.Colors;
1406
colors[0] = colors[1] = color1;
1407
colors[2] = colors[3] = color2;
1408
float[] positions = colorBlend.Positions;
1409
positions[1] = z / (2 * z + 1);
1410
positions[2] = (z + 1) / (2 * z + 1);
1411
positions[3] = 1.0f;
1412
linear.InterpolationColors = colorBlend;
1414
linear.WrapMode = WrapMode.TileFlipXY;
1420
if (paint is java.awt.TexturePaint)
1422
java.awt.TexturePaint texture = (java.awt.TexturePaint)paint;
1423
brush = new TextureBrush(
1424
J2C.ConvertImage(texture.getImage()),
1425
J2C.ConvertRect(texture.getAnchorRect()),
1426
composite.GetImageAttributes());
1431
if (paint is java.awt.LinearGradientPaint) {
1432
java.awt.LinearGradientPaint gradient = (java.awt.LinearGradientPaint)paint;
1433
PointF start = J2C.ConvertPoint(gradient.getStartPoint());
1434
PointF end = J2C.ConvertPoint(gradient.getEndPoint());
1436
java.awt.Color[] javaColors = gradient.getColors();
1437
ColorBlend colorBlend;
1439
bool noCycle = gradient.getCycleMethod() == java.awt.MultipleGradientPaint.CycleMethod.NO_CYCLE;
1441
//HACK because .NET does not support continue gradient like Java else Tile Gradient
1442
//that we receize the rectangle very large (factor z) and set 2 additional color values
1443
//an exact solution will calculate the size of the Graphics with the current transform
1444
float diffX = end.X - start.X;
1445
float diffY = end.Y - start.Y;
1446
SizeF size = GetSize();
1447
//HACK zoom factor, with a larger factor .NET will make the gradient wider.
1448
float z = Math.Min(10, Math.Max(size.Width / diffX, size.Height / diffY));
1449
start.X -= z * diffX;
1450
start.Y -= z * diffY;
1454
colorBlend = new ColorBlend(javaColors.Length + 2);
1455
colors = colorBlend.Colors;
1456
float[] fractions = gradient.getFractions();
1457
float[] positions = colorBlend.Positions;
1458
for (int i = 0; i < javaColors.Length; i++) {
1459
colors[i + 1] = composite.GetColor(javaColors[i]);
1460
positions[i + 1] = (z + fractions[i]) / (2 * z + 1);
1462
colors[0] = colors[1];
1463
colors[colors.Length - 1] = colors[colors.Length - 2];
1464
positions[positions.Length - 1] = 1.0f;
1466
colorBlend = new ColorBlend(javaColors.Length);
1467
colors = colorBlend.Colors;
1468
colorBlend.Positions = gradient.getFractions();
1469
for (int i = 0; i < javaColors.Length; i++) {
1470
colors[i] = composite.GetColor(javaColors[i]);
1473
LinearGradientBrush linear = new LinearGradientBrush(start, end, colors[0], colors[colors.Length - 1]);
1474
linear.InterpolationColors = colorBlend;
1475
switch (gradient.getCycleMethod().ordinal()) {
1476
case (int)java.awt.MultipleGradientPaint.CycleMethod.__Enum.NO_CYCLE:
1477
case (int)java.awt.MultipleGradientPaint.CycleMethod.__Enum.REFLECT:
1478
linear.WrapMode = WrapMode.TileFlipXY;
1480
case (int)java.awt.MultipleGradientPaint.CycleMethod.__Enum.REPEAT:
1481
linear.WrapMode = WrapMode.Tile;
1489
throw new NotImplementedException("setPaint("+paint.GetType().FullName+")");
1492
public override void setStroke(java.awt.Stroke stroke)
1494
if (this.stroke != null && this.stroke.Equals(stroke))
1498
this.stroke = stroke;
1499
if (stroke is java.awt.BasicStroke)
1501
java.awt.BasicStroke s = (java.awt.BasicStroke)stroke;
1503
pen = new Pen(pen.Brush, s.getLineWidth());
1510
Console.WriteLine("Unknown Stroke type: " + stroke.GetType().FullName);
1514
private void SetLineJoin(java.awt.BasicStroke s)
1516
pen.MiterLimit = s.getMiterLimit();
1517
pen.LineJoin = J2C.ConvertLineJoin(s.getLineJoin());
1520
private void SetLineDash(java.awt.BasicStroke s)
1522
float[] dash = s.getDashArray();
1525
pen.DashStyle = DashStyle.Solid;
1527
if (dash.Length % 2 == 1)
1529
int len = dash.Length;
1530
Array.Resize(ref dash, len * 2);
1531
Array.Copy(dash, 0, dash, len, len);
1533
float lineWidth = s.getLineWidth();
1534
if (lineWidth > 1) // for values < 0 there is no correctur needed
1536
for (int i = 0; i < dash.Length; i++)
1538
//dividing by line thickness because of the representation difference
1539
dash[i] = dash[i] / lineWidth;
1542
// To fix the problem where solid style in Java can be represented at { 1.0, 0.0 }.
1543
// In .NET, however, array can only have positive value
1544
if (dash.Length == 2 && dash[dash.Length - 1] == 0)
1546
Array.Resize(ref dash, 1);
1549
float dashPhase = s.getDashPhase();
1550
// correct the dash cap
1551
switch (s.getEndCap())
1553
case java.awt.BasicStroke.CAP_BUTT:
1554
pen.DashCap = DashCap.Flat;
1556
case java.awt.BasicStroke.CAP_ROUND:
1557
pen.DashCap = DashCap.Round;
1559
case java.awt.BasicStroke.CAP_SQUARE:
1560
pen.DashCap = DashCap.Flat;
1561
// there is no equals DashCap in .NET, we need to emulate it
1562
dashPhase += lineWidth / 2;
1563
for (int i = 0; i < dash.Length; i++)
1571
dash[i] = Math.Max(0.00001F, dash[i] - 1);
1576
Console.WriteLine("Unknown dash cap type:" + s.getEndCap());
1580
// calc the dash offset
1583
//dividing by line thickness because of the representation difference
1584
pen.DashOffset = dashPhase / lineWidth;
1591
pen.Width = lineWidth = 0.001F; // hack to prevent a division with 0
1592
pen.DashOffset = dashPhase / lineWidth;
1600
// set the final dash pattern
1601
pen.DashPattern = dash;
1605
public override void setRenderingHint(java.awt.RenderingHints.Key hintKey, Object hintValue)
1607
if (hintKey == java.awt.RenderingHints.KEY_ANTIALIASING)
1609
if (hintValue == java.awt.RenderingHints.VALUE_ANTIALIAS_DEFAULT)
1611
g.SmoothingMode = SmoothingMode.Default;
1612
g.PixelOffsetMode = PixelOffsetMode.Default;
1615
if (hintValue == java.awt.RenderingHints.VALUE_ANTIALIAS_OFF)
1617
g.SmoothingMode = SmoothingMode.None;
1618
g.PixelOffsetMode = PixelOffsetMode.Default;
1621
if (hintValue == java.awt.RenderingHints.VALUE_ANTIALIAS_ON)
1623
g.SmoothingMode = SmoothingMode.AntiAlias;
1624
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
1629
if (hintKey == java.awt.RenderingHints.KEY_INTERPOLATION)
1631
if (hintValue == java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR)
1633
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
1636
if (hintValue == java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC)
1638
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
1641
if (hintValue == java.awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR)
1643
g.InterpolationMode = InterpolationMode.NearestNeighbor;
1648
if (hintKey == java.awt.RenderingHints.KEY_TEXT_ANTIALIASING)
1650
if (hintValue == java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT ||
1651
hintValue == java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF)
1653
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
1654
textAntialiasHint = hintValue;
1657
if (hintValue == java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON)
1659
g.TextRenderingHint = TextRenderingHint.AntiAlias;
1660
textAntialiasHint = hintValue;
1665
if (hintKey == java.awt.RenderingHints.KEY_FRACTIONALMETRICS)
1667
if (hintValue == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT ||
1668
hintValue == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_OFF ||
1669
hintValue == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_ON)
1671
fractionalHint = hintValue;
1678
public override object getRenderingHint(java.awt.RenderingHints.Key hintKey)
1680
return getRenderingHints().get(hintKey);
1683
public override void setRenderingHints(java.util.Map hints)
1685
addRenderingHints(hints);
1686
//TODO all not included values should reset to default, but was is default?
1689
public override void addRenderingHints(java.util.Map hints)
1691
Iterator iterator = hints.entrySet().iterator();
1692
while (iterator.hasNext())
1694
java.util.Map.Entry entry = (java.util.Map.Entry)iterator.next();
1695
setRenderingHint((java.awt.RenderingHints.Key)entry.getKey(), entry.getValue());
1699
public override java.awt.RenderingHints getRenderingHints()
1701
java.awt.RenderingHints hints = new java.awt.RenderingHints(null);
1702
switch (g.SmoothingMode)
1704
case SmoothingMode.Default:
1705
hints.put(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_DEFAULT);
1707
case SmoothingMode.None:
1708
hints.put(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_OFF);
1710
case SmoothingMode.AntiAlias:
1711
hints.put(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);
1715
switch (g.InterpolationMode)
1717
case InterpolationMode.Bilinear:
1718
case InterpolationMode.HighQualityBilinear:
1719
hints.put(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR);
1721
case InterpolationMode.Bicubic:
1722
case InterpolationMode.HighQualityBicubic:
1723
hints.put(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC);
1725
case InterpolationMode.NearestNeighbor:
1726
hints.put(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
1730
hints.put(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, textAntialiasHint);
1731
hints.put(java.awt.RenderingHints.KEY_FRACTIONALMETRICS, fractionalHint);
1735
public override void translate(double x, double y)
1737
Matrix transform = g.Transform;
1738
transform.Translate((float)x, (float)y);
1739
g.Transform = transform;
1742
private static double RadiansToDegrees(double radians)
1744
return radians * (180 / Math.PI);
1747
public override void rotate(double theta)
1749
Matrix transform = g.Transform;
1750
transform.Rotate((float)RadiansToDegrees(theta));
1751
g.Transform = transform;
1754
public override void rotate(double theta, double x, double y)
1756
Matrix transform = g.Transform;
1757
transform.Translate((float)x, (float)y);
1758
transform.Rotate((float)RadiansToDegrees(theta));
1759
transform.Translate(-(float)x, -(float)y);
1760
g.Transform = transform;
1763
public override void scale(double scaleX, double scaleY)
1765
using (Matrix transform = g.Transform)
1767
transform.Scale((float)scaleX, (float)scaleY);
1768
g.Transform = transform;
1772
public override void shear(double shearX, double shearY)
1774
using (Matrix transform = g.Transform)
1776
transform.Shear((float)shearX, (float)shearY);
1777
g.Transform = transform;
1781
public override void transform(java.awt.geom.AffineTransform tx)
1783
using (Matrix transform = g.Transform,
1784
matrix = J2C.ConvertTransform(tx))
1786
transform.Multiply(matrix);
1787
g.Transform = transform;
1791
public override void setTransform(java.awt.geom.AffineTransform tx)
1793
g.Transform = J2C.ConvertTransform(tx);
1796
public override java.awt.geom.AffineTransform getTransform()
1798
using (Matrix matrix = g.Transform)
1800
return C2J.ConvertMatrix(matrix);
1804
public override java.awt.Paint getPaint()
1806
if( javaPaint == null ) {
1807
javaPaint = composite.GetColor(color);
1812
public override java.awt.Composite getComposite()
1814
return javaComposite;
1817
public override void setBackground(java.awt.Color backcolor)
1819
bgcolor = backcolor == null ? Color.Empty : Color.FromArgb(backcolor.getRGB());
1822
public override java.awt.Color getBackground()
1824
return bgcolor == Color.Empty ? null : new java.awt.Color(color.ToArgb(), true);
1827
public override java.awt.Stroke getStroke()
1831
return defaultStroke;
1836
private bool isAntiAlias()
1838
switch (g.TextRenderingHint)
1840
case TextRenderingHint.AntiAlias:
1841
case TextRenderingHint.AntiAliasGridFit:
1842
case TextRenderingHint.ClearTypeGridFit:
1849
private bool isFractionalMetrics()
1851
return fractionalHint == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_ON;
1854
public override java.awt.font.FontRenderContext getFontRenderContext()
1856
return new java.awt.font.FontRenderContext(getTransform(), isAntiAlias(), isFractionalMetrics());
1859
public override void drawGlyphVector(java.awt.font.GlyphVector gv, float x, float y)
1861
java.awt.font.FontRenderContext frc = gv.getFontRenderContext();
1862
Matrix currentMatrix = null;
1863
Font currentFont = netfont;
1864
TextRenderingHint currentHint = g.TextRenderingHint;
1867
java.awt.Font javaFont = gv.getFont();
1868
if (javaFont != null)
1870
netfont = javaFont.getNetFont();
1872
if (frc.isAntiAliased()) {
1873
if( frc.usesFractionalMetrics() ){
1874
g.TextRenderingHint = TextRenderingHint.AntiAlias;
1876
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
1879
if (frc.usesFractionalMetrics()) {
1880
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
1882
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
1885
if (!frc.getTransform().equals(getTransform()))
1887
// save the old context and use the transformation from the renderContext
1888
currentMatrix = g.Transform;
1889
g.Transform = J2C.ConvertTransform(frc.getTransform());
1891
drawString(J2C.ConvertGlyphVector(gv), x, y);
1895
// Restore the old context if needed
1896
g.TextRenderingHint = currentHint;
1897
netfont = currentFont;
1898
if (currentMatrix != null)
1900
g.Transform = currentMatrix;
1906
sealed class NetGraphicsConfiguration : java.awt.GraphicsConfiguration
1908
internal readonly Screen screen;
1910
public NetGraphicsConfiguration(Screen screen)
1912
this.screen = screen;
1915
public override java.awt.image.BufferedImage createCompatibleImage(int width, int height, int transparency)
1917
switch (transparency)
1919
case java.awt.Transparency.__Fields.OPAQUE:
1920
return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
1921
case java.awt.Transparency.__Fields.BITMASK:
1922
return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
1923
case java.awt.Transparency.__Fields.TRANSLUCENT:
1924
return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
1926
throw new java.lang.IllegalArgumentException("transparency:" + transparency);
1930
public override java.awt.image.BufferedImage createCompatibleImage(int width, int height)
1932
return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
1935
public override java.awt.image.VolatileImage createCompatibleVolatileImage(int param1, int param2, java.awt.ImageCapabilities param3)
1937
throw new NotImplementedException();
1940
public override java.awt.image.VolatileImage createCompatibleVolatileImage(int width, int height)
1942
return new NetVolatileImage(width, height);
1945
public override java.awt.Rectangle getBounds()
1947
System.Drawing.Rectangle bounds = screen.Bounds;
1948
return new java.awt.Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height);
1951
public override java.awt.BufferCapabilities getBufferCapabilities()
1953
throw new NotImplementedException();
1956
public override java.awt.image.ColorModel getColorModel(int transparency)
1958
if (transparency == java.awt.Transparency.__Fields.TRANSLUCENT)
1960
//we return the default ColorModel because this produce the fewest problems with convertions
1961
return ColorModel.getRGBdefault();
1969
public override java.awt.image.ColorModel getColorModel()
1971
//we return the default ColorModel because this produce the fewest problems with convertions
1972
return ColorModel.getRGBdefault();
1975
public override java.awt.geom.AffineTransform getDefaultTransform()
1977
return new java.awt.geom.AffineTransform();
1980
public override java.awt.GraphicsDevice getDevice()
1982
return new NetGraphicsDevice(screen);
1985
public override java.awt.ImageCapabilities getImageCapabilities()
1987
throw new NotImplementedException();
1990
public override java.awt.geom.AffineTransform getNormalizingTransform()
1992
throw new NotImplementedException();
1995
public override VolatileImage createCompatibleVolatileImage(int width, int height, int transparency)
1997
return new NetVolatileImage(width, height);
2000
public override VolatileImage createCompatibleVolatileImage(int width, int height, java.awt.ImageCapabilities caps, int transparency)
2002
return new NetVolatileImage(width, height);
2005
public override bool isTranslucencyCapable()
2011
class NetGraphicsDevice : java.awt.GraphicsDevice
2013
internal readonly Screen screen;
2015
internal NetGraphicsDevice(Screen screen)
2017
this.screen = screen;
2020
public override java.awt.GraphicsConfiguration[] getConfigurations()
2022
Screen[] screens = Screen.AllScreens;
2023
NetGraphicsConfiguration[] configs = new NetGraphicsConfiguration[screens.Length];
2024
for (int i = 0; i < screens.Length; i++)
2026
configs[i] = new NetGraphicsConfiguration(screens[i]);
2031
public override java.awt.GraphicsConfiguration getDefaultConfiguration()
2033
return new NetGraphicsConfiguration(Screen.PrimaryScreen);
2036
public override string getIDstring()
2038
return screen.DeviceName;
2041
public override int getType()
2043
return TYPE_RASTER_SCREEN;
2047
public class NetGraphicsEnvironment : java.awt.GraphicsEnvironment
2049
// Create a bitmap with the dimensions of the argument image. Then
2050
// create a graphics objects from the bitmap. All paint operations will
2051
// then paint the bitmap.
2052
public override java.awt.Graphics2D createGraphics(BufferedImage bi)
2054
return new BitmapGraphics(bi.getBitmap());
2057
public override java.awt.Font[] getAllFonts()
2060
System.Collections.Generic.ICollection<Typeface> typefaces = System.Windows.Media.Fonts.SystemTypefaces;
2061
java.awt.Font[] fonts = new java.awt.Font[typefaces.Count];
2063
foreach (Typeface face in typefaces)
2065
FontFamily family = face.FontFamily;
2066
fonts[i++] = new java.awt.Font(family.GetName(0), face.Style, 1);
2069
String[] names = getAvailableFontFamilyNames();
2070
java.awt.Font[] fonts = new java.awt.Font[names.Length];
2071
for(int i=0; i<fonts.Length; i++)
2073
fonts[i] = new java.awt.Font(names[i], 0, 1);
2079
public override String[] getAvailableFontFamilyNames()
2081
int language = CultureInfo.CurrentCulture.LCID;
2082
return getAvailableFontFamilyNames(language);
2085
public override string[] getAvailableFontFamilyNames(Locale locale)
2087
int language = CultureInfo.GetCultureInfo(locale.toString()).LCID;
2088
return getAvailableFontFamilyNames(language);
2091
private String[] getAvailableFontFamilyNames(int language)
2093
FontFamily[] families = FontFamily.Families;
2094
String[] results = new String[families.Length + 5];
2096
for (; i < families.Length; i++)
2098
results[i] = families[i].GetName(language);
2100
results[i++] = "Dialog";
2101
results[i++] = "DialogInput";
2102
results[i++] = "Serif";
2103
results[i++] = "SansSerif";
2104
results[i++] = "Monospaced";
2105
Array.Sort(results);
2109
public override java.awt.GraphicsDevice getDefaultScreenDevice()
2111
return new NetGraphicsDevice(Screen.PrimaryScreen);
2114
public override java.awt.GraphicsDevice[] getScreenDevices()
2116
Screen[] screens = Screen.AllScreens;
2117
NetGraphicsDevice[] devices = new NetGraphicsDevice[screens.Length];
2118
for (int i = 0; i < screens.Length; i++)
2120
devices[i] = new NetGraphicsDevice(screens[i]);
b'\\ No newline at end of file'