src/windows/classes/sun/awt/windows/WPathGraphics.java
Print this page
rev 1297 : [mq]: fontmanager.patch
@@ -63,10 +63,12 @@
import sun.font.CharToGlyphMapper;
import sun.font.CompositeFont;
import sun.font.Font2D;
import sun.font.FontManager;
+import sun.font.FontManagerFactory;
+import sun.font.FontUtilities;
import sun.font.PhysicalFont;
import sun.font.TrueTypeFont;
import sun.print.PathGraphics;
import sun.print.ProxyGraphics2D;
@@ -292,11 +294,11 @@
* unknown to GDI. Those can be registered too, although that
* code does not exist yet, it can be added too, so we should not
* fail that case. Just do a quick check whether its a TrueTypeFont
* - ie not a Type1 font etc, and let drawString() resolve the rest.
*/
- Font2D font2D = FontManager.getFont2D(font);
+ Font2D font2D = FontUtilities.getFont2D(font);
if (font2D instanceof CompositeFont ||
font2D instanceof TrueTypeFont) {
return 1;
} else {
return 0;
@@ -318,25 +320,45 @@
* be drawn via TextLayout, which in is rendered as runs of
* GlyphVectors, to which we can assign positions for each glyph.
*/
private boolean strNeedsTextLayout(String str, Font font) {
char[] chars = str.toCharArray();
- boolean isComplex = FontManager.isComplexText(chars, 0, chars.length);
+ boolean isComplex = FontUtilities.isComplexText(chars, 0, chars.length);
if (!isComplex) {
return false;
} else if (!useGDITextLayout) {
return true;
} else {
if (preferGDITextLayout ||
- (isXP() && FontManager.textLayoutIsCompatible(font))) {
+ (isXP() && textLayoutIsCompatible(font))) {
return false;
} else {
return true;
}
}
}
+ /**
+ * Used by windows printing to assess if a font is likely to
+ * be layout compatible with JDK
+ * TrueType fonts should be, but if they have no GPOS table,
+ * but do have a GSUB table, then they are probably older
+ * fonts GDI handles differently.
+ */
+ private boolean textLayoutIsCompatible(Font font) {
+
+ Font2D font2D = FontUtilities.getFont2D(font);
+ if (font2D instanceof TrueTypeFont) {
+ TrueTypeFont ttf = (TrueTypeFont)font2D;
+ return
+ ttf.getDirectoryEntry(TrueTypeFont.GSUBTag) == null ||
+ ttf.getDirectoryEntry(TrueTypeFont.GPOSTag) != null;
+ } else {
+ return false;
+ }
+ }
+
private int getAngle(Point2D.Double pt) {
/* Get the rotation in 1/10'ths degree (as needed by Windows)
* so that GDI can draw the text rotated.
* This calculation is only valid for a uniform scale, no shearing.
*/
@@ -496,11 +518,11 @@
float scaledFontSizeX = (float)(fontSize * scaleFactorX);
float awScale = getAwScale(scaleFactorX, scaleFactorY);
int iangle = getAngle(ptx);
- Font2D font2D = FontManager.getFont2D(font);
+ Font2D font2D = FontUtilities.getFont2D(font);
if (font2D instanceof TrueTypeFont) {
textOut(str, font, (TrueTypeFont)font2D, frc,
scaledFontSizeY, iangle, awScale,
deviceTransform, scaleFactorX,
x, y, devpos.x, devpos.y, targetW);
@@ -691,11 +713,11 @@
advanceTransform.transform(glyphPos, 0, //source
glyphAdvPos, 0, //destination
glyphPos.length/2); //num points
- Font2D font2D = FontManager.getFont2D(font);
+ Font2D font2D = FontUtilities.getFont2D(font);
if (font2D instanceof TrueTypeFont) {
String family = font2D.getFamilyName(null);
int style = font.getStyle() | font2D.getStyle();
if (!wPrinterJob.setFont(family, scaledFontSizeY, style,
iangle, awScale)) {
@@ -790,11 +812,11 @@
*/
str = wPrinterJob.removeControlChars(str);
char[] chars = str.toCharArray();
int len = chars.length;
GlyphVector gv = null;
- if (!FontManager.isComplexText(chars, 0, len)) {
+ if (!FontUtilities.isComplexText(chars, 0, len)) {
gv = font.createGlyphVector(frc, str);
}
if (gv == null) {
super.drawString(str, userx, usery, font, frc, targetW);
return;