diff --git a/Lib/fontTools/ttLib/tables/otBase.py b/Lib/fontTools/ttLib/tables/otBase.py index c9149dfbd..2a28bcdb8 100644 --- a/Lib/fontTools/ttLib/tables/otBase.py +++ b/Lib/fontTools/ttLib/tables/otBase.py @@ -167,6 +167,13 @@ class OTTableReader(object): self.pos = newpos return value + def readUInt8(self): + pos = self.pos + newpos = pos + 1 + value, = struct.unpack(">B", self.data[pos:newpos]) + self.pos = newpos + return value + def readUInt24(self): pos = self.pos newpos = pos + 3 @@ -446,6 +453,10 @@ class OTTableWriter(object): def writeShort(self, value): self.items.append(struct.pack(">h", value)) + def writeUInt8(self, value): + assert 0 <= value < 256 + self.items.append(struct.pack(">B", value)) + def writeUInt24(self, value): assert 0 <= value < 0x1000000 b = struct.pack(">L", value) diff --git a/Lib/fontTools/ttLib/tables/otBase_test.py b/Lib/fontTools/ttLib/tables/otBase_test.py index 6464f6c53..b02dceff7 100644 --- a/Lib/fontTools/ttLib/tables/otBase_test.py +++ b/Lib/fontTools/ttLib/tables/otBase_test.py @@ -16,6 +16,11 @@ class OTTableReaderTest(unittest.TestCase): self.assertEqual(reader.readLong(), -889274641) self.assertEqual(reader.pos, 4) + def test_readUInt8(self): + reader = OTTableReader(deHexStr("C3")) + self.assertEqual(reader.readUInt8(), 0xC3) + self.assertEqual(reader.pos, 1) + def test_readUShort(self): reader = OTTableReader(deHexStr("CA FE")) self.assertEqual(reader.readUShort(), 0xCAFE) @@ -53,6 +58,11 @@ class OTTableWriterTest(unittest.TestCase): writer.writeLong(-12345678) self.assertEqual(writer.getData(), deHexStr("FF 43 9E B2")) + def test_writeUInt8(self): + writer = OTTableWriter(globalState={}) + writer.writeUInt8(0xBE) + self.assertEqual(writer.getData(), deHexStr("BE")) + def test_writeUShort(self): writer = OTTableWriter(globalState={}) writer.writeUShort(0xBEEF) diff --git a/Lib/fontTools/ttLib/tables/otConverters.py b/Lib/fontTools/ttLib/tables/otConverters.py index c6b823ed7..5cb3fd4fc 100644 --- a/Lib/fontTools/ttLib/tables/otConverters.py +++ b/Lib/fontTools/ttLib/tables/otConverters.py @@ -175,6 +175,13 @@ class UShort(IntValue): def write(self, writer, font, tableDict, value, repeatIndex=None): writer.writeUShort(value) +class UInt8(IntValue): + staticSize = 1 + def read(self, reader, font, tableDict): + return reader.readUInt8() + def write(self, writer, font, tableDict, value, repeatIndex=None): + writer.writeUInt8(value) + class UInt24(IntValue): staticSize = 3 def read(self, reader, font, tableDict): @@ -464,7 +471,8 @@ class DeltaValue(BaseConverter): converterMapping = { # type class - "int16": Short, + "int16": Short, + "uint8": UInt8, "uint16": UShort, "uint24": UInt24, "uint32": ULong,