Skip to content

Commit 5809c88

Browse files
Merge pull request #61 from felipesanches/dehint_function
add a `dehinter.font.dehint` method for programs (such as FontBakery) that import dehinter as a dependency
2 parents 8c013cf + ec00bd9 commit 5809c88

File tree

4 files changed

+129
-134
lines changed

4 files changed

+129
-134
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## v3.1.0
4+
- add a `dehinter.font.dehint` function to be used by programs that import dehinter as a module
5+
36
## v3.0.0
47

58
- add support for cvar table removal in variable fonts (backward incompatible change)

lib/dehinter/__main__.py

Lines changed: 16 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -14,37 +14,14 @@
1414

1515
import argparse
1616
import os
17-
import pprint
1817
import sys
1918
from typing import List
2019

2120
from fontTools.ttLib import TTFont # type: ignore
2221

2322
from dehinter import __version__
24-
from dehinter.font import (
25-
has_cvar_table,
26-
has_cvt_table,
27-
has_fpgm_table,
28-
has_hdmx_table,
29-
has_ltsh_table,
30-
has_prep_table,
31-
has_ttfa_table,
32-
has_vdmx_table,
33-
is_truetype_font,
34-
is_variable_font,
35-
remove_cvar_table,
36-
remove_cvt_table,
37-
remove_fpgm_table,
38-
remove_glyf_instructions,
39-
remove_hdmx_table,
40-
remove_ltsh_table,
41-
remove_prep_table,
42-
remove_ttfa_table,
43-
remove_vdmx_table,
44-
update_gasp_table,
45-
update_head_table_flags,
46-
update_maxp_table,
47-
)
23+
from dehinter.font import (dehint,
24+
is_truetype_font)
4825
from dehinter.paths import filepath_exists, get_default_out_path
4926
from dehinter.system import get_filesize
5027

@@ -54,9 +31,6 @@ def main() -> None: # pragma: no cover
5431

5532

5633
def run(argv: List[str]) -> None:
57-
# instantiate pretty printer
58-
pp = pprint.PrettyPrinter(indent=4)
59-
6034
# ===========================================================
6135
# argparse command line argument definitions
6236
# ===========================================================
@@ -132,111 +106,20 @@ def run(argv: List[str]) -> None:
132106
)
133107
sys.exit(1)
134108

