diff options
author | Roman Kennke <roman@kennke.org> | 2006-12-16 20:51:01 +0000 |
---|---|---|
committer | Roman Kennke <roman@kennke.org> | 2006-12-16 20:51:01 +0000 |
commit | 7061738ae0359a82559bc19e7c8f9316fa0721c1 (patch) | |
tree | bce986a33e4ccf7c9ce7e114b9e06937dae8a15f /gnu/java/awt | |
parent | 1ffd40e6b6dc7495403327511d5df94b69c7acab (diff) | |
download | classpath-7061738ae0359a82559bc19e7c8f9316fa0721c1.tar.gz |
2006-12-16 Roman Kennke <kennke@aicas.com>
* gnu/java/awt/font/FontDelegate.java
(FLAG_FITTED): New constant field.
(FLAG_NO_HINT_HORIZONTAL): New constant field.
(FLAG_NO_HINT_VERTICAL): New constant field.w
(FLAG_NO_HINT_EDGE_POINTS): New constant field.
(FLAG_NO_HINT_STRONG_POINTS): New constant field.
(FLAG_NO_HINT_WEAK_POINTS): New constant field.
(TYPE_FITTED): Replaced by flags above.
(TYPE_SCALED): Replaced by flags above.
(TYPE_ORIGINAL): Replaced by flags above.
* gnu/java/awt/font/GNUGlyphVector.java
(getGlyphOutline): Use FLAG_FITTED.
* gnu/java/awt/font/autofit/AutoHinter.java
(setFlags): New method. Sets hinting flags.
* gnu/java/awt/font/autofit/GlyphHints.java
(flags): New field.
(alignStrongPoint): Use 16.16 fixed arithmetic.
(doAlignEdgePoints): New helper method.
(doAlignStrongPoints): New helper method.
(doAlignWeakPoints): New helper method.
(doHorizonal): Check flags.
(doVertical): Check flags.
* gnu/java/awt/font/autofit/Latin.java
(applyHints): Check hinting flags.
(computeEdges): Also initialize fitted position.
(scaleMetricsDim): Commented out buggy block.
* gnu/java/awt/font/opentype/Hinter.java
(setFlags): New method.
* gnu/java/awt/font/opentype/OpenTypeFont.java
(checkHinter): Accept flags parameter.
(createGlyphVector): Pass flags to hinter.
(getGlyphOutline): Pass flags to hinter.
* gnu/java/awt/font/opentype/truetype/Fixed.java
(floatValue16): New method.
* gnu/java/awt/font/opentype/truetype/Zone.java
(getX): Use new flags.
(getY): Use new flags.
Diffstat (limited to 'gnu/java/awt')
-rw-r--r-- | gnu/java/awt/font/FontDelegate.java | 9 | ||||
-rw-r--r-- | gnu/java/awt/font/GNUGlyphVector.java | 2 | ||||
-rw-r--r-- | gnu/java/awt/font/autofit/AutoHinter.java | 7 | ||||
-rw-r--r-- | gnu/java/awt/font/autofit/GlyphHints.java | 31 | ||||
-rw-r--r-- | gnu/java/awt/font/autofit/Latin.java | 71 | ||||
-rw-r--r-- | gnu/java/awt/font/opentype/Hinter.java | 2 | ||||
-rw-r--r-- | gnu/java/awt/font/opentype/OpenTypeFont.java | 11 | ||||
-rw-r--r-- | gnu/java/awt/font/opentype/truetype/Fixed.java | 5 | ||||
-rw-r--r-- | gnu/java/awt/font/opentype/truetype/Zone.java | 44 |
9 files changed, 100 insertions, 82 deletions
diff --git a/gnu/java/awt/font/FontDelegate.java b/gnu/java/awt/font/FontDelegate.java index 9d06b6464..030f9d3bc 100644 --- a/gnu/java/awt/font/FontDelegate.java +++ b/gnu/java/awt/font/FontDelegate.java @@ -61,9 +61,12 @@ import java.util.Locale; */ public interface FontDelegate { - public static final int TYPE_ORIGINAL = 0; - public static final int TYPE_SCALED = 1; - public static final int TYPE_FITTED = 2; + public static final int FLAG_FITTED = 1 << 0; + public static final int FLAG_NO_HINT_HORIZONTAL = 1 << 1; + public static final int FLAG_NO_HINT_VERTICAL = 1 << 2; + public static final int FLAG_NO_HINT_EDGE_POINTS = 1 << 3; + public static final int FLAG_NO_HINT_STRONG_POINTS = 1 << 4; + public static final int FLAG_NO_HINT_WEAK_POINTS = 1 << 5; /** * Returns the full name of this font face in the specified diff --git a/gnu/java/awt/font/GNUGlyphVector.java b/gnu/java/awt/font/GNUGlyphVector.java index 4186248a4..2f73dce77 100644 --- a/gnu/java/awt/font/GNUGlyphVector.java +++ b/gnu/java/awt/font/GNUGlyphVector.java @@ -328,7 +328,7 @@ public class GNUGlyphVector path = fontDelegate.getGlyphOutline(glyphs[glyphIndex], fontSize, tx, renderContext.isAntiAliased(), renderContext.usesFractionalMetrics(), - FontDelegate.TYPE_FITTED); + FontDelegate.FLAG_FITTED); tx = new AffineTransform(); tx.translate(pos[glyphIndex * 2], pos[glyphIndex * 2 + 1]); diff --git a/gnu/java/awt/font/autofit/AutoHinter.java b/gnu/java/awt/font/autofit/AutoHinter.java index b61eaa182..b0420ab7a 100644 --- a/gnu/java/awt/font/autofit/AutoHinter.java +++ b/gnu/java/awt/font/autofit/AutoHinter.java @@ -73,4 +73,11 @@ public class AutoHinter latinScript.applyHints(hints, outline, metrics); } + public void setFlags(int flags) + { + if (hints == null) + hints = new GlyphHints(); + hints.flags = flags; + } + } diff --git a/gnu/java/awt/font/autofit/GlyphHints.java b/gnu/java/awt/font/autofit/GlyphHints.java index 8358dab36..16d9e7214 100644 --- a/gnu/java/awt/font/autofit/GlyphHints.java +++ b/gnu/java/awt/font/autofit/GlyphHints.java @@ -38,6 +38,7 @@ exception statement from your version. */ package gnu.java.awt.font.autofit; +import gnu.java.awt.font.FontDelegate; import gnu.java.awt.font.opentype.truetype.Fixed; import gnu.java.awt.font.opentype.truetype.Point; import gnu.java.awt.font.opentype.truetype.Zone; @@ -66,7 +67,8 @@ class GlyphHints ScriptMetrics metrics; - + int flags; + GlyphHints() { axis = new AxisHints[Constants.DIMENSION_MAX]; @@ -287,12 +289,12 @@ class GlyphHints boolean doHorizontal() { - return true; // Check scaler flags here. + return (flags & FontDelegate.FLAG_NO_HINT_HORIZONTAL) == 0; } boolean doVertical() { - return true; // Check scaler flags here. + return (flags & FontDelegate.FLAG_NO_HINT_VERTICAL) == 0; } void alignWeakPoints(int dim) @@ -551,15 +553,15 @@ class GlyphHints Edge after = edges[min]; if (before.scale == 0) { - before.scale = Fixed.div(after.pos - before.pos, + before.scale = Fixed.div16(after.pos - before.pos, after.fpos - before.fpos); } - u = before.pos + Fixed.mul(fu - before.fpos, - before.scale); + u = before.pos + Fixed.mul16(fu - before.fpos, + before.scale); } + storePoint(point, u, dim, touchFlag); } } - storePoint(point, u, dim, touchFlag); } } } @@ -619,4 +621,19 @@ class GlyphHints } return idx; } + + public boolean doAlignEdgePoints() + { + return (flags & FontDelegate.FLAG_NO_HINT_EDGE_POINTS) == 0; + } + + public boolean doAlignStrongPoints() + { + return (flags & FontDelegate.FLAG_NO_HINT_STRONG_POINTS) == 0; + } + + public boolean doAlignWeakPoints() + { + return (flags & FontDelegate.FLAG_NO_HINT_WEAK_POINTS) == 0; + } } diff --git a/gnu/java/awt/font/autofit/Latin.java b/gnu/java/awt/font/autofit/Latin.java index db2d369d7..8951e8b19 100644 --- a/gnu/java/awt/font/autofit/Latin.java +++ b/gnu/java/awt/font/autofit/Latin.java @@ -97,9 +97,12 @@ class Latin || dim == DIMENSION_VERT && hints.doVertical()) { hintEdges(hints, dim); - hints.alignEdgePoints(dim); - hints.alignStrongPoints(dim); - hints.alignWeakPoints(dim); + if (hints.doAlignEdgePoints()) + hints.alignEdgePoints(dim); + if (hints.doAlignStrongPoints()) + hints.alignStrongPoints(dim); + if (hints.doAlignWeakPoints()) + hints.alignWeakPoints(dim); } } @@ -283,7 +286,9 @@ class Latin edge2.flags |= Segment.FLAG_EDGE_DONE; if (e > 0 && edge.pos < edges[e - 1].pos) - edge.pos = edges[e - 1].pos; + { + edge.pos = edges[e - 1].pos; + } } } // TODO: Implement the lowercase m symmetry thing. @@ -595,33 +600,33 @@ class Latin // letters to the pixel grid. LatinAxis axis2 = lm.axis[DIMENSION_VERT]; LatinBlue blue = null; - for (int nn = 0; nn < axis2.blueCount; nn++) - { - if ((axis2.blues[nn].flags & LatinBlue.FLAG_ADJUSTMENT) != 0) - { - blue = axis2.blues[nn]; - break; - } - } - if (blue != null) - { - int scaled = Fixed.mul16(blue.shoot.org, scaler.yScale); - int fitted = Utils.pixRound(scaled); - if (scaled != fitted) - { - if (dim == DIMENSION_HORZ) - { - if (fitted < scaled) - { - scale -= scale / 50; - } - } - else - { - scale = Utils.mulDiv(scale, fitted, scaled); - } - } - } +// for (int nn = 0; nn < axis2.blueCount; nn++) +// { +// if ((axis2.blues[nn].flags & LatinBlue.FLAG_ADJUSTMENT) != 0) +// { +// blue = axis2.blues[nn]; +// break; +// } +// } +// if (blue != null) +// { +// int scaled = Fixed.mul16(blue.shoot.org, scaler.yScale); +// int fitted = Utils.pixRound(scaled); +// if (scaled != fitted) +// { +// if (dim == DIMENSION_HORZ) +// { +// if (fitted < scaled) +// { +// scale -= scale / 50; +// } +// } +// else +// { +// scale = Utils.mulDiv(scale, fitted, scaled); +// } +// } +// } axis.scale = scale; axis.delta = delta; if (dim == DIMENSION_HORZ) @@ -669,7 +674,7 @@ class Latin if (delta1 < 0) delta2 = -delta2; blue.ref.fit = Utils.pixRound(blue.ref.cur); - blue.shoot.fit = blue.ref.fit+ delta2; + blue.shoot.fit = blue.ref.fit + delta2; blue.flags |= LatinBlue.FLAG_BLUE_ACTIVE; } } @@ -1163,7 +1168,7 @@ class Latin edge.first = seg; edge.last = seg; edge.fpos = seg.pos; - edge.opos = Fixed.mul16(seg.pos, scale); + edge.opos = edge.pos = Fixed.mul16(seg.pos, scale); seg.edgeNext = seg; seg.edge = edge; } diff --git a/gnu/java/awt/font/opentype/Hinter.java b/gnu/java/awt/font/opentype/Hinter.java index 1e48e1108..9758a2896 100644 --- a/gnu/java/awt/font/opentype/Hinter.java +++ b/gnu/java/awt/font/opentype/Hinter.java @@ -58,4 +58,6 @@ public interface Hinter * @param outline the outline to hint */ void applyHints(Zone outline); + + void setFlags(int flags); } diff --git a/gnu/java/awt/font/opentype/OpenTypeFont.java b/gnu/java/awt/font/opentype/OpenTypeFont.java index 0dab92956..a270ce7d9 100644 --- a/gnu/java/awt/font/opentype/OpenTypeFont.java +++ b/gnu/java/awt/font/opentype/OpenTypeFont.java @@ -582,7 +582,7 @@ public final class OpenTypeFont CharacterIterator ci) { // Initialize hinter if necessary. - checkHinter(); + checkHinter(FontDelegate.FLAG_FITTED); CharGlyphMap cmap; int numGlyphs; @@ -695,14 +695,14 @@ public final class OpenTypeFont AffineTransform transform, boolean antialias, boolean fractionalMetrics, - int type) + int flags) { /* The synchronization is needed because the scaler is not * synchronized. */ - checkHinter(); + checkHinter(flags); return scaler.getOutline(glyph, pointSize, transform, - antialias, fractionalMetrics, hinter, type); + antialias, fractionalMetrics, hinter, flags); } /** @@ -848,7 +848,7 @@ public final class OpenTypeFont /** * Checks if a hinter is installed and installs one when not. */ - private void checkHinter() + private void checkHinter(int flags) { // When another hinting impl gets added (maybe a true TrueType hinter) // then add some options here. The Hinter interface might need to be @@ -867,5 +867,6 @@ public final class OpenTypeFont ex.printStackTrace(); } } + hinter.setFlags(flags); } } diff --git a/gnu/java/awt/font/opentype/truetype/Fixed.java b/gnu/java/awt/font/opentype/truetype/Fixed.java index 4e1ba441e..287593e43 100644 --- a/gnu/java/awt/font/opentype/truetype/Fixed.java +++ b/gnu/java/awt/font/opentype/truetype/Fixed.java @@ -126,7 +126,10 @@ public final class Fixed { return ((float) f) / 64; } - + public static float floatValue16(int f) + { + return ((float) f) / 65536; + } public static double doubleValue(int f) { diff --git a/gnu/java/awt/font/opentype/truetype/Zone.java b/gnu/java/awt/font/opentype/truetype/Zone.java index ea4727d75..7c25a0a6a 100644 --- a/gnu/java/awt/font/opentype/truetype/Zone.java +++ b/gnu/java/awt/font/opentype/truetype/Zone.java @@ -73,26 +73,16 @@ public final class Zone public int getX(int point) { - return getX(point, FontDelegate.TYPE_FITTED); + return getX(point, FontDelegate.FLAG_FITTED); } - public int getX(int point, int type) + public int getX(int point, int flags) { int x; - switch (type) - { - case FontDelegate.TYPE_FITTED: - x = points[point].x; - break; - case FontDelegate.TYPE_ORIGINAL: - x = points[point].origX; - break; - case FontDelegate.TYPE_SCALED: - x = points[point].scaledX; - break; - default: - x = points[point].x; - } + if ((flags & FontDelegate.FLAG_FITTED) != 0) + x = points[point].x; + else + x = points[point].scaledX; return x; } @@ -116,26 +106,16 @@ public final class Zone public int getY(int point) { - return getY(point, FontDelegate.TYPE_FITTED); + return getY(point, FontDelegate.FLAG_FITTED); } - public int getY(int point, int type) + public int getY(int point, int flags) { int y; - switch (type) - { - case FontDelegate.TYPE_FITTED: - y = points[point].y; - break; - case FontDelegate.TYPE_ORIGINAL: - y = points[point].origY; - break; - case FontDelegate.TYPE_SCALED: - y = points[point].scaledY; - break; - default: - y = points[point].y; - } + if ((flags & FontDelegate.FLAG_FITTED) != 0) + y = points[point].y; + else + y = points[point].scaledY; return y; } |