[GRASS-dev] font path question for Linux and Windows

Glynn Clements glynn at gclements.plus.com
Mon Apr 30 14:45:43 EDT 2007

William Kyngesburye wrote:

> >> Note that font names on OSX aren't required to follow any file
> >> extension conventions.  First the HFS+ file type/creator is used to
> >> determine if a file is a font, then the file extension if the type/
> >> creator are empty.  I think it's that order.
> >>
> >> So scanning automatically for fonts to create the freetypecap may
> >> miss many fonts, unless it knew how to check OSX type/creator info
> >> for a file.
> >>
> >> ie the MS fonts that come with the system have no extension.  Also,
> >> many TT fonts in OSX have been repackaged in the .dfont (a flattened
> >> resource-fork file).
> >
> > In which case, users will need to construct the freetypecap file
> > manually.
> >
> If you do that, there is not much point to the automatic scan - most  
> of the useful TT fonts that are included with OSX are either dfonts  
> or have no extension.  Most, if not all, of the included .ttf TT  
> fonts are miscellaneous language fonts.
> But, then there is another problem (and in general TT font usage) -  
> d.font.freetype doesn't handle multiple faces in a file.  Many dfonts  
> and resource fonts (the ones with no extension) have multiple faces  
> in a single file (ie regular, italic, bold..).  Without specifying  
> the face index or name, freetype defaults to the first face in a font  
> file. (I thought I made a feature request for this, but I don't see  
> it in either tracker)  There is no guarantee that plain/regular will  
> be the first face in a font file, so you may get italic or bold or  
> other unexpected style.

Regarding both cases (mkftcap and R_font()), fixes are welcome. They
will need to come from someone who can devise (and test) a solution,
though (i.e. someone with a Mac).

> A few more comments:
> - Add /System/Library/Fonts to the search paths (assuming some way to  
> handle other file extensions, or lack of, is worked out, as well as  
> multiple faces in a file).

> $HOME/Library/Fonts would be another good default dir to search.  And  
> to do these in the proper OSX order of precedence would be: $HOME/ 
> Library/Fonts /Library/Fonts /System/Library/Fonts.  $HOME can have  
> spaces if it's on a network driver, so that path at least should be  
> quoted.

These are easy enough to do (adding the directory, not the other
parts). Even if it doesn't do anything yet because there are no .ttf
files there, it's harmless.

> - Maybe Michael's proposed font path env var could be used here?  For  
> additional user font paths to search automatically.

I can add "$@" to the list used by mkftcap, so other directories can
be passed as arguments. Environment variables are problematic when
directories contain spaces, but command-line arguments can be quoted.

> - since this is now in /tools and installed in etc/, that implies  
> that mkftcap will get run automatically somehow?  From GUI?  Or some  
> future script module?  On startup?

At present, it gets run at build time; thereafter, it has to be run
manually. It could be run from a post-install script used by the
packaging system (.deb, .rpm, etc).

It isn't intended to be run automatically during normal use.

> Then it will destroy a user's  
> manually created freetypecap, so it should be as thorough as  
> possible.  Or add some sort of divider in the freetypecap between  
> user entries and auto-generated entries, and mkftcap would not  
> overwrite user edits.

Reasonable enough. Also, I'm considering making it write to stdout
rather than $GISBASE/etc/freetypecap. That allows it to write to some
other file, which can then be referenced by $GRASS_FT_CAP.

Also for preserving user additions, you could use e.g.:

	mkftcap > freetypecap.new
	cat freetypecap.new $GISBASE/etc/freetypecap | sort | uniq > freetypecap.tmp
	mv -f freetypecap.tmp $GISBASE/etc/freetypecap

This won't preserve deletion or re-ordering, but it's trivial to
implement. If the user has a local $GRASS_FT_CAP, an alternative is:

	mkftcap > freetypecap.new
	diff -u $GISBASE/etc/freetypecap freetypecap.new | patch $GRASS_FT_CAP
	rm -f freetypecap.new

> - regenerating the freetypecap at runtime in the GRASS application  
> folder is not a good thing on OSX (see my previous discussions about  
> OSX apps and user preference/config/addon files).  There should be  
> some way to have GRASS look for alternative external freetypecap  
> files, for both generating the freetypecap file, and reading it to  
> set the font.

The code which reads the file already uses $GRASS_FT_CAP if that is

Glynn Clements <glynn at gclements.plus.com>

More information about the grass-dev mailing list