java类java.awt.font.GlyphVector的实例源码

UnicodeFont.java 文件源码 项目:trashjam2017 阅读 18 收藏 0 点赞 0 评论 0
/**
 * Initialise the font to be used based on configuration
 * 
 * @param baseFont The AWT font to render
 * @param size The point size of the font to generated
 * @param bold True if the font should be rendered in bold typeface
 * @param italic True if the font should be rendered in bold typeface
 */
private void initializeFont(Font baseFont, int size, boolean bold, boolean italic) {
    Map attributes = baseFont.getAttributes();
    attributes.put(TextAttribute.SIZE, new Float(size));
    attributes.put(TextAttribute.WEIGHT, bold ? TextAttribute.WEIGHT_BOLD : TextAttribute.WEIGHT_REGULAR);
    attributes.put(TextAttribute.POSTURE, italic ? TextAttribute.POSTURE_OBLIQUE : TextAttribute.POSTURE_REGULAR);
    try {
        attributes.put(TextAttribute.class.getDeclaredField("KERNING").get(null), TextAttribute.class.getDeclaredField(
            "KERNING_ON").get(null));
    } catch (Exception ignored) {
    }
    font = baseFont.deriveFont(attributes);

    FontMetrics metrics = GlyphPage.getScratchGraphics().getFontMetrics(font);
    ascent = metrics.getAscent();
    descent = metrics.getDescent();
    leading = metrics.getLeading();

    // Determine width of space glyph (getGlyphPixelBounds gives a width of zero).
    char[] chars = " ".toCharArray();
    GlyphVector vector = font.layoutGlyphVector(GlyphPage.renderContext, chars, 0, chars.length, Font.LAYOUT_LEFT_TO_RIGHT);
    spaceWidth = vector.getGlyphLogicalBounds(0).getBounds().width;
}
UnicodeFont.java 文件源码 项目:trashjam2017 阅读 21 收藏 0 点赞 0 评论 0
/**
 * Returns the glyph for the specified codePoint. If the glyph does not exist yet, 
 * it is created and queued to be loaded.
 * 
 * @param glyphCode The code of the glyph to locate
 * @param codePoint The code point associated with the glyph
 * @param bounds The bounds of the glyph on the page
 * @param vector The vector the glyph is part of  
 * @param index The index of the glyph within the vector
 * @return The glyph requested
 */
