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:
smallsql 2011-01-23 11:20:38 +00:00
Родитель 209830e5fe
Коммит b0398ffc0a
5 изменённых файлов: 72 добавлений и 74 удалений

Просмотреть файл

@ -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);
}