Are you using FOP in your Desktop app (meaning you feed and FO file and output one of the supported formats) or you just want to use some classes to get the list of fonts in your system?

On 7/30/13 5:42 PM, Bernard Giannetti wrote:
(apologies for the double post...somehow my email got tagged to the end of an unrelated post)


Hi,


I'm making a call to org.apache.fop.tools.fontlist.FontListGenerator.listFonts( ... ) to get a list of font names for my desktop application.  To get the font names, I take the keys from the returned fontFamilies SortedMap; the actual data is junked.

I hadn't realised just how much memory is used by listfont( ... ) - on some platforms such as Windows 7, in excess of 250 MB.  In this case I'm hitting out of memory errors.

I was wondering if there's a simpler way (uses less memory) to get just the font names (first family names)?  As I said, I don't make use of the metrics and other font details...just the first family name for each font.  Digging down into  listfont( ... ), I was wondering if it's safe to take the firstFamilyName and place it into a list say and then drop the following lines for the containers/sort?

Iterator iter = fontInfo.getFontTriplets().entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry entry = (Map.Entry)iter.next();
    FontTriplet triplet = (FontTriplet)entry.getKey();
    String key = (String)entry.getValue();
    FontSpec container;
    if (keyBag.contains(key)) {
        keyBag.remove(key);

        FontMetrics metrics = (FontMetrics)fonts.get(key);

        container = new FontSpec(key, metrics);
        container.addFamilyNames(metrics.getFamilyNames());
        keys.put(key, container);
        String firstFamilyName = (String)container.getFamilyNames().first();
        List containers = (List)fontFamilies.get(firstFamilyName);
        if (containers == null) {
            containers = new java.util.ArrayList();
            fontFamilies.put(firstFamilyName, containers);
        }
        containers.add(container);
        Collections.sort(containers);
    } else {
        container = (FontSpec)keys.get(key);
    }
    container.addTriplet(triplet);
}

I'm guessing a lot of memory is chewed up in the containers/sort section...but really I can't be sure as I don't fully follow what's going on!

Ideally I'd just up the amount of memory supplied to the desktop application, but I don't have that option and besides, it just delays the problem of running out of memory.


Thanks in advance,

Bernard.