summaryrefslogtreecommitdiff
path: root/gnu/java/awt
diff options
context:
space:
mode:
authorRoman Kennke <roman@kennke.org>2006-12-16 20:51:01 +0000
committerRoman Kennke <roman@kennke.org>2006-12-16 20:51:01 +0000
commit7061738ae0359a82559bc19e7c8f9316fa0721c1 (patch)
treebce986a33e4ccf7c9ce7e114b9e06937dae8a15f /gnu/java/awt
parent1ffd40e6b6dc7495403327511d5df94b69c7acab (diff)
downloadclasspath-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.java9
-rw-r--r--gnu/java/awt/font/GNUGlyphVector.java2
-rw-r--r--gnu/java/awt/font/autofit/AutoHinter.java7
-rw-r--r--gnu/java/awt/font/autofit/GlyphHints.java31
-rw-r--r--gnu/java/awt/font/autofit/Latin.java71
-rw-r--r--gnu/java/awt/font/opentype/Hinter.java2
-rw-r--r--gnu/java/awt/font/opentype/OpenTypeFont.java11
-rw-r--r--gnu/java/awt/font/opentype/truetype/Fixed.java5
-rw-r--r--gnu/java/awt/font/opentype/truetype/Zone.java44
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;
}