Miserable text when drawing offscreen images in Java

Viewed 454

I am stuck (beyond the limits of fun) at trying to fix text quality with offscreen image double buffering. Screen capture worth a thousand words.

  • The ugly String is drawn to an offscreen image, and then copied to the paintComponent's Graphics argument.
  • The good looking String is written directly to the paintComponent's Graphics argument, bypassing the offscreen image.

Both Graphics instances (onscreen and offscreen) are identically setup in terms of rendering quality, antialiasing, and so on...

Thank you very much in advance for your wisdom.


The very simple code follows:

public class AcceleratedPanel extends JPanel {
    private Dimension     osd; //offscreen dimension
    private BufferedImage osi; //offscreen image
    private Graphics      osg; //offscreen graphic

    public AcceleratedPanel() {
        super();
    }

    @Override
    public final void paintComponent(Graphics g) {
        super.paintComponent(g); 

        // --------------------------------------
        //OffScreen painting

        Graphics2D osg2D = getOffscreenGraphics();
        setupGraphics(osg2D);
        osg2D.drawString("Offscreen painting", 10, 20);

        //Dump offscreen buffer to screen
        g.drawImage(osi, 0, 0, this);

        // --------------------------------------
        // OnScreen painting
        Graphics2D gg = (Graphics2D)g;
        setupGraphics(gg);
        gg.drawString("Direct painting", 10, 35);
    }

    /*
    To make sure same settings are used in different Graphics instances,
    a unique setup procedure is used.
    */
    private void setupGraphics(Graphics2D g) {
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    }

    private Graphics2D getOffscreenGraphics() {
        //Graphics Acceleration
        Dimension currentDimension = getSize();
        if (osi == null || !currentDimension.equals(osd)) {
            osi = (BufferedImage)createImage(currentDimension.width, currentDimension.height);
            osg = osi.createGraphics();
            osd = currentDimension;
        }
        return (Graphics2D) osg;
    }

} //End of mistery
2 Answers
Related