private Glyph getGlyph (int glyphCode, int codePoint, Rectangle bounds, GlyphVector vector, int index) {
    if (glyphCode < 0 || glyphCode >= MAX_GLYPH_CODE) {
        // GlyphVector#getGlyphCode sometimes returns negative numbers on OS X.
        return new Glyph(codePoint, bounds, vector, index, this) {
            public boolean isMissing () {
                return true;
            }
        };
    }
    int pageIndex = glyphCode / PAGE_SIZE;
    int glyphIndex = glyphCode & (PAGE_SIZE - 1);
    Glyph glyph = null;
    Glyph[] page = glyphs[pageIndex];
    if (page != null) {
        glyph = page[glyphIndex];
        if (glyph != null) return glyph;
    } else
        page = glyphs[pageIndex] = new Glyph[PAGE_SIZE];
    // Add glyph so size information is available and queue it so its image can be loaded later.
    glyph = page[glyphIndex] = new Glyph(codePoint, bounds, vector, index, this);
    queuedGlyphs.add(glyph);
    return glyph;
}
TestStandardGlyphVectorBug.java 文件源码 项目:openjdk-jdk10 阅读 26 收藏 0 点赞 0 评论 0
public static void main(String[] args)
{
    Font defaultFont = new Font(null);
    FontRenderContext defaultFrc = new FontRenderContext(new AffineTransform(),
                                                         true, true);
    GlyphVector gv = defaultFont.createGlyphVector(defaultFrc, "test");

    //this causes the bounds to be cached
    //which is necessary to trigger the bug
    gv.getGlyphLogicalBounds(0);

    //this correctly gets the position of the overall advance
    Point2D glyphPosition = gv.getGlyphPosition(gv.getNumGlyphs());

    // this sets the position of the overall advance,
    // but also incorrectly tries to clear the bounds cache
    // of a specific glyph indexed by the glyphIndex parameter
    // even if the glyphIndex represents the overall advance
    // (i.e. if glyphIndex == getNumGlyphs())
    gv.setGlyphPosition(gv.getNumGlyphs(), glyphPosition);
}
HelvLtOblTest.java 文件源码 项目:openjdk-jdk10 阅读 22 收藏 0 点赞 0 评论 0
public void paintComponent(Graphics g) {
     super.paintComponent(g);
     Graphics2D g2 = (Graphics2D)g;
     FontRenderContext frc = new FontRenderContext(null, true, true);
     Font f = helvFont.deriveFont(Font.PLAIN, 40);
     System.out.println("font = " +f.getFontName());
     GlyphVector gv = f.createGlyphVector(frc, codes);
     g.setFont(f);
     g.setColor(Color.white);
     g.fillRect(0,0,400,400);
     g.setColor(Color.black);
     g2.drawGlyphVector(gv, 5,200);
     g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                         RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                         RenderingHints.VALUE_FRACTIONALMETRICS_ON);
     g2.drawString(str, 5, 250);
}
FontCache.java 文件源码 项目:ClientAPI 阅读 25 收藏 0 点赞 0 评论 0
private Rectangle cacheVector(GlyphVector vector) {
    /*
        * Compute the exact area that the rendered string will take up in the image buffer. Note that
        * the string will actually be drawn at a positive (x,y) offset from (0,0) to leave enough room
        * for the ascent above the baseline and to correct for a few glyphs that appear to have negative
        * horizontal bearing (e.g. U+0423 Cyrillic uppercase letter U on Windows 7).
        */
    final Rectangle vectorBounds = vector.getPixelBounds(fontContext, 0, 0);

    /* Enlage the stringImage if it is too small to store the entire rendered string */
    if (vectorBounds.width > stringImage.getWidth() || vectorBounds.height > stringImage.getHeight())
        allocateStringImage(Math.max(vectorBounds.width, stringImage.getWidth()),
                Math.max(vectorBounds.height, stringImage.getHeight()));

    /* Erase the upper-left corner where the string will get drawn*/
    stringGraphics.clearRect(0, 0, vectorBounds.width, vectorBounds.height);

    /* Draw string with opaque white color and baseline adjustment so the upper-left corner of the image is at (0,0) */
    stringGraphics.drawGlyphVector(vector, -vectorBounds.x, -vectorBounds.y);

    return vectorBounds;
}
HelvLtOblTest.java 文件源码 项目:jdk8u-jdk 阅读 22 收藏 0 点赞 0 评论 0
public void paintComponent(Graphics g) {
     super.paintComponent(g);
     Graphics2D g2 = (Graphics2D)g;
     FontRenderContext frc = new FontRenderContext(null, true, true);
     Font f = helvFont.deriveFont(Font.PLAIN, 40);
     System.out.println("font = " +f.getFontName());
     GlyphVector gv = f.createGlyphVector(frc, codes);
     g.setFont(f);
     g.setColor(Color.white);
     g.fillRect(0,0,400,400);
     g.setColor(Color.black);
     g2.drawGlyphVector(gv, 5,200);
     g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                         RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
     g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                         RenderingHints.VALUE_FRACTIONALMETRICS_ON);
     g2.drawString(str, 5, 250);
}
UnicodeFont.java 文件源码 项目:BaseClient 阅读 20 收藏 0 点赞 0 评论 0
/**
 * Initialise the font to be used based on configuration
 * 
 * @param baseFont The AWT font to render
 * @param size The point size of the font to generated
 * @param bold True if the font should be rendered in bold typeface
 * @param italic True if the font should be rendered in bold typeface
 */
private void initializeFont(Font baseFont, int size, boolean bold, boolean italic) {
    Map attributes = baseFont.getAttributes();
    attributes.put(TextAttribute.SIZE, new Float(size));
    attributes.put(TextAttribute.WEIGHT, bold ? TextAttribute.WEIGHT_BOLD : TextAttribute.WEIGHT_REGULAR);
    attributes.put(TextAttribute.POSTURE, italic ? TextAttribute.POSTURE_OBLIQUE : TextAttribute.POSTURE_REGULAR);
    try {
        attributes.put(TextAttribute.class.getDeclaredField("KERNING").get(null), TextAttribute.class.getDeclaredField(
            "KERNING_ON").get(null));
    } catch (Exception ignored) {
    }
    font = baseFont.deriveFont(attributes);

    FontMetrics metrics = GlyphPage.getScratchGraphics().getFontMetrics(font);
    ascent = metrics.getAscent();
    descent = metrics.getDescent();
    leading = metrics.getLeading();

    // Determine width of space glyph (getGlyphPixelBounds gives a width of zero).
    char[] chars = " ".toCharArray();
    GlyphVector vector = font.layoutGlyphVector(GlyphPage.renderContext, chars, 0, chars.length, Font.LAYOUT_LEFT_TO_RIGHT);
    spaceWidth = vector.getGlyphLogicalBounds(0).getBounds().width;
}
UnicodeFont.java 文件源码 项目:BaseClient 阅读 19 收藏 0 点赞 0 评论 0
/**
 * Returns the glyph for the specified codePoint. If the glyph does not exist yet, 
 * it is created and queued to be loaded.
 * 
 * @param glyphCode The code of the glyph to locate
 * @param codePoint The code point associated with the glyph
 * @param bounds The bounds of the glyph on the page
 * @param vector The vector the glyph is part of  
 * @param index The index of the glyph within the vector
 * @return The glyph requested
 */
private Glyph getGlyph (int glyphCode, int codePoint, Rectangle bounds, GlyphVector vector, int index) {
    if (glyphCode < 0 || glyphCode >= MAX_GLYPH_CODE) {
        // GlyphVector#getGlyphCode sometimes returns negative numbers on OS X.
        return new Glyph(codePoint, bounds, vector, index, this) {
            public boolean isMissing () {
                return true;
            }
        };
    }
    int pageIndex = glyphCode / PAGE_SIZE;
    int glyphIndex = glyphCode & (PAGE_SIZE - 1);
    Glyph glyph = null;
    Glyph[] page = glyphs[pageIndex];
    if (page != null) {
        glyph = page[glyphIndex];
        if (glyph != null) return glyph;
    } else
        page = glyphs[pageIndex] = new Glyph[PAGE_SIZE];
    // Add glyph so size information is available and queue it so its image can be loaded later.
    glyph = page[glyphIndex] = new Glyph(codePoint, bounds, vector, index, this);
    queuedGlyphs.add(glyph);
    return glyph;
}
UnicodeFont.java 文件源码 项目:BaseClient 阅读 21 收藏 0 点赞 0 评论 0
/**
 * @param text the string to find the width of
 * @param logical whether to add the space the letters should occupy on the end
 * @return width of string.
 */
private int findWidth(String text,boolean logical) {
    char[] chars = text.toCharArray();
    GlyphVector vector = font.layoutGlyphVector(GlyphPage.renderContext, chars, 0, chars.length, Font.LAYOUT_LEFT_TO_RIGHT);

    int width = 0;
    int extraX = 0;
    boolean startNewLine = false;
    for (int glyphIndex = 0, n = vector.getNumGlyphs(); glyphIndex < n; glyphIndex++) {
        int charIndex = vector.getGlyphCharIndex(glyphIndex);
        int codePoint = text.codePointAt(charIndex);

        Rectangle bounds = logical ? vector.getLogicalBounds().getBounds() : getGlyphBounds(vector, glyphIndex, codePoint);

        if (startNewLine && codePoint != '\n') extraX = -bounds.x;

        if (glyphIndex > 0) extraX += paddingLeft + paddingRight + paddingAdvanceX;
        width = Math.max(width, bounds.x + extraX + bounds.width);

        if (codePoint == '\n') startNewLine = true;
    }
    return width;
}
X11TextRenderer.java 文件源码 项目:openjdk-jdk10 阅读 21 收藏 0 点赞 0 评论 0
public void drawGlyphVector(SunGraphics2D sg2d, GlyphVector g,
                            float x, float y)
{
    FontRenderContext frc = g.getFontRenderContext();
    FontInfo info = sg2d.getGVFontInfo(g.getFont(), frc);
    switch (info.aaHint) {
    case SunHints.INTVAL_TEXT_ANTIALIAS_OFF:
        super.drawGlyphVector(sg2d, g, x, y);
        return;
    case SunHints.INTVAL_TEXT_ANTIALIAS_ON:
         SurfaceData.aaTextRenderer.drawGlyphVector(sg2d, g, x, y);
        return;
    case SunHints.INTVAL_TEXT_ANTIALIAS_LCD_HRGB:
    case SunHints.INTVAL_TEXT_ANTIALIAS_LCD_VRGB:
         SurfaceData.lcdTextRenderer.drawGlyphVector(sg2d, g, x, y);
        return;
    default:
    }
}
GlyphList.java 文件源码 项目:jdk8u-jdk 阅读 15 收藏 0 点赞 0 评论 0
public void setFromGlyphVector(FontInfo info, GlyphVector gv,
                               float x, float y) {
    this.x = x;
    this.y = y;
    this.lcdRGBOrder = info.lcdRGBOrder;
    this.lcdSubPixPos = info.lcdSubPixPos;
    /* A GV may be rendered in different Graphics. It is possible it is
     * used for one case where LCD text is available, and another where
     * it is not. Pass in the "info". to ensure get a suitable one.
     */
    StandardGlyphVector sgv = StandardGlyphVector.getStandardGV(gv, info);
    // call before ensureCapacity :-
    usePositions = sgv.needsPositions(info.devTx);
    len = sgv.getNumGlyphs();
    ensureCapacity(len);
    strikelist = sgv.setupGlyphImages(images,
                                      usePositions ? positions : null,
                                      info.devTx);
    glyphindex = -1;
}
GlyphList.java 文件源码 项目:openjdk-jdk10 阅读 18 收藏 0 点赞 0 评论 0
public void setFromGlyphVector(FontInfo info, GlyphVector gv,
                               float x, float y) {
    this.x = x;
    this.y = y;
    this.lcdRGBOrder = info.lcdRGBOrder;
    this.lcdSubPixPos = info.lcdSubPixPos;
    /* A GV may be rendered in different Graphics. It is possible it is
     * used for one case where LCD text is available, and another where
     * it is not. Pass in the "info". to ensure get a suitable one.
     */
    StandardGlyphVector sgv = StandardGlyphVector.getStandardGV(gv, info);
    // call before ensureCapacity :-
    usePositions = sgv.needsPositions(info.devTx);
    len = sgv.getNumGlyphs();
    ensureCapacity(len);
    strikelist = sgv.setupGlyphImages(images,
                                      usePositions ? positions : null,
                                      info.devTx);
    glyphindex = -1;
}
GlyphListPipe.java 文件源码 项目:jdk8u-jdk 阅读 26 收藏 0 点赞 0 评论 0
public void drawGlyphVector(SunGraphics2D sg2d, GlyphVector gv,
                            float x, float y)
{
    FontRenderContext frc = gv.getFontRenderContext();
    FontInfo info = sg2d.getGVFontInfo(gv.getFont(), frc);
    if (info.pixelHeight > OutlineTextRenderer.THRESHHOLD) {
        SurfaceData.outlineTextRenderer.drawGlyphVector(sg2d, gv, x, y);
        return;
    }
    if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
        double origin[] = {x, y};
        sg2d.transform.transform(origin, 0, origin, 0, 1);
        x = (float) origin[0];
        y = (float) origin[1];
    } else {
        x += sg2d.transX; // don't use the glyph info origin, already in gv.
        y += sg2d.transY;
    }

    GlyphList gl = GlyphList.getInstance();
    gl.setFromGlyphVector(info, gv, x, y);
    drawGlyphList(sg2d, gl, info.aaHint);
    gl.dispose();
}
GlyphListPipe.java 文件源码 项目:OpenJSharp 阅读 21 收藏 0 点赞 0 评论 0
public void drawGlyphVector(SunGraphics2D sg2d, GlyphVector gv,
                            float x, float y)
{
    FontRenderContext frc = gv.getFontRenderContext();
    FontInfo info = sg2d.getGVFontInfo(gv.getFont(), frc);
    if (info.pixelHeight > OutlineTextRenderer.THRESHHOLD) {
        SurfaceData.outlineTextRenderer.drawGlyphVector(sg2d, gv, x, y);
        return;
    }
    if (sg2d.transformState >= SunGraphics2D.TRANSFORM_TRANSLATESCALE) {
        double origin[] = {x, y};
        sg2d.transform.transform(origin, 0, origin, 0, 1);
        x = (float) origin[0];
        y = (float) origin[1];
    } else {
        x += sg2d.transX; // don't use the glyph info origin, already in gv.
        y += sg2d.transY;
    }

    GlyphList gl = GlyphList.getInstance();
    gl.setFromGlyphVector(info, gv, x, y);
    drawGlyphList(sg2d, gl, info.aaHint);
    gl.dispose();
}
SunGraphics2D.java 文件源码 项目:OpenJSharp 阅读 29 收藏 0 点赞 0 评论 0
public void drawGlyphVector(GlyphVector gv, float x, float y)
{
    if (gv == null) {
        throw new NullPointerException("GlyphVector is null");
    }

    try {
        textpipe.drawGlyphVector(this, gv, x, y);
    } catch (InvalidPipeException e) {
        try {
            revalidateAll();
            textpipe.drawGlyphVector(this, gv, x, y);
        } catch (InvalidPipeException e2) {
            // Still catching the exception; we are not yet ready to
            // validate the surfaceData correctly.  Fail for now and
            // try again next time around.
        }
    } finally {
        surfaceData.markDirty();
    }
}
PathGraphics.java 文件源码 项目:OpenJSharp 阅读 24 收藏 0 点赞 0 评论 0
/**
 * Draws a GlyphVector.
 * The rendering attributes applied include the clip, transform,
 * paint or color, and composite attributes.  The GlyphVector specifies
 * individual glyphs from a Font.
 * @param g The GlyphVector to be drawn.
 * @param x,y The coordinates where the glyphs should be drawn.
 * @see #setPaint
 * @see java.awt.Graphics#setColor
 * @see #transform
 * @see #setTransform
 * @see #setComposite
 * @see #clip
 * @see #setClip
 */
