Skip to contentSkip to conversation

Allow imagemagick to find ghostscript fonts.

PATCH New Ricardo Martincoski 2 participants 3 messages Feb 9, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Allow imagemagick to find ghostscript fonts.

Hello all,

I don't need this patch for my own personal use, but I took a look into it.

Quoted 3 lines · Thomas Petazzoni

Could you give a specific example use of imagemagick that triggers this problem, so that we can reproduce the problem on our side and investigate the possible solutions?

Using this config with the master branch:
BR2_PACKAGE_IMAGEMAGICK=y BR2_PACKAGE_GHOSTSCRIPT_FONTS=y BR2_PACKAGE_FREETYPE=y
The problem can be triggered by converting any text file to ps

$ cd /tmp ; echo -e 'text 1\ntext 2' > file.txt ; convert file.txt file.ps

And doing this on the target works around the problem

$ sed -e s,/usr/share/fonts/type1/gsfonts,/usr/share/fonts/gs,g -i /etc/ImageMagick-6/type-ghostscript.xml
Quoted 9 lines · Baruch Siach
Quoted 8 lines · grepper
Quoted 7 lines · Baruch Siach
Quoted 6 lines · grepper

From: Robert Sohn <[email protected]>

It appears that Imagemagick needs to be configured with
--with-gs-font-dir=/usr/share/fonts/gs else it will not find
the ghostscript fonts and /etc/ImageMagick-6/type-ghostscript.xml will contain the wrong font paths. You end up with messages like:

The wrong path is the default for debian-based distros /usr/share/fonts/type1/gsfonts/ # debian non-x11, default for imagemagick
/usr/share/fonts/X11/Type1/ # debian x11

An alternative solution would be to have the fonts installed to this location +++ b/package/ghostscript-fonts/ghostscript-fonts.mk
@@@ -13,1 -13,1 +13,1 @@@ GHOSTSCRIPT_FONTS_LICENSE_FILES = COPYI --GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/gs ++GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/type1/gsfonts

I don't see from
grep -w '\(gs\|ghostscript-fonts\|GHOSTSCRIPT_FONTS_\)' -R package/ any explicit use of this path nor hard dependency.
But changing it can potentially break packages (in runtime!) if them expect the fonts to be installed in the current location.

Does anyone know an example of package that would break?

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

