Just guessing: But I'm not sure, that this has something to do with java2d - If you try to anti-alias fonts of small size, you always end up with bad results, no matter what platform you use. It's just a question of how many pixels you have for display of the glyph&for the anti-aliasing. Maybe trying a pixel-font (A font designed to look good at a fixed font-size and/or switching of anti-aliasing for small sizes will fix this.
Olof Andersson wrote:
Hi all, I'm building an app with a zoomable interface and I'm getting quite poor results when rendering text(AttributedStrings, actually) when the font size gets small. I know this topic was briefly discussed during the Java2D BOF at this years JavaOne, and the problem was put down to a bug that probably wouldn't get fixed until the release of 1.5. Any news on this issue? Is it a platform-specific problem(I'm running 1.4.2 on win2k)? Tips for workarounds to increase rendering quality would be greatly appreciated!
Here's a code snippet that shows the problem. Run the applet, change fontsize by right-clicking and watch a significant change in quality between fontsize 11 and 10.
import java.awt.*; import java.awt.event.*; import java.applet.*; import java.awt.font.*; import java.text.*; import javax.swing.*;
public class FontSizeTest extends Applet { private boolean isStandalone = false; int fontSize = 12; AttributedString attributedString; TextLayout textLayout; String theString = "How come font size < 11 looks crappy?";
//Construct the applet public FontSizeTest() { addMouseListener(new MouseAdapter() { public void mouseReleased(MouseEvent e) { if(e.isPopupTrigger()){ JPopupMenu pM = new JPopupMenu(); JMenu fontSizeMenu = new JMenu("Set font size"); for(int i = 5; i < 16; i++){ final int fs = i; fontSizeMenu.add(new AbstractAction("Font size " + fs){ public void actionPerformed(ActionEvent e){ fontSize = fs; attributedString = null; textLayout = null; repaint(); } }); } pM.add(fontSizeMenu); pM.show(FontSizeTest.this,e.getX(), e.getY()); } } }); }
public void paint(Graphics g){ Dimension d = getSize(); int w = d.width; int h = d.height; Graphics2D g2 = (Graphics2D) g; g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); g2.setColor(Color.black); g2.fillRect(0, 0, w, h); drawString(g2); }
private void drawString(Graphics2D gr){ if(attributedString == null || textLayout == null){ attributedString = new AttributedString(theString); attributedString.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); attributedString.addAttribute(TextAttribute.FOREGROUND, Color.white); attributedString.addAttribute(TextAttribute.BACKGROUND, Color.black); attributedString.addAttribute(TextAttribute.FONT, new Font("Arial", Font.BOLD, fontSize)); textLayout = new TextLayout(attributedString.getIterator(), gr.getFontRenderContext()); } textLayout.draw(gr, (int)(getWidth()/2 - textLayout.getBounds().getWidth()/2), getHeight()/2); }
//Main method public static void main(String[] args) { FontSizeTest applet = new FontSizeTest(); applet.isStandalone = true; Frame frame; frame = new Frame(); frame.setTitle("Font size test"); frame.add(applet, BorderLayout.CENTER); applet.init(); applet.start(); frame.setSize(400,320); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2); frame.setVisible(true); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } }
Thanks, Olof
=========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA2D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".
=========================================================================== To unsubscribe, send email to [EMAIL PROTECTED] and include in the body of the message "signoff JAVA2D-INTEREST". For general help, send email to [EMAIL PROTECTED] and include in the body of the message "help".