135-
if is_variable_font(tt) and not args.keep_cvar:
136-
if has_cvar_table(tt):
137-
remove_cvar_table(tt)
138-
if not has_cvar_table(tt):
139-
print("[-] Removed cvar table")
140-
else: # pragma: no cover
141-
sys.stderr.write(
142-
f"[!] Error: failed to remove cvar table from font{os.linesep}"
143-
)
144-
145-
if not args.keep_cvt:
146-
if has_cvt_table(tt):
147-
remove_cvt_table(tt)
148-
if not has_cvt_table(tt):
149-
print("[-] Removed cvt table")
150-
else: # pragma: no cover
151-
sys.stderr.write(
152-
f"[!] Error: failed to remove cvt table from font{os.linesep}"
153-
)
154-
155-
if not args.keep_fpgm:
156-
if has_fpgm_table(tt):
157-
remove_fpgm_table(tt)
158-
if not has_fpgm_table(tt):
159-
print("[-] Removed fpgm table")
160-
else: # pragma: no cover
161-
sys.stderr.write(
162-
f"[!] Error: failed to remove fpgm table from font{os.linesep}"
163-
)
164-
165-
if not args.keep_hdmx:
166-
if has_hdmx_table(tt):
167-
remove_hdmx_table(tt)
168-
if not has_hdmx_table(tt):
169-
print("[-] Removed hdmx table")
170-
else: # pragma: no cover
171-
sys.stderr.write(
172-
f"[!] Error: failed to remove hdmx table from font{os.linesep}"
173-
)
174-
175-
if not args.keep_ltsh:
176-
if has_ltsh_table(tt):
177-
remove_ltsh_table(tt)
178-
if not has_ltsh_table(tt):
179-
print("[-] Removed LTSH table")
180-
else: # pragma: no cover
181-
sys.stderr.write(
182-
f"[!] Error: failed to remove LTSH table from font{os.linesep}"
183-
)
184-
185-
if not args.keep_prep:
186-
if has_prep_table(tt):
187-
remove_prep_table(tt)
188-
if not has_prep_table(tt):
189-
print("[-] Removed prep table")
190-
else: # pragma: no cover
191-
sys.stderr.write(
192-
f"[!] Error: failed to remove prep table from font{os.linesep}"
193-
)
194-
195-
if not args.keep_ttfa:
196-
if has_ttfa_table(tt):
197-
remove_ttfa_table(tt)
198-
if not has_ttfa_table(tt):
199-
print("[-] Removed TTFA table")
200-
else: # pragma: no cover
201-
sys.stderr.write(
202-
f"[!] Error: failed to remove TTFA table from font{os.linesep}"
203-
)
204-
205-
if not args.keep_vdmx:
206-
if has_vdmx_table(tt):
207-
remove_vdmx_table(tt)
208-
if not has_vdmx_table(tt):
209-
print("[-] Removed VDMX table")
210-
else: # pragma: no cover
211-
sys.stderr.write(
212-
f"[!] Error: failed to remove VDMX table from font{os.linesep}"
213-
)
214-
215-
# (2) Remove glyf table instruction set bytecode
216-
if not args.keep_glyf:
217-
number_glyfs_edited = remove_glyf_instructions(tt)
218-
if number_glyfs_edited > 0:
219-
print(
220-
f"[-] Removed glyf table instruction bytecode from "
221-
f"{number_glyfs_edited} glyphs"
222-
)
223-
224-
# (3) Edit gasp table
225-
if not args.keep_gasp:
226-
if update_gasp_table(tt):
227-
gasp_string = pp.pformat(tt["gasp"].__dict__)
228-
print(f"[Δ] New gasp table values:{os.linesep} {gasp_string}")
229-
230-
# (4) Edit maxp table
231-
if not args.keep_maxp:
232-
if update_maxp_table(tt):
233-
maxp_string = pp.pformat(tt["maxp"].__dict__)
234-
print(f"[Δ] New maxp table values:{os.linesep} {maxp_string}")
235-
236-
# (5) Edit head table flags to clear bit 4
237-
if not args.keep_head:
238-
if update_head_table_flags(tt):
239-
print("[Δ] Cleared bit 4 in head table flags")
109+
dehint(tt,
110+
keep_cvar=args.keep_cvar,
111+
keep_cvt=args.keep_cvt,
112+
keep_fpgm=args.keep_fpgm,
113+
keep_gasp=args.keep_gasp,
114+
keep_glyf=args.keep_glyf,
115+
keep_hdmx=args.keep_hdmx,
116+
keep_head=args.keep_head,
117+
keep_ltsh=args.keep_ltsh,
118+
keep_maxp=args.keep_maxp,
119+
keep_prep=args.keep_prep,
120+
keep_ttfa=args.keep_ttfa,
121+
keep_vdmx=args.keep_vdmx,
122+
verbose=True)
240123

241124
# File write
242125
# ----------

lib/dehinter/font.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,121 @@
1414

1515
import array
1616
import os
17+
import pprint
18+
import sys
1719
from typing import Union
1820

1921
from fontTools import ttLib # type: ignore
2022

2123
from dehinter.bitops import clear_bit_k, is_bit_k_set
2224