Magick: unable to read font `(null)' @ error/annotate.c/RenderFreetype/1153 They are non-fatal but could get annoying fast if you are using 'convert'

The error is non-fatal in a batch conversion. But each error means a file failed to be converted. The output is not generated for the failed file.

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

on a lot of files.

---
 package/imagemagick/imagemagick.mk | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines

package/imagemagick/imagemagick.mk IMAGEMAGICK_CONF_OPTS = \ · line 37

Quoted 11 lines
package/imagemagick/imagemagick.mk +2 -1
index 298d0a8..1abb2a8 100644
@@ -33,7 +33,8 @@ IMAGEMAGICK_CONF_OPTS = \
 	--without-dps \
 	--without-gslib \
 	--without-fpx \
-	--without-x
+	--without-x \
+	--with-gs-font-dir=/usr/share/fonts/gs

Configuring unconditionally does not seem so bad in this case, IMO. The configured path will be added to an XML that will be used at runtime. If freetype support is not compiled in or the fonts are not installed, /convert/ would fail anyway.

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

These fonts are only available when the ghostscript-fonts is built, isn't it?

Yes.

Quoted 5 lines
Quoted 5 lines
Quoted 5 lines

If so, then this should be

ifeq ($(BR2_PACKAGE_GHOSTSCRIPT_FONTS),y) IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=/usr/share/fonts/gs endif

BR2_PACKAGE_FREETYPE is also needed.

Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

Or maybe we should use $(GHOSTSCRIPT_FONTS_TARGET_DIR) here, instead of duplicating it?

It seems good practice to me.
But we can't use GHOSTSCRIPT_FONTS_TARGET_DIR as is, it is prefixed with TARGET_DIR. We could create an auxiliary symbol

+++ b/package/ghostscript-fonts/ghostscript-fonts.mk
@@@ -13,1 -13,1 +13,2 @@@ GHOSTSCRIPT_FONTS_LICENSE_FILES = COPYI --GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/gs ++GHOSTSCRIPT_FONTS_DIR = /usr/share/fonts/gs ++GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/$(GHOSTSCRIPT_FONTS_DIR) +++ b/package/imagemagick/imagemagick.mk
@@@ -37,1 -37,1 +37,1 @@@ IMAGEMAGICK_CONF_OPTS =
-- --with-gs-font-dir=/usr/share/fonts/gs
++ --with-gs-font-dir=$(GHOSTSCRIPT_FONTS_DIR)

Quoted 11 lines
Quoted 3 lines

Hm, the problem is that the issue will remain if ghostscript-fonts are not installed. I don't know the solution to that.

The usual way to set a dependency package is to add a 'select' statement for that package in Config.in. In this case ghostscript-fonts is not a hard dependency, because imagemagick is quite functional without it, and its size is non negligible. Maybe adding a comment to the help text in Config.in would suffice.

What do others think?

Adding a comment to the Config.in sounds reasonable to me. One would need both BR2_PACKAGE_FREETYPE as optional build dependency and BR2_PACKAGE_GHOSTSCRIPT_FONTS as optional runtime dependency to get the conversion txt -> ps to work.

Regards,
Ricardo

#1 lore raw

PATCH 1/1 Allow imagemagick to find ghostscript fonts.

Ricardo, All,

On 2016-02-09 02:29 -0200, Ricardo Martincoski spake thusly:

Quoted 1 line

I don't need this patch for my own personal use, but I took a look into it.

Thank you, this is very much appreciated! :-)

Quoted 11 lines · Thomas Petazzoni
Quoted 3 lines

Could you give a specific example use of imagemagick that triggers this problem, so that we can reproduce the problem on our side and investigate the possible solutions?

Using this config with the master branch:
BR2_PACKAGE_IMAGEMAGICK=y BR2_PACKAGE_GHOSTSCRIPT_FONTS=y BR2_PACKAGE_FREETYPE=y
The problem can be triggered by converting any text file to ps

$ cd /tmp ; echo -e 'text 1\ntext 2' > file.txt ; convert file.txt file.ps

Aha, so that is the root of the problem. Thanks for the explanations.

[--SNIP--]

Quoted 10 lines

The wrong path is the default for debian-based distros /usr/share/fonts/type1/gsfonts/ # debian non-x11, default for imagemagick
/usr/share/fonts/X11/Type1/ # debian x11

An alternative solution would be to have the fonts installed to this location +++ b/package/ghostscript-fonts/ghostscript-fonts.mk

(quoted diff) +1 -1
@@@ -13,1 -13,1 +13,1 @@@ GHOSTSCRIPT_FONTS_LICENSE_FILES = COPYI
--GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/gs
++GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/type1/gsfonts
Quoted 5 lines

I don't see from
grep -w '\(gs\|ghostscript-fonts\|GHOSTSCRIPT_FONTS_\)' -R package/ any explicit use of this path nor hard dependency.
But changing it can potentially break packages (in runtime!) if them expect the fonts to be installed in the current location.

And why not symlink the former to the latter?

Quoted 8 lines

Does anyone know an example of package that would break?

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

Magick: unable to read font `(null)' @ error/annotate.c/RenderFreetype/1153 They are non-fatal but could get annoying fast if you are using 'convert'

The error is non-fatal in a batch conversion. But each error means a file failed to be converted. The output is not generated for the failed file.

