зеркало из https://github.com/mono/ikvm-fork.git
Currently there are an inconsistency between NetFontMetrics and FontDesignMetrics. To prevent this we replace all with FontDesignMetrics and remove NetFontMetrics.
This commit is contained in:
Родитель
209830e5fe
Коммит
b0398ffc0a
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
Copyright (C) 2002, 2004, 2005, 2006, 2007 Jeroen Frijters
|
||||
Copyright (C) 2006 Active Endpoints, Inc.
|
||||
Copyright (C) 2006, 2007, 2009, 2010 Volker Berlin
|
||||
Copyright (C) 2006, 2007, 2009 - 2011 Volker Berlin
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
|
@ -41,7 +41,7 @@ using System.Windows.Media;
|
|||
namespace ikvm.awt
|
||||
{
|
||||
|
||||
class NetFontMetrics : java.awt.FontMetrics
|
||||
/*class NetFontMetrics : java.awt.FontMetrics
|
||||
{
|
||||
private static readonly Bitmap defaultbitmap = new Bitmap(1, 1);
|
||||
[ThreadStatic]
|
||||
|
@ -190,7 +190,7 @@ namespace ikvm.awt
|
|||
}
|
||||
return GetStringBounds(aString, GetDefaultGraphics());
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
/* class NetFontPeer : java.awt.peer.FontPeer, IDisposable
|
||||
{
|
||||
|
@ -457,7 +457,7 @@ namespace ikvm.awt
|
|||
}
|
||||
}*/
|
||||
|
||||
class NetLineMetrics : LineMetrics
|
||||
/*class NetLineMetrics : LineMetrics
|
||||
{
|
||||
private java.awt.Font mFont;
|
||||
private String mString;
|
||||
|
@ -552,6 +552,6 @@ namespace ikvm.awt
|
|||
return mFont.getSize2D() / 18;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
Copyright (C) 2002, 2004, 2005, 2006, 2007 Jeroen Frijters
|
||||
Copyright (C) 2006 Active Endpoints, Inc.
|
||||
Copyright (C) 2006 - 2010 Volker Berlin (i-net software)
|
||||
Copyright (C) 2006 - 2011 Volker Berlin (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
|
||||
|
@ -532,12 +532,12 @@ namespace ikvm.awt
|
|||
|
||||
public override java.awt.FontMetrics getFontMetrics(java.awt.Font f)
|
||||
{
|
||||
return new NetFontMetrics(f);
|
||||
return sun.font.FontDesignMetrics.getMetrics(f);
|
||||
}
|
||||
|
||||
public override java.awt.FontMetrics getFontMetrics()
|
||||
{
|
||||
return new NetFontMetrics(font);
|
||||
return sun.font.FontDesignMetrics.getMetrics(font);
|
||||
}
|
||||
|
||||
public override void setClip(int x, int y, int width, int height)
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
/*
|
||||
Copyright (C) 2002, 2004-2009 Jeroen Frijters
|
||||
Copyright (C) 2006 Active Endpoints, Inc.
|
||||
Copyright (C) 2006-2010 Volker Berlin (i-net software)
|
||||
Copyright (C) 2006-2011 Volker Berlin (i-net software)
|
||||
Copyright (C) 2010 Karsten Heinrich (i-net software)
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
|
@ -528,7 +528,7 @@ namespace ikvm.awt
|
|||
[Obsolete]
|
||||
public override java.awt.FontMetrics getFontMetrics(java.awt.Font font)
|
||||
{
|
||||
return new NetFontMetrics(font);
|
||||
return sun.font.FontDesignMetrics.getMetrics(font);
|
||||
}
|
||||
|
||||
public override void sync()
|
||||
|
@ -2549,7 +2549,7 @@ namespace ikvm.awt
|
|||
|
||||
public override java.awt.FontMetrics getFontMetrics(java.awt.Font f)
|
||||
{
|
||||
return new NetFontMetrics(f);
|
||||
return sun.font.FontDesignMetrics.getMetrics(f);
|
||||
}
|
||||
|
||||
public override java.awt.Graphics getGraphics()
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2009, 2010 Volker Berlin (i-net software)
|
||||
Copyright (C) 2009 - 2011 Volker Berlin (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
|
||||
|
@ -23,14 +23,27 @@
|
|||
*/
|
||||
package sun.font;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.Font;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.awt.geom.GeneralPath;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.Point2D.Float;
|
||||
|
||||
import cli.System.Drawing.Bitmap;
|
||||
import cli.System.Drawing.CharacterRange;
|
||||
import cli.System.Drawing.FontFamily;
|
||||
import cli.System.Drawing.FontStyle;
|
||||
import cli.System.Drawing.Graphics;
|
||||
import cli.System.Drawing.RectangleF;
|
||||
import cli.System.Drawing.Region;
|
||||
import cli.System.Drawing.SizeF;
|
||||
import cli.System.Drawing.StringFormat;
|
||||
import cli.System.Drawing.StringFormatFlags;
|
||||
import cli.System.Drawing.StringTrimming;
|
||||
import cli.System.Drawing.Drawing2D.PixelOffsetMode;
|
||||
import cli.System.Drawing.Drawing2D.SmoothingMode;
|
||||
import cli.System.Drawing.Text.TextRenderingHint;
|
||||
|
||||
import ikvm.internal.NotYetImplementedError;
|
||||
|
||||
/**
|
||||
|
@ -39,6 +52,8 @@ import ikvm.internal.NotYetImplementedError;
|
|||
*/
|
||||
public class PhysicalStrike extends FontStrike{
|
||||
|
||||
private static final Bitmap BITMAP = new Bitmap( 1, 1 );
|
||||
|
||||
private final Font font;
|
||||
private final FontFamily family;
|
||||
private final FontStyle style;
|
||||
|
@ -48,8 +63,6 @@ public class PhysicalStrike extends FontStrike{
|
|||
|
||||
private StrikeMetrics strike;
|
||||
|
||||
private FontMetrics metrics;
|
||||
|
||||
public PhysicalStrike(Font font, FontFamily family, FontStyle style, FontRenderContext frc){
|
||||
this.font = font;
|
||||
this.family = family;
|
||||
|
@ -68,17 +81,37 @@ public class PhysicalStrike extends FontStrike{
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a Graphics with the settings for the given FontRenderContext
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private static Graphics createGraphics(FontRenderContext frc){
|
||||
Graphics g = Graphics.FromImage(BITMAP);
|
||||
boolean fm = frc.usesFractionalMetrics();
|
||||
g.set_SmoothingMode(SmoothingMode.wrap(fm ? SmoothingMode.None : SmoothingMode.AntiAlias));
|
||||
g.set_PixelOffsetMode(PixelOffsetMode.wrap(fm ? PixelOffsetMode.None : PixelOffsetMode.HighQuality));
|
||||
g.set_TextRenderingHint(TextRenderingHint.wrap(fm ? TextRenderingHint.SingleBitPerPixelGridFit : TextRenderingHint.AntiAliasGridFit));
|
||||
return g;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
float getCodePointAdvance( int cp ) {
|
||||
Graphics2D g = StandardGlyphVector.createGraphics( frc );
|
||||
if( metrics == null ) {
|
||||
metrics = Toolkit.getDefaultToolkit().getFontMetrics( font );
|
||||
}
|
||||
Rectangle2D.Float bounds = (Rectangle2D.Float)metrics.getStringBounds( String.valueOf( (char)cp ), g );
|
||||
return bounds.width;
|
||||
StringFormat format = new StringFormat(StringFormat.get_GenericTypographic());
|
||||
|
||||
format.set_FormatFlags( StringFormatFlags.wrap( StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.NoWrap |
|
||||
StringFormatFlags.FitBlackBox ));
|
||||
format.set_Trimming( StringTrimming.wrap( StringTrimming.None ) );
|
||||
format.SetMeasurableCharacterRanges(new CharacterRange[] {new CharacterRange(0, 1)});
|
||||
Graphics g = createGraphics( frc );
|
||||
Region[] regions = g.MeasureCharacterRanges(String.valueOf((char)cp), font.getNetFont(),
|
||||
new RectangleF(0, 0, Integer.MAX_VALUE, Integer.MAX_VALUE), format);
|
||||
SizeF size = regions[0].GetBounds(g).get_Size();
|
||||
regions[0].Dispose();
|
||||
return frc.usesFractionalMetrics() ? size.get_Width() : Math.round(size.get_Width());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2009, 2010 Volker Berlin (i-net software)
|
||||
Copyright (C) 2009 - 2011 Volker Berlin (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
|
||||
|
@ -26,24 +26,18 @@ package sun.font;
|
|||
import ikvm.awt.IkvmToolkit;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.FontMetrics;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.RenderingHints;
|
||||
import java.awt.Shape;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.font.FontRenderContext;
|
||||
import java.awt.font.GlyphJustificationInfo;
|
||||
import java.awt.font.GlyphMetrics;
|
||||
import java.awt.font.GlyphVector;
|
||||
import java.awt.font.LineMetrics;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Point2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.text.CharacterIterator;
|
||||
import java.util.WeakHashMap;
|
||||
|
||||
import cli.System.Drawing.Drawing2D.GraphicsPath;
|
||||
import ikvm.internal.NotYetImplementedError;
|
||||
|
||||
/**
|
||||
|
@ -52,8 +46,6 @@ import ikvm.internal.NotYetImplementedError;
|
|||
*/
|
||||
public class StandardGlyphVector extends GlyphVector{
|
||||
|
||||
private static final BufferedImage IMAGE = new BufferedImage( 1, 1, BufferedImage.TYPE_INT_ARGB );
|
||||
|
||||
private float[] positions; // only if not default advances
|
||||
|
||||
private final Font font;
|
||||
|
@ -62,13 +54,9 @@ public class StandardGlyphVector extends GlyphVector{
|
|||
|
||||
private final String glyphs;
|
||||
|
||||
private transient FontMetrics metrics;
|
||||
|
||||
private Font2D font2D;
|
||||
private FontStrike strike;
|
||||
|
||||
private Graphics2D graphics;
|
||||
|
||||
|
||||
public StandardGlyphVector(Font font, String str, FontRenderContext frc){
|
||||
if(str == null){
|
||||
|
@ -105,20 +93,6 @@ public class StandardGlyphVector extends GlyphVector{
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create and get
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings( "deprecation" )
|
||||
private FontMetrics getMetrics(){
|
||||
if(metrics == null){
|
||||
metrics = Toolkit.getDefaultToolkit().getFontMetrics(font);
|
||||
}
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* As a concrete subclass of GlyphVector, this must implement clone.
|
||||
*/
|
||||
|
@ -308,29 +282,6 @@ public class StandardGlyphVector extends GlyphVector{
|
|||
throw new NotYetImplementedError();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get/Create a Graphics with the settings of the current FontMetrics
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private Graphics2D getGraphics() {
|
||||
if( graphics == null ){
|
||||
graphics = createGraphics( frc );
|
||||
}
|
||||
return graphics;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a Graphics with the settings for the given FontRenderContext
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
static Graphics2D createGraphics( FontRenderContext frc ) {
|
||||
Graphics2D g = (Graphics2D)IMAGE.getGraphics();
|
||||
g.setRenderingHint( RenderingHints.KEY_FRACTIONALMETRICS, frc.usesFractionalMetrics() ? RenderingHints.VALUE_FRACTIONALMETRICS_ON : RenderingHints.VALUE_FRACTIONALMETRICS_OFF );
|
||||
g.setRenderingHint( RenderingHints.KEY_TEXT_ANTIALIASING, frc.usesFractionalMetrics() ? RenderingHints.VALUE_TEXT_ANTIALIAS_ON : RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
|
||||
return g;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Shape getGlyphLogicalBounds( int glyphIndex ) {
|
||||
|
@ -351,7 +302,21 @@ public class StandardGlyphVector extends GlyphVector{
|
|||
|
||||
@Override
|
||||
public Rectangle2D getLogicalBounds(){
|
||||
return getMetrics().getStringBounds(glyphs, getGraphics());
|
||||
initPositions();
|
||||
|
||||
LineMetrics lm = font.getLineMetrics("", frc);
|
||||
|
||||
float minX, minY, maxX, maxY;
|
||||
// horiz only for now...
|
||||
minX = 0;
|
||||
minY = -lm.getAscent();
|
||||
maxX = 0;
|
||||
maxY = lm.getDescent() + lm.getLeading();
|
||||
if (glyphs.length() > 0) {
|
||||
maxX = positions[positions.length - 2];
|
||||
}
|
||||
|
||||
return new Rectangle2D.Float(minX, minY, maxX - minX, maxY - minY);
|
||||
}
|
||||
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче