JDK-6686365 : bolded zero width space has non zero width in FM or LCD modes
  • Type: Bug
  • Component: client-libs
  • Sub-Component: 2d
  • Affected Version: 6
  • Priority: P4
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2008-04-09
  • Updated: 2012-07-11
  • Resolved: 2011-03-08
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7 b28Fixed
Related Reports
Relates :  
Description
For algorithmically bolded Lucida Sans Regular \u200b char - which is a zero width
space - will in some cases report its advance to be 1 pixel.

Although this was first seen with LCD_HRGB, it is also reproducible in AA and BW modes if 
fractional metrics is enabled. Problem is reproducible with T2K rasterizer.

==========================
import java.awt.*;
import java.awt.image.*;

public class met {
    public static void main(String[] s) {
        BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);

        Graphics g = bi.getGraphics();

        g.setFont(new Font("monospaced", Font.BOLD, 14));
        //g.setFont(new Font("Lucida Sans Regular", Font.BOLD, 14));
        FontMetrics fm = g.getFontMetrics();
        System.out.println("Bold: " + fm.charWidth('\u200b'));
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                 RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        fm = g.getFontMetrics();
        System.out.println("Bold + LCD: "+fm.charWidth('\u200b'));
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                                 RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                 RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        fm = g.getFontMetrics();
        System.out.println("Bold FM OFF + AA: " + fm.charWidth('\u200b'));
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                                 RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                 RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        fm = g.getFontMetrics();
        System.out.println("Bold FM ON + AA: " + fm.charWidth('\u200b'));
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS,
                                 RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                 RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
        fm = g.getFontMetrics();
        System.out.println("Bold FM ON + nonAA: " + fm.charWidth('\u200b'));

        System.out.println("All printed values should be 0 to PASS");
    }
}

Comments
EVALUATION Internally we perform number of adjustments of phantom points and advances to compensate for style changes. However, zero width chars is special case and style adjustments should not be applicable to them.
09-04-2008