1 /* Demo.java -- Shows examples of AWT components
2 Copyright (C) 1998, 1999, 2002, 2004, 2006 Free Software Foundation, Inc.
4 This file is part of GNU Classpath examples.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 package gnu.classpath.examples.awt;
23 import gnu.java.awt.font.FontDelegate;
24 import gnu.java.awt.font.GNUGlyphVector;
25 import gnu.java.awt.font.opentype.OpenTypeFontFactory;
27 import java.awt.BasicStroke;
28 import java.awt.BorderLayout;
29 import java.awt.Color;
31 import java.awt.Graphics;
32 import java.awt.Graphics2D;
33 import java.awt.GridLayout;
34 import java.awt.Insets;
35 import java.awt.RenderingHints;
36 import java.awt.Shape;
37 import java.awt.event.ActionEvent;
38 import java.awt.event.ActionListener;
39 import java.awt.font.FontRenderContext;
41 import java.io.RandomAccessFile;
42 import java.nio.ByteBuffer;
43 import java.nio.channels.FileChannel;
44 import java.text.StringCharacterIterator;
46 import javax.swing.BoxLayout;
47 import javax.swing.JCheckBox;
48 import javax.swing.JFileChooser;
49 import javax.swing.JFrame;
50 import javax.swing.JMenu;
51 import javax.swing.JMenuBar;
52 import javax.swing.JMenuItem;
53 import javax.swing.JPanel;
54 import javax.swing.JSpinner;
55 import javax.swing.JTextField;
56 import javax.swing.border.TitledBorder;
57 import javax.swing.event.ChangeEvent;
58 import javax.swing.event.ChangeListener;
60 public class HintingDemo extends JFrame {
64 GlyphPreview glyphPreview;
66 StringViewer stringViewer;
76 class StringViewer extends JPanel
77 implements ActionListener
84 setLayout(new GridLayout(0, 1));
85 setBorder(new TitledBorder("Use this field to render complete strings"));
86 input = new JTextField();
87 input.addActionListener(this);
89 viewer = new Viewer();
93 public void actionPerformed(ActionEvent event)
100 gv = (GNUGlyphVector)
101 font.createGlyphVector(new Font("Dialog", 0, 12),
102 new FontRenderContext(null, false, false),
103 new StringCharacterIterator(input.getText()));
107 class Viewer extends JPanel
109 protected void paintComponent(Graphics g)
111 if (gv != null && g instanceof Graphics2D)
113 Graphics2D g2d = (Graphics2D) g;
116 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
117 RenderingHints.VALUE_ANTIALIAS_ON);
121 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
122 RenderingHints.VALUE_ANTIALIAS_OFF);
124 g2d.clearRect(0, 0, getWidth(), getHeight());
125 g2d.setColor(Color.BLACK);
126 Shape outline = gv.getOutline(0, 0,
127 flags | FontDelegate.FLAG_FITTED);
128 g2d.translate(20, Math.floor(outline.getBounds2D().getHeight()) + 2);
135 class HintPanel extends JPanel
140 setBorder(new TitledBorder("Detailed glyph view"));
142 protected void paintComponent(Graphics g)
144 if (glyph != null && g instanceof Graphics2D)
146 Graphics2D g2d = (Graphics2D) g.create();
147 Insets i = getInsets();
148 g2d.clearRect(i.left, i.top, getWidth() - i.left - i.right,
149 getHeight() - i.top - i.bottom);
152 g2d.setColor(Color.GRAY);
153 for (int x = 20; x < getWidth(); x += 20)
155 g2d.drawLine(x, i.top, x, getHeight() - i.top - i.bottom);
157 for (int y = 20; y < getHeight(); y += 20)
159 g2d.drawLine(i.left, y, getWidth() - i.left - i.right, y);
162 // g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
163 // RenderingHints.VALUE_ANTIALIAS_ON);
164 g2d.translate(40, 300);
166 g2d.setStroke(new BasicStroke((float) (1/10.)));
169 g2d.setColor(Color.RED);
170 g2d.draw(glyph.getOutline(0, 0,
171 flags & ~FontDelegate.FLAG_FITTED));
175 g2d.setColor(Color.RED);
176 g2d.draw(glyph.getOutline(0, 0,
177 flags | FontDelegate.FLAG_FITTED));
184 class GlyphPreview extends JPanel
186 protected void paintComponent(Graphics g)
188 if (glyph != null && g instanceof Graphics2D)
190 Graphics2D g2d = (Graphics2D) g;
193 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
194 RenderingHints.VALUE_ANTIALIAS_ON);
198 g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
199 RenderingHints.VALUE_ANTIALIAS_OFF);
201 g2d.clearRect(0, 0, getWidth(), getHeight());
202 g2d.setColor(Color.BLACK);
203 Shape outline = glyph.getOutline(0, 0,
204 flags | FontDelegate.FLAG_FITTED);
205 g2d.translate(20, outline.getBounds2D().getHeight() + 2);
214 File file = new File("/usr/share/fonts/truetype/freefont/FreeSans.ttf");
216 setLayout(new BorderLayout());
217 chooser = new Chooser();
218 add(chooser, BorderLayout.NORTH);
219 hintPanel = new HintPanel();
223 options = new Options();
224 add(options, BorderLayout.EAST);
226 stringViewer = new StringViewer();
227 add(stringViewer, BorderLayout.SOUTH);
230 JMenuBar mb = new JMenuBar();
232 JMenu fileMenu = new JMenu("File");
234 JMenuItem loadFont = new JMenuItem("Load font");
235 loadFont.addActionListener(new ActionListener(){
236 public void actionPerformed(ActionEvent ev)
238 JFileChooser fc = new JFileChooser()
240 public boolean accept(File f)
242 return f.isDirectory() || f.getName().endsWith(".ttf");
245 int status = fc.showOpenDialog(HintingDemo.this);
246 if (status == JFileChooser.APPROVE_OPTION)
248 File file = fc.getSelectedFile();
253 fileMenu.add(loadFont);
260 if (glyphPreview != null)
261 glyphPreview.repaint();
262 if (hintPanel != null)
264 if (stringViewer != null)
265 stringViewer.refresh();
268 class Options extends JPanel
269 implements ActionListener
271 JCheckBox antiAliasOpt;
272 JCheckBox showGridOpt;
273 JCheckBox showOriginalOpt;
274 JCheckBox showHintedOpt;
275 JCheckBox hintHorizontalOpt;
276 JCheckBox hintVerticalOpt;
277 JCheckBox hintEdgeOpt;
278 JCheckBox hintStrongOpt;
279 JCheckBox hintWeakOpt;
282 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
283 setBorder(new TitledBorder("Hinting options"));
284 antiAliasOpt = new JCheckBox("Antialias");
285 antiAliasOpt.setSelected(true);
286 antiAliasOpt.addActionListener(this);
288 showGridOpt = new JCheckBox("Show grid");
289 showGridOpt.setSelected(true);
290 showGridOpt.addActionListener(this);
292 showOriginalOpt = new JCheckBox("Show original");
293 showOriginalOpt.setSelected(true);
294 showOriginalOpt.addActionListener(this);
295 add(showOriginalOpt);
296 showHintedOpt = new JCheckBox("Show hinted");
297 showHintedOpt.setSelected(true);
298 showHintedOpt.addActionListener(this);
300 hintHorizontalOpt = new JCheckBox("Hint horizontal");
301 hintHorizontalOpt.setSelected(true);
302 hintHorizontalOpt.addActionListener(this);
303 add(hintHorizontalOpt);
304 hintVerticalOpt = new JCheckBox("Hint vertical");
305 hintVerticalOpt.setSelected(true);
306 hintVerticalOpt.addActionListener(this);
307 add(hintVerticalOpt);
308 hintEdgeOpt = new JCheckBox("Hint edge points");
309 hintEdgeOpt.setSelected(true);
310 hintEdgeOpt.addActionListener(this);
312 hintStrongOpt = new JCheckBox("Hint strong points");
313 hintStrongOpt.setSelected(true);
314 hintStrongOpt.addActionListener(this);
316 hintWeakOpt = new JCheckBox("Hint weak points");
317 hintWeakOpt.setSelected(true);
318 hintWeakOpt.addActionListener(this);
325 antiAlias = antiAliasOpt.isSelected();
326 showGrid = showGridOpt.isSelected();
327 showOriginal = showOriginalOpt.isSelected();
328 showHinted = showHintedOpt.isSelected();
329 if (hintHorizontalOpt.isSelected())
330 flags &= ~FontDelegate.FLAG_NO_HINT_HORIZONTAL;
332 flags |= FontDelegate.FLAG_NO_HINT_HORIZONTAL;
333 if (hintVerticalOpt.isSelected())
334 flags &= ~FontDelegate.FLAG_NO_HINT_VERTICAL;
336 flags |= FontDelegate.FLAG_NO_HINT_VERTICAL;
337 if (hintEdgeOpt.isSelected())
338 flags &= ~FontDelegate.FLAG_NO_HINT_EDGE_POINTS;
340 flags |= FontDelegate.FLAG_NO_HINT_EDGE_POINTS;
341 if (hintStrongOpt.isSelected())
342 flags &= ~FontDelegate.FLAG_NO_HINT_STRONG_POINTS;
344 flags |= FontDelegate.FLAG_NO_HINT_STRONG_POINTS;
345 if (hintWeakOpt.isSelected())
346 flags &= ~FontDelegate.FLAG_NO_HINT_WEAK_POINTS;
348 flags |= FontDelegate.FLAG_NO_HINT_WEAK_POINTS;
353 public void actionPerformed(ActionEvent event)
359 class Chooser extends JPanel
364 setLayout(new GridLayout(1, 0));
365 setBorder(new TitledBorder("Choose and preview the character to render"));
366 spin = new JSpinner();
367 spin.addChangeListener(new ChangeListener()
370 public void stateChanged(ChangeEvent event)
372 int val = ((Integer) spin.getValue()).intValue();
373 setGlyph((char) val);
377 glyphPreview = new GlyphPreview();
382 spin.setValue(new Integer(character));
387 private void loadFont(File file)
391 RandomAccessFile raf = new RandomAccessFile(file, "r");
392 FileChannel chan = raf.getChannel();
393 ByteBuffer buf = chan.map(FileChannel.MapMode.READ_ONLY, 0, raf.length());
394 FontDelegate[] fonts = OpenTypeFontFactory.createFonts(buf);
401 ex.printStackTrace();
405 void setGlyph(char ch)
408 glyph = (GNUGlyphVector)
409 font.createGlyphVector(new Font("Dialog", 0, 12),
410 new FontRenderContext(null, false, false),
411 new StringCharacterIterator(new String(new char[]{ch})));
415 public static void main(String[] args) {
416 HintingDemo f = new HintingDemo();