package jira; import com.sun.javafx.font.CompositeFontResource; import com.sun.javafx.font.CompositeGlyphMapper; import com.sun.javafx.font.FontResource; import com.sun.javafx.font.FontStrike; import com.sun.javafx.font.Glyph; import com.sun.javafx.font.PGFont; import com.sun.javafx.geom.transform.BaseTransform; import com.sun.javafx.scene.text.GlyphList; import com.sun.javafx.scene.text.TextLayout; import com.sun.javafx.scene.text.TextLayoutFactory; import com.sun.javafx.tk.Toolkit; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.FontSmoothingType; import javafx.scene.text.Text; import javafx.stage.Stage; /** * * @author rql1986 */ public class RT31587b extends Application { private void debugText(Text t, boolean listFonts) { TextLayoutFactory factory = Toolkit.getToolkit().getTextLayoutFactory(); TextLayout layout = factory.createLayout(); PGFont prismFont = (PGFont)t.getFont().impl_getNativeFont(); layout.setContent(t.getText(), prismFont); CompositeFontResource compositeFont = (CompositeFontResource)prismFont.getFontResource(); if (listFonts) { int count = compositeFont.getNumSlots(); for (int i = 0; i < count; i++) { com.sun.javafx.font.FontResource fr = compositeFont.getSlotResource(i); System.out.println("Composite slot " + i + " name " + fr.getFullName() + " file " + fr.getFileName()); } } boolean lcd = t.getFontSmoothingType() == FontSmoothingType.LCD; System.out.println("***** Font " + t.getFont() + (lcd ? "LCD" : "GRAY")); FontStrike strike = prismFont.getStrike(BaseTransform.IDENTITY_TRANSFORM, lcd ? FontResource.AA_LCD : FontResource.AA_GREYSCALE); GlyphList[] runs = layout.getRuns(); for (int i = 0; i < runs.length; i++) { GlyphList run = runs[i]; System.out.println("run["+i+"]="+run); int glyphCount = run.getGlyphCount(); for (int j = 0; j < glyphCount; j++) { int glyphCode = run.getGlyphCode(j); int slot = (glyphCode & CompositeGlyphMapper.SLOTMASK) >> 24; int glyphIndex = glyphCode & CompositeGlyphMapper.GLYPHMASK; System.out.println("\tglyph["+j+"]="+ glyphIndex + " slot=" + slot + " pos=" + run.getPosX(j*2)); Glyph glyph = strike.getGlyph(glyphCode); System.out.println("\t\tbbox=" + glyph.getBBox()); System.out.println("\t\twidth=" + glyph.getWidth()); System.out.println("\t\theight=" + glyph.getHeight()); System.out.println("\t\tpixelData.length=" + glyph.getPixelData().length); System.out.println("\t\tshape.bounds=" + glyph.getShape().getBounds()); } } } @Override public void start(Stage primaryStage) { String ch = "\u4E2D\u6587\u6807\u7B7E"; Text text1 = new Text(ch); text1.setFont(Font.font(12)); text1.setFontSmoothingType(FontSmoothingType.LCD); Text text2 = new Text(ch); text2.setFont(Font.font(12)); text2.setFontSmoothingType(FontSmoothingType.GRAY); Text text3 = new Text(ch); text3.setFont(Font.font(22)); text3.setFontSmoothingType(FontSmoothingType.LCD); Text text4 = new Text(ch); text4.setFont(Font.font(22)); text4.setFontSmoothingType(FontSmoothingType.GRAY); Text text5 = new Text(ch); text5.setFont(Font.font(12)); text5.setFill(null); text5.setStroke(Color.RED); debugText(text1, true); debugText(text2, false); debugText(text3, false); debugText(text4, false); VBox vbox = new VBox(text1, text2, text3, text4, text5); Scene scene = new Scene(vbox, 300, 250); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { System.setProperty("prism.debugfonts", "true"); launch(args); } }