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