/* * This file is modified by Ivan Maidanski <ivmai@ivmaisoft.com> * Project name: JCGO-SUNAWT (http://www.ivmaisoft.com/jcgo/) */ /* * @(#)MFontPeer.java 1.21 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package sun.awt.motif; import java.security.AccessController; import java.security.PrivilegedAction; import sun.io.CharToByteConverter; import sun.awt.PlatformFont; import sun.io.CharToByteISO8859_1; import java.awt.GraphicsEnvironment; import java.util.Properties; public class MFontPeer extends PlatformFont { /* * XLFD name for XFontSet. */ private String xfsname; /* * converter name for this XFontSet encoding. */ private String converter; static { if (!GraphicsEnvironment.isHeadless()) { initIDs(); } } /** * Initialize JNI field and method IDs for fields that may be accessed from C. */ private static native void initIDs(); public MFontPeer(String name, int style){ super(name, style); if (props != null){ xfsname = props.getProperty ("fontset." + familyName + "." + styleString); } } public CharToByteConverter getFontCharset(final String charsetName, String fontName){ CharToByteConverter fc; if (charsetName.equals("default")){ fc = (CharToByteConverter)charsetRegistry.get(fontName); } else { fc = (CharToByteConverter)charsetRegistry.get(charsetName); } if (fc instanceof CharToByteConverter){ return fc; } Class fcc = (Class)AccessController.doPrivileged(new PrivilegedAction() { public Object run() { try { return Class.forName(charsetName, true, Thread.currentThread().getContextClassLoader()); } catch(ClassNotFoundException e){ try { return Class.forName("sun.io." + charsetName, true, Thread.currentThread().getContextClassLoader()); } catch (ClassNotFoundException exx){ try { return Class.forName("sun.awt.motif." + charsetName, true, Thread.currentThread().getContextClassLoader()); } catch(ClassNotFoundException ex){ return null; } } } } }); if (fcc == null) { return getDefaultFontCharset(fontName); } try { fc = (CharToByteConverter)fcc.newInstance(); } catch(Exception e){ return getDefaultFontCharset(fontName); } if (charsetName.equals("default")){ charsetRegistry.put(fontName, fc); } else { charsetRegistry.put(charsetName, fc); } return fc; } private CharToByteConverter getDefaultFontCharset(String fontName){ return new CharToByteISO8859_1(); } /** * Get default font for Motif widgets to use, preventing them from * wasting time accessing inappropriate X resources. This is called * only from native code. * * This is part of a Motif specific performance enhancement. By * default, when Motif widgets are created and initialized, Motif will * set up default fonts for the widgets, which we ALWAYS override. * This set up includes finding the default font in the widget's X * resources and fairly expensive requests of the X server to identify * the specific font or fontset. We avoid all of this overhead by * providing a well known font to use at the creation of widgets, where * possible. * * The X11 fonts are specified by XLFD strings which have %d as a * marker to indicate where the fontsize should be substituted. [The * libc function sprintf() is used to replace it.] The value 140 * specifies a font size of 14 points. */ private static String getDefaultMotifFontSet() { int i; String font = fprops.getProperty("fontset.default"); if (font != null) { while ((i = font.indexOf("%d")) >= 0) font = font.substring(0, i) + "140" + font.substring(i+2); } return font; } }