This is a sad decision not to fail in that case... :-(

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

on a lot of files.

---
 package/imagemagick/imagemagick.mk | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Quoted 16 lines
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines

package/imagemagick/imagemagick.mk IMAGEMAGICK_CONF_OPTS = \ · line 37

Quoted 11 lines
package/imagemagick/imagemagick.mk +2 -1
index 298d0a8..1abb2a8 100644
@@ -33,7 +33,8 @@ IMAGEMAGICK_CONF_OPTS = \
 	--without-dps \
 	--without-gslib \
 	--without-fpx \
-	--without-x
+	--without-x \
+	--with-gs-font-dir=/usr/share/fonts/gs

Configuring unconditionally does not seem so bad in this case, IMO. The configured path will be added to an XML that will be used at runtime. If freetype support is not compiled in or the fonts are not installed, /convert/ would fail anyway.

The best would probbly to do something like Thomas suggested:

Quoted 4 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

ifeq ($(BR2_PACKAGE_GHOSTSCRIPT_FONTS),y) IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=/usr/share/fonts/gs endif

BR2_PACKAGE_FREETYPE is also needed.

    ifeq ($(BR2_PACKAGE_FREETYPE)$(BR2_PACKAGE_GHOSTSCRIPT_FONTS),yy)
    IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=/usr/share/fonts/gs
    endif

But with the symlink I suggested above, that might not even be necessary, would it?

Quoted 6 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

Or maybe we should use $(GHOSTSCRIPT_FONTS_TARGET_DIR) here, instead of duplicating it?

It seems good practice to me.
But we can't use GHOSTSCRIPT_FONTS_TARGET_DIR as is, it is prefixed with TARGET_DIR. We could create an auxiliary symbol

Then what about:

    package/ghostscript-fonts/ghostscript-fonts.mk;
        GHOSTSCRIPT_FONTS_DIR = /usr/share/fonts/gs
        GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/$(GHOSTSCRIPT_FONTS_DIR)

    package/imagemagick/imagemagick.mk:
        ifeq ($(BR2_PACKAGE_FREETYPE)$(BR2_PACKAGE_GHOSTSCRIPT_FONTS),yy)
        IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=$(GHOSTSCRIPT_FONTS_DIR)
        endif
Quoted 9 lines
Quoted 9 lines
Quoted 2 lines

Hm, the problem is that the issue will remain if ghostscript-fonts are not installed. I don't know the solution to that.

The usual way to set a dependency package is to add a 'select' statement for that package in Config.in. In this case ghostscript-fonts is not a hard dependency, because imagemagick is quite functional without it, and its size is non negligible. Maybe adding a comment to the help text in Config.in would suffice.

Quoted 6 lines
Quoted 1 line

What do others think?

Adding a comment to the Config.in sounds reasonable to me. One would need both BR2_PACKAGE_FREETYPE as optional build dependency and BR2_PACKAGE_GHOSTSCRIPT_FONTS as optional runtime dependency to get the conversion txt -> ps to work.

Well, since it is an *optional* and *runtime* dependency, then there is rally nothing to do, neither in the Config.in nor in the .mk.

However, if we want to be a little bit user-friendly, we could add a Config.in opiton in ImageMagick, like:

config BR2_PACKAGE_IMAGEMAGICK_TXT_PS
bool "support txt->ps conversion" select BR2_PACKAGE_FREETYPE # runtime select BR2_PACKAGE_GHOSTSCRIPT_FONTS # runtime

(with the appropriate "depends on" to propagate freetype's and ghostscript-fonts' own dependencies...

Anyway, thanks a lot Ricardo for the thorough and detailed explanations. It was really useful. :-)

Regards,
Yann E. MORIN.

Signature · 6 lines
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
#2 lore raw

PATCH 1/1 Allow imagemagick to find ghostscript fonts.

Yann E. MORIN, All,

I tried to reply to 2 mails at once. Sorry I created some confusion.

Quoted 1 line · Yann E. MORIN

On 2016-02-09 02:29 -0200, Ricardo Martincoski spake thusly:

[SNIP]

Quoted 5 lines
Quoted 5 lines · Thomas Petazzoni
Quoted 3 lines

Could you give a specific example use of imagemagick that triggers this problem, so that we can reproduce the problem on our side and investigate the possible solutions?

Quoted 8 lines
Quoted 6 lines

Using this config with the master branch:
BR2_PACKAGE_IMAGEMAGICK=y BR2_PACKAGE_GHOSTSCRIPT_FONTS=y BR2_PACKAGE_FREETYPE=y
The problem can be triggered by converting any text file to ps

$ cd /tmp ; echo -e 'text 1\ntext 2' > file.txt ; convert file.txt file.ps

Aha, so that is the root of the problem. Thanks for the explanations.

---------------------------------------------------------------
--- end of the reply to Thomas and begin of reply to Baruch ---
---------------------------------------------------------------

Quoted 2 lines

[--SNIP--]

[UN-SNIP]

Quoted 5 lines · Yann E. MORIN

On 2016-02-09 02:29 -0200, Ricardo Martincoski spake thusly:

Quoted 4 lines · Baruch Siach
Quoted 3 lines · grepper
Quoted 2 lines · Baruch Siach
Quoted 1 line · grepper

[/UN-SNIP]

Quoted 10 lines
Quoted 10 lines

The wrong path is the default for debian-based distros /usr/share/fonts/type1/gsfonts/ # debian non-x11, default for imagemagick
/usr/share/fonts/X11/Type1/ # debian x11

An alternative solution would be to have the fonts installed to this location +++ b/package/ghostscript-fonts/ghostscript-fonts.mk

(quoted diff) +1 -1
@@@ -13,1 -13,1 +13,1 @@@ GHOSTSCRIPT_FONTS_LICENSE_FILES = COPYI
--GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/gs
++GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/usr/share/fonts/type1/gsfonts
Quoted 7 lines
Quoted 5 lines

I don't see from
grep -w '\(gs\|ghostscript-fonts\|GHOSTSCRIPT_FONTS_\)' -R package/ any explicit use of this path nor hard dependency.
But changing it can potentially break packages (in runtime!) if them expect the fonts to be installed in the current location.

And why not symlink the former to the latter?

Symlink seems an acceptable solution to me.

Quoted 36 lines
Quoted 9 lines

Does anyone know an example of package that would break?

Quoted 2 lines
Quoted 2 lines
Quoted 2 lines
Quoted 2 lines

Magick: unable to read font `(null)' @ error/annotate.c/RenderFreetype/1153 They are non-fatal but could get annoying fast if you are using 'convert'

The error is non-fatal in a batch conversion. But each error means a file failed to be converted. The output is not generated for the failed file.

This is a sad decision not to fail in that case... :-(

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

on a lot of files.

---
 package/imagemagick/imagemagick.mk | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
Quoted 16 lines
Quoted 11 lines
Quoted 11 lines
Quoted 11 lines

package/imagemagick/imagemagick.mk IMAGEMAGICK_CONF_OPTS = \ · line 37

Quoted 11 lines
package/imagemagick/imagemagick.mk +2 -1
index 298d0a8..1abb2a8 100644
@@ -33,7 +33,8 @@ IMAGEMAGICK_CONF_OPTS = \
 	--without-dps \
 	--without-gslib \
 	--without-fpx \
-	--without-x
+	--without-x \
+	--with-gs-font-dir=/usr/share/fonts/gs

Configuring unconditionally does not seem so bad in this case, IMO. The configured path will be added to an XML that will be used at runtime. If freetype support is not compiled in or the fonts are not installed, /convert/ would fail anyway.

Quoted 1 line

The best would probbly to do something like Thomas suggested:

Actually it was Baruch who suggested, see my UN-SNIP above

Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines
Quoted 4 lines

ifeq ($(BR2_PACKAGE_GHOSTSCRIPT_FONTS),y) IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=/usr/share/fonts/gs endif

Quoted 8 lines
Quoted 1 line

BR2_PACKAGE_FREETYPE is also needed.

    ifeq ($(BR2_PACKAGE_FREETYPE)$(BR2_PACKAGE_GHOSTSCRIPT_FONTS),yy)
    IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=/usr/share/fonts/gs
    endif

But with the symlink I suggested above, that might not even be necessary, would it?

No. Not necessary.

Quoted 10 lines
Quoted 7 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines

Or maybe we should use $(GHOSTSCRIPT_FONTS_TARGET_DIR) here, instead of duplicating it?

It seems good practice to me.
But we can't use GHOSTSCRIPT_FONTS_TARGET_DIR as is, it is prefixed with TARGET_DIR. We could create an auxiliary symbol

Then what about:

Quoted 8 lines
    package/ghostscript-fonts/ghostscript-fonts.mk;
        GHOSTSCRIPT_FONTS_DIR = /usr/share/fonts/gs
        GHOSTSCRIPT_FONTS_TARGET_DIR = $(TARGET_DIR)/$(GHOSTSCRIPT_FONTS_DIR)

    package/imagemagick/imagemagick.mk:
        ifeq ($(BR2_PACKAGE_FREETYPE)$(BR2_PACKAGE_GHOSTSCRIPT_FONTS),yy)
        IMAGEMAGICK_CONF_OPTS += --with-gs-font-dir=$(GHOSTSCRIPT_FONTS_DIR)
        endif

I have no strong opinion among the discussed solutions (or any combination):
1) symlink for font dir
2) configure path
3) user-friendly entry on the menu

Quoted 20 lines
Quoted 10 lines
Quoted 10 lines
Quoted 3 lines

Hm, the problem is that the issue will remain if ghostscript-fonts are not installed. I don't know the solution to that.

The usual way to set a dependency package is to add a 'select' statement for that package in Config.in. In this case ghostscript-fonts is not a hard dependency, because imagemagick is quite functional without it, and its size is non negligible. Maybe adding a comment to the help text in Config.in would suffice.

Quoted 6 lines
Quoted 1 line

What do others think?

Adding a comment to the Config.in sounds reasonable to me. One would need both BR2_PACKAGE_FREETYPE as optional build dependency and BR2_PACKAGE_GHOSTSCRIPT_FONTS as optional runtime dependency to get the conversion txt -> ps to work.

Well, since it is an *optional* and *runtime* dependency, then there is rally nothing to do, neither in the Config.in nor in the .mk.

Quoted 6 lines

However, if we want to be a little bit user-friendly, we could add a Config.in opiton in ImageMagick, like:

config BR2_PACKAGE_IMAGEMAGICK_TXT_PS
bool "support txt->ps conversion"
select BR2_PACKAGE_FREETYPE # runtime

freetype is build time

Quoted 7 lines

select BR2_PACKAGE_GHOSTSCRIPT_FONTS # runtime

(with the appropriate "depends on" to propagate freetype's and ghostscript-fonts' own dependencies...

Anyway, thanks a lot Ricardo for the thorough and detailed explanations. It was really useful. :-)

You are welcome.

Regards,
Ricardo