summaryrefslogtreecommitdiff
path: root/python/examples/kaitai/png.py
diff options
context:
space:
mode:
authorXusheng <xusheng@vector35.com>2021-07-01 12:34:30 +0800
committerXusheng Li <xushengli@protonmail.com>2021-07-05 10:11:47 +0800
commit13ff200ba134b8704f37eca99c42b70dab0d17dc (patch)
tree876b3db3c53f704b31152aeaede1f2edc9d27b24 /python/examples/kaitai/png.py
parent4039a800349dcd587833d3e27d9137e4649818f4 (diff)
Remove snippet and kaitai plugin. Note their individual links.
Diffstat (limited to 'python/examples/kaitai/png.py')
-rw-r--r--python/examples/kaitai/png.py580
1 files changed, 0 insertions, 580 deletions
diff --git a/python/examples/kaitai/png.py b/python/examples/kaitai/png.py
deleted file mode 100644
index 4a494756..00000000
--- a/python/examples/kaitai/png.py
+++ /dev/null
@@ -1,580 +0,0 @@
-# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
-
-from pkg_resources import parse_version
-from .kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
-from enum import Enum
-import collections
-import zlib
-
-
-if parse_version(ks_version) < parse_version('0.7'):
- raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
-
-class Png(KaitaiStruct):
-
- class ColorType(Enum):
- greyscale = 0
- truecolor = 2
- indexed = 3
- greyscale_alpha = 4
- truecolor_alpha = 6
-
- class PhysUnit(Enum):
- unknown = 0
- meter = 1
-
- class CompressionMethods(Enum):
- zlib = 0
- SEQ_FIELDS = ["magic", "ihdr_len", "ihdr_type", "ihdr", "ihdr_crc", "chunks"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['magic']['start'] = self._io.pos()
- self.magic = self._io.ensure_fixed_contents(b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
- self._debug['magic']['end'] = self._io.pos()
- self._debug['ihdr_len']['start'] = self._io.pos()
- self.ihdr_len = self._io.ensure_fixed_contents(b"\x00\x00\x00\x0D")
- self._debug['ihdr_len']['end'] = self._io.pos()
- self._debug['ihdr_type']['start'] = self._io.pos()
- self.ihdr_type = self._io.ensure_fixed_contents(b"\x49\x48\x44\x52")
- self._debug['ihdr_type']['end'] = self._io.pos()
- self._debug['ihdr']['start'] = self._io.pos()
- self.ihdr = self._root.IhdrChunk(self._io, self, self._root)
- self.ihdr._read()
- self._debug['ihdr']['end'] = self._io.pos()
- self._debug['ihdr_crc']['start'] = self._io.pos()
- self.ihdr_crc = self._io.read_bytes(4)
- self._debug['ihdr_crc']['end'] = self._io.pos()
- self._debug['chunks']['start'] = self._io.pos()
- self.chunks = []
- i = 0
- while True:
- if not 'arr' in self._debug['chunks']:
- self._debug['chunks']['arr'] = []
- self._debug['chunks']['arr'].append({'start': self._io.pos()})
- _t_chunks = self._root.Chunk(self._io, self, self._root)
- _t_chunks._read()
- _ = _t_chunks
- self.chunks.append(_)
- self._debug['chunks']['arr'][len(self.chunks) - 1]['end'] = self._io.pos()
- if ((_.type == u"IEND") or (self._io.is_eof())) :
- break
- i += 1
- self._debug['chunks']['end'] = self._io.pos()
-
- class Rgb(KaitaiStruct):
- SEQ_FIELDS = ["r", "g", "b"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['r']['start'] = self._io.pos()
- self.r = self._io.read_u1()
- self._debug['r']['end'] = self._io.pos()
- self._debug['g']['start'] = self._io.pos()
- self.g = self._io.read_u1()
- self._debug['g']['end'] = self._io.pos()
- self._debug['b']['start'] = self._io.pos()
- self.b = self._io.read_u1()
- self._debug['b']['end'] = self._io.pos()
-
-
- class Chunk(KaitaiStruct):
- SEQ_FIELDS = ["len", "type", "body", "crc"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['len']['start'] = self._io.pos()
- self.len = self._io.read_u4be()
- self._debug['len']['end'] = self._io.pos()
- self._debug['type']['start'] = self._io.pos()
- self.type = (self._io.read_bytes(4)).decode(u"UTF-8")
- self._debug['type']['end'] = self._io.pos()
- self._debug['body']['start'] = self._io.pos()
- _on = self.type
- if _on == u"iTXt":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.InternationalTextChunk(io, self, self._root)
- self.body._read()
- elif _on == u"gAMA":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.GamaChunk(io, self, self._root)
- self.body._read()
- elif _on == u"tIME":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.TimeChunk(io, self, self._root)
- self.body._read()
- elif _on == u"PLTE":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.PlteChunk(io, self, self._root)
- self.body._read()
- elif _on == u"bKGD":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.BkgdChunk(io, self, self._root)
- self.body._read()
- elif _on == u"pHYs":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.PhysChunk(io, self, self._root)
- self.body._read()
- elif _on == u"tEXt":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.TextChunk(io, self, self._root)
- self.body._read()
- elif _on == u"cHRM":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.ChrmChunk(io, self, self._root)
- self.body._read()
- elif _on == u"sRGB":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.SrgbChunk(io, self, self._root)
- self.body._read()
- elif _on == u"zTXt":
- self._raw_body = self._io.read_bytes(self.len)
- io = KaitaiStream(BytesIO(self._raw_body))
- self.body = self._root.CompressedTextChunk(io, self, self._root)
- self.body._read()
- else:
- self.body = self._io.read_bytes(self.len)
- self._debug['body']['end'] = self._io.pos()
- self._debug['crc']['start'] = self._io.pos()
- self.crc = self._io.read_bytes(4)
- self._debug['crc']['end'] = self._io.pos()
-
-
- class BkgdIndexed(KaitaiStruct):
- """Background chunk for images with indexed palette."""
- SEQ_FIELDS = ["palette_index"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['palette_index']['start'] = self._io.pos()
- self.palette_index = self._io.read_u1()
- self._debug['palette_index']['end'] = self._io.pos()
-
-
- class Point(KaitaiStruct):
- SEQ_FIELDS = ["x_int", "y_int"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['x_int']['start'] = self._io.pos()
- self.x_int = self._io.read_u4be()
- self._debug['x_int']['end'] = self._io.pos()
- self._debug['y_int']['start'] = self._io.pos()
- self.y_int = self._io.read_u4be()
- self._debug['y_int']['end'] = self._io.pos()
-
- @property
- def x(self):
- if hasattr(self, '_m_x'):
- return self._m_x if hasattr(self, '_m_x') else None
-
- self._m_x = (self.x_int / 100000.0)
- return self._m_x if hasattr(self, '_m_x') else None
-
- @property
- def y(self):
- if hasattr(self, '_m_y'):
- return self._m_y if hasattr(self, '_m_y') else None
-
- self._m_y = (self.y_int / 100000.0)
- return self._m_y if hasattr(self, '_m_y') else None
-
-
- class BkgdGreyscale(KaitaiStruct):
- """Background chunk for greyscale images."""
- SEQ_FIELDS = ["value"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['value']['start'] = self._io.pos()
- self.value = self._io.read_u2be()
- self._debug['value']['end'] = self._io.pos()
-
-
- class ChrmChunk(KaitaiStruct):
- """
- .. seealso::
- Source - https://www.w3.org/TR/PNG/#11cHRM
- """
- SEQ_FIELDS = ["white_point", "red", "green", "blue"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['white_point']['start'] = self._io.pos()
- self.white_point = self._root.Point(self._io, self, self._root)
- self.white_point._read()
- self._debug['white_point']['end'] = self._io.pos()
- self._debug['red']['start'] = self._io.pos()
- self.red = self._root.Point(self._io, self, self._root)
- self.red._read()
- self._debug['red']['end'] = self._io.pos()
- self._debug['green']['start'] = self._io.pos()
- self.green = self._root.Point(self._io, self, self._root)
- self.green._read()
- self._debug['green']['end'] = self._io.pos()
- self._debug['blue']['start'] = self._io.pos()
- self.blue = self._root.Point(self._io, self, self._root)
- self.blue._read()
- self._debug['blue']['end'] = self._io.pos()
-
-
- class IhdrChunk(KaitaiStruct):
- """
- .. seealso::
- Source - https://www.w3.org/TR/PNG/#11IHDR
- """
- SEQ_FIELDS = ["width", "height", "bit_depth", "color_type", "compression_method", "filter_method", "interlace_method"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['width']['start'] = self._io.pos()
- self.width = self._io.read_u4be()
- self._debug['width']['end'] = self._io.pos()
- self._debug['height']['start'] = self._io.pos()
- self.height = self._io.read_u4be()
- self._debug['height']['end'] = self._io.pos()
- self._debug['bit_depth']['start'] = self._io.pos()
- self.bit_depth = self._io.read_u1()
- self._debug['bit_depth']['end'] = self._io.pos()
- self._debug['color_type']['start'] = self._io.pos()
- self.color_type = KaitaiStream.resolve_enum(self._root.ColorType, self._io.read_u1())
- self._debug['color_type']['end'] = self._io.pos()
- self._debug['compression_method']['start'] = self._io.pos()
- self.compression_method = self._io.read_u1()
- self._debug['compression_method']['end'] = self._io.pos()
- self._debug['filter_method']['start'] = self._io.pos()
- self.filter_method = self._io.read_u1()
- self._debug['filter_method']['end'] = self._io.pos()
- self._debug['interlace_method']['start'] = self._io.pos()
- self.interlace_method = self._io.read_u1()
- self._debug['interlace_method']['end'] = self._io.pos()
-
-
- class PlteChunk(KaitaiStruct):
- """
- .. seealso::
- Source - https://www.w3.org/TR/PNG/#11PLTE
- """
- SEQ_FIELDS = ["entries"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['entries']['start'] = self._io.pos()
- self.entries = []
- i = 0
- while not self._io.is_eof():
- if not 'arr' in self._debug['entries']:
- self._debug['entries']['arr'] = []
- self._debug['entries']['arr'].append({'start': self._io.pos()})
- _t_entries = self._root.Rgb(self._io, self, self._root)
- _t_entries._read()
- self.entries.append(_t_entries)
- self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
- i += 1
-
- self._debug['entries']['end'] = self._io.pos()
-
-
- 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
- SEQ_FIELDS = ["render_intent"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['render_intent']['start'] = self._io.pos()
- self.render_intent = KaitaiStream.resolve_enum(self._root.SrgbChunk.Intent, self._io.read_u1())
- self._debug['render_intent']['end'] = self._io.pos()
-
-
- 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
- """
- SEQ_FIELDS = ["keyword", "compression_method", "text_datastream"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['keyword']['start'] = self._io.pos()
- self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
- self._debug['keyword']['end'] = self._io.pos()
- self._debug['compression_method']['start'] = self._io.pos()
- self.compression_method = KaitaiStream.resolve_enum(self._root.CompressionMethods, self._io.read_u1())
- self._debug['compression_method']['end'] = self._io.pos()
- self._debug['text_datastream']['start'] = self._io.pos()
- self._raw_text_datastream = self._io.read_bytes_full()
- self.text_datastream = zlib.decompress(self._raw_text_datastream)
- self._debug['text_datastream']['end'] = self._io.pos()
-
-
- class BkgdTruecolor(KaitaiStruct):
- """Background chunk for truecolor images."""
- SEQ_FIELDS = ["red", "green", "blue"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['red']['start'] = self._io.pos()
- self.red = self._io.read_u2be()
- self._debug['red']['end'] = self._io.pos()
- self._debug['green']['start'] = self._io.pos()
- self.green = self._io.read_u2be()
- self._debug['green']['end'] = self._io.pos()
- self._debug['blue']['start'] = self._io.pos()
- self.blue = self._io.read_u2be()
- self._debug['blue']['end'] = self._io.pos()
-
-
- class GamaChunk(KaitaiStruct):
- """
- .. seealso::
- Source - https://www.w3.org/TR/PNG/#11gAMA
- """
- SEQ_FIELDS = ["gamma_int"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['gamma_int']['start'] = self._io.pos()
- self.gamma_int = self._io.read_u4be()
- self._debug['gamma_int']['end'] = self._io.pos()
-
- @property
- def gamma_ratio(self):
- if hasattr(self, '_m_gamma_ratio'):
- return self._m_gamma_ratio if hasattr(self, '_m_gamma_ratio') else None
-
- self._m_gamma_ratio = (100000.0 / self.gamma_int)
- return self._m_gamma_ratio if hasattr(self, '_m_gamma_ratio') else 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
- """
- SEQ_FIELDS = ["bkgd"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['bkgd']['start'] = self._io.pos()
- _on = self._root.ihdr.color_type
- if _on == self._root.ColorType.indexed:
- self.bkgd = self._root.BkgdIndexed(self._io, self, self._root)
- self.bkgd._read()
- elif _on == self._root.ColorType.truecolor_alpha:
- self.bkgd = self._root.BkgdTruecolor(self._io, self, self._root)
- self.bkgd._read()
- elif _on == self._root.ColorType.greyscale_alpha:
- self.bkgd = self._root.BkgdGreyscale(self._io, self, self._root)
- self.bkgd._read()
- elif _on == self._root.ColorType.truecolor:
- self.bkgd = self._root.BkgdTruecolor(self._io, self, self._root)
- self.bkgd._read()
- elif _on == self._root.ColorType.greyscale:
- self.bkgd = self._root.BkgdGreyscale(self._io, self, self._root)
- self.bkgd._read()
- self._debug['bkgd']['end'] = self._io.pos()
-
-
- 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
- """
- SEQ_FIELDS = ["pixels_per_unit_x", "pixels_per_unit_y", "unit"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['pixels_per_unit_x']['start'] = self._io.pos()
- self.pixels_per_unit_x = self._io.read_u4be()
- self._debug['pixels_per_unit_x']['end'] = self._io.pos()
- self._debug['pixels_per_unit_y']['start'] = self._io.pos()
- self.pixels_per_unit_y = self._io.read_u4be()
- self._debug['pixels_per_unit_y']['end'] = self._io.pos()
- self._debug['unit']['start'] = self._io.pos()
- self.unit = KaitaiStream.resolve_enum(self._root.PhysUnit, self._io.read_u1())
- self._debug['unit']['end'] = self._io.pos()
-
-
- 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
- """
- SEQ_FIELDS = ["keyword", "compression_flag", "compression_method", "language_tag", "translated_keyword", "text"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['keyword']['start'] = self._io.pos()
- self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
- self._debug['keyword']['end'] = self._io.pos()
- self._debug['compression_flag']['start'] = self._io.pos()
- self.compression_flag = self._io.read_u1()
- self._debug['compression_flag']['end'] = self._io.pos()
- self._debug['compression_method']['start'] = self._io.pos()
- self.compression_method = KaitaiStream.resolve_enum(self._root.CompressionMethods, self._io.read_u1())
- self._debug['compression_method']['end'] = self._io.pos()
- self._debug['language_tag']['start'] = self._io.pos()
- self.language_tag = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
- self._debug['language_tag']['end'] = self._io.pos()
- self._debug['translated_keyword']['start'] = self._io.pos()
- self.translated_keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")
- self._debug['translated_keyword']['end'] = self._io.pos()
- self._debug['text']['start'] = self._io.pos()
- self.text = (self._io.read_bytes_full()).decode(u"UTF-8")
- self._debug['text']['end'] = self._io.pos()
-
-
- 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
- """
- SEQ_FIELDS = ["keyword", "text"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['keyword']['start'] = self._io.pos()
- self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"iso8859-1")
- self._debug['keyword']['end'] = self._io.pos()
- self._debug['text']['start'] = self._io.pos()
- self.text = (self._io.read_bytes_full()).decode(u"iso8859-1")
- self._debug['text']['end'] = self._io.pos()
-
-
- 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
- """
- SEQ_FIELDS = ["year", "month", "day", "hour", "minute", "second"]
- def __init__(self, _io, _parent=None, _root=None):
- self._io = _io
- self._parent = _parent
- self._root = _root if _root else self
- self._debug = collections.defaultdict(dict)
-
- def _read(self):
- self._debug['year']['start'] = self._io.pos()
- self.year = self._io.read_u2be()
- self._debug['year']['end'] = self._io.pos()
- self._debug['month']['start'] = self._io.pos()
- self.month = self._io.read_u1()
- self._debug['month']['end'] = self._io.pos()
- self._debug['day']['start'] = self._io.pos()
- self.day = self._io.read_u1()
- self._debug['day']['end'] = self._io.pos()
- self._debug['hour']['start'] = self._io.pos()
- self.hour = self._io.read_u1()
- self._debug['hour']['end'] = self._io.pos()
- self._debug['minute']['start'] = self._io.pos()
- self.minute = self._io.read_u1()
- self._debug['minute']['end'] = self._io.pos()
- self._debug['second']['start'] = self._io.pos()
- self.second = self._io.read_u1()
- self._debug['second']['end'] = self._io.pos()
-
-
-