From f4515664dcccc012b5936715e30c9a968608ce04 Mon Sep 17 00:00:00 2001 From: WindSoilder Date: Sun, 7 Aug 2022 08:29:43 +0800 Subject: [PATCH] finish basic structure, but needs more improvement --- .gitignore | 69 +++ FiraCode-VF.ttf | Bin 0 -> 286320 bytes README.md | 28 ++ kaitaistruct.py | 521 ++++++++++++++++++++++ plugin.py | 170 ++++++++ reader/png.py | 526 +++++++++++++++++++++++ reader/ttf.py | 1099 +++++++++++++++++++++++++++++++++++++++++++++++ utils.py | 57 +++ 8 files changed, 2470 insertions(+) create mode 100644 .gitignore create mode 100644 FiraCode-VF.ttf create mode 100644 README.md create mode 100755 kaitaistruct.py create mode 100755 plugin.py create mode 100644 reader/png.py create mode 100644 reader/ttf.py create mode 100755 utils.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..84203c8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,69 @@ +# Project-specific generated files +docs/build/ + +bench/results/ +bench/env/ +bench/trio/ + +# Byte-compiled / optimized / DLL files / editor temp files +__pycache__/ +*.py[cod] +*~ +\#* +.#* +*.swp + +# C extensions +*.so + +# Distribution / packaging +.Python +/build/ +/develop-eggs/ +/dist/ +/eggs/ +/lib/ +/lib64/ +/parts/ +/sdist/ +/var/ +*.egg-info/ +.installed.cfg +*.egg +/.pybuild + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.venv/ +.coverage +.coverage.* +.cache +.pytest_cache/ +.mypy_cache/ +nosetests.xml +coverage.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# Rope +.ropeproject + +# Django stuff: +*.log +*.pot + +# Sphinx documentation +doc/_build/ + +# vscode config file +.vscode/* diff --git a/FiraCode-VF.ttf b/FiraCode-VF.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c05ac827c5847d8e6e8fc2f425b1c0e5f4ad7d0d GIT binary patch literal 286320 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..3f0df38 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# Nu plugin binary reader +A general binary parser based on [kaitai struct](https://formats.kaitai.io/). + +## Require python version +python3.7+ + +## Usage +1. register the plugin to nushell +``` +register -e json plugin.py +``` + +It will introduce a new command: `from-binary`. So you can just play with it. + +## Usage example +1. read and parse png file: +``` +open capture.PNG | from-binary png | get ihdr +``` + +2. read and parse ttf file: +``` +open FiraCode-VF.ttf | from-binary ttf | get directory_table +``` + +## Note +The `kaitaistruct.py` is just a copy of [kaitai struct python runtime](https://github.com/kaitai-io/kaitai_struct_python_runtime), put it directly here, so we don't need extra requirements. +And `reader/*.py` are just a copy of auto-generated parser, DON'T CHANGE IT. diff --git a/kaitaistruct.py b/kaitaistruct.py new file mode 100755 index 0000000..7b17277 --- /dev/null +++ b/kaitaistruct.py @@ -0,0 +1,521 @@ +import itertools +import sys +import struct +from io import open, BytesIO, SEEK_CUR, SEEK_END # noqa + +PY2 = sys.version_info[0] == 2 + +# Kaitai Struct runtime version, in the format defined by PEP 440. +# Used by our setup.cfg to set the version number in +# packaging/distribution metadata. +# Also used in Python code generated by older ksc versions (0.7 through 0.9) +# to check that the imported runtime is compatible with the generated code. +# Since ksc 0.10, the compatibility check instead uses the API_VERSION constant, +# so that the version string does not need to be parsed at runtime +# (see https://github.com/kaitai-io/kaitai_struct/issues/804). +__version__ = '0.10' + +# Kaitai Struct runtime API version, as a tuple of ints. +# Used in generated Python code (since ksc 0.10) to check that the imported +# runtime is compatible with the generated code. +API_VERSION = (0, 10) + +# pylint: disable=invalid-name,missing-docstring,too-many-public-methods +# pylint: disable=useless-object-inheritance,super-with-arguments,consider-using-f-string + + +class KaitaiStruct(object): + def __init__(self, stream): + self._io = stream + + def __enter__(self): + return self + + def __exit__(self, *args, **kwargs): + self.close() + + def close(self): + self._io.close() + + @classmethod + def from_file(cls, filename): + f = open(filename, 'rb') + try: + return cls(KaitaiStream(f)) + except Exception: + # close file descriptor, then reraise the exception + f.close() + raise + + @classmethod + def from_bytes(cls, buf): + return cls(KaitaiStream(BytesIO(buf))) + + @classmethod + def from_io(cls, io): + return cls(KaitaiStream(io)) + + +class KaitaiStream(object): + def __init__(self, io): + self._io = io + self.align_to_byte() + + def __enter__(self): + return self + + def __exit__(self, *args, **kwargs): + self.close() + + def close(self): + self._io.close() + + # ======================================================================== + # Stream positioning + # ======================================================================== + + def is_eof(self): + if self.bits_left > 0: + return False + + io = self._io + t = io.read(1) + if t == b'': + return True + + io.seek(-1, SEEK_CUR) + return False + + def seek(self, n): + self._io.seek(n) + + def pos(self): + return self._io.tell() + + def size(self): + # Python has no internal File object API function to get + # current file / StringIO size, thus we use the following + # trick. + io = self._io + # Remember our current position + cur_pos = io.tell() + # Seek to the end of the stream and remember the full length + full_size = io.seek(0, SEEK_END) + # Seek back to the current position + io.seek(cur_pos) + return full_size + + # ======================================================================== + # Integer numbers + # ======================================================================== + + packer_s1 = struct.Struct('b') + packer_s2be = struct.Struct('>h') + packer_s4be = struct.Struct('>i') + packer_s8be = struct.Struct('>q') + packer_s2le = struct.Struct('H') + packer_u4be = struct.Struct('>I') + packer_u8be = struct.Struct('>Q') + packer_u2le = struct.Struct('f') + packer_f8be = struct.Struct('>d') + packer_f4le = struct.Struct(' 0: + # 1 bit => 1 byte + # 8 bits => 1 byte + # 9 bits => 2 bytes + bytes_needed = ((bits_needed - 1) // 8) + 1 # `ceil(bits_needed / 8)` + buf = self.read_bytes(bytes_needed) + if PY2: + buf = bytearray(buf) + for byte in buf: + res = res << 8 | byte + + new_bits = res + res = res >> self.bits_left | self.bits << bits_needed + self.bits = new_bits # will be masked at the end of the function + else: + res = self.bits >> -bits_needed # shift unneeded bits out + + mask = (1 << self.bits_left) - 1 # `bits_left` is in range 0..7 + self.bits &= mask + + return res + + # Unused since Kaitai Struct Compiler v0.9+ - compatibility with + # older versions. + def read_bits_int(self, n): + return self.read_bits_int_be(n) + + def read_bits_int_le(self, n): + res = 0 + bits_needed = n - self.bits_left + + if bits_needed > 0: + # 1 bit => 1 byte + # 8 bits => 1 byte + # 9 bits => 2 bytes + bytes_needed = ((bits_needed - 1) // 8) + 1 # `ceil(bits_needed / 8)` + buf = self.read_bytes(bytes_needed) + if PY2: + buf = bytearray(buf) + for i, byte in enumerate(buf): + res |= byte << (i * 8) + + new_bits = res >> bits_needed + res = res << self.bits_left | self.bits + self.bits = new_bits + else: + res = self.bits + self.bits >>= n + + self.bits_left = -bits_needed % 8 + + mask = (1 << n) - 1 # no problem with this in Python (arbitrary precision integers) + res &= mask + return res + + # ======================================================================== + # Byte arrays + # ======================================================================== + + def read_bytes(self, n): + if n < 0: + raise ValueError( + "requested invalid %d amount of bytes" % + (n,) + ) + + is_satisfiable = True + # When a large number of bytes is requested, try to check first + # that there is indeed enough data left in the stream. + # This avoids reading large amounts of data only to notice afterwards + # that it's not long enough. For smaller amounts of data, it's faster to + # first read the data unconditionally and check the length afterwards. + if ( + n >= 8*1024*1024 # = 8 MiB + # in Python 2, there is a common error ['file' object has no + # attribute 'seekable'], so we need to make sure that seekable() exists + and callable(getattr(self._io, 'seekable', None)) + and self._io.seekable() + ): + num_bytes_available = self.size() - self.pos() + is_satisfiable = (n <= num_bytes_available) + + if is_satisfiable: + r = self._io.read(n) + num_bytes_available = len(r) + is_satisfiable = (n <= num_bytes_available) + + if not is_satisfiable: + # noinspection PyUnboundLocalVariable + raise EOFError( + "requested %d bytes, but only %d bytes available" % + (n, num_bytes_available) + ) + + # noinspection PyUnboundLocalVariable + return r + + def read_bytes_full(self): + return self._io.read() + + def read_bytes_term(self, term, include_term, consume_term, eos_error): + r = b'' + while True: + c = self._io.read(1) + if c == b'': + if eos_error: + raise Exception( + "end of stream reached, but no terminator %d found" % + (term,) + ) + + return r + + if ord(c) == term: + if include_term: + r += c + if not consume_term: + self._io.seek(-1, SEEK_CUR) + return r + + r += c + + def ensure_fixed_contents(self, expected): + actual = self._io.read(len(expected)) + if actual != expected: + raise Exception( + "unexpected fixed contents: got %r, was waiting for %r" % + (actual, expected) + ) + return actual + + @staticmethod + def bytes_strip_right(data, pad_byte): + return data.rstrip(KaitaiStream.byte_from_int(pad_byte)) + + @staticmethod + def bytes_terminate(data, term, include_term): + new_data, term_byte, _ = data.partition(KaitaiStream.byte_from_int(term)) + if include_term: + new_data += term_byte + return new_data + + # ======================================================================== + # Byte array processing + # ======================================================================== + + @staticmethod + def process_xor_one(data, key): + if PY2: + return bytes(bytearray(v ^ key for v in bytearray(data))) + + return bytes(v ^ key for v in data) + + @staticmethod + def process_xor_many(data, key): + if PY2: + return bytes(bytearray(a ^ b for a, b in zip(bytearray(data), itertools.cycle(bytearray(key))))) + + return bytes(a ^ b for a, b in zip(data, itertools.cycle(key))) + + @staticmethod + def process_rotate_left(data, amount, group_size): + if group_size != 1: + raise Exception( + "unable to rotate group of %d bytes yet" % + (group_size,) + ) + + anti_amount = -amount % (group_size * 8) + + r = bytearray(data) + for i, byte in enumerate(r): + r[i] = (byte << amount) & 0xff | (byte >> anti_amount) + return bytes(r) + + # ======================================================================== + # Misc + # ======================================================================== + + @staticmethod + def int_from_byte(v): + return ord(v) if PY2 else v + + @staticmethod + def byte_from_int(i): + return chr(i) if PY2 else bytes((i,)) + + @staticmethod + def byte_array_index(data, i): + return KaitaiStream.int_from_byte(data[i]) + + @staticmethod + def byte_array_min(b): + return KaitaiStream.int_from_byte(min(b)) + + @staticmethod + def byte_array_max(b): + return KaitaiStream.int_from_byte(max(b)) + + @staticmethod + def resolve_enum(enum_obj, value): + """Resolves value using enum: if the value is not found in the map, + we'll just use literal value per se. Works around problem with Python + enums throwing an exception when encountering unknown value. + """ + try: + return enum_obj(value) + except ValueError: + return value + + +class KaitaiStructError(Exception): + """Common ancestor for all error originating from Kaitai Struct usage. + Stores KSY source path, pointing to an element supposedly guilty of + an error. + """ + def __init__(self, msg, src_path): + super(KaitaiStructError, self).__init__("%s: %s" % (src_path, msg)) + self.src_path = src_path + + +class UndecidedEndiannessError(KaitaiStructError): + """Error that occurs when default endianness should be decided with + switch, but nothing matches (although using endianness expression + implies that there should be some positive result). + """ + def __init__(self, src_path): + super(UndecidedEndiannessError, self).__init__("unable to decide on endianness for a type", src_path) + + +class ValidationFailedError(KaitaiStructError): + """Common ancestor for all validation failures. Stores pointer to + KaitaiStream IO object which was involved in an error. + """ + def __init__(self, msg, io, src_path): + super(ValidationFailedError, self).__init__("at pos %d: validation failed: %s" % (io.pos(), msg), src_path) + self.io = io + + +class ValidationNotEqualError(ValidationFailedError): + """Signals validation failure: we required "actual" value to be equal to + "expected", but it turned out that it's not. + """ + def __init__(self, expected, actual, io, src_path): + super(ValidationNotEqualError, self).__init__("not equal, expected %s, but got %s" % (repr(expected), repr(actual)), io, src_path) + self.expected = expected + self.actual = actual + + +class ValidationLessThanError(ValidationFailedError): + """Signals validation failure: we required "actual" value to be + greater than or equal to "min", but it turned out that it's not. + """ + def __init__(self, min_bound, actual, io, src_path): + super(ValidationLessThanError, self).__init__("not in range, min %s, but got %s" % (repr(min_bound), repr(actual)), io, src_path) + self.min = min_bound + self.actual = actual + + +class ValidationGreaterThanError(ValidationFailedError): + """Signals validation failure: we required "actual" value to be + less than or equal to "max", but it turned out that it's not. + """ + def __init__(self, max_bound, actual, io, src_path): + super(ValidationGreaterThanError, self).__init__("not in range, max %s, but got %s" % (repr(max_bound), repr(actual)), io, src_path) + self.max = max_bound + self.actual = actual + + +class ValidationNotAnyOfError(ValidationFailedError): + """Signals validation failure: we required "actual" value to be + from the list, but it turned out that it's not. + """ + def __init__(self, actual, io, src_path): + super(ValidationNotAnyOfError, self).__init__("not any of the list, got %s" % (repr(actual)), io, src_path) + self.actual = actual + + +class ValidationExprError(ValidationFailedError): + """Signals validation failure: we required "actual" value to match + the expression, but it turned out that it doesn't. + """ + def __init__(self, actual, io, src_path): + super(ValidationExprError, self).__init__("not matching the expression, got %s" % (repr(actual)), io, src_path) + self.actual = actual diff --git a/plugin.py b/plugin.py new file mode 100755 index 0000000..0084e46 --- /dev/null +++ b/plugin.py @@ -0,0 +1,170 @@ +# Example of using a Python script as a Nushell plugin +# +# The example uses JSON encoding but it should be a similar process using +# Cap'n Proto to move data between Nushell and the plugin. The only difference +# would be that you need to compile the schema file in order have the objects +# that decode and encode information that is read and written to stdin and stdout +# +# To register the plugin use: +# register -e json +# +# Be carefull with the spans. Miette will crash if a span is outside the +# size of the contents vector. For this example we are using 0 and 1, which will +# point to the beginning of the contents vector. We strongly suggest using the span +# found in the plugin call head +# +# The plugin will be run using the active Python implementation. If you are in +# a Python environment, that is the Python version that is used +# +# Note: To keep the plugin simple and without dependencies, the dictionaries that +# represent the data transferred between Nushell and the plugin are kept as +# native Python dictionaries. The encoding and decoding process could be improved +# by using libraries like pydantic and marshmallow +# +# This plugin uses python3 +# Note: To debug plugins write to stderr using sys.stderr.write +import sys +import json + +from kaitaistruct import BytesIO, KaitaiStream +from utils import to_nu_value, nu_error, kaitai_obj_to_dict + + +def signatures(): + """ + Multiple signatures can be sent to Nushell. Each signature will be registered + as a different plugin function in Nushell. + + In your plugin logic you can use the name of the signature to indicate what + operation should be done with the plugin + """ + return { + "Signature": [ + { + "name": "from-binary", + "usage": "Read binary data", + "extra_usage": "", + "input_type": "Any", + "output_type": "Any", + "required_positional": [ + { + "name": "format", + "desc": "input binary format", + "shape": "String", + "var_id": None, + }, + ], + "optional_positional": [], + # FIXME: the rest positional is required, and it's not empty, I don't know if it's ok. + "rest_positional": { + "name": "rest", + "desc": "rest value string", + "shape": "String", + "var_id": None, + }, + "named": [ + { + "long": "help", + "short": "h", + "arg": None, + "required": False, + "desc": "Display this help message", + "var_id": None, + }, + ], + "search_terms": ["png"], + "is_filter": False, + "creates_scope": False, + "category": "Experimental", + } + ] + } + + +def process_call(plugin_call): + """ + plugin_call is a dictionary with the information from the call + It should contain: + - The name of the call + - The call data which includes the positional and named values + - The input from the pipeline + + Use this information to implement your plugin logic + """ + # Pretty printing the call to stderr + # sys.stderr.write(json.dumps(plugin_call, indent=4)) + # sys.stderr.write("\n") + + # check input, make sure that the input is binary. + call_info = plugin_call["CallInfo"] + head_span = call_info["call"]["head"] + if "input" not in call_info: + return nu_error( + "UnsupportedInput", + "Input's type is nothing. This command only works with binary.", + head_span, + ) + pipeline_input = call_info["input"] + if "Value" not in pipeline_input: + return nu_error( + "UnsupportedInput", + "Input's type is nushell's Value. This command only works with binary.", + head_span, + ) + value = pipeline_input["Value"] + if "Binary" not in value: + # pick up value type, we can make sure that the input value contains only one key. + value_type = list(value.keys())[0] + return nu_error( + "UnsupportedInput", + f"Input's type is {value_type}. This command only works with binary.", + value.get("span", head_span), + ) + + binary_data = bytearray(value["Binary"]["val"]) + format = call_info["call"]["positional"][0]["String"]["val"] + try: + return handle(binary_data, format, head_span) + except Exception as e: + return nu_error("Binary data parsing error", str(e), head_span) + + +def handle(binary_data, format, span): + if format == "png": + from reader.png import Png + + data = Png(KaitaiStream(BytesIO(binary_data))) + elif format == "ttf": + from reader.ttf import Ttf + + data = Ttf(KaitaiStream(BytesIO(binary_data))) + a = kaitai_obj_to_dict(data) + return to_nu_value(a, span) + + +def plugin(): + call_str = ",".join(sys.stdin.readlines()) + plugin_call = json.loads(call_str) + + if plugin_call == "Signature": + signature = json.dumps(signatures()) + sys.stdout.write(signature) + + elif "CallInfo" in plugin_call: + response = process_call(plugin_call) + sys.stdout.write(json.dumps(response)) + + else: + # Use this error format if you want to return an error back to Nushell + error = { + "Error": { + "label": "ERROR from plugin", + "msg": "error message pointing to call head span", + "span": {"start": 0, "end": 1}, + } + } + sys.stdout.write(json.dumps(error)) + + +if __name__ == "__main__": + plugin() diff --git a/reader/png.py b/reader/png.py new file mode 100644 index 0000000..8fa758e --- /dev/null +++ b/reader/png.py @@ -0,0 +1,526 @@ +# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild + +import kaitaistruct +from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO +from enum import Enum +import zlib + + +if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9): + raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__)) + +class Png(KaitaiStruct): + """Test files for APNG can be found at the following locations: + + * + * + """ + + class PhysUnit(Enum): + unknown = 0 + meter = 1 + + class BlendOpValues(Enum): + source = 0 + over = 1 + + class CompressionMethods(Enum): + zlib = 0 + + class DisposeOpValues(Enum): + none = 0 + background = 1 + previous = 2 + + class ColorType(Enum): + greyscale = 0 + truecolor = 2 + indexed = 3 + greyscale_alpha = 4 + truecolor_alpha = 6 + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.magic = self._io.read_bytes(8) + if not self.magic == b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A": + raise kaitaistruct.ValidationNotEqualError(b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", self.magic, self._io, u"/seq/0") + self.ihdr_len = self._io.read_u4be() + if not self.ihdr_len == 13: + raise kaitaistruct.ValidationNotEqualError(13, self.ihdr_len, self._io, u"/seq/1") + self.ihdr_type = self._io.read_bytes(4) + if not self.ihdr_type == b"\x49\x48\x44\x52": + raise kaitaistruct.ValidationNotEqualError(b"\x49\x48\x44\x52", self.ihdr_type, self._io, u"/seq/2") + self.ihdr = Png.IhdrChunk(self._io, self, self._root) + self.ihdr_crc = self._io.read_bytes(4) + self.chunks = [] + i = 0 + while True: + _ = Png.Chunk(self._io, self, self._root) + self.chunks.append(_) + if ((_.type == u"IEND") or (self._io.is_eof())) : + break + i += 1 + + class Rgb(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.r = self._io.read_u1() + self.g = self._io.read_u1() + self.b = self._io.read_u1() + + + class Chunk(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.len = self._io.read_u4be() + self.type = (self._io.read_bytes(4)).decode(u"UTF-8") + _on = self.type + if _on == u"iTXt": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.InternationalTextChunk(_io__raw_body, self, self._root) + elif _on == u"gAMA": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.GamaChunk(_io__raw_body, self, self._root) + elif _on == u"tIME": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.TimeChunk(_io__raw_body, self, self._root) + elif _on == u"PLTE": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.PlteChunk(_io__raw_body, self, self._root) + elif _on == u"bKGD": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.BkgdChunk(_io__raw_body, self, self._root) + elif _on == u"pHYs": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.PhysChunk(_io__raw_body, self, self._root) + elif _on == u"fdAT": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.FrameDataChunk(_io__raw_body, self, self._root) + elif _on == u"tEXt": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.TextChunk(_io__raw_body, self, self._root) + elif _on == u"cHRM": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.ChrmChunk(_io__raw_body, self, self._root) + elif _on == u"acTL": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.AnimationControlChunk(_io__raw_body, self, self._root) + elif _on == u"sRGB": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.SrgbChunk(_io__raw_body, self, self._root) + elif _on == u"zTXt": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.CompressedTextChunk(_io__raw_body, self, self._root) + elif _on == u"fcTL": + self._raw_body = self._io.read_bytes(self.len) + _io__raw_body = KaitaiStream(BytesIO(self._raw_body)) + self.body = Png.FrameControlChunk(_io__raw_body, self, self._root) + else: + self.body = self._io.read_bytes(self.len) + self.crc = self._io.read_bytes(4) + + + class BkgdIndexed(KaitaiStruct): + """Background chunk for images with indexed palette.""" + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.palette_index = self._io.read_u1() + + + class Point(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.x_int = self._io.read_u4be() + self.y_int = self._io.read_u4be() + + @property + def x(self): + if hasattr(self, '_m_x'): + return self._m_x + + self._m_x = (self.x_int / 100000.0) + return getattr(self, '_m_x', None) + + @property + def y(self): + if hasattr(self, '_m_y'): + return self._m_y + + self._m_y = (self.y_int / 100000.0) + return getattr(self, '_m_y', None) + + + class BkgdGreyscale(KaitaiStruct): + """Background chunk for greyscale images.""" + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.value = self._io.read_u2be() + + + class ChrmChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11cHRM + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.white_point = Png.Point(self._io, self, self._root) + self.red = Png.Point(self._io, self, self._root) + self.green = Png.Point(self._io, self, self._root) + self.blue = Png.Point(self._io, self, self._root) + + + class IhdrChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11IHDR + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.width = self._io.read_u4be() + self.height = self._io.read_u4be() + self.bit_depth = self._io.read_u1() + self.color_type = KaitaiStream.resolve_enum(Png.ColorType, self._io.read_u1()) + self.compression_method = self._io.read_u1() + self.filter_method = self._io.read_u1() + self.interlace_method = self._io.read_u1() + + + class PlteChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11PLTE + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.entries = [] + i = 0 + while not self._io.is_eof(): + self.entries.append(Png.Rgb(self._io, self, self._root)) + i += 1 + + + + class SrgbChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11sRGB + """ + + class Intent(Enum): + perceptual = 0 + relative_colorimetric = 1 + saturation = 2 + absolute_colorimetric = 3 + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.render_intent = KaitaiStream.resolve_enum(Png.SrgbChunk.Intent, self._io.read_u1()) + + + class CompressedTextChunk(KaitaiStruct): + """Compressed text chunk effectively allows to store key-value + string pairs in PNG container, compressing "value" part (which + can be quite lengthy) with zlib compression. + + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11zTXt + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8") + self.compression_method = KaitaiStream.resolve_enum(Png.CompressionMethods, self._io.read_u1()) + self._raw_text_datastream = self._io.read_bytes_full() + self.text_datastream = zlib.decompress(self._raw_text_datastream) + + + class FrameDataChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://wiki.mozilla.org/APNG_Specification#.60fdAT.60:_The_Frame_Data_Chunk + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.sequence_number = self._io.read_u4be() + self.frame_data = self._io.read_bytes_full() + + + class BkgdTruecolor(KaitaiStruct): + """Background chunk for truecolor images.""" + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.red = self._io.read_u2be() + self.green = self._io.read_u2be() + self.blue = self._io.read_u2be() + + + class GamaChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11gAMA + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.gamma_int = self._io.read_u4be() + + @property + def gamma_ratio(self): + if hasattr(self, '_m_gamma_ratio'): + return self._m_gamma_ratio + + self._m_gamma_ratio = (100000.0 / self.gamma_int) + return getattr(self, '_m_gamma_ratio', None) + + + class BkgdChunk(KaitaiStruct): + """Background chunk stores default background color to display this + image against. Contents depend on `color_type` of the image. + + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11bKGD + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + _on = self._root.ihdr.color_type + if _on == Png.ColorType.indexed: + self.bkgd = Png.BkgdIndexed(self._io, self, self._root) + elif _on == Png.ColorType.truecolor_alpha: + self.bkgd = Png.BkgdTruecolor(self._io, self, self._root) + elif _on == Png.ColorType.greyscale_alpha: + self.bkgd = Png.BkgdGreyscale(self._io, self, self._root) + elif _on == Png.ColorType.truecolor: + self.bkgd = Png.BkgdTruecolor(self._io, self, self._root) + elif _on == Png.ColorType.greyscale: + self.bkgd = Png.BkgdGreyscale(self._io, self, self._root) + + + class PhysChunk(KaitaiStruct): + """"Physical size" chunk stores data that allows to translate + logical pixels into physical units (meters, etc) and vice-versa. + + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11pHYs + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.pixels_per_unit_x = self._io.read_u4be() + self.pixels_per_unit_y = self._io.read_u4be() + self.unit = KaitaiStream.resolve_enum(Png.PhysUnit, self._io.read_u1()) + + + class FrameControlChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://wiki.mozilla.org/APNG_Specification#.60fcTL.60:_The_Frame_Control_Chunk + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.sequence_number = self._io.read_u4be() + self.width = self._io.read_u4be() + if not self.width >= 1: + raise kaitaistruct.ValidationLessThanError(1, self.width, self._io, u"/types/frame_control_chunk/seq/1") + if not self.width <= self._root.ihdr.width: + raise kaitaistruct.ValidationGreaterThanError(self._root.ihdr.width, self.width, self._io, u"/types/frame_control_chunk/seq/1") + self.height = self._io.read_u4be() + if not self.height >= 1: + raise kaitaistruct.ValidationLessThanError(1, self.height, self._io, u"/types/frame_control_chunk/seq/2") + if not self.height <= self._root.ihdr.height: + raise kaitaistruct.ValidationGreaterThanError(self._root.ihdr.height, self.height, self._io, u"/types/frame_control_chunk/seq/2") + self.x_offset = self._io.read_u4be() + if not self.x_offset <= (self._root.ihdr.width - self.width): + raise kaitaistruct.ValidationGreaterThanError((self._root.ihdr.width - self.width), self.x_offset, self._io, u"/types/frame_control_chunk/seq/3") + self.y_offset = self._io.read_u4be() + if not self.y_offset <= (self._root.ihdr.height - self.height): + raise kaitaistruct.ValidationGreaterThanError((self._root.ihdr.height - self.height), self.y_offset, self._io, u"/types/frame_control_chunk/seq/4") + self.delay_num = self._io.read_u2be() + self.delay_den = self._io.read_u2be() + self.dispose_op = KaitaiStream.resolve_enum(Png.DisposeOpValues, self._io.read_u1()) + self.blend_op = KaitaiStream.resolve_enum(Png.BlendOpValues, self._io.read_u1()) + + @property + def delay(self): + """Time to display this frame, in seconds.""" + if hasattr(self, '_m_delay'): + return self._m_delay + + self._m_delay = (self.delay_num / (100.0 if self.delay_den == 0 else self.delay_den)) + return getattr(self, '_m_delay', None) + + + class InternationalTextChunk(KaitaiStruct): + """International text chunk effectively allows to store key-value string pairs in + PNG container. Both "key" (keyword) and "value" (text) parts are + given in pre-defined subset of iso8859-1 without control + characters. + + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11iTXt + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8") + self.compression_flag = self._io.read_u1() + self.compression_method = KaitaiStream.resolve_enum(Png.CompressionMethods, self._io.read_u1()) + self.language_tag = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII") + self.translated_keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8") + self.text = (self._io.read_bytes_full()).decode(u"UTF-8") + + + class TextChunk(KaitaiStruct): + """Text chunk effectively allows to store key-value string pairs in + PNG container. Both "key" (keyword) and "value" (text) parts are + given in pre-defined subset of iso8859-1 without control + characters. + + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11tEXt + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"iso8859-1") + self.text = (self._io.read_bytes_full()).decode(u"iso8859-1") + + + class AnimationControlChunk(KaitaiStruct): + """ + .. seealso:: + Source - https://wiki.mozilla.org/APNG_Specification#.60acTL.60:_The_Animation_Control_Chunk + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.num_frames = self._io.read_u4be() + self.num_plays = self._io.read_u4be() + + + class TimeChunk(KaitaiStruct): + """Time chunk stores time stamp of last modification of this image, + up to 1 second precision in UTC timezone. + + .. seealso:: + Source - https://www.w3.org/TR/PNG/#11tIME + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.year = self._io.read_u2be() + self.month = self._io.read_u1() + self.day = self._io.read_u1() + self.hour = self._io.read_u1() + self.minute = self._io.read_u1() + self.second = self._io.read_u1() + + diff --git a/reader/ttf.py b/reader/ttf.py new file mode 100644 index 0000000..db28062 --- /dev/null +++ b/reader/ttf.py @@ -0,0 +1,1099 @@ +# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild + +import kaitaistruct +from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO +from enum import Enum + + +if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9): + raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__)) + +class Ttf(KaitaiStruct): + """A TrueType font file contains data, in table format, that comprises + an outline font. + + .. seealso:: + Source - https://www.microsoft.com/typography/tt/ttf_spec/ttch02.doc + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.offset_table = Ttf.OffsetTable(self._io, self, self._root) + self.directory_table = [] + for i in range(self.offset_table.num_tables): + self.directory_table.append(Ttf.DirTableEntry(self._io, self, self._root)) + + + class Post(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.format = Ttf.Fixed(self._io, self, self._root) + self.italic_angle = Ttf.Fixed(self._io, self, self._root) + self.underline_position = self._io.read_s2be() + self.underline_thichness = self._io.read_s2be() + self.is_fixed_pitch = self._io.read_u4be() + self.min_mem_type42 = self._io.read_u4be() + self.max_mem_type42 = self._io.read_u4be() + self.min_mem_type1 = self._io.read_u4be() + self.max_mem_type1 = self._io.read_u4be() + if ((self.format.major == 2) and (self.format.minor == 0)) : + self.format20 = Ttf.Post.Format20(self._io, self, self._root) + + + class Format20(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.number_of_glyphs = self._io.read_u2be() + self.glyph_name_index = [] + for i in range(self.number_of_glyphs): + self.glyph_name_index.append(self._io.read_u2be()) + + self.glyph_names = [] + i = 0 + while True: + _ = Ttf.Post.Format20.PascalString(self._io, self, self._root) + self.glyph_names.append(_) + if ((_.length == 0) or (self._io.is_eof())) : + break + i += 1 + + class PascalString(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.length = self._io.read_u1() + if self.length != 0: + self.value = (self._io.read_bytes(self.length)).decode(u"ascii") + + + + + + class Name(KaitaiStruct): + """Name table is meant to include human-readable string metadata + that describes font: name of the font, its styles, copyright & + trademark notices, vendor and designer info, etc. + + The table includes a list of "name records", each of which + corresponds to a single metadata entry. + + .. seealso:: + Source - https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6name.html + """ + + class Platforms(Enum): + unicode = 0 + macintosh = 1 + reserved_2 = 2 + microsoft = 3 + + class Names(Enum): + copyright = 0 + font_family = 1 + font_subfamily = 2 + unique_subfamily_id = 3 + full_font_name = 4 + name_table_version = 5 + postscript_font_name = 6 + trademark = 7 + manufacturer = 8 + designer = 9 + description = 10 + url_vendor = 11 + url_designer = 12 + license = 13 + url_license = 14 + reserved_15 = 15 + preferred_family = 16 + preferred_subfamily = 17 + compatible_full_name = 18 + sample_text = 19 + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.format_selector = self._io.read_u2be() + self.num_name_records = self._io.read_u2be() + self.ofs_strings = self._io.read_u2be() + self.name_records = [] + for i in range(self.num_name_records): + self.name_records.append(Ttf.Name.NameRecord(self._io, self, self._root)) + + + class NameRecord(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.platform_id = KaitaiStream.resolve_enum(Ttf.Name.Platforms, self._io.read_u2be()) + self.encoding_id = self._io.read_u2be() + self.language_id = self._io.read_u2be() + self.name_id = KaitaiStream.resolve_enum(Ttf.Name.Names, self._io.read_u2be()) + self.len_str = self._io.read_u2be() + self.ofs_str = self._io.read_u2be() + + @property + def ascii_value(self): + if hasattr(self, '_m_ascii_value'): + return self._m_ascii_value + + io = self._parent._io + _pos = io.pos() + io.seek((self._parent.ofs_strings + self.ofs_str)) + self._m_ascii_value = (io.read_bytes(self.len_str)).decode(u"ascii") + io.seek(_pos) + return getattr(self, '_m_ascii_value', None) + + @property + def unicode_value(self): + if hasattr(self, '_m_unicode_value'): + return self._m_unicode_value + + io = self._parent._io + _pos = io.pos() + io.seek((self._parent.ofs_strings + self.ofs_str)) + self._m_unicode_value = (io.read_bytes(self.len_str)).decode(u"utf-16be") + io.seek(_pos) + return getattr(self, '_m_unicode_value', None) + + + + class Head(KaitaiStruct): + + class Flags(Enum): + baseline_at_y0 = 1 + left_sidebearing_at_x0 = 2 + flag_depend_on_point_size = 4 + flag_force_ppem = 8 + flag_may_advance_width = 16 + + class FontDirectionHint(Enum): + fully_mixed_directional_glyphs = 0 + only_strongly_left_to_right = 1 + strongly_left_to_right_and_neutrals = 2 + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.version = Ttf.Fixed(self._io, self, self._root) + self.font_revision = Ttf.Fixed(self._io, self, self._root) + self.checksum_adjustment = self._io.read_u4be() + self.magic_number = self._io.read_bytes(4) + if not self.magic_number == b"\x5F\x0F\x3C\xF5": + raise kaitaistruct.ValidationNotEqualError(b"\x5F\x0F\x3C\xF5", self.magic_number, self._io, u"/types/head/seq/3") + self.flags = KaitaiStream.resolve_enum(Ttf.Head.Flags, self._io.read_u2be()) + self.units_per_em = self._io.read_u2be() + self.created = self._io.read_u8be() + self.modified = self._io.read_u8be() + self.x_min = self._io.read_s2be() + self.y_min = self._io.read_s2be() + self.x_max = self._io.read_s2be() + self.y_max = self._io.read_s2be() + self.mac_style = self._io.read_u2be() + self.lowest_rec_ppem = self._io.read_u2be() + self.font_direction_hint = KaitaiStream.resolve_enum(Ttf.Head.FontDirectionHint, self._io.read_s2be()) + self.index_to_loc_format = self._io.read_s2be() + self.glyph_data_format = self._io.read_s2be() + + + class Prep(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.instructions = self._io.read_bytes_full() + + + class Hhea(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.version = Ttf.Fixed(self._io, self, self._root) + self.ascender = self._io.read_s2be() + self.descender = self._io.read_s2be() + self.line_gap = self._io.read_s2be() + self.advance_width_max = self._io.read_u2be() + self.min_left_side_bearing = self._io.read_s2be() + self.min_right_side_bearing = self._io.read_s2be() + self.x_max_extend = self._io.read_s2be() + self.caret_slope_rise = self._io.read_s2be() + self.caret_slope_run = self._io.read_s2be() + self.reserved = self._io.read_bytes(10) + if not self.reserved == b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00": + raise kaitaistruct.ValidationNotEqualError(b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", self.reserved, self._io, u"/types/hhea/seq/10") + self.metric_data_format = self._io.read_s2be() + self.number_of_hmetrics = self._io.read_u2be() + + + class Fpgm(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.instructions = self._io.read_bytes_full() + + + class Kern(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.version = self._io.read_u2be() + self.subtable_count = self._io.read_u2be() + self.subtables = [] + for i in range(self.subtable_count): + self.subtables.append(Ttf.Kern.Subtable(self._io, self, self._root)) + + + class Subtable(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.version = self._io.read_u2be() + self.length = self._io.read_u2be() + self.format = self._io.read_u1() + self.reserved = self._io.read_bits_int_be(4) + self.is_override = self._io.read_bits_int_be(1) != 0 + self.is_cross_stream = self._io.read_bits_int_be(1) != 0 + self.is_minimum = self._io.read_bits_int_be(1) != 0 + self.is_horizontal = self._io.read_bits_int_be(1) != 0 + self._io.align_to_byte() + if self.format == 0: + self.format0 = Ttf.Kern.Subtable.Format0(self._io, self, self._root) + + + class Format0(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.pair_count = self._io.read_u2be() + self.search_range = self._io.read_u2be() + self.entry_selector = self._io.read_u2be() + self.range_shift = self._io.read_u2be() + self.kerning_pairs = [] + for i in range(self.pair_count): + self.kerning_pairs.append(Ttf.Kern.Subtable.Format0.KerningPair(self._io, self, self._root)) + + + class KerningPair(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.left = self._io.read_u2be() + self.right = self._io.read_u2be() + self.value = self._io.read_s2be() + + + + + + class DirTableEntry(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.tag = (self._io.read_bytes(4)).decode(u"ascii") + self.checksum = self._io.read_u4be() + self.offset = self._io.read_u4be() + self.length = self._io.read_u4be() + + @property + def value(self): + if hasattr(self, '_m_value'): + return self._m_value + + io = self._root._io + _pos = io.pos() + io.seek(self.offset) + _on = self.tag + if _on == u"head": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Head(_io__raw__m_value, self, self._root) + elif _on == u"cvt ": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Cvt(_io__raw__m_value, self, self._root) + elif _on == u"prep": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Prep(_io__raw__m_value, self, self._root) + elif _on == u"kern": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Kern(_io__raw__m_value, self, self._root) + elif _on == u"hhea": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Hhea(_io__raw__m_value, self, self._root) + elif _on == u"post": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Post(_io__raw__m_value, self, self._root) + elif _on == u"OS/2": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Os2(_io__raw__m_value, self, self._root) + elif _on == u"name": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Name(_io__raw__m_value, self, self._root) + elif _on == u"maxp": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Maxp(_io__raw__m_value, self, self._root) + elif _on == u"glyf": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Glyf(_io__raw__m_value, self, self._root) + elif _on == u"fpgm": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Fpgm(_io__raw__m_value, self, self._root) + elif _on == u"cmap": + self._raw__m_value = io.read_bytes(self.length) + _io__raw__m_value = KaitaiStream(BytesIO(self._raw__m_value)) + self._m_value = Ttf.Cmap(_io__raw__m_value, self, self._root) + else: + self._m_value = io.read_bytes(self.length) + io.seek(_pos) + return getattr(self, '_m_value', None) + + + class Os2(KaitaiStruct): + """The OS/2 table consists of a set of metrics that are required by Windows and OS/2.""" + + class WeightClass(Enum): + thin = 100 + extra_light = 200 + light = 300 + normal = 400 + medium = 500 + semi_bold = 600 + bold = 700 + extra_bold = 800 + black = 900 + + class WidthClass(Enum): + ultra_condensed = 1 + extra_condensed = 2 + condensed = 3 + semi_condensed = 4 + normal = 5 + semi_expanded = 6 + expanded = 7 + extra_expanded = 8 + ultra_expanded = 9 + + class FsType(Enum): + restricted_license_embedding = 2 + preview_and_print_embedding = 4 + editable_embedding = 8 + + class FsSelection(Enum): + italic = 1 + underscore = 2 + negative = 4 + outlined = 8 + strikeout = 16 + bold = 32 + regular = 64 + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.version = self._io.read_u2be() + self.x_avg_char_width = self._io.read_s2be() + self.weight_class = KaitaiStream.resolve_enum(Ttf.Os2.WeightClass, self._io.read_u2be()) + self.width_class = KaitaiStream.resolve_enum(Ttf.Os2.WidthClass, self._io.read_u2be()) + self.fs_type = KaitaiStream.resolve_enum(Ttf.Os2.FsType, self._io.read_s2be()) + self.y_subscript_x_size = self._io.read_s2be() + self.y_subscript_y_size = self._io.read_s2be() + self.y_subscript_x_offset = self._io.read_s2be() + self.y_subscript_y_offset = self._io.read_s2be() + self.y_superscript_x_size = self._io.read_s2be() + self.y_superscript_y_size = self._io.read_s2be() + self.y_superscript_x_offset = self._io.read_s2be() + self.y_superscript_y_offset = self._io.read_s2be() + self.y_strikeout_size = self._io.read_s2be() + self.y_strikeout_position = self._io.read_s2be() + self.s_family_class = self._io.read_s2be() + self.panose = Ttf.Os2.Panose(self._io, self, self._root) + self.unicode_range = Ttf.Os2.UnicodeRange(self._io, self, self._root) + self.ach_vend_id = (self._io.read_bytes(4)).decode(u"ascii") + self.selection = KaitaiStream.resolve_enum(Ttf.Os2.FsSelection, self._io.read_u2be()) + self.first_char_index = self._io.read_u2be() + self.last_char_index = self._io.read_u2be() + self.typo_ascender = self._io.read_s2be() + self.typo_descender = self._io.read_s2be() + self.typo_line_gap = self._io.read_s2be() + self.win_ascent = self._io.read_u2be() + self.win_descent = self._io.read_u2be() + self.code_page_range = Ttf.Os2.CodePageRange(self._io, self, self._root) + + class Panose(KaitaiStruct): + + class Weight(Enum): + any = 0 + no_fit = 1 + very_light = 2 + light = 3 + thin = 4 + book = 5 + medium = 6 + demi = 7 + bold = 8 + heavy = 9 + black = 10 + nord = 11 + + class Proportion(Enum): + any = 0 + no_fit = 1 + old_style = 2 + modern = 3 + even_width = 4 + expanded = 5 + condensed = 6 + very_expanded = 7 + very_condensed = 8 + monospaced = 9 + + class FamilyKind(Enum): + any = 0 + no_fit = 1 + text_and_display = 2 + script = 3 + decorative = 4 + pictorial = 5 + + class LetterForm(Enum): + any = 0 + no_fit = 1 + normal_contact = 2 + normal_weighted = 3 + normal_boxed = 4 + normal_flattened = 5 + normal_rounded = 6 + normal_off_center = 7 + normal_square = 8 + oblique_contact = 9 + oblique_weighted = 10 + oblique_boxed = 11 + oblique_flattened = 12 + oblique_rounded = 13 + oblique_off_center = 14 + oblique_square = 15 + + class SerifStyle(Enum): + any = 0 + no_fit = 1 + cove = 2 + obtuse_cove = 3 + square_cove = 4 + obtuse_square_cove = 5 + square = 6 + thin = 7 + bone = 8 + exaggerated = 9 + triangle = 10 + normal_sans = 11 + obtuse_sans = 12 + perp_sans = 13 + flared = 14 + rounded = 15 + + class XHeight(Enum): + any = 0 + no_fit = 1 + constant_small = 2 + constant_standard = 3 + constant_large = 4 + ducking_small = 5 + ducking_standard = 6 + ducking_large = 7 + + class ArmStyle(Enum): + any = 0 + no_fit = 1 + straight_arms_horizontal = 2 + straight_arms_wedge = 3 + straight_arms_vertical = 4 + straight_arms_single_serif = 5 + straight_arms_double_serif = 6 + non_straight_arms_horizontal = 7 + non_straight_arms_wedge = 8 + non_straight_arms_vertical = 9 + non_straight_arms_single_serif = 10 + non_straight_arms_double_serif = 11 + + class StrokeVariation(Enum): + any = 0 + no_fit = 1 + gradual_diagonal = 2 + gradual_transitional = 3 + gradual_vertical = 4 + gradual_horizontal = 5 + rapid_vertical = 6 + rapid_horizontal = 7 + instant_vertical = 8 + + class Contrast(Enum): + any = 0 + no_fit = 1 + none = 2 + very_low = 3 + low = 4 + medium_low = 5 + medium = 6 + medium_high = 7 + high = 8 + very_high = 9 + + class Midline(Enum): + any = 0 + no_fit = 1 + standard_trimmed = 2 + standard_pointed = 3 + standard_serifed = 4 + high_trimmed = 5 + high_pointed = 6 + high_serifed = 7 + constant_trimmed = 8 + constant_pointed = 9 + constant_serifed = 10 + low_trimmed = 11 + low_pointed = 12 + low_serifed = 13 + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.family_type = KaitaiStream.resolve_enum(Ttf.Os2.Panose.FamilyKind, self._io.read_u1()) + self.serif_style = KaitaiStream.resolve_enum(Ttf.Os2.Panose.SerifStyle, self._io.read_u1()) + self.weight = KaitaiStream.resolve_enum(Ttf.Os2.Panose.Weight, self._io.read_u1()) + self.proportion = KaitaiStream.resolve_enum(Ttf.Os2.Panose.Proportion, self._io.read_u1()) + self.contrast = KaitaiStream.resolve_enum(Ttf.Os2.Panose.Contrast, self._io.read_u1()) + self.stroke_variation = KaitaiStream.resolve_enum(Ttf.Os2.Panose.StrokeVariation, self._io.read_u1()) + self.arm_style = KaitaiStream.resolve_enum(Ttf.Os2.Panose.ArmStyle, self._io.read_u1()) + self.letter_form = KaitaiStream.resolve_enum(Ttf.Os2.Panose.LetterForm, self._io.read_u1()) + self.midline = KaitaiStream.resolve_enum(Ttf.Os2.Panose.Midline, self._io.read_u1()) + self.x_height = KaitaiStream.resolve_enum(Ttf.Os2.Panose.XHeight, self._io.read_u1()) + + + class UnicodeRange(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.basic_latin = self._io.read_bits_int_be(1) != 0 + self.latin_1_supplement = self._io.read_bits_int_be(1) != 0 + self.latin_extended_a = self._io.read_bits_int_be(1) != 0 + self.latin_extended_b = self._io.read_bits_int_be(1) != 0 + self.ipa_extensions = self._io.read_bits_int_be(1) != 0 + self.spacing_modifier_letters = self._io.read_bits_int_be(1) != 0 + self.combining_diacritical_marks = self._io.read_bits_int_be(1) != 0 + self.basic_greek = self._io.read_bits_int_be(1) != 0 + self.greek_symbols_and_coptic = self._io.read_bits_int_be(1) != 0 + self.cyrillic = self._io.read_bits_int_be(1) != 0 + self.armenian = self._io.read_bits_int_be(1) != 0 + self.basic_hebrew = self._io.read_bits_int_be(1) != 0 + self.hebrew_extended = self._io.read_bits_int_be(1) != 0 + self.basic_arabic = self._io.read_bits_int_be(1) != 0 + self.arabic_extended = self._io.read_bits_int_be(1) != 0 + self.devanagari = self._io.read_bits_int_be(1) != 0 + self.bengali = self._io.read_bits_int_be(1) != 0 + self.gurmukhi = self._io.read_bits_int_be(1) != 0 + self.gujarati = self._io.read_bits_int_be(1) != 0 + self.oriya = self._io.read_bits_int_be(1) != 0 + self.tamil = self._io.read_bits_int_be(1) != 0 + self.telugu = self._io.read_bits_int_be(1) != 0 + self.kannada = self._io.read_bits_int_be(1) != 0 + self.malayalam = self._io.read_bits_int_be(1) != 0 + self.thai = self._io.read_bits_int_be(1) != 0 + self.lao = self._io.read_bits_int_be(1) != 0 + self.basic_georgian = self._io.read_bits_int_be(1) != 0 + self.georgian_extended = self._io.read_bits_int_be(1) != 0 + self.hangul_jamo = self._io.read_bits_int_be(1) != 0 + self.latin_extended_additional = self._io.read_bits_int_be(1) != 0 + self.greek_extended = self._io.read_bits_int_be(1) != 0 + self.general_punctuation = self._io.read_bits_int_be(1) != 0 + self.superscripts_and_subscripts = self._io.read_bits_int_be(1) != 0 + self.currency_symbols = self._io.read_bits_int_be(1) != 0 + self.combining_diacritical_marks_for_symbols = self._io.read_bits_int_be(1) != 0 + self.letterlike_symbols = self._io.read_bits_int_be(1) != 0 + self.number_forms = self._io.read_bits_int_be(1) != 0 + self.arrows = self._io.read_bits_int_be(1) != 0 + self.mathematical_operators = self._io.read_bits_int_be(1) != 0 + self.miscellaneous_technical = self._io.read_bits_int_be(1) != 0 + self.control_pictures = self._io.read_bits_int_be(1) != 0 + self.optical_character_recognition = self._io.read_bits_int_be(1) != 0 + self.enclosed_alphanumerics = self._io.read_bits_int_be(1) != 0 + self.box_drawing = self._io.read_bits_int_be(1) != 0 + self.block_elements = self._io.read_bits_int_be(1) != 0 + self.geometric_shapes = self._io.read_bits_int_be(1) != 0 + self.miscellaneous_symbols = self._io.read_bits_int_be(1) != 0 + self.dingbats = self._io.read_bits_int_be(1) != 0 + self.cjk_symbols_and_punctuation = self._io.read_bits_int_be(1) != 0 + self.hiragana = self._io.read_bits_int_be(1) != 0 + self.katakana = self._io.read_bits_int_be(1) != 0 + self.bopomofo = self._io.read_bits_int_be(1) != 0 + self.hangul_compatibility_jamo = self._io.read_bits_int_be(1) != 0 + self.cjk_miscellaneous = self._io.read_bits_int_be(1) != 0 + self.enclosed_cjk_letters_and_months = self._io.read_bits_int_be(1) != 0 + self.cjk_compatibility = self._io.read_bits_int_be(1) != 0 + self.hangul = self._io.read_bits_int_be(1) != 0 + self.reserved_for_unicode_subranges1 = self._io.read_bits_int_be(1) != 0 + self.reserved_for_unicode_subranges2 = self._io.read_bits_int_be(1) != 0 + self.cjk_unified_ideographs = self._io.read_bits_int_be(1) != 0 + self.private_use_area = self._io.read_bits_int_be(1) != 0 + self.cjk_compatibility_ideographs = self._io.read_bits_int_be(1) != 0 + self.alphabetic_presentation_forms = self._io.read_bits_int_be(1) != 0 + self.arabic_presentation_forms_a = self._io.read_bits_int_be(1) != 0 + self.combining_half_marks = self._io.read_bits_int_be(1) != 0 + self.cjk_compatibility_forms = self._io.read_bits_int_be(1) != 0 + self.small_form_variants = self._io.read_bits_int_be(1) != 0 + self.arabic_presentation_forms_b = self._io.read_bits_int_be(1) != 0 + self.halfwidth_and_fullwidth_forms = self._io.read_bits_int_be(1) != 0 + self.specials = self._io.read_bits_int_be(1) != 0 + self._io.align_to_byte() + self.reserved = self._io.read_bytes(7) + + + class CodePageRange(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.symbol_character_set = self._io.read_bits_int_be(1) != 0 + self.oem_character_set = self._io.read_bits_int_be(1) != 0 + self.macintosh_character_set = self._io.read_bits_int_be(1) != 0 + self.reserved_for_alternate_ansi_oem = self._io.read_bits_int_be(7) + self.cp1361_korean_johab = self._io.read_bits_int_be(1) != 0 + self.cp950_chinese_traditional_chars_taiwan_and_hong_kong = self._io.read_bits_int_be(1) != 0 + self.cp949_korean_wansung = self._io.read_bits_int_be(1) != 0 + self.cp936_chinese_simplified_chars_prc_and_singapore = self._io.read_bits_int_be(1) != 0 + self.cp932_jis_japan = self._io.read_bits_int_be(1) != 0 + self.cp874_thai = self._io.read_bits_int_be(1) != 0 + self.reserved_for_alternate_ansi = self._io.read_bits_int_be(8) + self.cp1257_windows_baltic = self._io.read_bits_int_be(1) != 0 + self.cp1256_arabic = self._io.read_bits_int_be(1) != 0 + self.cp1255_hebrew = self._io.read_bits_int_be(1) != 0 + self.cp1254_turkish = self._io.read_bits_int_be(1) != 0 + self.cp1253_greek = self._io.read_bits_int_be(1) != 0 + self.cp1251_cyrillic = self._io.read_bits_int_be(1) != 0 + self.cp1250_latin_2_eastern_europe = self._io.read_bits_int_be(1) != 0 + self.cp1252_latin_1 = self._io.read_bits_int_be(1) != 0 + self.cp437_us = self._io.read_bits_int_be(1) != 0 + self.cp850_we_latin_1 = self._io.read_bits_int_be(1) != 0 + self.cp708_arabic_asmo_708 = self._io.read_bits_int_be(1) != 0 + self.cp737_greek_former_437_g = self._io.read_bits_int_be(1) != 0 + self.cp775_ms_dos_baltic = self._io.read_bits_int_be(1) != 0 + self.cp852_latin_2 = self._io.read_bits_int_be(1) != 0 + self.cp855_ibm_cyrillic_primarily_russian = self._io.read_bits_int_be(1) != 0 + self.cp857_ibm_turkish = self._io.read_bits_int_be(1) != 0 + self.cp860_ms_dos_portuguese = self._io.read_bits_int_be(1) != 0 + self.cp861_ms_dos_icelandic = self._io.read_bits_int_be(1) != 0 + self.cp862_hebrew = self._io.read_bits_int_be(1) != 0 + self.cp863_ms_dos_canadian_french = self._io.read_bits_int_be(1) != 0 + self.cp864_arabic = self._io.read_bits_int_be(1) != 0 + self.cp865_ms_dos_nordic = self._io.read_bits_int_be(1) != 0 + self.cp866_ms_dos_russian = self._io.read_bits_int_be(1) != 0 + self.cp869_ibm_greek = self._io.read_bits_int_be(1) != 0 + self.reserved_for_oem = self._io.read_bits_int_be(16) + + + + class Fixed(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.major = self._io.read_u2be() + self.minor = self._io.read_u2be() + + + class Glyf(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.number_of_contours = self._io.read_s2be() + self.x_min = self._io.read_s2be() + self.y_min = self._io.read_s2be() + self.x_max = self._io.read_s2be() + self.y_max = self._io.read_s2be() + if self.number_of_contours > 0: + self.value = Ttf.Glyf.SimpleGlyph(self._io, self, self._root) + + + class SimpleGlyph(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.end_pts_of_contours = [] + for i in range(self._parent.number_of_contours): + self.end_pts_of_contours.append(self._io.read_u2be()) + + self.instruction_length = self._io.read_u2be() + self.instructions = self._io.read_bytes(self.instruction_length) + self.flags = [] + for i in range(self.point_count): + self.flags.append(Ttf.Glyf.SimpleGlyph.Flag(self._io, self, self._root)) + + + class Flag(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.reserved = self._io.read_bits_int_be(2) + self.y_is_same = self._io.read_bits_int_be(1) != 0 + self.x_is_same = self._io.read_bits_int_be(1) != 0 + self.repeat = self._io.read_bits_int_be(1) != 0 + self.y_short_vector = self._io.read_bits_int_be(1) != 0 + self.x_short_vector = self._io.read_bits_int_be(1) != 0 + self.on_curve = self._io.read_bits_int_be(1) != 0 + self._io.align_to_byte() + if self.repeat: + self.repeat_value = self._io.read_u1() + + + + @property + def point_count(self): + if hasattr(self, '_m_point_count'): + return self._m_point_count + + self._m_point_count = (max(self.end_pts_of_contours) + 1) + return getattr(self, '_m_point_count', None) + + + + class Cvt(KaitaiStruct): + """cvt - Control Value Table This table contains a list of values that can be referenced by instructions. They can be used, among other things, to control characteristics for different glyphs. + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.fwords = [] + i = 0 + while not self._io.is_eof(): + self.fwords.append(self._io.read_s2be()) + i += 1 + + + + class Maxp(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.table_version_number = Ttf.Fixed(self._io, self, self._root) + self.num_glyphs = self._io.read_u2be() + if self.is_version10: + self.version10_body = Ttf.MaxpVersion10Body(self._io, self, self._root) + + + @property + def is_version10(self): + if hasattr(self, '_m_is_version10'): + return self._m_is_version10 + + self._m_is_version10 = ((self.table_version_number.major == 1) and (self.table_version_number.minor == 0)) + return getattr(self, '_m_is_version10', None) + + + class MaxpVersion10Body(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.max_points = self._io.read_u2be() + self.max_contours = self._io.read_u2be() + self.max_composite_points = self._io.read_u2be() + self.max_composite_contours = self._io.read_u2be() + self.max_zones = self._io.read_u2be() + self.max_twilight_points = self._io.read_u2be() + self.max_storage = self._io.read_u2be() + self.max_function_defs = self._io.read_u2be() + self.max_instruction_defs = self._io.read_u2be() + self.max_stack_elements = self._io.read_u2be() + self.max_size_of_instructions = self._io.read_u2be() + self.max_component_elements = self._io.read_u2be() + self.max_component_depth = self._io.read_u2be() + + + class OffsetTable(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.sfnt_version = Ttf.Fixed(self._io, self, self._root) + self.num_tables = self._io.read_u2be() + self.search_range = self._io.read_u2be() + self.entry_selector = self._io.read_u2be() + self.range_shift = self._io.read_u2be() + + + class Cmap(KaitaiStruct): + """cmap - Character To Glyph Index Mapping Table This table defines the mapping of character codes to the glyph index values used in the font. + """ + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.version_number = self._io.read_u2be() + self.number_of_encoding_tables = self._io.read_u2be() + self.tables = [] + for i in range(self.number_of_encoding_tables): + self.tables.append(Ttf.Cmap.SubtableHeader(self._io, self, self._root)) + + + class SubtableHeader(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.platform_id = self._io.read_u2be() + self.encoding_id = self._io.read_u2be() + self.subtable_offset = self._io.read_u4be() + + @property + def table(self): + if hasattr(self, '_m_table'): + return self._m_table + + io = self._parent._io + _pos = io.pos() + io.seek(self.subtable_offset) + self._m_table = Ttf.Cmap.Subtable(io, self, self._root) + io.seek(_pos) + return getattr(self, '_m_table', None) + + + class Subtable(KaitaiStruct): + + class SubtableFormat(Enum): + byte_encoding_table = 0 + high_byte_mapping_through_table = 2 + segment_mapping_to_delta_values = 4 + trimmed_table_mapping = 6 + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.format = KaitaiStream.resolve_enum(Ttf.Cmap.Subtable.SubtableFormat, self._io.read_u2be()) + self.length = self._io.read_u2be() + self.version = self._io.read_u2be() + _on = self.format + if _on == Ttf.Cmap.Subtable.SubtableFormat.byte_encoding_table: + self._raw_value = self._io.read_bytes((self.length - 6)) + _io__raw_value = KaitaiStream(BytesIO(self._raw_value)) + self.value = Ttf.Cmap.Subtable.ByteEncodingTable(_io__raw_value, self, self._root) + elif _on == Ttf.Cmap.Subtable.SubtableFormat.segment_mapping_to_delta_values: + self._raw_value = self._io.read_bytes((self.length - 6)) + _io__raw_value = KaitaiStream(BytesIO(self._raw_value)) + self.value = Ttf.Cmap.Subtable.SegmentMappingToDeltaValues(_io__raw_value, self, self._root) + elif _on == Ttf.Cmap.Subtable.SubtableFormat.high_byte_mapping_through_table: + self._raw_value = self._io.read_bytes((self.length - 6)) + _io__raw_value = KaitaiStream(BytesIO(self._raw_value)) + self.value = Ttf.Cmap.Subtable.HighByteMappingThroughTable(_io__raw_value, self, self._root) + elif _on == Ttf.Cmap.Subtable.SubtableFormat.trimmed_table_mapping: + self._raw_value = self._io.read_bytes((self.length - 6)) + _io__raw_value = KaitaiStream(BytesIO(self._raw_value)) + self.value = Ttf.Cmap.Subtable.TrimmedTableMapping(_io__raw_value, self, self._root) + else: + self.value = self._io.read_bytes((self.length - 6)) + + class ByteEncodingTable(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.glyph_id_array = self._io.read_bytes(256) + + + class HighByteMappingThroughTable(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.sub_header_keys = [] + for i in range(256): + self.sub_header_keys.append(self._io.read_u2be()) + + + + class SegmentMappingToDeltaValues(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.seg_count_x2 = self._io.read_u2be() + self.search_range = self._io.read_u2be() + self.entry_selector = self._io.read_u2be() + self.range_shift = self._io.read_u2be() + self.end_count = [] + for i in range(self.seg_count): + self.end_count.append(self._io.read_u2be()) + + self.reserved_pad = self._io.read_u2be() + self.start_count = [] + for i in range(self.seg_count): + self.start_count.append(self._io.read_u2be()) + + self.id_delta = [] + for i in range(self.seg_count): + self.id_delta.append(self._io.read_u2be()) + + self.id_range_offset = [] + for i in range(self.seg_count): + self.id_range_offset.append(self._io.read_u2be()) + + self.glyph_id_array = [] + i = 0 + while not self._io.is_eof(): + self.glyph_id_array.append(self._io.read_u2be()) + i += 1 + + + @property + def seg_count(self): + if hasattr(self, '_m_seg_count'): + return self._m_seg_count + + self._m_seg_count = self.seg_count_x2 // 2 + return getattr(self, '_m_seg_count', None) + + + class TrimmedTableMapping(KaitaiStruct): + def __init__(self, _io, _parent=None, _root=None): + self._io = _io + self._parent = _parent + self._root = _root if _root else self + self._read() + + def _read(self): + self.first_code = self._io.read_u2be() + self.entry_count = self._io.read_u2be() + self.glyph_id_array = [] + for i in range(self.entry_count): + self.glyph_id_array.append(self._io.read_u2be()) + + + + + + diff --git a/utils.py b/utils.py new file mode 100755 index 0000000..95391bd --- /dev/null +++ b/utils.py @@ -0,0 +1,57 @@ +def kaitai_obj_to_dict(obj): + if hasattr(obj, "__dict__"): + result = {} + for k, v in obj.__dict__.items(): + if not k.startswith("_"): + result[k] = kaitai_obj_to_dict(v) + return result + elif isinstance(obj, list): + result = [] + for item in obj: + result.append(kaitai_obj_to_dict(item)) + return result + else: + return obj + + +def to_nu_value(obj, span): + return {"Value": to_nu_value_impl(obj, span)} + + +def to_nu_value_impl(obj, span): + # check for single builtin type. + nu_type_table = { + str: "String", + int: "Int", + float: "Float", + } + obj_type = type(obj) + if obj_type in nu_type_table: + return {nu_type_table[obj_type]: {"val": obj, "span": span}} + # dict should convert to Record. + if isinstance(obj, dict): + cols = [] + values = [] + for k, v in obj.items(): + cols.append(k) + values.append(to_nu_value_impl(v, span)) + return {"Record": {"cols": cols, "vals": values, "span": span}} + # list should convert to List. + elif isinstance(obj, list): + values = [] + for item in obj: + values.append(to_nu_value_impl(item, span)) + return {"List": {"vals": values, "span": span}} + # bytes should convert to nushell Bytes + elif isinstance(obj, (bytes, bytearray)): + return { + "Binary": { + "val": list(obj), + "span": span, + } + } + raise RuntimeError + + +def nu_error(err_type, msg, span): + return {"Error": {"label": err_type, "msg": msg, "span": span}}