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.