/* * @(#)FontDemo.java 1.6 06/10/10 * * Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */ package basis.demos; import java.awt.*; import java.util.HashMap; import basis.Builder; public class FontDemo extends Demo { private static String[] fontNames = new String[] { "Serif", "SansSerif", "Monospaced", "Dialog", "DialogInput", "Symbol" }; private static HashMap cache; private static Image logo; private int fontSize; private int largeFontSize; private int smallFontSize; private char character = 'g'; private int factor = 0; public FontDemo() { if (logo == null) { logo = ImageDemo.loadImage(this, "images/logo.gif"); } } public void paint(Graphics g) { Dimension d = getSize(); int w = d.width - 1; int h = d.height - 1; resize(); ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f)); g.drawImage(logo, 0, 0, w, h, this); ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f)); Font font = new Font("monospaced", Font.PLAIN, fontNames.length * fontSize); g.setFont(font); setStatus("Font " + fontSize); g.setColor(Color.black); font = new Font("monospaced", Font.PLAIN, fontSize); FontMetrics fm = g.getFontMetrics(font); int charWidth = fm.charWidth('O'); int y = fontSize + 2; for (int i = 0; i < fontNames.length; i++) { int x = 2; font = new Font(fontNames[i], Font.PLAIN, fontSize); g.setFont(font); g.drawString(fontNames[i], x, y); x += 11 * charWidth; font = new Font(fontNames[i], Font.BOLD, fontSize); g.setFont(font); g.drawString("Bold", x, y); x += 5 * charWidth; font = new Font(fontNames[i], Font.ITALIC, fontSize); g.setFont(font); g.drawString("Ital", x, y); x += 4 * charWidth; font = new Font(fontNames[i], Font.BOLD + Font.ITALIC, fontSize); g.setFont(font); g.drawString("BItal", x, y); y += (fontSize + 2); } y = fontNames.length * (fontSize + 2); largeFontSize = (h - y) / 2; int max = 2 * w / 3; largeFontSize = largeFontSize < max ? largeFontSize : max; font = new Font("Dialog", Font.PLAIN, largeFontSize); g.setFont(font); fm = g.getFontMetrics(font); charWidth = fm.charWidth(character); int ascent = fm.getAscent(); int descent = fm.getDescent(); int height = fm.getHeight(); int leading = fm.getLeading(); int maxAdvance = fm.getMaxAdvance(); int maxAscent = fm.getMaxAscent(); int maxDescent = fm.getMaxDescent(); int x = 4; g.drawString("" + character, x, y + ascent); g.drawLine(x, y + ascent, x + charWidth, y + ascent); g.drawLine(x, y, x, y + ascent + descent); w = (d.width - charWidth) / 12; h = (d.height - y) / 9; smallFontSize = w < h ? w : h; x = charWidth + 8; font = new Font("monospaced", Font.PLAIN, smallFontSize); g.setFont(font); y += smallFontSize; g.drawString("size: " + largeFontSize, x, y); y += smallFontSize; g.drawString("ascent: " + ascent, x, y); y += smallFontSize; g.drawString("descent: " + descent, x, y); y += smallFontSize; g.drawString("height: " + height, x, y); y += smallFontSize; g.drawString("leading: " + leading, x, y); y += smallFontSize; g.drawString("maxAdvance: " + maxAdvance, x, y); y += smallFontSize; g.drawString("maxAscent: " + maxAscent, x, y); y += smallFontSize; g.drawString("maxDescent: " + maxDescent, x, y); y += smallFontSize; g.drawString("charWidth: " + charWidth, x, y); } private void resize() { Dimension d = getSize(); if (factor == 0) { int guess = d.width / 40; Graphics g = getGraphics(); if (g == null) { return; } fontSize = getFontSize(g, d.width, guess); factor = d.width / fontSize; } fontSize = d.width / factor; int max = d.height / 2 / fontNames.length; fontSize = fontSize < max ? fontSize : max; } private static int getFontSize(Graphics g, int width, int guess) { while (true) { Font font = new Font("monospaced", Font.BOLD + Font.ITALIC, guess + 1); FontMetrics fm = g.getFontMetrics(font); int fw = fm.stringWidth("Monospaced Bold Ital BItal"); if (++guess >= width/10) { break; } if (fw <= width) { continue; } else { break; } } return guess; } }