[mapserver-dev] fontconfig patch
Stephen Woodbridge
woodbri at swoodbridge.com
Sat Nov 27 10:23:33 EST 2010
Thomas,
I would be OK with this as long as it is a configure option that is off
by default.
The fontconfig cache build is only built once on a system when it is
first initialized? As opposed to on the first time mapserver calls
fontconfig? correct? Is there away that the font cache can be be checked
and built at configure time rather than when mapserver calls it? I'm a
little concerned by the first time long time cache building as that
might reflect poorly on mapserver for new users.
-Steve W
On 11/27/2010 7:47 AM, thomas bonfort wrote:
> guys,
>
> is there any reason why mapserver isn't using fontconfig to lookup
> fonts that aren't configured in the fontset?
> I've got a patch of a dozen lines that seems to be working ok and
> shouldn't affect backwards compatibility, and was wondering if anyone
> would have reasons to oppose to its inclusion before I start
> integrating it cleanly.
>
> what it basically does:
> when looking up a font by name, we first query the supplied fontset
> for the path to the font.
> * if the fontset contains that font, then we proceed as usual.
> * if not, we do a fontconfig lookup for the given font name, and
> insert the found font into our fontset (to avoid calling fontconfig
> over and over again for the next labels)
>
> pros:
> * no need to define and populate a fontset.
> * we get access to a "default" truetype font, making mapserver run out
> of the box without having to supply a ttf font file.
>
> cons:
> * extra dependency, although the feature will be disablable at compile
> time, and the dependency already exists (though probably without the
> need for header files) through gd and cairo.
> * some extra steps for cleaning up some fontconfig structures at exit
> * the first time the fontconfig functions are called and there is no
> fontconfig cache on the system, the processing time can be *very* long
> while waiting for fontconfig to create its cache. This is a one time
> operation though, although I should investigate what happens in the
> case an unpriviliedged user is running the command.
> * the ouptut of a mapfile can be different depending on the systems it
> runs on, as fontconfig may return a different font depending on what
> fonts are installed on the system.
>
> To me this seems like a nice usability enhancement for mapserver, but
> I won't be offended if we decide we don't want this added.
>
> best regards,
> thomas
>
>
> Index: maplabel.c
> ===================================================================
> --- maplabel.c (revision 10758)
> +++ maplabel.c (working copy)
> @@ -35,7 +35,7 @@
> #include<gdfontt.h>
> #include<gdfontmb.h>
> #include<gdfontg.h>
> -
> +#include<fontconfig/fontconfig.h>
> #include "mapserver.h"
>
> MS_CVSID("$Id$")
> @@ -760,17 +760,35 @@
>
>
> char *msFontsetLookupFont(fontSetObj *fontset, char *fontKey) {
> - char *font;
> - if(!fontKey) {
> - msSetError(MS_TTFERR, "Requested font (NULL) not found.",
> "msFontsetLookupFont()");
> - return NULL;
> - }
> - font = msLookupHashTable(&(fontset->fonts), fontKey);
> - if(!font) {
> - msSetError(MS_TTFERR, "Requested font (%s) not found.",
> "msGetLabelSize()", fontKey);
> - return NULL;
> - }
> - return font;
> + char *font = NULL;
> + if(!fontKey) {
> + msSetError(MS_TTFERR, "Requested font (NULL) not found.",
> "msFontsetLookupFont()");
> + return NULL;
> + }
> + if(!fontset) {
> + msSetError(MS_TTFERR, "fontset is NULL", "msFontsetLookupFont()");
> + return NULL;
> + }
> +
> + font = msLookupHashTable(&(fontset->fonts), fontKey);
> + if(!font) {
> + FcPattern* pattern = FcNameParse ((FcChar8 *) fontKey);
> + FcResult fcresult;
> +
> + FcConfigSubstitute (0, pattern, FcMatchPattern);
> + FcDefaultSubstitute (pattern);
> + FcPattern *matched = FcFontMatch (0, pattern,&fcresult);
> + if (FcPatternGetString (matched, FC_FILE, 0, (FcChar8**)&font) !=
> FcResultMatch) {
> + font = NULL;
> + msSetError(MS_TTFERR, "Requested font (%s) not found.",
> "msGetLabelSize()", fontKey);
> + } else {
> + struct hashObj *entry =
> msInsertHashTable(&(fontset->fonts),fontKey,font);
> + //free(font); TODO this segfaults, check who allocated the string.
> + font = entry->data;
> + }
> + FcPatternDestroy(pattern);
> + }
> + return font;
> }
> _______________________________________________
> mapserver-dev mailing list
> mapserver-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapserver-dev
More information about the mapserver-dev
mailing list