25+
# instantiate pretty printer
26+
pp = pprint.PrettyPrinter(indent=4)
27+
28+
29+
# ========================================================
30+
# Core dehinting routine
31+
# ========================================================
32+
def dehint(tt,
33+
keep_cvar=False,
34+
keep_cvt=False,
35+
keep_fpgm=False,
36+
keep_gasp=False,
37+
keep_glyf=False,
38+
keep_hdmx=False,
39+
keep_head=False,
40+
keep_ltsh=False,
41+
keep_maxp=False,
42+
keep_prep=False,
43+
keep_ttfa=False,
44+
keep_vdmx=False,
45+
verbose=True):
46+
def report_actions(table, has_table):
47+
if not has_table:
48+
print(f"[-] Removed {table} table")
49+
else: # pragma: no cover
50+
sys.stderr.write(
51+
f"[!] Error: failed to remove {table} table from font{os.linesep}"
52+
)
53+
54+
if is_variable_font(tt) and not keep_cvar:
55+
if has_cvar_table(tt):
56+
remove_cvar_table(tt)
57+
if verbose:
58+
report_actions("cvar", has_cvar_table(tt))
59+
60+
if not keep_cvt:
61+
if has_cvt_table(tt):
62+
remove_cvt_table(tt)
63+
if verbose:
64+
report_actions("cvt", has_cvt_table(tt))
65+
66+
if not keep_fpgm:
67+
if has_fpgm_table(tt):
68+
remove_fpgm_table(tt)
69+
if verbose:
70+
report_actions("fpgm", has_fpgm_table(tt))
71+
72+
if not keep_hdmx:
73+
if has_hdmx_table(tt):
74+
remove_hdmx_table(tt)
75+
if verbose:
76+
report_actions("hdmx", has_hdmx_table(tt))
77+
78+
if not keep_ltsh:
79+
if has_ltsh_table(tt):
80+
remove_ltsh_table(tt)
81+
if verbose:
82+
report_actions("LTSH", has_ltsh_table(tt))
83+
84+
if not keep_prep:
85+
if has_prep_table(tt):
86+
remove_prep_table(tt)
87+
if verbose:
88+
report_actions("prep", has_prep_table(tt))
89+
90+
if not keep_ttfa:
91+
if has_ttfa_table(tt):
92+
remove_ttfa_table(tt)
93+
if verbose:
94+
report_actions("ttfa", has_ttfa_table(tt))
95+
96+
if not keep_vdmx:
97+
if has_vdmx_table(tt):
98+
remove_vdmx_table(tt)
99+
if verbose:
100+
report_actions("VDMX", has_vdmx_table(tt))
101+
102+
# (2) Remove glyf table instruction set bytecode
103+
if not keep_glyf:
104+
number_glyfs_edited = remove_glyf_instructions(tt)
105+
if number_glyfs_edited > 0:
106+
if verbose:
107+
print(
108+
f"[-] Removed glyf table instruction bytecode from "
109+
f"{number_glyfs_edited} glyphs"
110+
)
111+
112+
# (3) Edit gasp table
113+
if not keep_gasp:
114+
if update_gasp_table(tt):
115+
gasp_string = pp.pformat(tt["gasp"].__dict__)
116+
if verbose:
117+
print(f"[Δ] New gasp table values:{os.linesep} {gasp_string}")
118+
119+
# (4) Edit maxp table
120+
if not keep_maxp:
121+
if update_maxp_table(tt):
122+
maxp_string = pp.pformat(tt["maxp"].__dict__)
123+
if verbose:
124+
print(f"[Δ] New maxp table values:{os.linesep} {maxp_string}")
125+
126+
# (5) Edit head table flags to clear bit 4
127+
if not keep_head:
128+
if update_head_table_flags(tt):
129+
if verbose:
130+
print("[Δ] Cleared bit 4 in head table flags")
131+
23132

24133
# ========================================================
25134
# Utilities

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
REQUIRES_PYTHON = ">=3.6.0"
1414

1515
INSTALL_REQUIRES = [
16-
"fontTools==4.22.1",
16+
"fontTools",
1717
]
1818
# Optional packages
1919
EXTRAS_REQUIRES = {

0 commit comments

Comments
 (0)