mirror of
https://github.com/curioustorvald/Terrarum-sans-bitmap.git
synced 2026-03-07 20:01:52 +09:00
fix: diacritics not stacking
This commit is contained in:
Binary file not shown.
@@ -1485,6 +1485,7 @@ def _generate_mark(glyphs, has):
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
lines = []
|
lines = []
|
||||||
|
mark_anchors = {} # cp -> mark_x, for MarkToMark mark2 anchor computation
|
||||||
|
|
||||||
_align_suffix = {
|
_align_suffix = {
|
||||||
SC.ALIGN_LEFT: 'l',
|
SC.ALIGN_LEFT: 'l',
|
||||||
@@ -1529,6 +1530,7 @@ def _generate_mark(glyphs, has):
|
|||||||
# ALIGN_LEFT / ALIGN_BEFORE: mark sits at base origin.
|
# ALIGN_LEFT / ALIGN_BEFORE: mark sits at base origin.
|
||||||
mark_x = 0
|
mark_x = 0
|
||||||
mark_y = SC.ASCENT
|
mark_y = SC.ASCENT
|
||||||
|
mark_anchors[cp] = mark_x
|
||||||
lines.append(
|
lines.append(
|
||||||
f"markClass {glyph_name(cp)} <anchor {mark_x} {mark_y}> {class_name};"
|
f"markClass {glyph_name(cp)} <anchor {mark_x} {mark_y}> {class_name};"
|
||||||
)
|
)
|
||||||
@@ -1608,12 +1610,53 @@ def _generate_mark(glyphs, has):
|
|||||||
lines.append("")
|
lines.append("")
|
||||||
lookup_names.append(lookup_name)
|
lookup_names.append(lookup_name)
|
||||||
|
|
||||||
# Register mark lookups under DFLT (for Latin, etc.)
|
# --- MarkToMark lookups for diacritics stacking ---
|
||||||
|
# When multiple marks of the same type stack on a base, MarkToMark
|
||||||
|
# positions each successive mark relative to the previous one,
|
||||||
|
# shifted by H_DIACRITICS pixels in the stacking direction.
|
||||||
|
mkmk_lookup_names = []
|
||||||
|
for (mark_type, align, is_dia), mark_list in sorted(mark_groups.items()):
|
||||||
|
stacking_marks = [(cp, g) for cp, g in mark_list
|
||||||
|
if g.props.stack_where in (SC.STACK_UP,
|
||||||
|
SC.STACK_DOWN,
|
||||||
|
SC.STACK_UP_N_DOWN)]
|
||||||
|
if not stacking_marks:
|
||||||
|
continue
|
||||||
|
|
||||||
|
suffix = _align_suffix.get(align, 'x')
|
||||||
|
class_name = f"@mark_t{mark_type}_{suffix}" + ("_dia" if is_dia else "")
|
||||||
|
mkmk_name = f"mkmk_t{mark_type}_{suffix}" + ("_dia" if is_dia else "")
|
||||||
|
lines.append(f"lookup {mkmk_name} {{")
|
||||||
|
|
||||||
|
for cp, g in stacking_marks:
|
||||||
|
mx = mark_anchors.get(cp, 0)
|
||||||
|
if g.props.stack_where in (SC.STACK_UP, SC.STACK_UP_N_DOWN):
|
||||||
|
m2y = SC.ASCENT + SC.H_DIACRITICS * SC.SCALE
|
||||||
|
else: # STACK_DOWN
|
||||||
|
m2y = SC.ASCENT - SC.H_DIACRITICS * SC.SCALE
|
||||||
|
lines.append(
|
||||||
|
f" pos mark {glyph_name(cp)}"
|
||||||
|
f" <anchor {mx} {m2y}> mark {class_name};"
|
||||||
|
)
|
||||||
|
|
||||||
|
lines.append(f"}} {mkmk_name};")
|
||||||
|
lines.append("")
|
||||||
|
mkmk_lookup_names.append(mkmk_name)
|
||||||
|
|
||||||
|
# Register MarkToBase lookups under DFLT (for Latin, etc.)
|
||||||
lines.append("feature mark {")
|
lines.append("feature mark {")
|
||||||
for ln in lookup_names:
|
for ln in lookup_names:
|
||||||
lines.append(f" lookup {ln};")
|
lines.append(f" lookup {ln};")
|
||||||
lines.append("} mark;")
|
lines.append("} mark;")
|
||||||
|
|
||||||
|
# Register MarkToMark lookups under mkmk
|
||||||
|
if mkmk_lookup_names:
|
||||||
|
lines.append("")
|
||||||
|
lines.append("feature mkmk {")
|
||||||
|
for ln in mkmk_lookup_names:
|
||||||
|
lines.append(f" lookup {ln};")
|
||||||
|
lines.append("} mkmk;")
|
||||||
|
|
||||||
# For Devanagari, HarfBuzz's Indic v2 shaper uses abvm/blwm
|
# For Devanagari, HarfBuzz's Indic v2 shaper uses abvm/blwm
|
||||||
# features for mark positioning, not the generic 'mark' feature.
|
# features for mark positioning, not the generic 'mark' feature.
|
||||||
# Register the same lookups under abvm for dev2 script.
|
# Register the same lookups under abvm for dev2 script.
|
||||||
@@ -1622,6 +1665,8 @@ def _generate_mark(glyphs, has):
|
|||||||
lines.append(" script dev2;")
|
lines.append(" script dev2;")
|
||||||
for ln in lookup_names:
|
for ln in lookup_names:
|
||||||
lines.append(f" lookup {ln};")
|
lines.append(f" lookup {ln};")
|
||||||
|
for ln in mkmk_lookup_names:
|
||||||
|
lines.append(f" lookup {ln};")
|
||||||
lines.append("} abvm;")
|
lines.append("} abvm;")
|
||||||
|
|
||||||
return '\n'.join(lines)
|
return '\n'.join(lines)
|
||||||
|
|||||||
Reference in New Issue
Block a user