"montage: unable to read font (null)"

Questions and postings pertaining to the development of ImageMagick, feature enhancements, and ImageMagick internals. ImageMagick source code and algorithms are discussed here. Usage questions which are too arcane for the normal user list should also be posted here.
naoliv
Posts: 110
Joined: 2007-12-10T18:54:27-07:00
Location: Brazil

"montage: unable to read font (null)"

Post by naoliv »

Hi!

We are having some issues related with fonts in ImageMagick (version 6.0.0-4) on Debian (see http://bugs.debian.org/573983) where an user is having this problem (that I cannot reproduce):

Code: Select all

$  montage test.jpg test1.jpg
montage: unable to read font `(null)' @ error/annotate.c/RenderFreetype/1044.
and problems like this:

Code: Select all

convert -size 320x85 xc:transparent -font Bookman-DemiItalic \
  -pointsize 72 -draw "text 25,60 'Magick'" -channel RGBA \
  -blur 0x6 -fill darkred -stroke magenta \
  -draw "text 20,55 'Magick'" fuzzy-magick.png

  On older imagemagick, it works fine.

  On the newer one, it works, but issues the following warnings:

convert: unable to read font `Bookman-DemiItalic' @
warning/annotate.c/RenderType/807.
convert: unable to read font `Bookman-DemiItalic' @
error/annotate.c/RenderFreetype/1044.
(...)
I am thinking if this could be related with viewtopic.php?f=2&t=15355 where we removed these lines from config/type.xml.in:

Code: Select all

<typemap>
  @type_include_files@
</typemap>
Our final type.xml file is this:

Code: Select all

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE typemap [
<!ELEMENT typemap (type)+>
<!ELEMENT type (#PCDATA)>
<!ELEMENT include (#PCDATA)>
<!ATTLIST type name CDATA #REQUIRED>
<!ATTLIST type fullname CDATA #IMPLIED>
<!ATTLIST type family CDATA #IMPLIED>
<!ATTLIST type foundry CDATA #IMPLIED>
<!ATTLIST type weight CDATA #IMPLIED>
<!ATTLIST type style CDATA #IMPLIED>
<!ATTLIST type stretch CDATA #IMPLIED>
<!ATTLIST type format CDATA #IMPLIED>
<!ATTLIST type metrics CDATA #IMPLIED>
<!ATTLIST type glyphs CDATA #REQUIRED>
<!ATTLIST type version CDATA #IMPLIED>
<!ATTLIST include file CDATA #REQUIRED>
]>
Did we manage to create an invalid type.xml file (and if yes, how could we fix it) or is it some problem with ImageMagick, please?

Really thank you!
User avatar
magick
Site Admin
Posts: 11064
Joined: 2003-05-31T11:32:55-07:00

Re: "montage: unable to read font (null)"

Post by magick »

is the <typemap> element included in your XML file? If not, try it. It should look like this:
  • <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE typemap [
    <!ELEMENT typemap (type)+>
    <!ELEMENT type (#PCDATA)>
    <!ELEMENT include (#PCDATA)>
    <!ATTLIST type name CDATA #REQUIRED>
    <!ATTLIST type fullname CDATA #IMPLIED>
    <!ATTLIST type family CDATA #IMPLIED>
    <!ATTLIST type foundry CDATA #IMPLIED>
    <!ATTLIST type weight CDATA #IMPLIED>
    <!ATTLIST type style CDATA #IMPLIED>
    <!ATTLIST type stretch CDATA #IMPLIED>
    <!ATTLIST type format CDATA #IMPLIED>
    <!ATTLIST type metrics CDATA #IMPLIED>
    <!ATTLIST type glyphs CDATA #REQUIRED>
    <!ATTLIST type version CDATA #IMPLIED>
    <!ATTLIST include file CDATA #REQUIRED>
    ]>
    <typemap>
    </typemap>
if that does not fix the problem, we'll try to reproduce the problem and come up with a patch.
naoliv
Posts: 110
Joined: 2007-12-10T18:54:27-07:00
Location: Brazil

Re: "montage: unable to read font (null)"

Post by naoliv »

Hi!

There was no

Code: Select all

<typemap>
</typemap>
in type.xml. But even after including these two lines:

Code: Select all

$ convert -size 320x85 xc:transparent -font Bookman-DemiItalic -pointsize 72 -draw "text 25,60 'Magick'" -channel RGBA -blur 0x6 -fill darkred -stroke magenta -draw "text 20,55 'Magick'" output.png

convert: unable to read font `Bookman-DemiItalic' @ warning/annotate.c/RenderType/807.
We have a new comment on our bug report (http://bugs.debian.org/573983) that maybe could help:
I think I have a better idea of what is happening: if I use one of the
fonts listed by

~ convert -list font

I get no error, and the output looks fine. Looking closer, I find that
there are several fonts missing from the newer version of imagemagick,
namely, the postscript fonts:

diff im-fontlist.old im-fontlist.new
1,8d0
< Font: AvantGarde-Book
< Font: AvantGarde-BookOblique
< Font: AvantGarde-Demi
< Font: AvantGarde-DemiOblique
< Font: Bookman-Demi
< Font: Bookman-DemiItalic
< Font: Bookman-Light
< Font: Bookman-LightItalic
53,56d44
< Font: Courier
< Font: Courier-Bold
< Font: Courier-BoldOblique
< Font: Courier-Oblique
64,72d51
< Font: fixed
< Font: Helvetica
< Font: Helvetica-Bold
< Font: Helvetica-BoldOblique
< Font: Helvetica-Narrow
< Font: Helvetica-Narrow-Bold
< Font: Helvetica-Narrow-BoldOblique
< Font: Helvetica-Narrow-Oblique
< Font: Helvetica-Oblique
177,180d155
< Font: NewCenturySchlbk-Bold
< Font: NewCenturySchlbk-BoldItalic
< Font: NewCenturySchlbk-Italic
< Font: NewCenturySchlbk-Roman
197,200d171
< Font: Palatino-Bold
< Font: Palatino-BoldItalic
< Font: Palatino-Italic
< Font: Palatino-Roman
202,206d172
< Font: Symbol
< Font: Times-Bold
< Font: Times-BoldItalic
< Font: Times-Italic
< Font: Times-Roman

I think I've understood the problem: when a font isn't found,
imagemagick falls back onto using helvetica (line 1032 of
magick/annotate.c). On the older imagemagick, as the postscript fonts
were automatically included with

<typemap>
@type_include_files@
</typemap>

there was no problems. On the newer version, Helvetica is missing, so it
isn't found at all. That's pretty bad for the default font !

I don't know who's to blame: how comes helvetica doesn't show up in
fontconfig ? gs-fonts are installed, which is where it should be coming,
shouldn't it ?
User avatar
magick
Site Admin
Posts: 11064
Joined: 2003-05-31T11:32:55-07:00

Re: "montage: unable to read font (null)"

Post by magick »

We can reproduce the problem and have a tentative patch. We added
  • if (type_info == (const TypeInfo *) NULL)
    type_info=GetTypeInfoByFamily("Utopia",draw_info->style,
    draw_info->stretch,draw_info->weight,&image->exception);
just before
  • if (type_info == (const TypeInfo *) NULL)
    type_info=GetTypeInfoByFamily("arial",draw_info->style,
    draw_info->stretch,draw_info->weight,&image->exception);
in magick/annotate.c

This looks for the "Utopia" family presumably available from fontconfig. Is there a better choice for the default font family?
naoliv
Posts: 110
Joined: 2007-12-10T18:54:27-07:00
Location: Brazil

Re: "montage: unable to read font (null)"

Post by naoliv »

Hi!

With the patch applied the problem is still present:
I've just built and installed a set of local imagemagick packages with
the suggested patch from upstream (adding "Utopia" as an alternative
font family) and I'm afraid I have to report that I still get the same
problem:

$ montage IMG_3058.jpg IMG_3059.jpg
montage: unable to read font `(null)' @ error/annotate.c/RenderFreetype/1047.

(the change in line number being purely the addition of the patch).
But there is some light on why ImageMagick isn't finding the ghostscripts fonts, even with them installed:
Nelson A. de Oliveira wrote:
> One thing that I don't understand however (and if somebody knows why,
> I would be grateful for an explanation) is why fontconfig/imagemagick
> doesn't see the ghostscripts fonts (and why it's necessary to
> explicitly include them in type.xml).

Argh ! I was just writing up a long mail explaining that, in part.
I'll send it along in a few minutes.

The thing is that the font "helvetica" doesn't exist as such for
fontconfig, but through something like a matching mechanism:

~ fc-match helvetica
n019003l.pfb: "Nimbus Sans L" "Regular"

The *real* font behind is Nimbus-Sans (in my case, but see the mail
I'll send in a minute).

To do well, on would have to use the equivalent of fc-match somewhere
around the place where imagemagick falls back onto Helvetica as default.
I don't have any idea of how to do that, but I'm pretty sure upstream would.
User avatar
magick
Site Admin
Posts: 11064
Joined: 2003-05-31T11:32:55-07:00

Re: "montage: unable to read font (null)"

Post by magick »

GetTypeInfoByFamily() is similar to fc-match. Can you post the output of
  • identify -list font
That will tell us which fonts are available on your system. Also, see if ImageMagick 6.6.0-6, the lastest release finds a default font. Otherwise we're not sure what the best method to reliably find a default font on a particular system.

We'll also try finding a Debian system so I can debug this problem.
naoliv
Posts: 110
Joined: 2007-12-10T18:54:27-07:00
Location: Brazil

Re: "montage: unable to read font (null)"

Post by naoliv »

http://people.debian.org/~naoliv/misc/i ... fonts1.txt is the output of "identify -list font".
http://people.debian.org/~naoliv/misc/i ... fonts2.txt is the result without including type-ghostscript.xml in type.xml
naoliv
Posts: 110
Joined: 2007-12-10T18:54:27-07:00
Location: Brazil

Re: "montage: unable to read font (null)"

Post by naoliv »

And testing with 6.6.0-6 with type-ghostscript.xml reference removed from type.xml, I still see the same message:

Code: Select all

$ convert -size 320x85 xc:transparent -font Bookman-DemiItalic -pointsize 72 -draw "text 25,60  Magick'" -channel RGBA -blur 0x6 -fill darkred -stroke magenta -draw "text 20,55 'Magick'" output.png

convert: unable to read font `Bookman-DemiItalic' @ warning/annotate.c/RenderType/807.
broucaries
Posts: 467
Joined: 2008-12-21T11:51:10-07:00

Re: "montage: unable to read font (null)"

Post by broucaries »

Any news of this anoyying bug ?

Regards

Bastien
broucaries
Posts: 467
Joined: 2008-12-21T11:51:10-07:00

Re: "montage: unable to read font (null)"

Post by broucaries »

BTW something like this would help you to select a default font

sans = FcPatternBuild (NULL,
FC_FAMILY, FcTypeString, "sans",
FC_PIXEL_SIZE, FcTypeDouble, size,
FC_ANY_METRICS, FcTypeBool, FcTrue,
NULL);

matched = FcFontMatch (NULL, sans, &result);

Bastien
User avatar
magick
Site Admin
Posts: 11064
Joined: 2003-05-31T11:32:55-07:00

Re: "montage: unable to read font (null)"

Post by magick »

Download the latest release and let us know if our patch resolved the problem. And thanks for the tip on using FcFontMatch().
fletcher.mcbeth

Re: "montage: unable to read font (null)"

Post by fletcher.mcbeth »

Using:

ImageMagick-x86_64-apple-darwin10.4.0.tar (ImageMagick-6.6.3) on a MacBookPro Version 10.6.4

With the instruction:

montage [0-9].png -tile 1x10 -geometry 522x304+0+0 strip.png

I get:

montage: unable to read font `(null)' @ error/annotate.c/RenderFreetype/1056.
broucaries
Posts: 467
Joined: 2008-12-21T11:51:10-07:00

Re: "montage: unable to read font (null)"

Post by broucaries »

This bug is still here
User avatar
magick
Site Admin
Posts: 11064
Joined: 2003-05-31T11:32:55-07:00

Re: "montage: unable to read font (null)"

Post by magick »

Do you have an example to reproduce the problem? We're using ImageMagick 6.7.0-9 and we cannot produce an "unable to read font" exception.
broucaries
Posts: 467
Joined: 2008-12-21T11:51:10-07:00

Re: "montage: unable to read font (null)"

Post by broucaries »

config/type.xml is only:
<typemap>
</typemap>

So I use fc by default.

Doing montage rose: fail with exception

Bastien
Post Reply