diff options
Diffstat (limited to 'awt/graphics.cs')
-rw-r--r-- | awt/graphics.cs | 2344 |
1 files changed, 0 insertions, 2344 deletions
diff --git a/awt/graphics.cs b/awt/graphics.cs deleted file mode 100644 index b0891d26..00000000 --- a/awt/graphics.cs +++ /dev/null @@ -1,2344 +0,0 @@ -/* - Copyright (C) 2002, 2004, 2005, 2006, 2007 Jeroen Frijters - Copyright (C) 2006 Active Endpoints, Inc. - Copyright (C) 2006 - 2014 Volker Berlin (i-net software) - Copyright (C) 2011 Karsten Heinrich (i-net software) - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jeroen Frijters - jeroen@frijters.net - -*/ - -using System; -using System.Drawing; -using System.Drawing.Drawing2D; -using System.Drawing.Text; -using System.Globalization; -using System.Windows.Forms; -using java.awt.image; -using java.util; - -namespace ikvm.awt -{ - - internal class BitmapGraphics : NetGraphics - { - private readonly Bitmap bitmap; - private readonly BufferedImage image; - - internal BitmapGraphics(Bitmap bitmap, Object destination, java.awt.Font font, Color fgcolor, Color bgcolor) - : base(createGraphics(bitmap), destination, font, fgcolor, bgcolor) - { - this.bitmap = bitmap; - image = destination as BufferedImage; - } - - internal BitmapGraphics(Bitmap bitmap, Object destination) - : this(bitmap, destination, null, Color.White, Color.Black) - { - } - - internal override Graphics g - { - get { - if (image != null) - { - image.toBitmap(); - } - return base.g; - } - } - - protected override SizeF GetSize() { - return bitmap.Size; - } - - private static Graphics createGraphics(Bitmap bitmap) - { - // lock to prevent the exception - // System.InvalidOperationException: Object is currently in use elsewhere - lock (bitmap) - { - return Graphics.FromImage(bitmap); - } - } - - public override java.awt.Graphics create() - { - BitmapGraphics newGraphics = (BitmapGraphics)MemberwiseClone(); - newGraphics.init(createGraphics(bitmap)); - return newGraphics; - } - - public override void copyArea(int x, int y, int width, int height, int dx, int dy) - { - Bitmap copy = new Bitmap(width, height); - using (Graphics gCopy = Graphics.FromImage(copy)) - { - gCopy.DrawImage(bitmap, new Rectangle(0, 0, width, height), x, y, width, height, GraphicsUnit.Pixel); - } - g.DrawImageUnscaled(copy, x + dx, y + dy); - } - } - - internal class ComponentGraphics : NetGraphics - { - private readonly Control control; - - internal ComponentGraphics(Control control, java.awt.Component target, java.awt.Color fgColor, java.awt.Color bgColor, java.awt.Font font) - : base(control.CreateGraphics(), target, font, J2C.ConvertColor(fgColor), J2C.ConvertColor(bgColor)) - { - this.control = control; - } - - protected override SizeF GetSize() { - return control.Size; - } - - public override java.awt.Graphics create() - { - ComponentGraphics newGraphics = (ComponentGraphics)MemberwiseClone(); - newGraphics.init(control.CreateGraphics()); - return newGraphics; - } - - private Point getPointToScreenImpl(Point point) - { - return this.control.PointToScreen(point); - } - - private Point getPointToScreen(Point point) - { - return (Point)this.control.Invoke(new Converter<Point,Point>(getPointToScreenImpl),point); - } - - public override void copyArea(int x, int y, int width, int height, int dx, int dy) - { - Matrix t = g.Transform; - Point src = getPointToScreen(new Point(x + (int)t.OffsetX, y + (int)t.OffsetY)); - Bitmap copy = new Bitmap(width, height); - using (Graphics gCopy = Graphics.FromImage(copy)) - { - gCopy.CopyFromScreen(src, new Point(0, 0), new Size(width, height)); - } - g.DrawImageUnscaled(copy, x + dx, y + dy); - } - - public override void clip(java.awt.Shape shape) - { - if (shape == null) - { - // the API specification says that this will clear - // the clip, but in fact the reference implementation throws a - // NullPointerException - see the following entry in the bug parade: - // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6206189 - throw new java.lang.NullPointerException(); - } - base.clip(shape); - } - } - - internal class PrintGraphicsContext - { - internal PrintGraphics Current; - } - - internal class PrintGraphics : NetGraphics - { - private NetGraphicsState myState; - private PrintGraphicsContext baseContext; - private bool disposed = false; - private bool isBase = true; - - internal PrintGraphics(Graphics g) - : base(g, null, null, Color.White, Color.Black) - { - baseContext = new PrintGraphicsContext(); - baseContext.Current = this; - } - - public override java.awt.Graphics create() - { - checkState(); - myState = new NetGraphicsState(); - myState.saveGraphics(this); - PrintGraphics newGraphics = (PrintGraphics)MemberwiseClone(); - newGraphics.myState = null; - newGraphics.isBase = false; - newGraphics.baseContext = baseContext; - baseContext.Current = newGraphics; // since it is very likely that the next op will be on that graphics - // this is similar to init - myState.restoreGraphics(newGraphics); - return newGraphics; - } - - /// <summary> - /// Checks whether the properties of this instance are set to the bse Graphics. If not, the context - /// of the currently PrintGraphics is saved and the context if this instance is restored. - /// </summary> - private void checkState() - { - // this is required to simulate Graphics.create(), which is not possible in .NET - // we simply call Save on create() an restore this state, if any method is called - // on the current graphics. This will work for almost any use case of create() - if (baseContext != null && baseContext.Current != this) - { - if (!baseContext.Current.disposed) - { - if (baseContext.Current.myState == null) - { - baseContext.Current.myState = new NetGraphicsState(baseContext.Current); - } - else - { - baseContext.Current.myState.saveGraphics(baseContext.Current); - } - } - baseContext.Current = this; - if (myState != null) // is only null, if this instance was already disposed - { - myState.restoreGraphics(this); - } - } - } - - public override void copyArea(int x, int y, int width, int height, int dx, int dy) - { - throw new NotImplementedException(); - } - - public override void clearRect(int x, int y, int width, int height) - { - checkState(); - base.clearRect(x, y, width, height); - } - - public override void clipRect(int x, int y, int w, int h) - { - checkState(); - base.clearRect(x, y, w, h); - } - - public override void clip(java.awt.Shape shape) - { - checkState(); - base.clip(shape); - } - - public override void dispose() - { - myState = null; - if (pen != null) pen.Dispose(); - if (brush != null) brush.Dispose(); - disposed = true; - if (!isBase) - { - // only dispose the underlying Graphics if this is the base PrintGraphics! - return; - } - base.dispose(); - } - - public override void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) - { - checkState(); - base.drawArc(x, y, width, height, startAngle, arcAngle); - } - - public override void drawBytes(byte[] data, int offset, int length, int x, int y) - { - checkState(); - base.drawBytes(data, offset, length, x, y); - } - - public override void drawChars(char[] data, int offset, int length, int x, int y) - { - checkState(); - base.drawChars(data, offset, length, x, y); - } - - 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) - { - checkState(); - return base.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, color, observer); - } - - 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) - { - checkState(); - return base.drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, observer); - } - - 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) - { - checkState(); - return base.drawImage( img, x, y, width, height, bgcolor, observer); - } - - public override bool drawImage(java.awt.Image img, int x, int y, java.awt.Color bgcolor, java.awt.image.ImageObserver observer) - { - checkState(); - return base.drawImage(img, x, y, bgcolor, observer); - } - - public override bool drawImage(java.awt.Image img, int x, int y, int width, int height, java.awt.image.ImageObserver observer) - { - checkState(); - return base.drawImage( img, x, y, width, height, observer); - } - - public override bool drawImage(java.awt.Image img, int x, int y, java.awt.image.ImageObserver observer) - { - checkState(); - return base.drawImage(img, x, y, observer); - } - - public override void drawLine(int x1, int y1, int x2, int y2) - { - checkState(); - base.drawLine(x1, y1, x2, y2); - } - - public override void drawOval(int x, int y, int w, int h) - { - checkState(); - base.drawOval(x, y, w, h); - } - - public override void drawPolygon(java.awt.Polygon polygon) - { - checkState(); - base.drawPolygon(polygon); - } - - public override void drawPolygon(int[] aX, int[] aY, int aLength) - { - checkState(); - base.drawPolygon(aX, aY, aLength); - } - - public override void drawPolyline(int[] aX, int[] aY, int aLength) - { - checkState(); - base.drawPolyline(aX, aY, aLength); - } - - public override void drawRect(int x, int y, int width, int height) - { - checkState(); - base.drawRect(x, y, width, height); - } - - public override void drawRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight) - { - checkState(); - base.drawRoundRect(x, y, w, h, arcWidth, arcHeight); - } - - public override void fill3DRect(int x, int y, int width, int height, bool raised) - { - checkState(); - base.fill3DRect(x, y, width, height, raised); - } - - public override void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) - { - checkState(); - base.fillArc(x, y, width, height, startAngle, arcAngle); - } - - public override void fillOval(int x, int y, int w, int h) - { - checkState(); - base.fillOval(x, y, w, h); - } - - public override void fillPolygon(java.awt.Polygon polygon) - { - checkState(); - base.fillPolygon(polygon); - } - - public override void fillPolygon(int[] aX, int[] aY, int aLength) - { - checkState(); - base.fillPolygon(aX, aY, aLength); - } - - public override void fillRect(int x, int y, int width, int height) - { - checkState(); - base.fillRect(x, y, width, height); - } - - public override void fillRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight) - { - checkState(); - base.fillRoundRect(x, y, w, h, arcWidth, arcHeight); - } - - public override java.awt.Shape getClip() - { - checkState(); - return base.getClip(); - } - - public override java.awt.Rectangle getClipBounds(java.awt.Rectangle r) - { - checkState(); - return base.getClipBounds( r ); - } - - public override java.awt.Rectangle getClipBounds() - { - checkState(); - return base.getClipBounds(); - } - - [Obsolete] - public override java.awt.Rectangle getClipRect() - { - checkState(); - return base.getClipRect(); - } - - public override java.awt.Color getColor() - { - checkState(); - return base.getColor(); - } - - public override java.awt.Font getFont() - { - checkState(); - return base.getFont(); - } - - public override java.awt.FontMetrics getFontMetrics(java.awt.Font f) - { - checkState(); - return base.getFontMetrics(f); - } - - public override java.awt.FontMetrics getFontMetrics() - { - checkState(); - return base.getFontMetrics(); - } - - public override void setClip(int x, int y, int width, int height) - { - checkState(); - base.setClip(x,y,width,height); - } - - public override void setClip(java.awt.Shape shape) - { - checkState(); - base.setClip(shape); - } - - public override void setColor(java.awt.Color color) - { - checkState(); - base.setColor(color); - } - - public override void setFont(java.awt.Font f) - { - checkState(); - base.setFont(f); - } - - public override void setPaintMode() - { - checkState(); - base.setPaintMode(); - } - - public override void setXORMode(java.awt.Color param) - { - checkState(); - base.setXORMode(param); - } - - public override void translate(int x, int y) - { - checkState(); - base.translate(x, y); - } - - public override void draw(java.awt.Shape shape) - { - checkState(); - base.draw(shape); - } - - public override bool drawImage(java.awt.Image img, java.awt.geom.AffineTransform xform, ImageObserver observer) - { - checkState(); - return base.drawImage(img, xform, observer); - } - - public override void drawImage(java.awt.image.BufferedImage image, BufferedImageOp op, int x, int y) - { - checkState(); - base.drawImage(image, op, x, y); - } - - public override void drawRenderedImage(java.awt.image.RenderedImage img, java.awt.geom.AffineTransform xform) - { - checkState(); - base.drawRenderedImage(img, xform); - } - - public override void drawRenderableImage(java.awt.image.renderable.RenderableImage image, java.awt.geom.AffineTransform xform) - { - checkState(); - base.drawRenderableImage(image, xform); - } - - public override void drawString(string str, int x, int y) - { - checkState(); - base.drawString(str, x, y); - } - - public override void drawString(string text, float x, float y) - { - checkState(); - base.drawString(text, x, y); - } - - public override void drawString(java.text.AttributedCharacterIterator iterator, int x, int y) - { - checkState(); - base.drawString(iterator, x, y); - } - - public override void drawString(java.text.AttributedCharacterIterator iterator, float x, float y) - { - checkState(); - base.drawString(iterator, x, y); - } - - public override void fill(java.awt.Shape shape) - { - checkState(); - base.fill(shape); - } - - public override bool hit(java.awt.Rectangle rect, java.awt.Shape s, bool onStroke) - { - checkState(); - return base.hit(rect, s, onStroke); - } - - public override java.awt.GraphicsConfiguration getDeviceConfiguration() - { - // no check here, since invariant - return base.getDeviceConfiguration(); - } - - public override void setComposite(java.awt.Composite comp) - { - checkState(); - base.setComposite(comp); - } - - public override void setPaint(java.awt.Paint paint) - { - checkState(); - base.setPaint(paint); - } - - public override void setStroke(java.awt.Stroke stroke) - { - checkState(); - base.setStroke(stroke); - } - - public override void setRenderingHint(java.awt.RenderingHints.Key hintKey, Object hintValue) - { - checkState(); - base.setRenderingHint(hintKey, hintValue); - } - - public override object getRenderingHint(java.awt.RenderingHints.Key hintKey) - { - checkState(); - return base.getRenderingHint(hintKey); - } - - public override void setRenderingHints(java.util.Map hints) - { - checkState(); - base.setRenderingHints(hints); - } - - public override void addRenderingHints(java.util.Map hints) - { - checkState(); - base.addRenderingHints(hints); - } - - public override java.awt.RenderingHints getRenderingHints() - { - checkState(); - return base.getRenderingHints(); - } - - public override void translate(double x, double y) - { - checkState(); - base.translate(x, y); - } - - public override void rotate(double theta) - { - checkState(); - base.rotate(theta); - } - - public override void rotate(double theta, double x, double y) - { - checkState(); - base.rotate(theta, x, y); - } - - public override void scale(double scaleX, double scaleY) - { - checkState(); - base.scale(scaleX, scaleY); - } - - public override void shear(double shearX, double shearY) - { - checkState(); - base.shear(shearX, shearY); - } - - public override void transform(java.awt.geom.AffineTransform tx) - { - checkState(); - base.transform(tx); - } - - public override void setTransform(java.awt.geom.AffineTransform tx) - { - checkState(); - base.setTransform(tx); - } - - public override java.awt.geom.AffineTransform getTransform() - { - checkState(); - return base.getTransform(); - } - - public override java.awt.Paint getPaint() - { - checkState(); - return base.getPaint(); - } - - public override java.awt.Composite getComposite() - { - checkState(); - return base.getComposite(); - } - - public override void setBackground(java.awt.Color color) - { - checkState(); - base.setBackground(color); - } - - public override java.awt.Color getBackground() - { - checkState(); - return base.getBackground(); - } - - public override java.awt.Stroke getStroke() - { - checkState(); - return base.getStroke(); - } - - public override java.awt.font.FontRenderContext getFontRenderContext() - { - checkState(); - return base.getFontRenderContext(); - } - - public override void drawGlyphVector(java.awt.font.GlyphVector gv, float x, float y) - { - checkState(); - base.drawGlyphVector(gv, x, y); - } - } - - /// <summary> - /// State to store/restore the state of a NetGraphics/Graphics object - /// </summary> - internal class NetGraphicsState - { - private Brush brush; - private Pen pen; - - // Graphics State - private Matrix Transform; - private Region Clip; - private SmoothingMode SmoothingMode; - private PixelOffsetMode PixelOffsetMode; - private TextRenderingHint TextRenderingHint; - private InterpolationMode InterpolationMode; - private CompositingMode CompositingMode; - - private bool savedGraphics = false; - - public NetGraphicsState() - { - } - - public NetGraphicsState( NetGraphics netG ) - { - saveGraphics(netG); - } - - public void saveGraphics(NetGraphics netG) - { - if (netG == null ) - { - return; - } - if (netG.g != null ) - { - this.Transform = netG.g.Transform; - this.Clip = netG.g.Clip; - this.SmoothingMode = netG.g.SmoothingMode; - this.PixelOffsetMode = netG.g.PixelOffsetMode; - this.TextRenderingHint = netG.g.TextRenderingHint; - this.InterpolationMode = netG.g.InterpolationMode; - this.CompositingMode = netG.g.CompositingMode; - savedGraphics = true; - } - if (netG.pen != null && netG.brush != null) - { - pen = (Pen)netG.pen.Clone(); - brush = (Brush)netG.brush.Clone(); - } - } - - public void restoreGraphics(NetGraphics netG) - { - if (netG == null) - { - return; - } - if (netG.g != null) - { - if (savedGraphics) - { - netG.g.Transform = Transform; - netG.g.Clip = Clip; - netG.g.SmoothingMode = SmoothingMode; - netG.g.PixelOffsetMode = PixelOffsetMode; - netG.setTextRenderingHint(TextRenderingHint); - netG.g.InterpolationMode = InterpolationMode; - netG.g.CompositingMode = CompositingMode; - } - else - { - // default values that Java used - netG.g.InterpolationMode = InterpolationMode.NearestNeighbor; - } - } - if ( pen != null && brush != null ) - { - netG.pen = (Pen)pen.Clone(); - netG.brush = (Brush)brush.Clone(); - } - else - { - netG.pen = new Pen(netG.color); - netG.brush = new SolidBrush(netG.color); - netG.setRenderingHint(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); - } - } - } - - internal abstract class NetGraphics : java.awt.Graphics2D//sun.java2d.SunGraphics2D - { - private Graphics graphics; - private java.awt.Color javaColor; - private java.awt.Paint javaPaint; - internal Color color; - private Color bgcolor; - private java.awt.Font font; - private java.awt.Stroke stroke; - private static java.awt.BasicStroke defaultStroke = new java.awt.BasicStroke(); - private Font netfont; - private int baseline; - internal Brush brush; - internal Pen pen; - private CompositeHelper composite; - private java.awt.Composite javaComposite = java.awt.AlphaComposite.SrcOver; - private Object textAntialiasHint; - private Object fractionalHint = java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT; - - private static System.Collections.Generic.Dictionary<String, Int32> baselines = new System.Collections.Generic.Dictionary<String, Int32>(); - - internal static readonly StringFormat FORMAT = new StringFormat(StringFormat.GenericTypographic); - static NetGraphics() - { - FORMAT.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.NoWrap | StringFormatFlags.FitBlackBox; - FORMAT.Trimming = StringTrimming.None; - } - - protected NetGraphics(Graphics g, Object destination, java.awt.Font font, Color fgcolor, Color bgcolor) //: base( new sun.java2d.SurfaceData(destination) ) - { - if (font == null) - { - font = new java.awt.Font("Dialog", java.awt.Font.PLAIN, 12); - } - this.font = font; - netfont = font.getNetFont(); - this.color = fgcolor; - this.bgcolor = bgcolor; - composite = CompositeHelper.Create(javaComposite, g); - init(g); - } - - /// <summary> - /// The current C# Graphics - /// </summary> - internal virtual Graphics g - { - get { return graphics; } - set { graphics = value; } - } - - protected void init(Graphics graphics) - { - NetGraphicsState state = new NetGraphicsState(); - state.saveGraphics(this); - g = graphics; - state.restoreGraphics(this); - } - - /// <summary> - /// Get the size of the graphics. This is used as a hind for some hacks. - /// </summary> - /// <returns></returns> - protected virtual SizeF GetSize() { - return g.ClipBounds.Size; - } - - public override void clearRect(int x, int y, int width, int height) - { - using (Brush br = bgcolor != Color.Empty ? new SolidBrush(bgcolor) : brush) - { - CompositingMode tempMode = g.CompositingMode; - g.CompositingMode = CompositingMode.SourceCopy; - g.FillRectangle(br, x, y, width, height); - g.CompositingMode = tempMode; - } - } - - public override void clipRect(int x, int y, int w, int h) - { - g.IntersectClip(new Rectangle(x, y, w, h)); - } - - public override void clip(java.awt.Shape shape) - { - if (shape == null) - { - // note that ComponentGraphics overrides clip() to throw a NullPointerException when shape is null - g.ResetClip(); - } - else - { - g.IntersectClip(new Region(J2C.ConvertShape(shape))); - } - } - - public override void dispose() - { - if (pen!=null) pen.Dispose(); - if (brush!=null) brush.Dispose(); - graphics.Dispose(); //for dispose we does not need to synchronize the buffer of a bitmap - } - - public override void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) - { - g.DrawArc(pen, x, y, width, height, 360 - startAngle - arcAngle, arcAngle); - } - - public override void drawBytes(byte[] data, int offset, int length, int x, int y) - { - char[] chars = new char[length]; - for (int i = 0; i < length; i++) - { - chars[i] = (char)data[offset + i]; - } - drawChars(chars, 0, length, x, y); - } - - public override void drawChars(char[] data, int offset, int length, int x, int y) - { - drawString(new String(data, offset, length), x, y); - } - - 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) - { - Image image = J2C.ConvertImage(img); - if (image == null) - { - return false; - } - Rectangle destRect = new Rectangle(dx1, dy1, dx2 - dx1, dy2 - dy1); - using (Brush brush = new SolidBrush(composite.GetColor(color))) { - g.FillRectangle(brush, destRect); - } - lock (image) - { - g.DrawImage(image, destRect, sx1, sy1, sx2 - sx1, sy2 - sy1, GraphicsUnit.Pixel, composite.GetImageAttributes()); - } - return true; - } - - 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) - { - Image image = J2C.ConvertImage(img); - if (image == null) - { - return false; - } - Rectangle destRect = new Rectangle(dx1, dy1, dx2 - dx1, dy2 - dy1); - lock (image) - { - g.DrawImage(image, destRect, sx1, sy1, sx2 - sx1, sy2 - sy1, GraphicsUnit.Pixel, composite.GetImageAttributes()); - } - return true; - } - - 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) - { - Image image = J2C.ConvertImage(img); - if (image == null) - { - return false; - } - using (Brush brush = new SolidBrush(composite.GetColor(bgcolor))) { - g.FillRectangle(brush, x, y, width, height); - } - lock (image) - { - g.DrawImage(image, new Rectangle( x, y, width, height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, composite.GetImageAttributes()); - } - return true; - } - - public override bool drawImage(java.awt.Image img, int x, int y, java.awt.Color bgcolor, java.awt.image.ImageObserver observer) - { - if (img == null) { - return false; - } - return drawImage(img, x, y, img.getWidth(observer), img.getHeight(observer), bgcolor, observer); - } - - public override bool drawImage(java.awt.Image img, int x, int y, int width, int height, java.awt.image.ImageObserver observer) - { - Image image = J2C.ConvertImage(img); - if (image == null) - { - return false; - } - lock (image) - { - g.DrawImage(image, new Rectangle(x, y, width, height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, composite.GetImageAttributes()); - } - return true; - } - - public override bool drawImage(java.awt.Image img, int x, int y, java.awt.image.ImageObserver observer) - { - if (img == null) { - return false; - } - return drawImage(img, x, y, img.getWidth(observer), img.getHeight(observer), observer); - } - - public override void drawLine(int x1, int y1, int x2, int y2) - { - // HACK DrawLine doesn't appear to draw the last pixel, so for single pixel lines, we have - // a freaky workaround - if (x1 == x2 && y1 == y2) - { - g.DrawLine(pen, x1, y1, x1 + 0.01f, y2 + 0.01f); - } - else - { - g.DrawLine(pen, x1, y1, x2, y2); - } - } - - public override void drawOval(int x, int y, int w, int h) - { - g.DrawEllipse(pen, x, y, w, h); - } - - public override void drawPolygon(java.awt.Polygon polygon) - { - drawPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints); - } - - public override void drawPolygon(int[] aX, int[] aY, int aLength) - { - Point[] points = new Point[aLength]; - for (int i = 0; i < aLength; i++) - { - points[i].X = aX[i]; - points[i].Y = aY[i]; - } - g.DrawPolygon(pen, points); - } - - /// <summary> - /// Draw a sequence of connected lines - /// </summary> - /// <param name="aX">Array of x coordinates</param> - /// <param name="aY">Array of y coordinates</param> - /// <param name="aLength">Length of coordinate arrays</param> - public override void drawPolyline(int[] aX, int[] aY, int aLength) - { - for (int i = 0; i < aLength - 1; i++) - { - Point point1 = new Point(aX[i], aY[i]); - Point point2 = new Point(aX[i + 1], aY[i + 1]); - g.DrawLine(pen, point1, point2); - } - } - - public override void drawRect(int x, int y, int width, int height) - { - g.DrawRectangle(pen, x, y, width, height); - } - - /// <summary> - /// Apparently there is no rounded rec function in .Net. Draw the - /// rounded rectangle by using lines and arcs. - /// </summary> - public override void drawRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight) - { - using (GraphicsPath gp = J2C.ConvertRoundRect(x, y, w, h, arcWidth, arcHeight)) - g.DrawPath(pen, gp); - } - - public override void fill3DRect(int x, int y, int width, int height, bool raised) - { - java.awt.Paint p = getPaint(); - java.awt.Color c = getColor(); - java.awt.Color brighter = c.brighter(); - java.awt.Color darker = c.darker(); - - if( !raised ) { - setColor(darker); - } else if( p != c ) { - setColor(c); - } - fillRect(x + 1, y + 1, width - 2, height - 2); - setColor(raised ? brighter : darker); - fillRect(x, y, 1, height); - fillRect(x + 1, y, width - 2, 1); - setColor(raised ? darker : brighter); - fillRect(x + 1, y + height - 1, width - 1, 1); - fillRect(x + width - 1, y, 1, height - 1); - setPaint(p); - } - - public override void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) - { - g.FillPie(brush, x, y, width, height, 360 - startAngle - arcAngle, arcAngle); - } - - public override void fillOval(int x, int y, int w, int h) - { - g.FillEllipse(brush, x, y, w, h); - } - - public override void fillPolygon(java.awt.Polygon polygon) - { - fillPolygon(polygon.xpoints, polygon.ypoints, polygon.npoints); - } - - public override void fillPolygon(int[] aX, int[] aY, int aLength) - { - Point[] points = new Point[aLength]; - for (int i = 0; i < aLength; i++) - { - points[i].X = aX[i]; - points[i].Y = aY[i]; - } - g.FillPolygon(brush, points); - } - - public override void fillRect(int x, int y, int width, int height) - { - g.FillRectangle(brush, x, y, width, height); - } - - public override void fillRoundRect(int x, int y, int w, int h, int arcWidth, int arcHeight) - { - GraphicsPath gp = J2C.ConvertRoundRect(x, y, w, h, arcWidth, arcHeight); - g.FillPath(brush, gp); - gp.Dispose(); - } - - public override java.awt.Shape getClip() - { - return getClipBounds(); - } - - public override java.awt.Rectangle getClipBounds(java.awt.Rectangle r) - { - using (Region clip = g.Clip) - { - if (!clip.IsInfinite(g)) - { - RectangleF rec = clip.GetBounds(g); - r.x = (int) rec.X; - r.y = (int) rec.Y; - r.width = (int) rec.Width; - r.height = (int) rec.Height; - } - return r; - } - } - - public override java.awt.Rectangle getClipBounds() - { - using (Region clip = g.Clip) - { - if (clip.IsInfinite(g)) - { - return null; - } - RectangleF rec = clip.GetBounds(g); - return C2J.ConvertRectangle(rec); - } - } - - [Obsolete] - public override java.awt.Rectangle getClipRect() - { - return getClipBounds(); - } - - public override java.awt.Color getColor() - { - if (javaColor == null) - { - javaColor = composite.GetColor(color); - } - return javaColor; - } - - public override java.awt.Font getFont() - { - return font; - } - - public override java.awt.FontMetrics getFontMetrics(java.awt.Font f) - { - return sun.font.FontDesignMetrics.getMetrics(f); - } - - public override java.awt.FontMetrics getFontMetrics() - { - return sun.font.FontDesignMetrics.getMetrics(font); - } - - public override void setClip(int x, int y, int width, int height) - { - g.Clip = new Region(new Rectangle(x, y, width, height)); - } - - public override void setClip(java.awt.Shape shape) - { - if (shape == null) - { - Region clip = g.Clip; - clip.MakeInfinite(); - g.Clip = clip; - } - else - { - g.Clip = new Region(J2C.ConvertShape(shape)); - } - } - - public override void setColor(java.awt.Color color) - { - if (color == null || color == this.javaPaint) - { - // Does not change the color, if it is null like in SunGraphics2D - return; - } - this.javaPaint = this.javaColor = color; - this.color = composite.GetColor(color); - if (brush is SolidBrush) - { - ((SolidBrush)brush).Color = this.color; - } - else - { - brush.Dispose(); - brush = new SolidBrush(this.color); - } - pen.Color = this.color; - pen.Brush = brush; - } - - public override void setFont(java.awt.Font f) - { - if (f != null && f != font) - { - netfont = f.getNetFont(); - font = f; - baseline = getBaseline( netfont, g.TextRenderingHint ); - } - } - - public override void setPaintMode() - { - throw new NotImplementedException(); - } - - public override void setXORMode(java.awt.Color param) - { - if( param == null ) { - throw new java.lang.IllegalArgumentException("null XORColor"); - } - throw new NotImplementedException(); - } - - public override void translate(int x, int y) - { - Matrix transform = g.Transform; - transform.Translate(x, y); - g.Transform = transform; - } - - public override void draw(java.awt.Shape shape) - { - using (GraphicsPath gp = J2C.ConvertShape(shape)) - { - g.DrawPath(pen, gp); - } - } - - public override bool drawImage(java.awt.Image img, java.awt.geom.AffineTransform xform, ImageObserver observer) - { - if (img == null) { - return true; - } - - if (xform == null || xform.isIdentity()) { - return drawImage(img, 0, 0, null, observer); - } - - NetGraphics clone = (NetGraphics)create(); - clone.transform(xform); - bool rendered = clone.drawImage(img, 0, 0, null, observer); - clone.dispose(); - return rendered; - } - - public override void drawImage(java.awt.image.BufferedImage image, BufferedImageOp op, int x, int y) - { - - if( op == null ) { - drawImage(image, x, y, null); - } else { - if( !(op is AffineTransformOp) ) { - drawImage(op.filter(image, null), x, y, null); - } else { - Console.WriteLine(new System.Diagnostics.StackTrace()); - throw new NotImplementedException(); - } - } - } - - public override void drawRenderedImage(java.awt.image.RenderedImage img, java.awt.geom.AffineTransform xform) - { - if (img == null) { - return; - } - - // BufferedImage case: use a simple drawImage call - if (img is BufferedImage) { - BufferedImage bufImg = (BufferedImage)img; - drawImage(bufImg,xform,null); - return; - } - throw new NotImplementedException("drawRenderedImage not implemented for images which are not BufferedImages."); - } - - public override void drawRenderableImage(java.awt.image.renderable.RenderableImage image, java.awt.geom.AffineTransform xform) - { - throw new NotImplementedException(); - } - - public override void drawString(string str, int x, int y) - { - drawString(str, (float)x, (float)y); - } - - public override void drawString(String text, float x, float y) { - if (text.Length == 0) { - return; - } - CompositingMode origCM = g.CompositingMode; - try { - if (origCM != CompositingMode.SourceOver) { - // Java has a different behaviar for AlphaComposite and Text Antialiasing - g.CompositingMode = CompositingMode.SourceOver; - } - - bool fractional = isFractionalMetrics(); - if (fractional || !sun.font.StandardGlyphVector.isSimpleString(font, text)) { - g.DrawString(text, netfont, brush, x, y - baseline, FORMAT); - } else { - // fixed metric for simple text, we position every character to simulate the Java behaviour - java.awt.font.FontRenderContext frc = new java.awt.font.FontRenderContext(null, isAntiAlias(), fractional); - sun.font.FontDesignMetrics metrics = sun.font.FontDesignMetrics.getMetrics(font, frc); - y -= baseline; - for (int i = 0; i < text.Length; i++) { - g.DrawString(text.Substring(i, 1), netfont, brush, x, y, FORMAT); - x += metrics.charWidth(text[i]); - } - } - } finally { - if (origCM != CompositingMode.SourceOver) { - g.CompositingMode = origCM; - } - } - } - - public override void drawString(java.text.AttributedCharacterIterator iterator, int x, int y) - { - drawString(iterator, (float) x, (float) y); - } - - public override void drawString(java.text.AttributedCharacterIterator iterator, float x, float y) - { - if( iterator == null ) { - throw new java.lang.NullPointerException("AttributedCharacterIterator is null"); - } - if( iterator.getBeginIndex() == iterator.getEndIndex() ) { - return; /* nothing to draw */ - } - java.awt.font.TextLayout tl = new java.awt.font.TextLayout(iterator, getFontRenderContext()); - tl.draw(this, x, y); - } - - public override void fill(java.awt.Shape shape) - { - g.FillPath(brush, J2C.ConvertShape(shape)); - } - - public override bool hit(java.awt.Rectangle rect, java.awt.Shape s, bool onStroke) - { - if (onStroke) - { - //TODO use stroke - //s = stroke.createStrokedShape(s); - } - return s.intersects(rect); - } - - public override java.awt.GraphicsConfiguration getDeviceConfiguration() - { - return new NetGraphicsConfiguration(Screen.PrimaryScreen); - } - - public override void setComposite(java.awt.Composite comp) - { - if (javaComposite == comp) { - return; - } - if (comp == null) - { - throw new java.lang.IllegalArgumentException("null Composite"); - } - this.javaComposite = comp; - java.awt.Paint oldPaint = getPaint(); //getPaint() is never null - composite = CompositeHelper.Create(comp, g); - javaPaint = null; - setPaint(oldPaint); - } - - public override void setPaint(java.awt.Paint paint) - { - if (paint is java.awt.Color) - { - setColor((java.awt.Color)paint); - return; - } - - if (paint == null || this.javaPaint == paint) - { - return; - } - this.javaPaint = paint; - - if (paint is java.awt.GradientPaint) - { - java.awt.GradientPaint gradient = (java.awt.GradientPaint)paint; - LinearGradientBrush linear; - if (gradient.isCyclic()) - { - linear = new LinearGradientBrush( - J2C.ConvertPoint(gradient.getPoint1()), - J2C.ConvertPoint(gradient.getPoint2()), - composite.GetColor(gradient.getColor1()), - composite.GetColor(gradient.getColor2())); - } - else - { - //HACK because .NET does not support continue gradient like Java else Tile Gradient - //that we receize the rectangle very large (factor z) and set 4 color values - // a exact solution will calculate the size of the Graphics with the current transform - Color color1 = composite.GetColor(gradient.getColor1()); - Color color2 = composite.GetColor(gradient.getColor2()); - float x1 = (float)gradient.getPoint1().getX(); - float x2 = (float)gradient.getPoint2().getX(); - float y1 = (float)gradient.getPoint1().getY(); - float y2 = (float)gradient.getPoint2().getY(); - float diffX = x2 - x1; - float diffY = y2 - y1; - const float z = 60; //HACK zoom factor, with a larger factor .NET will make the gradient wider. - linear = new LinearGradientBrush( - new PointF(x1 - z * diffX, y1 - z * diffY), - new PointF(x2 + z * diffX, y2 + z * diffY), - color1, - color1); - ColorBlend colorBlend = new ColorBlend(4); - Color[] colors = colorBlend.Colors; - colors[0] = colors[1] = color1; - colors[2] = colors[3] = color2; - float[] positions = colorBlend.Positions; - positions[1] = z / (2 * z + 1); - positions[2] = (z + 1) / (2 * z + 1); - positions[3] = 1.0f; - linear.InterpolationColors = colorBlend; - } - linear.WrapMode = WrapMode.TileFlipXY; - brush = linear; - pen.Brush = brush; - return; - } - - if (paint is java.awt.TexturePaint) - { - java.awt.TexturePaint texture = (java.awt.TexturePaint)paint; - Bitmap txtr = J2C.ConvertImage(texture.getImage()); - java.awt.geom.Rectangle2D anchor = texture.getAnchorRect(); - TextureBrush txtBrush; - brush = txtBrush = new TextureBrush(txtr, new Rectangle(0, 0, txtr.Width, txtr.Height), composite.GetImageAttributes()); - txtBrush.TranslateTransform((float)anchor.getX(), (float)anchor.getY()); - txtBrush.ScaleTransform((float)anchor.getWidth() / txtr.Width, (float)anchor.getHeight() / txtr.Height); - txtBrush.WrapMode = WrapMode.Tile; - pen.Brush = brush; - return; - } - - if (paint is java.awt.LinearGradientPaint) { - java.awt.LinearGradientPaint gradient = (java.awt.LinearGradientPaint)paint; - PointF start = J2C.ConvertPoint(gradient.getStartPoint()); - PointF end = J2C.ConvertPoint(gradient.getEndPoint()); - - java.awt.Color[] javaColors = gradient.getColors(); - ColorBlend colorBlend; - Color[] colors; - bool noCycle = gradient.getCycleMethod() == java.awt.MultipleGradientPaint.CycleMethod.NO_CYCLE; - if (noCycle) { - //HACK because .NET does not support continue gradient like Java else Tile Gradient - //that we receize the rectangle very large (factor z) and set 2 additional color values - //an exact solution will calculate the size of the Graphics with the current transform - float diffX = end.X - start.X; - float diffY = end.Y - start.Y; - SizeF size = GetSize(); - //HACK zoom factor, with a larger factor .NET will make the gradient wider. - float z = Math.Min(10, Math.Max(size.Width / diffX, size.Height / diffY)); - start.X -= z * diffX; - start.Y -= z * diffY; - end.X += z * diffX; - end.Y += z * diffY; - - colorBlend = new ColorBlend(javaColors.Length + 2); - colors = colorBlend.Colors; - float[] fractions = gradient.getFractions(); - float[] positions = colorBlend.Positions; - for (int i = 0; i < javaColors.Length; i++) { - colors[i + 1] = composite.GetColor(javaColors[i]); - positions[i + 1] = (z + fractions[i]) / (2 * z + 1); - } - colors[0] = colors[1]; - colors[colors.Length - 1] = colors[colors.Length - 2]; - positions[positions.Length - 1] = 1.0f; - } else { - colorBlend = new ColorBlend(javaColors.Length); - colors = colorBlend.Colors; - colorBlend.Positions = gradient.getFractions(); - for (int i = 0; i < javaColors.Length; i++) { - colors[i] = composite.GetColor(javaColors[i]); - } - } - LinearGradientBrush linear = new LinearGradientBrush(start, end, colors[0], colors[colors.Length - 1]); - linear.InterpolationColors = colorBlend; - switch (gradient.getCycleMethod().ordinal()) { - case (int)java.awt.MultipleGradientPaint.CycleMethod.__Enum.NO_CYCLE: - case (int)java.awt.MultipleGradientPaint.CycleMethod.__Enum.REFLECT: - linear.WrapMode = WrapMode.TileFlipXY; - break; - case (int)java.awt.MultipleGradientPaint.CycleMethod.__Enum.REPEAT: - linear.WrapMode = WrapMode.Tile; - break; - } - brush = linear; - pen.Brush = brush; - return; - } - - if (paint is java.awt.RadialGradientPaint ) - { - java.awt.RadialGradientPaint gradient = (java.awt.RadialGradientPaint)paint; - GraphicsPath path = new GraphicsPath(); - SizeF size = GetSize(); - - PointF center = J2C.ConvertPoint(gradient.getCenterPoint()); - - float radius = gradient.getRadius(); - int factor = (int)Math.Ceiling(Math.Max(size.Width, size.Height) / radius); - - float diameter = radius * factor; - path.AddEllipse(center.X - diameter, center.Y - diameter, diameter * 2, diameter * 2); - - java.awt.Color[] javaColors = gradient.getColors(); - float[] fractions = gradient.getFractions(); - int length = javaColors.Length; - ColorBlend colorBlend = new ColorBlend(length * factor); - Color[] colors = colorBlend.Colors; - float[] positions = colorBlend.Positions; - - for (int c = 0, j = length - 1; j >= 0; ) - { - positions[c] = (1 - fractions[j]) / factor; - colors[c++] = composite.GetColor(javaColors[j--]); - } - - java.awt.MultipleGradientPaint.CycleMethod.__Enum cycle = (java.awt.MultipleGradientPaint.CycleMethod.__Enum)gradient.getCycleMethod().ordinal(); - for (int f = 1; f < factor; f++) - { - int off = f * length; - for (int c = 0, j = length - 1; j >= 0; j--, c++) - { - switch (cycle) - { - case java.awt.MultipleGradientPaint.CycleMethod.__Enum.REFLECT: - if (f % 2 == 0) - { - positions[off + c] = (f + 1 - fractions[j]) / factor; - colors[off + c] = colors[c]; - } - else - { - positions[off + c] = (f + fractions[c]) / factor; - colors[off + c] = colors[j]; - } - break; - case java.awt.MultipleGradientPaint.CycleMethod.__Enum.NO_CYCLE: - positions[off + c] = (f + 1 - fractions[j]) / factor; - break; - default: //CycleMethod.REPEAT - positions[off + c] = (f + 1 - fractions[j]) / factor; - colors[off + c] = colors[c]; - break; - } - } - } - if (cycle == java.awt.MultipleGradientPaint.CycleMethod.__Enum.NO_CYCLE && factor > 1) - { - Array.Copy(colors, 0, colors, colors.Length - length, length); - Color color = colors[length - 1]; - for (int i = colors.Length - length - 1; i >= 0; i--) - { - colors[i] = color; - } - } - - PathGradientBrush pathBrush = new PathGradientBrush(path); - pathBrush.CenterPoint = center; - pathBrush.InterpolationColors = colorBlend; - - brush = pathBrush; - pen.Brush = brush; - return; - } - - //generic paint to brush conversion for custom paints - //the tranform of the graphics should not change between the creation and it usage - using (Matrix transform = g.Transform) - { - SizeF size = GetSize(); - int width = (int)size.Width; - int height = (int)size.Height; - java.awt.Rectangle bounds = new java.awt.Rectangle(0, 0, width, height); - - java.awt.PaintContext context = paint.createContext(ColorModel.getRGBdefault(), bounds, bounds, C2J.ConvertMatrix(transform), getRenderingHints()); - WritableRaster raster = (WritableRaster)context.getRaster(0, 0, width, height); - BufferedImage txtrImage = new BufferedImage(context.getColorModel(), raster, true, null); - Bitmap txtr = J2C.ConvertImage(txtrImage); - - TextureBrush txtBrush; - brush = txtBrush = new TextureBrush(txtr, new Rectangle(0, 0, width, height), composite.GetImageAttributes()); - transform.Invert(); - txtBrush.Transform = transform; - txtBrush.WrapMode = WrapMode.Tile; - pen.Brush = brush; - return; - } - } - - public override void setStroke(java.awt.Stroke stroke) - { - if (this.stroke != null && this.stroke.Equals(stroke)) - { - return; - } - this.stroke = stroke; - if (stroke is java.awt.BasicStroke) - { - java.awt.BasicStroke s = (java.awt.BasicStroke)stroke; - - pen = new Pen(pen.Brush, s.getLineWidth()); - - SetLineJoin(s); - SetLineDash(s); - } - else - { - Console.WriteLine("Unknown Stroke type: " + stroke.GetType().FullName); - } - } - - private void SetLineJoin(java.awt.BasicStroke s) - { - pen.MiterLimit = s.getMiterLimit(); - pen.LineJoin = J2C.ConvertLineJoin(s.getLineJoin()); - } - - private void SetLineDash(java.awt.BasicStroke s) - { - float[] dash = s.getDashArray(); - if (dash == null) - { - pen.DashStyle = DashStyle.Solid; - } else { - if (dash.Length % 2 == 1) - { - int len = dash.Length; - Array.Resize(ref dash, len * 2); - Array.Copy(dash, 0, dash, len, len); - } - float lineWidth = s.getLineWidth(); - if (lineWidth > 1) // for values < 0 there is no correctur needed - { - for (int i = 0; i < dash.Length; i++) - { - //dividing by line thickness because of the representation difference - dash[i] = dash[i] / lineWidth; - } - } - // To fix the problem where solid style in Java can be represented at { 1.0, 0.0 }. - // In .NET, however, array can only have positive value - if (dash.Length == 2 && dash[dash.Length - 1] == 0) - { - Array.Resize(ref dash, 1); - } - - float dashPhase = s.getDashPhase(); - // correct the dash cap - switch (s.getEndCap()) - { - case java.awt.BasicStroke.CAP_BUTT: - pen.DashCap = DashCap.Flat; - break; - case java.awt.BasicStroke.CAP_ROUND: - pen.DashCap = DashCap.Round; - break; - case java.awt.BasicStroke.CAP_SQUARE: - pen.DashCap = DashCap.Flat; - // there is no equals DashCap in .NET, we need to emulate it - dashPhase += lineWidth / 2; - for (int i = 0; i < dash.Length; i++) - { - if (i % 2 == 0) - { - dash[i] += 1; - } - else - { - dash[i] = Math.Max(0.00001F, dash[i] - 1); - } - } - break; - default: - Console.WriteLine("Unknown dash cap type:" + s.getEndCap()); - break; - } - - // calc the dash offset - if (lineWidth > 0) - { - //dividing by line thickness because of the representation difference - pen.DashOffset = dashPhase / lineWidth; - } - else - { - // thickness == 0 - if (dashPhase > 0) - { - pen.Width = lineWidth = 0.001F; // hack to prevent a division with 0 - pen.DashOffset = dashPhase / lineWidth; - } - else - { - pen.DashOffset = 0; - } - } - - // set the final dash pattern - pen.DashPattern = dash; - } - } - - public override void setRenderingHint(java.awt.RenderingHints.Key hintKey, Object hintValue) - { - if (hintKey == java.awt.RenderingHints.KEY_ANTIALIASING) - { - if (hintValue == java.awt.RenderingHints.VALUE_ANTIALIAS_DEFAULT) - { - g.SmoothingMode = SmoothingMode.Default; - g.PixelOffsetMode = PixelOffsetMode.Default; - return; - } - if (hintValue == java.awt.RenderingHints.VALUE_ANTIALIAS_OFF) - { - g.SmoothingMode = SmoothingMode.None; - g.PixelOffsetMode = PixelOffsetMode.Default; - return; - } - if (hintValue == java.awt.RenderingHints.VALUE_ANTIALIAS_ON) - { - g.SmoothingMode = SmoothingMode.AntiAlias; - g.PixelOffsetMode = PixelOffsetMode.HighQuality; - return; - } - return; - } - if (hintKey == java.awt.RenderingHints.KEY_INTERPOLATION) - { - if (hintValue == java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR) - { - g.InterpolationMode = InterpolationMode.HighQualityBilinear; - return; - } - if (hintValue == java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC) - { - g.InterpolationMode = InterpolationMode.HighQualityBicubic; - return; - } - if (hintValue == java.awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR) - { - g.InterpolationMode = InterpolationMode.NearestNeighbor; - return; - } - return; - } - if (hintKey == java.awt.RenderingHints.KEY_TEXT_ANTIALIASING) - { - if (hintValue == java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT || - hintValue == java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_OFF) - { - setTextRenderingHint(TextRenderingHint.SingleBitPerPixelGridFit); - textAntialiasHint = hintValue; - return; - } - if (hintValue == java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON) - { - setTextRenderingHint(TextRenderingHint.AntiAlias); - textAntialiasHint = hintValue; - return; - } - return; - } - if (hintKey == java.awt.RenderingHints.KEY_FRACTIONALMETRICS) - { - if (hintValue == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT || - hintValue == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_OFF || - hintValue == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_ON) - { - fractionalHint = hintValue; - } - return; - } - - } - - public override object getRenderingHint(java.awt.RenderingHints.Key hintKey) - { - return getRenderingHints().get(hintKey); - } - - public override void setRenderingHints(java.util.Map hints) - { - addRenderingHints(hints); - //TODO all not included values should reset to default, but was is default? - } - - public override void addRenderingHints(java.util.Map hints) - { - Iterator iterator = hints.entrySet().iterator(); - while (iterator.hasNext()) - { - java.util.Map.Entry entry = (java.util.Map.Entry)iterator.next(); - setRenderingHint((java.awt.RenderingHints.Key)entry.getKey(), entry.getValue()); - } - } - - public override java.awt.RenderingHints getRenderingHints() - { - java.awt.RenderingHints hints = new java.awt.RenderingHints(null); - switch (g.SmoothingMode) - { - case SmoothingMode.Default: - hints.put(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_DEFAULT); - break; - case SmoothingMode.None: - hints.put(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_OFF); - break; - case SmoothingMode.AntiAlias: - hints.put(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON); - break; - } - - switch (g.InterpolationMode) - { - case InterpolationMode.Bilinear: - case InterpolationMode.HighQualityBilinear: - hints.put(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BILINEAR); - break; - case InterpolationMode.Bicubic: - case InterpolationMode.HighQualityBicubic: - hints.put(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC); - break; - case InterpolationMode.NearestNeighbor: - hints.put(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); - break; - } - - hints.put(java.awt.RenderingHints.KEY_TEXT_ANTIALIASING, textAntialiasHint); - hints.put(java.awt.RenderingHints.KEY_FRACTIONALMETRICS, fractionalHint); - return hints; - } - - public override void translate(double x, double y) - { - Matrix transform = g.Transform; - transform.Translate((float)x, (float)y); - g.Transform = transform; - } - - private static double RadiansToDegrees(double radians) - { - return radians * (180 / Math.PI); - } - - public override void rotate(double theta) - { - Matrix transform = g.Transform; - transform.Rotate((float)RadiansToDegrees(theta)); - g.Transform = transform; - } - - public override void rotate(double theta, double x, double y) - { - Matrix transform = g.Transform; - transform.Translate((float)x, (float)y); - transform.Rotate((float)RadiansToDegrees(theta)); - transform.Translate(-(float)x, -(float)y); - g.Transform = transform; - } - - public override void scale(double scaleX, double scaleY) - { - using (Matrix transform = g.Transform) - { - transform.Scale((float)scaleX, (float)scaleY); - g.Transform = transform; - } - } - - public override void shear(double shearX, double shearY) - { - using (Matrix transform = g.Transform) - { - transform.Shear((float)shearX, (float)shearY); - g.Transform = transform; - } - } - - public override void transform(java.awt.geom.AffineTransform tx) - { - using (Matrix transform = g.Transform, - matrix = J2C.ConvertTransform(tx)) - { - transform.Multiply(matrix); - g.Transform = transform; - } - } - - public override void setTransform(java.awt.geom.AffineTransform tx) - { - g.Transform = J2C.ConvertTransform(tx); - } - - public override java.awt.geom.AffineTransform getTransform() - { - using (Matrix matrix = g.Transform) - { - return C2J.ConvertMatrix(matrix); - } - } - - public override java.awt.Paint getPaint() - { - if( javaPaint == null ) { - javaPaint = composite.GetColor(color); - } - return javaPaint; - } - - public override java.awt.Composite getComposite() - { - return javaComposite; - } - - public override void setBackground(java.awt.Color backcolor) - { - bgcolor = backcolor == null ? Color.Empty : Color.FromArgb(backcolor.getRGB()); - } - - public override java.awt.Color getBackground() - { - return bgcolor == Color.Empty ? null : new java.awt.Color(color.ToArgb(), true); - } - - public override java.awt.Stroke getStroke() - { - if (stroke == null) - { - return defaultStroke; - } - return stroke; - } - - internal void setTextRenderingHint(TextRenderingHint hint) - { - g.TextRenderingHint = hint; - baseline = getBaseline(netfont, hint); - } - - /// <summary> - /// Caclulate the baseline from a font and a TextRenderingHint - /// </summary> - /// <param name="font">the font</param> - /// <param name="hint">the used TextRenderingHint</param> - /// <returns></returns> - private static int getBaseline(Font font, TextRenderingHint hint) - { - lock (baselines) - { - String key = font.ToString() + hint.ToString(); - int baseline; - if (!baselines.TryGetValue(key, out baseline)) - { - FontFamily family = font.FontFamily; - FontStyle style = font.Style; - float ascent = family.GetCellAscent(style); - float lineSpace = family.GetLineSpacing(style); - - baseline = (int)Math.Round(font.GetHeight() * ascent / lineSpace); - - // Until this point the calulation use only the Font. But with different TextRenderingHint there are smal differences. - // There is no API that calulate the offset from TextRenderingHint that we messure it. - const int w = 3; - const int h = 3; - - Bitmap bitmap = new Bitmap(w, h); - Graphics g = Graphics.FromImage(bitmap); - g.TextRenderingHint = hint; - g.FillRectangle(new SolidBrush(Color.White), 0, 0, w, h); - g.DrawString("A", font, new SolidBrush(Color.Black), 0, -baseline, FORMAT); - g.DrawString("X", font, new SolidBrush(Color.Black), 0, -baseline, FORMAT); - g.Dispose(); - - int y = 0; - LINE: - while (y < h) - { - for (int x = 0; x < w; x++) - { - Color color = bitmap.GetPixel(x, y); - if (color.GetBrightness() < 0.5) - { - //there is a black pixel, we continue in the next line. - baseline++; - y++; - goto LINE; - } - } - break; // there was a line without black pixel - } - - - baselines[key] = baseline; - } - return baseline; - } - } - - private bool isAntiAlias() - { - switch (g.TextRenderingHint) - { - case TextRenderingHint.AntiAlias: - case TextRenderingHint.AntiAliasGridFit: - case TextRenderingHint.ClearTypeGridFit: - return true; - default: - return false; - } - } - - private bool isFractionalMetrics() - { - return fractionalHint == java.awt.RenderingHints.VALUE_FRACTIONALMETRICS_ON; - } - - public override java.awt.font.FontRenderContext getFontRenderContext() - { - return new java.awt.font.FontRenderContext(getTransform(), isAntiAlias(), isFractionalMetrics()); - } - - public override void drawGlyphVector(java.awt.font.GlyphVector gv, float x, float y) - { - java.awt.font.FontRenderContext frc = gv.getFontRenderContext(); - Matrix currentMatrix = null; - Font currentFont = netfont; - TextRenderingHint currentHint = g.TextRenderingHint; - int currentBaseline = baseline; - try - { - java.awt.Font javaFont = gv.getFont(); - if (javaFont != null) - { - netfont = javaFont.getNetFont(); - } - TextRenderingHint hint; - if (frc.isAntiAliased()) { - if( frc.usesFractionalMetrics() ){ - hint = TextRenderingHint.AntiAlias; - } else { - hint = TextRenderingHint.AntiAliasGridFit; - } - } else { - if (frc.usesFractionalMetrics()) { - hint = TextRenderingHint.SingleBitPerPixel; - } else { - hint = TextRenderingHint.SingleBitPerPixelGridFit; - } - } - g.TextRenderingHint = hint; - baseline = getBaseline(netfont, hint); - if (!frc.getTransform().equals(getTransform())) - { - // save the old context and use the transformation from the renderContext - currentMatrix = g.Transform; - g.Transform = J2C.ConvertTransform(frc.getTransform()); - } - drawString(J2C.ConvertGlyphVector(gv), x, y); - } - finally - { - // Restore the old context if needed - g.TextRenderingHint = currentHint; - baseline = currentBaseline; - netfont = currentFont; - if (currentMatrix != null) - { - g.Transform = currentMatrix; - } - } - } - } - - sealed class NetGraphicsConfiguration : java.awt.GraphicsConfiguration - { - internal readonly Screen screen; - - public NetGraphicsConfiguration(Screen screen) - { - this.screen = screen; - } - - public override java.awt.image.BufferedImage createCompatibleImage(int width, int height, int transparency) - { - switch (transparency) - { - case java.awt.Transparency.__Fields.OPAQUE: - return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - case java.awt.Transparency.__Fields.BITMASK: - return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE); - case java.awt.Transparency.__Fields.TRANSLUCENT: - return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - default: - throw new java.lang.IllegalArgumentException("transparency:" + transparency); - } - } - - public override java.awt.image.BufferedImage createCompatibleImage(int width, int height) - { - return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - } - - public override java.awt.image.VolatileImage createCompatibleVolatileImage(int param1, int param2, java.awt.ImageCapabilities param3) - { - throw new NotImplementedException(); - } - - public override java.awt.image.VolatileImage createCompatibleVolatileImage(int width, int height) - { - return new NetVolatileImage(width, height); - } - - public override java.awt.Rectangle getBounds() - { - System.Drawing.Rectangle bounds = screen.Bounds; - return new java.awt.Rectangle(bounds.X, bounds.Y, bounds.Width, bounds.Height); - } - - public override java.awt.BufferCapabilities getBufferCapabilities() - { - throw new NotImplementedException(); - } - - public override java.awt.image.ColorModel getColorModel(int transparency) - { - if (transparency == java.awt.Transparency.__Fields.TRANSLUCENT) - { - //we return the default ColorModel because this produce the fewest problems with convertions - return ColorModel.getRGBdefault(); - } - else - { - return null; - } - } - - public override java.awt.image.ColorModel getColorModel() - { - //we return the default ColorModel because this produce the fewest problems with convertions - return ColorModel.getRGBdefault(); - } - - public override java.awt.geom.AffineTransform getDefaultTransform() - { - return new java.awt.geom.AffineTransform(); - } - - public override java.awt.GraphicsDevice getDevice() - { - return new NetGraphicsDevice(screen); - } - - public override java.awt.ImageCapabilities getImageCapabilities() - { - throw new NotImplementedException(); - } - - public override java.awt.geom.AffineTransform getNormalizingTransform() - { - throw new NotImplementedException(); - } - - public override VolatileImage createCompatibleVolatileImage(int width, int height, int transparency) - { - return new NetVolatileImage(width, height); - } - - public override VolatileImage createCompatibleVolatileImage(int width, int height, java.awt.ImageCapabilities caps, int transparency) - { - return new NetVolatileImage(width, height); - } - - public override bool isTranslucencyCapable() - { - return true; - } - } - - class NetGraphicsDevice : java.awt.GraphicsDevice - { - internal readonly Screen screen; - - internal NetGraphicsDevice(Screen screen) - { - this.screen = screen; - } - - public override java.awt.GraphicsConfiguration[] getConfigurations() - { - Screen[] screens = Screen.AllScreens; - NetGraphicsConfiguration[] configs = new NetGraphicsConfiguration[screens.Length]; - for (int i = 0; i < screens.Length; i++) - { - configs[i] = new NetGraphicsConfiguration(screens[i]); - } - return configs; - } - - public override java.awt.GraphicsConfiguration getDefaultConfiguration() - { - return new NetGraphicsConfiguration(screen); - } - - public override string getIDstring() - { - return screen.DeviceName; - } - - public override int getType() - { - return TYPE_RASTER_SCREEN; - } - } - - public class NetGraphicsEnvironment : sun.java2d.SunGraphicsEnvironment - { - - public override bool isDisplayLocal() - { - return true; - } - - // Create a bitmap with the dimensions of the argument image. Then - // create a graphics objects from the bitmap. All paint operations will - // then paint the bitmap. - public override java.awt.Graphics2D createGraphics(BufferedImage bi) - { - return new BitmapGraphics(bi.getBitmap(), bi ); - } - - public override java.awt.Font[] getAllFonts() - { -#if WINFX - System.Collections.Generic.ICollection<Typeface> typefaces = System.Windows.Media.Fonts.SystemTypefaces; - java.awt.Font[] fonts = new java.awt.Font[typefaces.Count]; - int i = 0; - foreach (Typeface face in typefaces) - { - FontFamily family = face.FontFamily; - fonts[i++] = new java.awt.Font(family.GetName(0), face.Style, 1); - } -#else - String[] names = getAvailableFontFamilyNames(); - java.awt.Font[] fonts = new java.awt.Font[names.Length]; - for(int i=0; i<fonts.Length; i++) - { - fonts[i] = new java.awt.Font(names[i], 0, 1); - } - return fonts; -#endif - } - - public override String[] getAvailableFontFamilyNames() - { - int language = CultureInfo.CurrentCulture.LCID; - return getAvailableFontFamilyNames(language); - } - - public override string[] getAvailableFontFamilyNames(Locale locale) - { - int language = CultureInfo.GetCultureInfo(locale.toString()).LCID; - return getAvailableFontFamilyNames(language); - } - - private String[] getAvailableFontFamilyNames(int language) - { - FontFamily[] families = FontFamily.Families; - String[] results = new String[families.Length + 5]; - int i = 0; - for (; i < families.Length; i++) - { - results[i] = families[i].GetName(language); - } - results[i++] = "Dialog"; - results[i++] = "DialogInput"; - results[i++] = "Serif"; - results[i++] = "SansSerif"; - results[i++] = "Monospaced"; - Array.Sort(results); - return results; - } - - public override java.awt.GraphicsDevice getDefaultScreenDevice() - { - return new NetGraphicsDevice(Screen.PrimaryScreen); - } - - public override java.awt.GraphicsDevice[] getScreenDevices() - { - Screen[] screens = Screen.AllScreens; - NetGraphicsDevice[] devices = new NetGraphicsDevice[screens.Length]; - for (int i = 0; i < screens.Length; i++) - { - devices[i] = new NetGraphicsDevice(screens[i]); - } - return devices; - } - } - -}
\ No newline at end of file |