public void drawGlyphVector(GlyphVector g,
                            float x,
                            float y) {

    /* We should not reach here if printingGlyphVector is already true.
     * Add an assert so this can be tested if need be.
     * But also ensure that we do at least render properly by filling
     * the outline.
     */
    if (printingGlyphVector) {
        assert !printingGlyphVector; // ie false.
        fill(g.getOutline(x, y));
        return;
    }

    try {
        printingGlyphVector = true;
        if (RasterPrinterJob.shapeTextProp ||
            !printedSimpleGlyphVector(g, x, y)) {
            fill(g.getOutline(x, y));
        }
    } finally {
        printingGlyphVector = false;
    }
}
PathGraphics.java 文件源码 项目:OpenJSharp 阅读 30 收藏 0 点赞 0 评论 0
private boolean samePositions(GlyphVector gv, int[] gvcodes,
                              int[] origCodes, float[] origPositions) {

    int numGlyphs = gv.getNumGlyphs();
    float[] gvpos = gv.getGlyphPositions(0, numGlyphs, null);

    /* this shouldn't happen here, but just in case */
    if (numGlyphs != gvcodes.length ||  /* real paranoia here */
        origCodes.length != gvcodes.length ||
        origPositions.length != gvpos.length) {
        return false;
    }

    for (int i=0; i<numGlyphs; i++) {
        if (gvcodes[i] != origCodes[i] || gvpos[i] != origPositions[i]) {
            return false;
        }
    }
    return true;
}
GlyphList.java 文件源码 项目:OpenJSharp 阅读 16 收藏 0 点赞 0 评论 0
public void setFromGlyphVector(FontInfo info, GlyphVector gv,
                               float x, float y) {
    this.x = x;
    this.y = y;
    this.lcdRGBOrder = info.lcdRGBOrder;
    this.lcdSubPixPos = info.lcdSubPixPos;
    /* A GV may be rendered in different Graphics. It is possible it is
     * used for one case where LCD text is available, and another where
     * it is not. Pass in the "info". to ensure get a suitable one.
     */
    StandardGlyphVector sgv = StandardGlyphVector.getStandardGV(gv, info);
    // call before ensureCapacity :-
    usePositions = sgv.needsPositions(info.devTx);
    len = sgv.getNumGlyphs();
    ensureCapacity(len);
    strikelist = sgv.setupGlyphImages(images,
                                      usePositions ? positions : null,
                                      info.devTx);
    glyphindex = -1;
}
X11TextRenderer.java 文件源码 项目:jdk8u-jdk 阅读 24 收藏 0 点赞 0 评论 0
public void drawGlyphVector(SunGraphics2D sg2d, GlyphVector g,
                            float x, float y)
{
    FontRenderContext frc = g.getFontRenderContext();
    FontInfo info = sg2d.getGVFontInfo(g.getFont(), frc);
    switch (info.aaHint) {
    case SunHints.INTVAL_TEXT_ANTIALIAS_OFF:
        super.drawGlyphVector(sg2d, g, x, y);
        return;
    case SunHints.INTVAL_TEXT_ANTIALIAS_ON:
         sg2d.surfaceData.aaTextRenderer.drawGlyphVector(sg2d, g, x, y);
        return;
    case SunHints.INTVAL_TEXT_ANTIALIAS_LCD_HRGB:
    case SunHints.INTVAL_TEXT_ANTIALIAS_LCD_VRGB:
         sg2d.surfaceData.lcdTextRenderer.drawGlyphVector(sg2d, g, x, y);
        return;
    default:
    }
}
PathGraphics.java 文件源码 项目:jdk8u-jdk 阅读 37 收藏 0 点赞 0 评论 0
private boolean samePositions(GlyphVector gv, int[] gvcodes,
                              int[] origCodes, float[] origPositions) {

    int numGlyphs = gv.getNumGlyphs();
    float[] gvpos = gv.getGlyphPositions(0, numGlyphs, null);

    /* this shouldn't happen here, but just in case */
    if (numGlyphs != gvcodes.length ||  /* real paranoia here */
        origCodes.length != gvcodes.length ||
        origPositions.length != gvpos.length) {
        return false;
    }

    for (int i=0; i<numGlyphs; i++) {
        if (gvcodes[i] != origCodes[i] || gvpos[i] != origPositions[i]) {
            return false;
        }
    }
    return true;
}
PathGraphics.java 文件源码 项目:openjdk-jdk10 阅读 32 收藏 0 点赞 0 评论 0
/**
 * Draws a GlyphVector.
 * The rendering attributes applied include the clip, transform,
 * paint or color, and composite attributes.  The GlyphVector specifies
 * individual glyphs from a Font.
 * @param g The GlyphVector to be drawn.
 * @param x,y The coordinates where the glyphs should be drawn.
 * @see #setPaint
 * @see java.awt.Graphics#setColor
 * @see #transform
 * @see #setTransform
 * @see #setComposite
 * @see #clip
 * @see #setClip
 */
