log modified glyps
This commit is contained in:
parent
1329c8f7db
commit
e94098606b
@ -4,15 +4,22 @@ Requires https://github.com/fonttools/skia-pathops
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
|
import logging
|
||||||
from typing import Iterable, Optional, Mapping
|
from typing import Iterable, Optional, Mapping
|
||||||
|
|
||||||
from fontTools.ttLib import ttFont
|
from fontTools.ttLib import ttFont
|
||||||
from fontTools.ttLib.tables import _g_l_y_f
|
from fontTools.ttLib.tables import _g_l_y_f
|
||||||
|
from fontTools.ttLib.tables import _h_m_t_x
|
||||||
from fontTools.pens.ttGlyphPen import TTGlyphPen
|
from fontTools.pens.ttGlyphPen import TTGlyphPen
|
||||||
|
|
||||||
import pathops
|
import pathops
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["removeOverlaps"]
|
||||||
|
|
||||||
|
|
||||||
|
log = logging.getLogger("fontTools.ttLib.removeOverlaps")
|
||||||
|
|
||||||
_TTGlyphMapping = Mapping[str, ttFont._TTGlyph]
|
_TTGlyphMapping = Mapping[str, ttFont._TTGlyph]
|
||||||
|
|
||||||
|
|
||||||
@ -69,6 +76,38 @@ def ttfGlyphFromSkPath(path: pathops.Path) -> _g_l_y_f.Glyph:
|
|||||||
return glyph
|
return glyph
|
||||||
|
|
||||||
|
|
||||||
|
def removeTTGlyphOverlaps(
|
||||||
|
glyphName: str,
|
||||||
|
glyphSet: _TTGlyphMapping,
|
||||||
|
glyfTable: _g_l_y_f.table__g_l_y_f,
|
||||||
|
hmtxTable: _h_m_t_x.table__h_m_t_x,
|
||||||
|
) -> bool:
|
||||||
|
glyph = glyfTable[glyphName]
|
||||||
|
# decompose composite glyphs only if components overlap each other
|
||||||
|
if (
|
||||||
|
glyph.numberOfContours > 0
|
||||||
|
or glyph.isComposite()
|
||||||
|
and componentsOverlap(glyph, glyphSet)
|
||||||
|
):
|
||||||
|
path = skPathFromGlyph(glyphName, glyphSet)
|
||||||
|
|
||||||
|
# remove overlaps
|
||||||
|
path2 = pathops.simplify(path, clockwise=path.clockwise)
|
||||||
|
|
||||||
|
# replace TTGlyph if simplified path is different
|
||||||
|
if path2 != path:
|
||||||
|
glyfTable[glyphName] = glyph = ttfGlyphFromSkPath(path2)
|
||||||
|
# simplified glyph is always unhinted
|
||||||
|
assert not glyph.program
|
||||||
|
# also ensure hmtx LSB == glyph.xMin so glyph origin is at x=0
|
||||||
|
width, lsb = hmtxTable[glyphName]
|
||||||
|
if lsb != glyph.xMin:
|
||||||
|
hmtxTable[glyphName] = (width, glyph.xMin)
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def removeOverlaps(
|
def removeOverlaps(
|
||||||
font: ttFont.TTFont, glyphNames: Optional[Iterable[str]] = None
|
font: ttFont.TTFont, glyphNames: Optional[Iterable[str]] = None
|
||||||
) -> None:
|
) -> None:
|
||||||
@ -108,28 +147,12 @@ def removeOverlaps(
|
|||||||
name,
|
name,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
modified = set()
|
||||||
for glyphName in glyphNames:
|
for glyphName in glyphNames:
|
||||||
glyph = glyfTable[glyphName]
|
if removeTTGlyphOverlaps(glyphName, glyphSet, glyfTable, hmtxTable):
|
||||||
# decompose composite glyphs only if components overlap each other
|
modified.add(glyphName)
|
||||||
if (
|
|
||||||
glyph.numberOfContours == 0
|
|
||||||
or glyph.isComposite()
|
|
||||||
and not componentsOverlap(glyph, glyphSet)
|
|
||||||
):
|
|
||||||
continue
|
|
||||||
|
|
||||||
path = skPathFromGlyph(glyphName, glyphSet)
|
log.debug("Removed overlaps for %s glyphs:\n%s", len(modified), " ".join(modified))
|
||||||
|
|
||||||
# remove overlaps
|
|
||||||
path2 = pathops.simplify(path, clockwise=path.clockwise)
|
|
||||||
|
|
||||||
# replace TTGlyph if simplified path is different
|
|
||||||
if path2 != path:
|
|
||||||
glyfTable[glyphName] = glyph = ttfGlyphFromSkPath(path2)
|
|
||||||
# also ensure hmtx LSB == glyph.xMin so glyph origin is at x=0
|
|
||||||
width, lsb = hmtxTable[glyphName]
|
|
||||||
if lsb != glyph.xMin:
|
|
||||||
hmtxTable[glyphName] = (width, glyph.xMin)
|
|
||||||
|
|
||||||
|
|
||||||
def main(args=None):
|
def main(args=None):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user