[Scribus] font lint tool

Craig Ringer craig
Tue Sep 4 10:51:41 CEST 2007

gww at silcom.com wrote:
> At the Libre Graphics Meeting in Montreal I was asked by someone from Scribus
> (and I can't recall who any longer) to write a tool for checking that a font was
> valid (didn't have any intersecting contours, had points at the extrema, etc.)
> I have now written this tool, called fontlint.
> It is part of the current release of fontforge.
> http://fontforge.sf.net/

Out of >2000 fonts I've run this on, including the full Adobe OTF
collection, the MS TT core fonts, some scary old clipart CD fonts, and
the Vera series, I've found exactly 16 faces that pass (all from the
Adobe OTF collection).

I realise that, like any `lint'-like tool, it'll identify all sorts of
issues that are routinely worked around in practice or are merely
warnings, but I'm still surprised by the the number of flat out fails.

Is it possible that these fonts are all really that bad? Are there any
quality collections it'll pass?

Maybe the man page (and I'm impressed that there is one) needs to note
that fails are extremely common in widely used sets of commercial fonts.

Here's an example from the OTF collection:

> $ fontlint "Adobe Garamond Pro/AGaramondPro-BoldItalic.otf"
> Copyright (c) 2000-2007 by George Williams.
>  Executable based on sources from 15:43 31-Aug-2007.
> Warning: Mac string is a subset of the Windows string in the 'name' table
>  for the Family string in the English (US) language.
> Warning: Mac and Windows entries in the 'name' table differ for the
>  Styles (SubFamily) string in the language English (US)
>  Mac String: Bold Italic
> Windows String: Italic
> Warning: Mac and Windows entries in the 'name' table differ for the
>  Fullname string in the language English (US)
>  Mac String: Adobe Garamond Pro Bold Italic
> Windows String: AGaramondPro-BoldItalic
> Validation AGaramondPro-BoldItalic ...Failed
>   Missing Points at Extrema

That's the rule rather than the exception for the collection. It seems
believable enough, but very surprising for a font publisher like Adobe.

I haven't been able to try our other collections yet because it doesn't
handle NetATalk's storage format (AppleDouble-encoded resource forks in
.AppleDouble/ subdirs).

Similar issues are reported for many of the MS TT Core fonts, eg:

Validation Arial-Black ...Failed
  Self Intersecting Glyph
  Wrong Direction
  Flipped Reference

though I'm particularly impressed by:

$ fontlint Times_New_Roman.ttf
Warning: Glyph 257 is named middot which should mean it is mapped to
 Unicode U+00B7, but Glyph 194 already has that encoding.
Glyph 1295 is called ".notdef", a singularly inept choice of name (only
glyph 0
 may be called .notdef)
FontForge will rename it.
Validation TimesNewRomanPSMT ...Failed
  Self Intersecting Glyph
  Wrong Direction
  Flipped Reference
  Missing Points at Extrema
  Bad Glyph Name

in that it seems that there's not much they didn't manage to get wrong.

If I run the tool over the entire Adobe OTF library then filter the
output to show only failures other than the apparently universal
"Missing Points at Extrema" error, here's what I get:

> craig at wallace:~/lintout$ grep -A 8 Failed * | gawk ' /^--$/ { next; } /\.\.\Failed$/ { next; } /Missing Points at Extrema$/ { next; } /^.*$/ { print $0; } ' | sort
> ACaslonPro-BoldItalic.otf.txt-  Self Intersecting Glyph
> ACaslonPro-Bold.otf.txt-  Self Intersecting Glyph
> ACaslonPro-Italic.otf.txt-  Self Intersecting Glyph
> ACaslonPro-Italic.otf.txt-  Wrong Direction
> ACaslonPro-Regular.otf.txt-  Self Intersecting Glyph
> ACaslonPro-SemiboldItalic.otf.txt-  Self Intersecting Glyph
> ACaslonPro-SemiboldItalic.otf.txt-  Wrong Direction
> ACaslonPro-Semibold.otf.txt-  Self Intersecting Glyph
> ArcanaGMMStd-Manuscript.otf.txt-  Self Intersecting Glyph
> ArcanaGMMStd-Manuscript.otf.txt-  Wrong Direction
> AstrologyPiLTStd-2.otf.txt-  Wrong Direction
> AuriolLTStd-BlackItalic.otf.txt-  Wrong Direction
> AuriolLTStd-Black.otf.txt-  Wrong Direction
> AuriolLTStd-Bold.otf.txt-  Wrong Direction
> AuriolLTStd.otf.txt-  Wrong Direction
> AvenirLTStd-BlackOblique.otf.txt-  Wrong Direction
> AvenirLTStd-Black.otf.txt-  Wrong Direction
> AvenirLTStd-BookOblique.otf.txt-  Wrong Direction
> AvenirLTStd-Book.otf.txt-  Wrong Direction
> AvenirLTStd-MediumOblique.otf.txt-  Wrong Direction
> AvenirLTStd-Medium.otf.txt-  Wrong Direction
> BemboStd-ExtraBold.otf.txt-  Wrong Direction
> BickhamScriptPro-Bold.otf.txt-  Self Intersecting Glyph
> BickhamScriptPro-Regular.otf.txt-  Self Intersecting Glyph
> BickhamScriptPro-Semibold.otf.txt-  Self Intersecting Glyph
> BlueIslandStd.otf.txt-  Wrong Direction
> BulmerMTStd-BoldItalicDisp.otf.txt-  Wrong Direction
> CaeciliaLTStd-Bold.otf.txt-  Wrong Direction
> CaflischScriptPro-Bold.otf.txt-  Self Intersecting Glyph
> CaflischScriptPro-Semibold.otf.txt-  Self Intersecting Glyph
> Caslon224Std-Black.otf.txt-  Wrong Direction
> CopalStd-Outline.otf.txt-  Wrong Direction
> CritterStd.otf.txt-  Self Intersecting Glyph
> CutoutStd.otf.txt-  Wrong Direction
> DanteMTStd-Bold.otf.txt-  Self Intersecting Glyph
> DecorationPiLTStd-2.otf.txt-  Self Intersecting Glyph
> DecorationPiLTStd-2.otf.txt-  Wrong Direction
> DucDeBerryLTStd.otf.txt-  Wrong Direction
> ExPontoPro-Bold.otf.txt-  Self Intersecting Glyph
> ExPontoPro-Bold.otf.txt-  Wrong Direction
> ExPontoPro-Light.otf.txt-  Self Intersecting Glyph
> ExPontoPro-Light.otf.txt-  Wrong Direction
> ExPontoPro-Regular.otf.txt-  Self Intersecting Glyph
> ExPontoPro-Regular.otf.txt-  Wrong Direction
> FeniceStd-BoldOblique.otf.txt-  Wrong Direction
> FeniceStd-Bold.otf.txt-  Wrong Direction
> FournierMTStd-Italic.otf.txt-  Self Intersecting Glyph
> GalliardStd-Italic.otf.txt-  Wrong Direction
> GalliardStd-Ultra.otf.txt-  Self Intersecting Glyph
> GamePiLTStd-DiceDominoes.otf.txt-  Self Intersecting Glyph
> GamePiLTStd-EnglishCards.otf.txt-  Wrong Direction
> GaramondPremrPro-BdDisp.otf.txt-  Self Intersecting Glyph
> GaramondPremrPro-BdSubh.otf.txt-  Self Intersecting Glyph
> GaramondPremrPro-Disp.otf.txt-  Self Intersecting Glyph
> GaramondPremrPro-SmbdDisp.otf.txt-  Self Intersecting Glyph
> GiddyupStd-Thangs.otf.txt-  Self Intersecting Glyph
> GillSansStd-LightShadowed.otf.txt-  Wrong Direction
> GillSansStd-Shadowed.otf.txt-  Wrong Direction
> HolidayPiLTStd-2.otf.txt-  Self Intersecting Glyph
> HolidayPiLTStd-2.otf.txt-  Wrong Direction
> HolidayPiLTStd-3.otf.txt-  Wrong Direction
> IndustriaLTStd-Inline.otf.txt-  Wrong Direction
> ITCFranklinGothicStd-MedIt.otf.txt-  Wrong Direction
> ITCFranklinGothicStd-Med.otf.txt-  Wrong Direction
> ITCGaramondStd-Bd.otf.txt-  Wrong Direction
> JimboStd-Black.otf.txt-  Self Intersecting Glyph
> KigaliStd-ZigZag.otf.txt-  Wrong Direction
> KinesisStd-Black.otf.txt-  Self Intersecting Glyph
> KinesisStd-Bold.otf.txt-  Self Intersecting Glyph
> KinesisStd-Light.otf.txt-  Self Intersecting Glyph
> KinesisStd-Regular.otf.txt-  Self Intersecting Glyph
> KinesisStd-Semibold.otf.txt-  Self Intersecting Glyph
> MadroneStd.otf.txt-  Wrong Direction
> MathematicalPiLTStd.otf.txt-  Self Intersecting Glyph
> MathematicalPiLTStd.otf.txt-  Wrong Direction
> MeliorLTStd-Bold.otf.txt-  Wrong Direction
> MezzStd-Black.otf.txt-  Wrong Direction
> MezzStd-Bold.otf.txt-  Wrong Direction
> MezzStd-Light.otf.txt-  Wrong Direction
> MezzStd-Regular.otf.txt-  Wrong Direction
> MezzStd-Semibold.otf.txt-  Wrong Direction
> ModernMTStd-Condensed.otf.txt-  Wrong Direction
> MojoStd.otf.txt-  Wrong Direction
> Montara-BoldInitials.otf.txt-  Self Intersecting Glyph
> NeuzeitSLTStd-Book.otf.txt-  Wrong Direction
> NewCenturySchlbkLTStd-Bd.otf.txt-  Wrong Direction
> NovareseStd-Ultra.otf.txt-  Wrong Direction
> NyxStd.otf.txt-  Wrong Direction
> OratorStd.otf.txt-  Wrong Direction
> OratorStd-Slanted.otf.txt-  Wrong Direction
> OrganicaGMMStd-SmSerifRoman.otf.txt-  Self Intersecting Glyph
> PepperwoodStd-Outline.otf.txt-  Wrong Direction
> PepperwoodStd-Regular.otf.txt-  Self Intersecting Glyph
> PostinoStd-Italic.otf.txt-  Wrong Direction
> PostinoStd.otf.txt-  Wrong Direction
> RadStd.otf.txt-  Self Intersecting Glyph
> RockwellStd-Condensed.otf.txt-  Self Intersecting Glyph
> RosewoodStd-Fill.otf.txt-  Wrong Direction
> RosewoodStd-Regular.otf.txt-  Self Intersecting Glyph
> RosewoodStd-Regular.otf.txt-  Wrong Direction
> SavaPro-Black.otf.txt-  Self Intersecting Glyph
> SavaPro-Bold.otf.txt-  Self Intersecting Glyph
> SavaPro-Light.otf.txt-  Self Intersecting Glyph
> SavaPro-Medium.otf.txt-  Self Intersecting Glyph
> SavaPro-Regular.otf.txt-  Self Intersecting Glyph
> SavaPro-Semibold.otf.txt-  Self Intersecting Glyph
> ShoLTStd-Roman.otf.txt-  Wrong Direction
> SonataStd.otf.txt-  Self Intersecting Glyph
> SonataStd.otf.txt-  Wrong Direction
> StempelSchneidlerStd-Black.otf.txt-  Self Intersecting Glyph
> StoneSerifStd-Phonetic.otf.txt-  Self Intersecting Glyph
> TradeGothicLTStd-BoldExt.otf.txt-  Self Intersecting Glyph
> TrajanPro-Bold.otf.txt-  Wrong Direction
> TrajanPro-Regular.otf.txt-  Self Intersecting Glyph
> TrajanPro-Regular.otf.txt-  Wrong Direction
> UmbraStd.otf.txt-  Wrong Direction
> UniversLTStd-ThinUltraCn.otf.txt-  Self Intersecting Glyph
> VectoraLTStd-BoldItalic.otf.txt-  Wrong Direction
> VisigothStd.otf.txt-  Self Intersecting Glyph
> VivaStd-BoldCondensed.otf.txt-  Wrong Direction
> VivaStd-BoldExtraExtended.otf.txt-  Wrong Direction
> VivaStd-Bold.otf.txt-  Wrong Direction
> VivaStd-Condensed.otf.txt-  Wrong Direction
> VivaStd-ExtraExtended.otf.txt-  Wrong Direction
> VivaStd-LightCondensed.otf.txt-  Wrong Direction
> VivaStd-LightExtraExtended.otf.txt-  Wrong Direction
> VivaStd-Light.otf.txt-  Wrong Direction
> VivaStd-Regular.otf.txt-  Wrong Direction
> VolutaScriptPro-Regular.otf.txt-  Self Intersecting Glyph
> VolutaScriptPro-Regular.otf.txt-  Wrong Direction
> WatersTitlingPro-Cn.otf.txt-  Self Intersecting Glyph
> WatersTitlingPro-LtCn.otf.txt-  Self Intersecting Glyph
> WatersTitlingPro-LtScn.otf.txt-  Self Intersecting Glyph
> WatersTitlingPro-Rg.otf.txt-  Self Intersecting Glyph
> WatersTitlingPro-Scn.otf.txt-  Self Intersecting Glyph
> WeidemannStd-BlackItalic.otf.txt-  Wrong Direction
> WiesbadenSwingLTStd-Ding.otf.txt-  Self Intersecting Glyph
> WiesbadenSwingLTStd-Ding.otf.txt-  Too Many Hints
> WoodtypeOrnamentsStd.otf.txt-  Self Intersecting Glyph
> ZapfDingbatsStd.otf.txt-  Self Intersecting Glyph
> ZebrawoodStd-Fill.otf.txt-  Wrong Direction
> craig at wallace:~/lint$

More information about the scribus mailing list