public void drawGlyphVector(GlyphVector g,
                            float x,
                            float y) {

    /* We should not reach here if printingGlyphVector is already true.
     * Add an assert so this can be tested if need be.
     * But also ensure that we do at least render properly by filling
     * the outline.
     */
    if (printingGlyphVector) {
        assert !printingGlyphVector; // ie false.
        fill(g.getOutline(x, y));
        return;
    }

    try {
        printingGlyphVector = true;
        if (RasterPrinterJob.shapeTextProp ||
            !printedSimpleGlyphVector(g, x, y)) {
            fill(g.getOutline(x, y));
        }
    } finally {
        printingGlyphVector = false;
    }
}
TextMeasureTests.java 文件源码 项目:openjdk-jdk10 阅读 30 收藏 0 点赞 0 评论 0
public void runTest(Object ctx, int numReps) {
    GVContext gvctx = (GVContext)ctx;
    GlyphVector gv = gvctx.gv;
    GlyphMetrics gm;
    do {
        for (int i = 0, e = gv.getNumGlyphs(); i < e; ++i) {
            gm = gv.getGlyphMetrics(i);
        }
    } while (--numReps >= 0);
}
Term.java 文件源码 项目:incubator-netbeans 阅读 38 收藏 0 点赞 0 评论 0
private void myDrawChars(Graphics g, /* OLD char buf[], */ Line l,
        int start, int howmany, int xoff, int baseline) {

    if (xferBuf.length < l.length()) {
        xferBuf = new char[l.length()];
    }
    // OLD final char buf[] = l.XcharArray();
    l.getChars(xferBuf);

    // Use rendering hints (antialiasing etc.)
    Map<?,?> hints = renderingHints;
    if ((hints != null) && (g instanceof Graphics2D)) {
        ((Graphics2D) g).setRenderingHints(hints);
    }
    if (metrics.isMultiCell()) {
        // slow way
        // This looks expensive but it is in fact a whole lot faster
        // than issuing a g.drawChars() _per_ character

        Graphics2D g2 = (Graphics2D) g;
        FontRenderContext frc = g2.getFontRenderContext();
        // Gaaah, why doesn't createGlyphVector() take a (char[],offset,len)
        // triple?
        char[] tmp = new char[howmany];
        System.arraycopy(xferBuf, start, tmp, 0, howmany);
        GlyphVector gv = getFont().createGlyphVector(frc, tmp);
        massage_glyphs(gv, start, howmany, l);
        g2.drawGlyphVector(gv, xoff, baseline);
    } else {
        // fast way
        g.drawChars(xferBuf, start, howmany, xoff, baseline);
    }
}
TextSourceLabel.java 文件源码 项目:jdk8u-jdk 阅读 31 收藏 0 点赞 0 评论 0
private final GlyphVector getGV() {
  if (gv == null) {
    gv = createGV();
  }

  return gv;
}
Font.java 文件源码 项目:jdk8u-jdk 阅读 58 收藏 0 点赞 0 评论 0
/**
 * Returns the logical bounds of the specified array of characters
 * in the specified <code>FontRenderContext</code>.  The logical
 * bounds contains the origin, ascent, advance, and height, which
 * includes the leading.  The logical bounds does not always enclose
 * all the text.  For example, in some languages and in some fonts,
 * accent marks can be positioned above the ascent or below the
 * descent.  To obtain a visual bounding box, which encloses all the
 * text, use the {@link TextLayout#getBounds() getBounds} method of
 * <code>TextLayout</code>.
 * <p>Note: The returned bounds is in baseline-relative coordinates
 * (see {@link java.awt.Font class notes}).
 * @param chars an array of characters
 * @param beginIndex the initial offset in the array of
 * characters
 * @param limit the end offset in the array of characters
 * @param frc the specified <code>FontRenderContext</code>
 * @return a <code>Rectangle2D</code> that is the bounding box of the
 * specified array of characters in the specified
 * <code>FontRenderContext</code>.
 * @throws IndexOutOfBoundsException if <code>beginIndex</code> is
 *         less than zero, or <code>limit</code> is greater than the
 *         length of <code>chars</code>, or <code>beginIndex</code>
 *         is greater than <code>limit</code>.
 * @see FontRenderContext
 * @see Font#createGlyphVector
 * @since 1.2
 */
