001 package railo.commons.lang.font; 002 003 import java.awt.Font; 004 import java.awt.FontMetrics; 005 import java.awt.Graphics2D; 006 import java.awt.GraphicsEnvironment; 007 import java.awt.image.BufferedImage; 008 import java.util.Iterator; 009 010 import railo.runtime.exp.ExpressionException; 011 import railo.runtime.type.Array; 012 import railo.runtime.type.ArrayImpl; 013 014 public class FontUtil { 015 016 private static Array fonts; 017 private static Graphics2D graphics; 018 019 public synchronized static Array getAvailableFontsAsStringArray() { 020 Iterator it = getAvailableFonts(false).iterator(); 021 Array arr=new ArrayImpl(); 022 while(it.hasNext()) { 023 arr.appendEL(((Font)it.next()).getFontName()); 024 } 025 return arr; 026 } 027 private synchronized static Array getAvailableFonts(boolean duplicate) { 028 if (fonts == null) { 029 030 fonts = new ArrayImpl(); 031 GraphicsEnvironment graphicsEvn = GraphicsEnvironment.getLocalGraphicsEnvironment(); 032 Font[] availableFonts = graphicsEvn.getAllFonts(); 033 for (int i = 0; i < availableFonts.length; i++) { 034 fonts.appendEL(availableFonts[i]); 035 } 036 037 } 038 if(!duplicate) return fonts; 039 return (Array) fonts.duplicate(false); 040 } 041 042 public static String toString(Font font) { 043 if(font==null) return null; 044 return font.getFontName(); 045 } 046 047 public static Font getFont(String font, Font defaultValue) { 048 Font f=Font.decode(font); 049 if(f!=null) return f; 050 // font name 051 Iterator it = getAvailableFonts(false).iterator(); 052 while(it.hasNext()) { 053 f=(Font) it.next(); 054 if(f.getFontName().equalsIgnoreCase(font)) return f; 055 } 056 // family 057 it = getAvailableFonts(false).iterator(); 058 while(it.hasNext()) { 059 f=(Font) it.next(); 060 if(f.getFamily().equalsIgnoreCase(font)) return f; 061 } 062 return defaultValue; 063 } 064 065 public static Font getFont(String font) throws ExpressionException { 066 Font f = getFont(font,null); 067 if(f!=null) return f; 068 throw new ExpressionException("no font with name ["+font+"] available" 069 ,"to get available fonts call function ImageFonts()"); 070 } 071 072 public static FontMetrics getFontMetrics(Font font) { 073 if(graphics==null) { 074 graphics = new BufferedImage(1, 1,BufferedImage.TYPE_INT_ARGB).createGraphics(); 075 } 076 return graphics.getFontMetrics(font); 077 } 078 }