Hi @GeorgSeifert,
Problem 1: Export to UFO crashes Glyphs
When I try to export the font to .ufo
via File > Export > UFO...
, Glyphs crashes immediately. This happens even if I disable automatic feature generation and rely only on my external .fea
files (see below).
I later had to use glyphsLib
in the terminal to convert the .glyphspackage
into UFO, just to continue development externally via fontmake
.
→
Problem 2: Pasting feature code causes crash or freeze
If I try to paste my feature code into the Features panel, the app freezes and crashes. The total feature codebase is over 6,000 lines, split across:
- ~950 class definitions (
+Def_xxx
, +Alt_xxx
)
- ~96 GSUB lookups (each with multiple substitution rules)
- a large
calt
feature that chains all lookups
My assumption was that this crash is due to feature size. But you mentioned it might be caused by unusual data elsewhere in the file. If needed, I’m happy to send the .glyphspackage
version that causes the crash on export, along with the .fea
source.
→
Sample of my feature structure:
Here’s a quick summary of the structure (code sample included below):
languagesystem arab dflt;
- 950 class definitions (some examples below)
- 96 named
lookup
blocks, all for context-based substitutions
- 1
feature calt
calling all 96 lookups
- Total: ~6,125 lines
This structure compiles perfectly via fontmake
, and I’ve tested many times using UFO + ufo2ft
. But inside Glyphs, it crashes when pasted or when attempting export.
→
Questions:
- Is there a known size or structural limit in Glyphs 3 for OpenType features?
- Is there a way to disable compilation during UFO export?
- Should I completely avoid using the feature panel and instead work only via external UFOs?
Thank you for your time and great support.
— Hamzeh Naghdi
→
languagesystem
languagesystem arab dflt;
languagesystem arab FAR;
→
Prefix = All Classes → init + medi + fina
be pe te th no ye (init} + al {fina) → با پا تا ثا نا یا
+Def_001 = [uni0628.init uni067E.init uni062A.init uni062B.init uni0646.init uni06CC.init uni0627.fina];
+Alt_001 = [uni0628.init.001 uni067E.init.001 uni062A.init.001 uni062B.init.001 uni0646.init.001 uni06CC.init.001 uni0627.fina.001];
…
ha {medi} + ye {fina) → ـهی
+Def_954 = [uni0647.medi uni06CC.fina];
+Alt_954 = [uni0647.medi.029 uni06CC.fina.022];
All Classes → Total lines = 3825 lines
→
Prefix = lookups GSUBs
lookup GSUB_001 {
sub +Def_001’ +Def_001 by +Alt_001;
sub +Alt_001 +Def_001’ by +Alt_001;
} GSUB_001;
…
lookup GSUB_096 {
sub +Def_954’ +Def_954 by +Alt_954;
sub +Alt_954 +Def_954’ by +Alt_954;
} GSUB_096;
lookups GSUBs → Total lines = 2196 lines
→
features = calt
feature calt {
script arab;
lookupflag RightToLeft IgnoreMarks;
language dflt;
language FAR;
lookup GSUB_001;
lookup GSUB_002;
lookup GSUB_003;
...
lookup GSUB_094;
lookup GSUB_095;
lookup GSUB_096;
} calt;
feature calt → Total lines = 102 lines
→
All features Code → Total lines = 6125 lines
"Please interpret the +
symbol as @
.
Due to posting limitations with the @
symbol, it was temporarily replaced with +
in the code."