Merge pull request #3336 from fonttools/fix-os2-cp-ranges-error
Fix os2 cp ranges error
This commit is contained in:
commit
21124cf9e4
@ -3455,7 +3455,9 @@ class Subsetter(object):
|
||||
log.info(
|
||||
"%s Unicode ranges pruned: %s", tag, sorted(new_uniranges)
|
||||
)
|
||||
if self.options.prune_codepage_ranges:
|
||||
if self.options.prune_codepage_ranges and font[tag].version >= 1:
|
||||
# codepage range fields were added with OS/2 format 1
|
||||
# https://learn.microsoft.com/en-us/typography/opentype/spec/os2#version-1
|
||||
old_codepages = font[tag].getCodePageRanges()
|
||||
new_codepages = font[tag].recalcCodePageRanges(font, pruneOnly=True)
|
||||
if old_codepages != new_codepages:
|
||||
|
@ -343,6 +343,8 @@ class table_O_S_2f_2(DefaultTable.DefaultTable):
|
||||
def getCodePageRanges(self):
|
||||
"""Return the set of 'ulCodePageRange*' bits currently enabled."""
|
||||
bits = set()
|
||||
if self.version < 1:
|
||||
return bits
|
||||
ul1, ul2 = self.ulCodePageRange1, self.ulCodePageRange2
|
||||
for i in range(32):
|
||||
if ul1 & (1 << i):
|
||||
@ -361,6 +363,8 @@ class table_O_S_2f_2(DefaultTable.DefaultTable):
|
||||
ul2 |= 1 << (bit - 32)
|
||||
else:
|
||||
raise ValueError(f"expected 0 <= int <= 63, found: {bit:r}")
|
||||
if self.version < 1:
|
||||
self.version = 1
|
||||
self.ulCodePageRange1, self.ulCodePageRange2 = ul1, ul2
|
||||
|
||||
def recalcCodePageRanges(self, ttFont, pruneOnly=False):
|
||||
|
@ -8,6 +8,7 @@ class OS2TableTest(unittest.TestCase):
|
||||
def makeOS2_cmap(mapping):
|
||||
font = TTFont()
|
||||
font["OS/2"] = os2 = newTable("OS/2")
|
||||
os2.version = 4
|
||||
font["cmap"] = cmap = newTable("cmap")
|
||||
st = getTableModule("cmap").CmapSubtable.newSubtable(4)
|
||||
st.platformID, st.platEncID, st.language = 3, 1, 0
|
||||
@ -64,6 +65,11 @@ class OS2TableTest(unittest.TestCase):
|
||||
|
||||
def test_getCodePageRanges(self):
|
||||
table = table_O_S_2f_2()
|
||||
# version 0 doesn't define these fields so by definition defines no cp ranges
|
||||
table.version = 0
|
||||
self.assertEqual(table.getCodePageRanges(), set())
|
||||
# version 1 and above do contain ulCodePageRange1 and 2 fields
|
||||
table.version = 1
|
||||
table.ulCodePageRange1 = 0xFFFFFFFF
|
||||
table.ulCodePageRange2 = 0xFFFFFFFF
|
||||
bits = table.getCodePageRanges()
|
||||
@ -72,6 +78,7 @@ class OS2TableTest(unittest.TestCase):
|
||||
|
||||
def test_setCodePageRanges(self):
|
||||
table = table_O_S_2f_2()
|
||||
table.version = 4
|
||||
table.ulCodePageRange1 = 0
|
||||
table.ulCodePageRange2 = 0
|
||||
bits = set(range(64))
|
||||
@ -84,6 +91,16 @@ class OS2TableTest(unittest.TestCase):
|
||||
with self.assertRaises(ValueError):
|
||||
table.setCodePageRanges([255])
|
||||
|
||||
def test_setCodePageRanges_bump_version(self):
|
||||
# Setting codepage ranges on a OS/2 table version 0 automatically makes it
|
||||
# a version 1 table
|
||||
table = table_O_S_2f_2()
|
||||
table.version = 0
|
||||
self.assertEqual(table.getCodePageRanges(), set())
|
||||
table.setCodePageRanges({0, 1, 2})
|
||||
self.assertEqual(table.getCodePageRanges(), {0, 1, 2})
|
||||
self.assertEqual(table.version, 1)
|
||||
|
||||
def test_recalcCodePageRanges(self):
|
||||
font, os2, cmap = self.makeOS2_cmap(
|
||||
{ord("A"): "A", ord("Ά"): "Alphatonos", ord("Б"): "Be"}
|
||||
|
Loading…
x
Reference in New Issue
Block a user