Skip to content

Commit

Permalink
Merge pull request #1952 from anthrotype/fix-merge-os2-mixed-versions
Browse files Browse the repository at this point in the history
[merge] Fix merging different versions of OS/2 table
  • Loading branch information
anthrotype committed May 13, 2020
2 parents c89c948 + b6601f6 commit abf7093
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 3 deletions.
13 changes: 10 additions & 3 deletions Lib/fontTools/merge.py
Original file line number Diff line number Diff line change
Expand Up @@ -291,11 +291,18 @@ def mergeOs2FsType(lst):
'sTypoLineGap': max,
'usWinAscent': max,
'usWinDescent': max,
# Version 2,3,4
# Version 1
'ulCodePageRange1': onlyExisting(bitwise_or),
'ulCodePageRange2': onlyExisting(bitwise_or),
'usMaxContex': onlyExisting(max),
# TODO version 5
# Version 2, 3, 4
'sxHeight': onlyExisting(max),
'sCapHeight': onlyExisting(max),
'usDefaultChar': onlyExisting(first),
'usBreakChar': onlyExisting(first),
'usMaxContext': onlyExisting(max),
# version 5
'usLowerOpticalPointSize': onlyExisting(min),
'usUpperOpticalPointSize': onlyExisting(max),
}

@_add_method(ttLib.getTableClass('OS/2'))
Expand Down
52 changes: 52 additions & 0 deletions Tests/merge_test.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import io
import itertools
from fontTools.misc.py23 import *
from fontTools import ttLib
from fontTools.ttLib.tables._g_l_y_f import Glyph
from fontTools.fontBuilder import FontBuilder
from fontTools.merge import *
import unittest
import pytest


class MergeIntegrationTest(unittest.TestCase):
Expand Down Expand Up @@ -113,6 +118,53 @@ def test_cmap_merge_three_dupes(self):
self.assertEqual(self.merger.duplicateGlyphsPerFont, [{}, {'space#0': 'space#1'}])


def _compile(ttFont):
buf = io.BytesIO()
ttFont.save(buf)
buf.seek(0)
return buf


def _make_fontfile_with_OS2(*, version, **kwargs):
upem = 1000
glyphOrder = [".notdef", "a"]
cmap = {0x61: "a"}
glyphs = {gn: Glyph() for gn in glyphOrder}
hmtx = {gn: (500, 0) for gn in glyphOrder}
names = {"familyName": "TestOS2", "styleName": "Regular"}

fb = FontBuilder(unitsPerEm=upem)
fb.setupGlyphOrder(glyphOrder)
fb.setupCharacterMap(cmap)
fb.setupGlyf(glyphs)
fb.setupHorizontalMetrics(hmtx)
fb.setupHorizontalHeader()
fb.setupNameTable(names)
fb.setupOS2(version=version, **kwargs)

return _compile(fb.font)


def _merge_and_recompile(fontfiles, options=None):
merger = Merger(options)
merged = merger.merge(fontfiles)
buf = _compile(merged)
return ttLib.TTFont(buf)


@pytest.mark.parametrize(
"v1, v2", list(itertools.permutations(range(5+1), 2))
)
def test_merge_OS2_mixed_versions(v1, v2):
# https://github.com/fonttools/fonttools/issues/1865
fontfiles = [
_make_fontfile_with_OS2(version=v1),
_make_fontfile_with_OS2(version=v2),
]
merged = _merge_and_recompile(fontfiles)
assert merged["OS/2"].version == max(v1, v2)


if __name__ == "__main__":
import sys
sys.exit(unittest.main())

0 comments on commit abf7093

Please sign in to comment.