Font problems (affecting Java and others?)

Alan Eliasen eliasen at mindspring.com
Sun Sep 7 21:17:22 EDT 2008


    I'm working on making it possible to get Java to run on the OLPC, 
and have a solution to what many of you may have seen:  the problem that 
any Java program uses a strange italicized serif font, no matter what 
font you request.  This odd font is used everywhere, and no other fonts 
seem to work.

    This is focusing on the OpenJDK 1.6.0.0 distribution as found in 
yum.  (That's "yum install java-1.6.0-openjdk")  I've also considered 
gcj, but gcj's implementations of things like AWT or Swing is far less 
complete than OpenJDK currently.  My OLPC is running Joyride 2346.  I 
was glad to see that despite what our Wiki says about Java, it's 
actually relatively easy to make graphical Java programs at least run on 
the OLPC, to switch to its window, etc.  (I'm not talking about making 
it a full-blown activity, which is dependent on a lot of other things 
happening, such as not having to set X properties on windows, bug 
http://dev.laptop.org/ticket/5271 and having a clean implementation of 
the services currently built in Python, and making a C/Java binding to 
them.)

    (By the way, I'm also experimenting with "java-gnome" which creates 
GTK bindings for gnome, so Java interfaces can look more like other 
Sugar applications, but due to several compounding bugs in our yum 
distribution, I can't build that on the OLPC, and can't emulate the OLPC 
due to bug http://dev.laptop.org/ticket/7813 .  I'll file those later.) 
  I know that there may be involved workarounds for some of these bugs, 
but I think it's important for everyone to know which bugs are seriously 
hampering developers who want to contribute, but don't have the time to 
research and duplicate lots of workarounds.  BTW, is there any progress 
on 7813?

    The problem is that our font.properties files are not set up 
correctly for the fonts distributed on the OLPC.  I've verified that 
adding one file fixes the problem, but there are several ways of fixing 
the problem and I wanted input from others on the proper way to do it.

    Here's a page that gives background on how fonts are loaded in Java:
http://java.sun.com/j2se/1.5.0/docs/guide/intl/fontconfig.html

    (It's Java 1.5 but it still seems to work the same in OpenJDK 1.6)

    When looking at that page, note that Joyride 2346 sets the following:

    JavaHome=/usr/lib/jvm/jre-1.6.0-openjdk
    OS=Fedora
    Version=9

    Thus, it searches for a working font configuration in the following 
order:

    /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.Fedora.9.properties
    /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.Fedora.9.bfc
    /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.Fedora.properties
*  /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.Fedora.bfc
    /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.9.properties
    /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.9.bfc
    /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.properties
    /usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.bfc

     The one marked with * is the first one that exists.  The .bfc files 
are a binary format.

     In the above directory, there exists a file 
/usr/lib/jvm/jre-1.6.0-openjdk/lib/fontconfig.Fedora.properties.src

    By copying this file to the filename "fontconfig.Fedora.properties" 
in the same directory, we can create a file that is found before the 
.bfc file and test our changes.

    Inside the new "fontconfig.Fedora.properties" file, at the end, 
there are lines like:

filename.DejaVu_Sans=/usr/share/fonts/dejavu/DejaVuSans.ttf

    Unfortunately, those font files don't exist, but instead of, say 
DejaVuSans.ttf, we have files named DejaVuLGCSans.ttf.

    Fixing the "fontconfig.fedora.properties" to change filenames of all 
DejaVu... to DejaVuLGC... fixes these problems, and Java implementations 
now display correctly.

    Now, how is the proper way to fix it?  Here are a few alternatives:

    1.) Just add the fixed properties file as demonstrated above to the 
OLPC's OpenJDK distribution.  Doing this is nice because it doesn't 
affect any existing files, and it's user-tweakable as opposed to the 
compiled .bfc file.

    2.) Create symbolic links in the fonts directory, for example, 
DejaVuSans.ttf would be a symbolic link to DejaVuLGCSans.ttf.  I don't 
know if this might help other applications.  Note that Fedora 9 usually 
contains /usr/share/fonts/dejavu/ *AND* /usr/share/fonts/dejavu-lgc/ 
directories while the OLPC just contains the former.

    3.) Add the missing fonts?

    4.) Do some unspecified font fallback trick?

    5.) Change "osname" (probably fetched from the Java property 
os.name) in the OpenJava JVM from "Fedora" to something more specific to 
the OLPC, like "OLPC".  This might allow us to push an OLPC 
configuration file upstream to the OpenJDK project.  I'm not sure where 
os.name is set, or how it is detected, though.

    Which of these (or some other alternative) is the best way to fix 
our Java font problem?

    I'll file a bug on this.  Is there anyone in charge of packaging the 
OpenJDK distribution?  I can probably create a patch for it.  By the 
way, I haven't verified if *all* fonts in our fontconfig file exist, 
such as Sazanami, Lohit, Baekmuk, etc., or if we should point it at 
other files on the OLPC.

    By the way, what's the best way to:

    a.) Create a patch for a *new* file
    b.) compile a resource file to that .bfc format?

--
    Alan Eliasen
    eliasen at mindspring.com
    http://futureboy.us/



More information about the Devel mailing list