public Rectangle2D getStringBounds(char [] chars,
                                int beginIndex, int limit,
                                   FontRenderContext frc) {
    if (beginIndex < 0) {
        throw new IndexOutOfBoundsException("beginIndex: " + beginIndex);
    }
    if (limit > chars.length) {
        throw new IndexOutOfBoundsException("limit: " + limit);
    }
    if (beginIndex > limit) {
        throw new IndexOutOfBoundsException("range length: " +
                                            (limit - beginIndex));
    }

    // this code should be in textlayout
    // quick check for simple text, assume GV ok to use if simple

    boolean simple = values == null ||
        (values.getKerning() == 0 && values.getLigatures() == 0 &&
          values.getBaselineTransform() == null);
    if (simple) {
        simple = ! FontUtilities.isComplexText(chars, beginIndex, limit);
    }

    if (simple) {
        GlyphVector gv = new StandardGlyphVector(this, chars, beginIndex,
                                                 limit - beginIndex, frc);
        return gv.getLogicalBounds();
    } else {
        // need char array constructor on textlayout
        String str = new String(chars, beginIndex, limit - beginIndex);
        TextLayout tl = new TextLayout(str, this, frc);
        return new Rectangle2D.Float(0, -tl.getAscent(), tl.getAdvance(),
                                     tl.getAscent() + tl.getDescent() +
                                     tl.getLeading());
    }
}
UnicodeFont.java 文件源码 项目:Progetto-C 阅读 19 收藏 0 点赞 0 评论 0
/**
 * @see org.newdawn.slick.Font#getHeight(java.lang.String)
 */
