codekingpro/portable-devtools
114k
1# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild2 3import kaitaistruct4from kaitaistruct import KaitaiStruct, KaitaiStream, BytesIO5from enum import Enum6import zlib7 8 9if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 9):10 raise Exception("Incompatible Kaitai Struct Python API: 0.9 or later is required, but you have %s" % (kaitaistruct.__version__))11 12class Png(KaitaiStruct):13 """Test files for APNG can be found at the following locations:14 15 * <https://philip.html5.org/tests/apng/tests.html>16 * <http://littlesvr.ca/apng/>17 """18 19 class PhysUnit(Enum):20 unknown = 021 meter = 122 23 class BlendOpValues(Enum):24 source = 025 over = 126 27 class CompressionMethods(Enum):28 zlib = 029 30 class DisposeOpValues(Enum):31 none = 032 background = 133 previous = 234 35 class ColorType(Enum):36 greyscale = 037 truecolor = 238 indexed = 339 greyscale_alpha = 440 truecolor_alpha = 641 def __init__(self, _io, _parent=None, _root=None):42 self._io = _io43 self._parent = _parent44 self._root = _root if _root else self45 self._read()46 47 def _read(self):48 self.magic = self._io.read_bytes(8)49 if not self.magic == b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A":50 raise kaitaistruct.ValidationNotEqualError(b"\x89\x50\x4E\x47\x0D\x0A\x1A\x0A", self.magic, self._io, u"/seq/0")51 self.ihdr_len = self._io.read_u4be()52 if not self.ihdr_len == 13:53 raise kaitaistruct.ValidationNotEqualError(13, self.ihdr_len, self._io, u"/seq/1")54 self.ihdr_type = self._io.read_bytes(4)55 if not self.ihdr_type == b"\x49\x48\x44\x52":56 raise kaitaistruct.ValidationNotEqualError(b"\x49\x48\x44\x52", self.ihdr_type, self._io, u"/seq/2")57 self.ihdr = Png.IhdrChunk(self._io, self, self._root)58 self.ihdr_crc = self._io.read_bytes(4)59 self.chunks = []60 i = 061 while True:62 _ = Png.Chunk(self._io, self, self._root)63 self.chunks.append(_)64 if ((_.type == u"IEND") or (self._io.is_eof())) :65 break66 i += 167 68 class Rgb(KaitaiStruct):69 def __init__(self, _io, _parent=None, _root=None):70 self._io = _io71 self._parent = _parent72 self._root = _root if _root else self73 self._read()74 75 def _read(self):76 self.r = self._io.read_u1()77 self.g = self._io.read_u1()78 self.b = self._io.read_u1()79 80 81 class Chunk(KaitaiStruct):82 def __init__(self, _io, _parent=None, _root=None):83 self._io = _io84 self._parent = _parent85 self._root = _root if _root else self86 self._read()87 88 def _read(self):89 self.len = self._io.read_u4be()90 self.type = (self._io.read_bytes(4)).decode(u"UTF-8")91 _on = self.type92 if _on == u"iTXt":93 self._raw_body = self._io.read_bytes(self.len)94 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))95 self.body = Png.InternationalTextChunk(_io__raw_body, self, self._root)96 elif _on == u"gAMA":97 self._raw_body = self._io.read_bytes(self.len)98 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))99 self.body = Png.GamaChunk(_io__raw_body, self, self._root)100 elif _on == u"tIME":101 self._raw_body = self._io.read_bytes(self.len)102 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))103 self.body = Png.TimeChunk(_io__raw_body, self, self._root)104 elif _on == u"PLTE":105 self._raw_body = self._io.read_bytes(self.len)106 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))107 self.body = Png.PlteChunk(_io__raw_body, self, self._root)108 elif _on == u"bKGD":109 self._raw_body = self._io.read_bytes(self.len)110 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))111 self.body = Png.BkgdChunk(_io__raw_body, self, self._root)112 elif _on == u"pHYs":113 self._raw_body = self._io.read_bytes(self.len)114 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))115 self.body = Png.PhysChunk(_io__raw_body, self, self._root)116 elif _on == u"fdAT":117 self._raw_body = self._io.read_bytes(self.len)118 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))119 self.body = Png.FrameDataChunk(_io__raw_body, self, self._root)120 elif _on == u"tEXt":121 self._raw_body = self._io.read_bytes(self.len)122 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))123 self.body = Png.TextChunk(_io__raw_body, self, self._root)124 elif _on == u"cHRM":125 self._raw_body = self._io.read_bytes(self.len)126 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))127 self.body = Png.ChrmChunk(_io__raw_body, self, self._root)128 elif _on == u"acTL":129 self._raw_body = self._io.read_bytes(self.len)130 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))131 self.body = Png.AnimationControlChunk(_io__raw_body, self, self._root)132 elif _on == u"sRGB":133 self._raw_body = self._io.read_bytes(self.len)134 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))135 self.body = Png.SrgbChunk(_io__raw_body, self, self._root)136 elif _on == u"zTXt":137 self._raw_body = self._io.read_bytes(self.len)138 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))139 self.body = Png.CompressedTextChunk(_io__raw_body, self, self._root)140 elif _on == u"fcTL":141 self._raw_body = self._io.read_bytes(self.len)142 _io__raw_body = KaitaiStream(BytesIO(self._raw_body))143 self.body = Png.FrameControlChunk(_io__raw_body, self, self._root)144 else:145 self.body = self._io.read_bytes(self.len)146 self.crc = self._io.read_bytes(4)147 148 149 class BkgdIndexed(KaitaiStruct):150 """Background chunk for images with indexed palette."""151 def __init__(self, _io, _parent=None, _root=None):152 self._io = _io153 self._parent = _parent154 self._root = _root if _root else self155 self._read()156 157 def _read(self):158 self.palette_index = self._io.read_u1()159 160 161 class Point(KaitaiStruct):162 def __init__(self, _io, _parent=None, _root=None):163 self._io = _io164 self._parent = _parent165 self._root = _root if _root else self166 self._read()167 168 def _read(self):169 self.x_int = self._io.read_u4be()170 self.y_int = self._io.read_u4be()171 172 @property173 def x(self):174 if hasattr(self, '_m_x'):175 return self._m_x176 177 self._m_x = (self.x_int / 100000.0)178 return getattr(self, '_m_x', None)179 180 @property181 def y(self):182 if hasattr(self, '_m_y'):183 return self._m_y184 185 self._m_y = (self.y_int / 100000.0)186 return getattr(self, '_m_y', None)187 188 189 class BkgdGreyscale(KaitaiStruct):190 """Background chunk for greyscale images."""191 def __init__(self, _io, _parent=None, _root=None):192 self._io = _io193 self._parent = _parent194 self._root = _root if _root else self195 self._read()196 197 def _read(self):198 self.value = self._io.read_u2be()199 200 201 class ChrmChunk(KaitaiStruct):202 """203 .. seealso::204 Source - https://www.w3.org/TR/PNG/#11cHRM205 """206 def __init__(self, _io, _parent=None, _root=None):207 self._io = _io208 self._parent = _parent209 self._root = _root if _root else self210 self._read()211 212 def _read(self):213 self.white_point = Png.Point(self._io, self, self._root)214 self.red = Png.Point(self._io, self, self._root)215 self.green = Png.Point(self._io, self, self._root)216 self.blue = Png.Point(self._io, self, self._root)217 218 219 class IhdrChunk(KaitaiStruct):220 """221 .. seealso::222 Source - https://www.w3.org/TR/PNG/#11IHDR223 """224 def __init__(self, _io, _parent=None, _root=None):225 self._io = _io226 self._parent = _parent227 self._root = _root if _root else self228 self._read()229 230 def _read(self):231 self.width = self._io.read_u4be()232 self.height = self._io.read_u4be()233 self.bit_depth = self._io.read_u1()234 self.color_type = KaitaiStream.resolve_enum(Png.ColorType, self._io.read_u1())235 self.compression_method = self._io.read_u1()236 self.filter_method = self._io.read_u1()237 self.interlace_method = self._io.read_u1()238 239 240 class PlteChunk(KaitaiStruct):241 """242 .. seealso::243 Source - https://www.w3.org/TR/PNG/#11PLTE244 """245 def __init__(self, _io, _parent=None, _root=None):246 self._io = _io247 self._parent = _parent248 self._root = _root if _root else self249 self._read()250 251 def _read(self):252 self.entries = []253 i = 0254 while not self._io.is_eof():255 self.entries.append(Png.Rgb(self._io, self, self._root))256 i += 1257 258 259 260 class SrgbChunk(KaitaiStruct):261 """262 .. seealso::263 Source - https://www.w3.org/TR/PNG/#11sRGB264 """265 266 class Intent(Enum):267 perceptual = 0268 relative_colorimetric = 1269 saturation = 2270 absolute_colorimetric = 3271 def __init__(self, _io, _parent=None, _root=None):272 self._io = _io273 self._parent = _parent274 self._root = _root if _root else self275 self._read()276 277 def _read(self):278 self.render_intent = KaitaiStream.resolve_enum(Png.SrgbChunk.Intent, self._io.read_u1())279 280 281 class CompressedTextChunk(KaitaiStruct):282 """Compressed text chunk effectively allows to store key-value283 string pairs in PNG container, compressing "value" part (which284 can be quite lengthy) with zlib compression.285 286 .. seealso::287 Source - https://www.w3.org/TR/PNG/#11zTXt288 """289 def __init__(self, _io, _parent=None, _root=None):290 self._io = _io291 self._parent = _parent292 self._root = _root if _root else self293 self._read()294 295 def _read(self):296 self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")297 self.compression_method = KaitaiStream.resolve_enum(Png.CompressionMethods, self._io.read_u1())298 self._raw_text_datastream = self._io.read_bytes_full()299 self.text_datastream = zlib.decompress(self._raw_text_datastream)300 301 302 class FrameDataChunk(KaitaiStruct):303 """304 .. seealso::305 Source - https://wiki.mozilla.org/APNG_Specification#.60fdAT.60:_The_Frame_Data_Chunk306 """307 def __init__(self, _io, _parent=None, _root=None):308 self._io = _io309 self._parent = _parent310 self._root = _root if _root else self311 self._read()312 313 def _read(self):314 self.sequence_number = self._io.read_u4be()315 self.frame_data = self._io.read_bytes_full()316 317 318 class BkgdTruecolor(KaitaiStruct):319 """Background chunk for truecolor images."""320 def __init__(self, _io, _parent=None, _root=None):321 self._io = _io322 self._parent = _parent323 self._root = _root if _root else self324 self._read()325 326 def _read(self):327 self.red = self._io.read_u2be()328 self.green = self._io.read_u2be()329 self.blue = self._io.read_u2be()330 331 332 class GamaChunk(KaitaiStruct):333 """334 .. seealso::335 Source - https://www.w3.org/TR/PNG/#11gAMA336 """337 def __init__(self, _io, _parent=None, _root=None):338 self._io = _io339 self._parent = _parent340 self._root = _root if _root else self341 self._read()342 343 def _read(self):344 self.gamma_int = self._io.read_u4be()345 346 @property347 def gamma_ratio(self):348 if hasattr(self, '_m_gamma_ratio'):349 return self._m_gamma_ratio350 351 self._m_gamma_ratio = (100000.0 / self.gamma_int)352 return getattr(self, '_m_gamma_ratio', None)353 354 355 class BkgdChunk(KaitaiStruct):356 """Background chunk stores default background color to display this357 image against. Contents depend on `color_type` of the image.358 359 .. seealso::360 Source - https://www.w3.org/TR/PNG/#11bKGD361 """362 def __init__(self, _io, _parent=None, _root=None):363 self._io = _io364 self._parent = _parent365 self._root = _root if _root else self366 self._read()367 368 def _read(self):369 _on = self._root.ihdr.color_type370 if _on == Png.ColorType.indexed:371 self.bkgd = Png.BkgdIndexed(self._io, self, self._root)372 elif _on == Png.ColorType.truecolor_alpha:373 self.bkgd = Png.BkgdTruecolor(self._io, self, self._root)374 elif _on == Png.ColorType.greyscale_alpha:375 self.bkgd = Png.BkgdGreyscale(self._io, self, self._root)376 elif _on == Png.ColorType.truecolor:377 self.bkgd = Png.BkgdTruecolor(self._io, self, self._root)378 elif _on == Png.ColorType.greyscale:379 self.bkgd = Png.BkgdGreyscale(self._io, self, self._root)380 381 382 class PhysChunk(KaitaiStruct):383 """"Physical size" chunk stores data that allows to translate384 logical pixels into physical units (meters, etc) and vice-versa.385 386 .. seealso::387 Source - https://www.w3.org/TR/PNG/#11pHYs388 """389 def __init__(self, _io, _parent=None, _root=None):390 self._io = _io391 self._parent = _parent392 self._root = _root if _root else self393 self._read()394 395 def _read(self):396 self.pixels_per_unit_x = self._io.read_u4be()397 self.pixels_per_unit_y = self._io.read_u4be()398 self.unit = KaitaiStream.resolve_enum(Png.PhysUnit, self._io.read_u1())399 400 401 class FrameControlChunk(KaitaiStruct):402 """403 .. seealso::404 Source - https://wiki.mozilla.org/APNG_Specification#.60fcTL.60:_The_Frame_Control_Chunk405 """406 def __init__(self, _io, _parent=None, _root=None):407 self._io = _io408 self._parent = _parent409 self._root = _root if _root else self410 self._read()411 412 def _read(self):413 self.sequence_number = self._io.read_u4be()414 self.width = self._io.read_u4be()415 if not self.width >= 1:416 raise kaitaistruct.ValidationLessThanError(1, self.width, self._io, u"/types/frame_control_chunk/seq/1")417 if not self.width <= self._root.ihdr.width:418 raise kaitaistruct.ValidationGreaterThanError(self._root.ihdr.width, self.width, self._io, u"/types/frame_control_chunk/seq/1")419 self.height = self._io.read_u4be()420 if not self.height >= 1:421 raise kaitaistruct.ValidationLessThanError(1, self.height, self._io, u"/types/frame_control_chunk/seq/2")422 if not self.height <= self._root.ihdr.height:423 raise kaitaistruct.ValidationGreaterThanError(self._root.ihdr.height, self.height, self._io, u"/types/frame_control_chunk/seq/2")424 self.x_offset = self._io.read_u4be()425 if not self.x_offset <= (self._root.ihdr.width - self.width):426 raise kaitaistruct.ValidationGreaterThanError((self._root.ihdr.width - self.width), self.x_offset, self._io, u"/types/frame_control_chunk/seq/3")427 self.y_offset = self._io.read_u4be()428 if not self.y_offset <= (self._root.ihdr.height - self.height):429 raise kaitaistruct.ValidationGreaterThanError((self._root.ihdr.height - self.height), self.y_offset, self._io, u"/types/frame_control_chunk/seq/4")430 self.delay_num = self._io.read_u2be()431 self.delay_den = self._io.read_u2be()432 self.dispose_op = KaitaiStream.resolve_enum(Png.DisposeOpValues, self._io.read_u1())433 self.blend_op = KaitaiStream.resolve_enum(Png.BlendOpValues, self._io.read_u1())434 435 @property436 def delay(self):437 """Time to display this frame, in seconds."""438 if hasattr(self, '_m_delay'):439 return self._m_delay440 441 self._m_delay = (self.delay_num / (100.0 if self.delay_den == 0 else self.delay_den))442 return getattr(self, '_m_delay', None)443 444 445 class InternationalTextChunk(KaitaiStruct):446 """International text chunk effectively allows to store key-value string pairs in447 PNG container. Both "key" (keyword) and "value" (text) parts are448 given in pre-defined subset of iso8859-1 without control449 characters.450 451 .. seealso::452 Source - https://www.w3.org/TR/PNG/#11iTXt453 """454 def __init__(self, _io, _parent=None, _root=None):455 self._io = _io456 self._parent = _parent457 self._root = _root if _root else self458 self._read()459 460 def _read(self):461 self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")462 self.compression_flag = self._io.read_u1()463 self.compression_method = KaitaiStream.resolve_enum(Png.CompressionMethods, self._io.read_u1())464 self.language_tag = (self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII")465 self.translated_keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"UTF-8")466 self.text = (self._io.read_bytes_full()).decode(u"UTF-8")467 468 469 class TextChunk(KaitaiStruct):470 """Text chunk effectively allows to store key-value string pairs in471 PNG container. Both "key" (keyword) and "value" (text) parts are472 given in pre-defined subset of iso8859-1 without control473 characters.474 475 .. seealso::476 Source - https://www.w3.org/TR/PNG/#11tEXt477 """478 def __init__(self, _io, _parent=None, _root=None):479 self._io = _io480 self._parent = _parent481 self._root = _root if _root else self482 self._read()483 484 def _read(self):485 self.keyword = (self._io.read_bytes_term(0, False, True, True)).decode(u"iso8859-1")486 self.text = (self._io.read_bytes_full()).decode(u"iso8859-1")487 488 489 class AnimationControlChunk(KaitaiStruct):490 """491 .. seealso::492 Source - https://wiki.mozilla.org/APNG_Specification#.60acTL.60:_The_Animation_Control_Chunk493 """494 def __init__(self, _io, _parent=None, _root=None):495 self._io = _io496 self._parent = _parent497 self._root = _root if _root else self498 self._read()499 500 def _read(self):501 self.num_frames = self._io.read_u4be()502 self.num_plays = self._io.read_u4be()503 504 505 class TimeChunk(KaitaiStruct):506 """Time chunk stores time stamp of last modification of this image,507 up to 1 second precision in UTC timezone.508 509 .. seealso::510 Source - https://www.w3.org/TR/PNG/#11tIME511 """512 def __init__(self, _io, _parent=None, _root=None):513 self._io = _io514 self._parent = _parent515 self._root = _root if _root else self516 self._read()517 518 def _read(self):519 self.year = self._io.read_u2be()520 self.month = self._io.read_u1()521 self.day = self._io.read_u1()522 self.hour = self._io.read_u1()523 self.minute = self._io.read_u1()524 self.second = self._io.read_u1()525 526 527 528 