OTF/CFF global/local subroutines

TLDR: in CFF is it legal to call a local subroutine from a global subroutine?
Hi everyone,
I'm currently working on some software that parses/manipulates charstrings that represent the glyphs in CFF (Compact Font Format) fonts.
While working on the part that handles global and local subroutines, I was initially working under the assumption that:
- charstrings can call local and global subroutines (i.e. use
callsubr
andcallgsubr
) - local subroutines can call other local and global subroutines (i.e. use
callsubr
andcallgsubr
) - global subroutines can only call other global subroutines (i.e. use
callgsubr
)
however, this seems not to be the case: when I ran some tests on a number of font files, I discovered that for example in "Nimbus Roman Italic" (a standard font installed on Ubuntu Linux) global subroutines exist that contain the callsubr
opcode, thereby trying to call local subroutines.
In the context of OTF fonts this can be worked around relatively unambiguously as OTF restricts CFF to contain only one CharSet and therefore only one private dict with local subroutines. But in a general case this seems like a bad idea.
Question:
- did I misunderstand the restrictions? (i.e. is this in fact legal behavior?)
- or are those font-files ill-formed?
Categories
- All Categories
- 46 Introductions
- 3.8K Typeface Design
- 478 Type Design Critiques
- 556 Type Design Software
- 1.1K Type Design Technique & Theory
- 644 Type Business
- 834 Font Technology
- 29 Punchcutting
- 511 Typography
- 120 Type Education
- 316 Type History
- 75 Type Resources
- 109 Lettering and Calligraphy
- 30 Lettering Critiques
- 79 Lettering Technique & Theory
- 535 Announcements
- 86 Events
- 110 Job Postings
- 168 Type Releases
- 170 Miscellaneous News
- 274 About TypeDrawers
- 53 TypeDrawers Announcements
- 119 Suggestions and Bug Reports