public int getHeight (String text) {
    if (text == null) throw new IllegalArgumentException("text cannot be null.");
    if (text.length() == 0) return 0;

    if (displayListCaching) {
        DisplayList displayList = (DisplayList)displayLists.get(text);
        if (displayList != null) return displayList.height;
    }

    char[] chars = text.toCharArray();
    GlyphVector vector = font.layoutGlyphVector(GlyphPage.renderContext, chars, 0, chars.length, Font.LAYOUT_LEFT_TO_RIGHT);

    int lines = 0, height = 0;
    for (int i = 0, n = vector.getNumGlyphs(); i < n; i++) {
        int charIndex = vector.getGlyphCharIndex(i);
        int codePoint = text.codePointAt(charIndex);
        if (codePoint == ' ') continue;
        Rectangle bounds = getGlyphBounds(vector, i, codePoint);

        height = Math.max(height, ascent + bounds.y + bounds.height);

        if (codePoint == '\n') {
            lines++;
            height = 0;
        }
    }
    return lines * getLineHeight() + height;
}
BMFontUtil.java 文件源码 项目:Progetto-C 阅读 30 收藏 0 点赞 0 评论 0
private int[] getGlyphMetrics (Font font, int codePoint) {
    // xOffset and xAdvance will be incorrect for unicode characters such as combining marks or non-spacing characters
    // (eg Pnujabi's "\u0A1C\u0A47") that require the context of surrounding glyphs to determine spacing, but thisis the
    // best we can do with the BMFont format.
    char[] chars = Character.toChars(codePoint);
    GlyphVector vector = font.layoutGlyphVector(GlyphPage.renderContext, chars, 0, chars.length, Font.LAYOUT_LEFT_TO_RIGHT);
    GlyphMetrics metrics = vector.getGlyphMetrics(0);
    int xOffset = vector.getGlyphPixelBounds(0, null, 0, 0).x - unicodeFont.getPaddingLeft();
    int xAdvance = (int)(metrics.getAdvanceX() + unicodeFont.getPaddingAdvanceX() + unicodeFont.getPaddingLeft() + unicodeFont
        .getPaddingRight());
    return new int[] {xOffset, xAdvance};
}
ImageProducer.java 文件源码 项目:oscm 阅读 26 收藏 0 点赞 0 评论 0
protected BufferedImage createImage(Color bgColor) {
    BufferedImage bufferedImage = new BufferedImage(END_X, END_Y,
            BufferedImage.TYPE_INT_RGB);
    // create graphics and graphics2d
    final Graphics graphics = bufferedImage.getGraphics();
    final Graphics2D g2d = (Graphics2D) graphics;

    // set the background color
    g2d.setBackground(bgColor == null ? Color.gray : bgColor);
    g2d.clearRect(START_X, START_Y, END_X, END_Y);
    // create a pattern for the background
    createPattern(g2d);
    // set the fonts and font rendering hints
    Font font = new Font("Helvetica", Font.ITALIC, 30);
    g2d.setFont(font);
    FontRenderContext frc = g2d.getFontRenderContext();
    g2d.translate(10, 24);
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setStroke(new BasicStroke(3));

    // sets the foreground color
    g2d.setPaint(Color.DARK_GRAY);
    GlyphVector gv = font.createGlyphVector(frc, message);
    int numGlyphs = gv.getNumGlyphs();
    for (int ii = 0; ii < numGlyphs; ii++) {
        AffineTransform at;
        Point2D p = gv.getGlyphPosition(ii);
        at = AffineTransform.getTranslateInstance(p.getX(), p.getY());
        at.rotate(Math.PI / 8);
        Shape shape = gv.getGlyphOutline(ii);
        Shape sss = at.createTransformedShape(shape);
        g2d.fill(sss);
    }
    return blurImage(bufferedImage);
}
Artist.java 文件源码 项目:org.alloytools.alloy 阅读 27 收藏 0 点赞 0 评论 0
/** Draws the given string at (x,y) */
public void drawString(String text, int x, int y) {
    if (text.length() == 0)
        return;
    if (gr != null) {
        gr.drawString(text, x, y);
        return;
    }
    calc();
    Font font = (fontBoldness ? cachedBoldFont : cachedPlainFont);
    GlyphVector gv = font.createGlyphVector(new FontRenderContext(null, false, false), text);
    translate(x, y);
    draw(gv.getOutline(), true);
    translate(-x, -y);
}
GetGlyphCharIndexTest.java 文件源码 项目:openjdk-jdk10 阅读 18 收藏 0 点赞 0 评论 0
public static void main(String[] args) {
    Font font = new Font(Font.MONOSPACED, Font.PLAIN, 12);
    FontRenderContext frc = new FontRenderContext(null, false, false);
    GlyphVector gv = font.layoutGlyphVector(frc, "abc".toCharArray(), 1, 3,
                                            Font.LAYOUT_LEFT_TO_RIGHT);
    int idx0 = gv.getGlyphCharIndex(0);
    if (idx0 != 0) {
       throw new RuntimeException("Expected 0, got " + idx0);
    }
}


问题


面经


文章

微信
公众号

扫码关注公众号