diff options
Diffstat (limited to 'src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java')
-rw-r--r-- | src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java | 129 |
1 files changed, 99 insertions, 30 deletions
diff --git a/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java b/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java index 0772cc47f..e1e44c92c 100644 --- a/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java +++ b/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java @@ -28,29 +28,45 @@ package jogamp.graph.font; import java.io.IOException; -import javax.media.opengl.GLException; +import com.jogamp.common.os.Platform; import com.jogamp.common.util.IntObjectHashMap; import com.jogamp.common.util.IOUtil; - +import com.jogamp.common.util.JarUtil; +import com.jogamp.common.util.cache.TempJarCache; import com.jogamp.graph.font.Font; import com.jogamp.graph.font.FontSet; import com.jogamp.graph.font.FontFactory; + +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URLConnection; +import java.security.AccessController; +import java.security.PrivilegedAction; public class UbuntuFontLoader implements FontSet { - - final static FontSet fontLoader = new UbuntuFontLoader(); - public static FontSet get() { + // FIXME: Add cache size to limit memory usage + private static final IntObjectHashMap fontMap = new IntObjectHashMap(); + + private static final String jarSubDir = "atomic/" ; + private static final String jarName = "jogl-fonts-p0.jar" ; + + private static final String relFontPath = "fonts/ubuntu/" ; + private static final String absFontPath = "jogamp/graph/font/fonts/ubuntu/" ; + + private static final FontSet fontLoader = new UbuntuFontLoader(); + + public static final FontSet get() { return fontLoader; } - + final static String availableFontFileNames[] = { /* 00 */ "Ubuntu-R.ttf", // regular /* 01 */ "Ubuntu-RI.ttf", // regular italic - /* 02 */ "Ubuntu-B.ttf", // bold + /* 02 */ "Ubuntu-B.ttf", // bold /* 03 */ "Ubuntu-BI.ttf", // bold italic /* 04 */ "Ubuntu-L.ttf", // light /* 05 */ "Ubuntu-LI.ttf", // light italic @@ -58,23 +74,20 @@ public class UbuntuFontLoader implements FontSet { /* 07 */ "Ubuntu-MI.ttf", // medium italic }; - - final static String relPath = "fonts/ubuntu/" ; - + private UbuntuFontLoader() { } - // FIXME: Add cache size to limit memory usage - static final IntObjectHashMap fontMap = new IntObjectHashMap(); - static boolean is(int bits, int bit) { return 0 != ( bits & bit ) ; } - + + @Override public Font getDefault() throws IOException { - return get(FAMILY_REGULAR, 0) ; // Sans Serif Regular + return get(FAMILY_REGULAR, 0) ; // Sans Serif Regular } - + + @Override public Font get(int family, int style) throws IOException { Font font = (Font)fontMap.get( ( family << 8 ) | style ); if (font != null) { @@ -97,7 +110,7 @@ public class UbuntuFontLoader implements FontSet { font = abspath(availableFontFileNames[0], family, style); } break; - + case FAMILY_LIGHT: if( is(style, STYLE_ITALIC) ) { font = abspath(availableFontFileNames[5], family, style); @@ -105,34 +118,90 @@ public class UbuntuFontLoader implements FontSet { font = abspath(availableFontFileNames[4], family, style); } break; - + case FAMILY_MEDIUM: if( is(style, STYLE_ITALIC) ) { font = abspath(availableFontFileNames[6], family, style); } else { font = abspath(availableFontFileNames[7], family, style); } - break; + break; } return font; } - - Font abspath(String fname, int family, int style) throws IOException { - final String err = "Problem loading font "+fname+", stream "+relPath+fname; + + private static boolean attemptedJARLoading = false; + private static boolean useTempJarCache = false; + + private synchronized Font abspath(String fname, int family, int style) throws IOException { + final String err = "Problem loading font "+fname+", stream "+relFontPath+fname; + final Exception[] privErr = { null }; try { - URLConnection conn = IOUtil.getResource(UbuntuFontLoader.class, relPath+fname); - if(null == conn) { - throw new GLException(err); + final Font f0 = abspathImpl(fname, family, style); + if(null != f0) { + return f0; + } + if( !attemptedJARLoading ) { + attemptedJARLoading = true; + Platform.initSingleton(); + if( TempJarCache.isInitialized() ) { + final URI uri = JarUtil.getRelativeOf(UbuntuFontLoader.class, jarSubDir, jarName); + AccessController.doPrivileged(new PrivilegedAction<Object>() { + @Override + public Object run() { + try { + TempJarCache.addResources(UbuntuFontLoader.class, uri); + } catch (Exception e) { privErr[0] = e; } + return null; + } } ); + if( null == privErr[0] ) { + useTempJarCache = true; + final Font f1 = abspathImpl(fname, family, style); + if(null != f1) { + return f1; + } + } + } + } + } catch(Exception e) { + throw new IOException(err, e); + } + if( null != privErr[0] ) { + throw new IOException(err, privErr[0]); + } + throw new IOException(err); + } + private Font abspathImpl(final String fname, final int family, final int style) throws IOException { + final URLConnection conn; + if( useTempJarCache ) { + // this code-path throws .. all exceptions + final Exception[] privErr = { null }; + final URLConnection[] privConn = { null }; + AccessController.doPrivileged(new PrivilegedAction<Object>() { + @Override + public Object run() { + try { + final URI uri = TempJarCache.getResource(absFontPath+fname); + privConn[0] = null != uri ? uri.toURL().openConnection() : null; + } catch (Exception e) { privErr[0] = e; } + return null; + } } ); + if( null != privErr[0] ) { + throw new IOException(privErr[0]); } + conn = privConn[0]; + } else { + // no exceptions .. + conn = IOUtil.getResource(UbuntuFontLoader.class, relFontPath+fname); + } + if(null != conn) { final Font f= FontFactory.get ( conn ) ; if(null != f) { fontMap.put( ( family << 8 ) | style, f ); return f; - } - throw new IOException(err); - } catch(IOException ioe) { - throw new IOException(err, ioe); + } } - } + return null; + } } |