From b57ce5454ddeb7dd4b7c010c5df54faa6e8d951a Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Thu, 31 Oct 2013 10:46:47 +0100 Subject: Bug 754 - Remove Ubuntu fonts from jogl-all.jar, provide it separately to reduce footprint for the masses. Remove the ubuntu fonts from atomic/jogl-util-graph.jar and hence all derivated 'all' JAR files. The Android jar files still contain the fonts as assets! atomic/jogl-util-graph-fonts-p0.jar contains the fonts and is either referenced by: - UbuntuFontLoader: Using class based Jar URI derivation using TempJarCache to [down]load and extract the jar file (similar to native lib-loading). - Explicitly via traditional classpath, see jnlp-files/jogl-applet-runner-newt-GraphTextDemo01b-napplet.html The pack200 jogl-all.jar file is now below 1MB --- .../jogamp/graph/font/UbuntuFontLoader.java | 89 +++++++++++++++++++--- 1 file changed, 78 insertions(+), 11 deletions(-) (limited to 'src/jogl/classes') diff --git a/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java b/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java index 9096f7d16..e1e44c92c 100644 --- a/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java +++ b/src/jogl/classes/jogamp/graph/font/UbuntuFontLoader.java @@ -28,22 +28,33 @@ 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 { // FIXME: Add cache size to limit memory usage private static final IntObjectHashMap fontMap = new IntObjectHashMap(); - private static final String relPath = "fonts/ubuntu/" ; + 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(); @@ -120,21 +131,77 @@ public class UbuntuFontLoader implements FontSet { 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() { + @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() { + @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; } } -- cgit v1.2.3