def _read(self, handle): # consume section of unknown purpose self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) # either before or after this unknown color? handle.file_handle.read(2) read_color(handle.file_handle) # useful stuff number_layers = unpack("<L", handle.file_handle.read(4))[0] for i in range(number_layers): consume_padding(handle.file_handle) layer = FillSymbolLayer.create(handle) if layer: layer.read(handle) self.levels.extend([layer]) # the next section varies in size. To handle this we jump forward to a known anchor # point, and then move back by a known amount # burn up to the 02 while not binascii.hexlify(handle.file_handle.read(1)) == b'02': pass # jump back a known amount handle.file_handle.seek(handle.file_handle.tell() - 8 * number_layers - 1) for l in self.levels: l.read_enabled(handle) for l in self.levels: l.read_locked(handle)
def _read(self, handle): # first bit is either an entire LineSymbol or just a LineSymbolLayer outline = LineSymbolLayer.create(handle) if isinstance(outline, LineSymbol): # embedded outline symbol line self.outline_symbol = outline if handle.debug: print('starting outline symbol at {}'.format(hex(handle.file_handle.tell()))) self.outline_symbol.read(handle) else: self.outline_layer = outline self.outline_layer.read(handle) consume_padding(handle.file_handle) # sometimes an extra 02 terminator here start = handle.file_handle.tell() symbol_terminator = binascii.hexlify(handle.file_handle.read(1)) if symbol_terminator == b'02': consume_padding(handle.file_handle) else: handle.file_handle.seek(start) self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(2) self.color = read_color(handle.file_handle)
def read(self, handle): """ Reads the symbol layer information. Internally calls _read method for individual layer types """ self._read(handle) # look for 0d terminator while not binascii.hexlify(handle.file_handle.read(1)) == b'0d': pass handle.file_handle.read(15) if handle.debug: print('xy offset at {}'.format(hex(handle.file_handle.tell()))) self.x_offset = unpack("<d", handle.file_handle.read(8))[0] self.y_offset = unpack("<d", handle.file_handle.read(8))[0] has_outline = unpack("<B", handle.file_handle.read(1))[0] if has_outline == 1: self.outline_enabled = True self.outline_width = unpack("<d", handle.file_handle.read(8))[0] self.outline_color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(2) self.outline_color = read_color(handle.file_handle) if handle.debug: print('finished simple marker layer read at {}'.format(hex(handle.file_handle.tell()))) while not binascii.hexlify(handle.file_handle.read(1)) == b'ff': pass handle.file_handle.read(1)
def _read(self, handle): self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(2) self.color = read_color(handle.file_handle) self.size = unpack("<d", handle.file_handle.read(8))[0] type_code = unpack("<L", handle.file_handle.read(4))[0] type_dict = { 0: 'circle', 1: 'square', 2: 'cross', 3: 'x', 4: 'diamond' } assert type_code in type_dict, 'Unknown marker type at {}, got {}'.format( hex(handle.file_handle.tell() - 4), type_code) if handle.debug: print('found a {} at {}'.format(type_dict[type_code], hex(handle.file_handle.tell() - 4))) self.type = type_dict[type_code]
def _read(self, handle): self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(2) self.color = read_color(handle.file_handle) self.width = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('read width of {} at {}'.format(self.width, hex(handle.file_handle.tell() - 8))) self.line_type = LineSymbol.read_line_type(handle.file_handle) if handle.debug: print('read line type of {}'.format(self.line_type))
def check_handle(self, file_handle): try: start = file_handle.tell() color_model = read_color_model(file_handle) if color_model == 'rgb': read_magic_2(Handle(file_handle)) file_handle.read(2) color = read_color(file_handle) if True or (color['R'] == 255 or color['G'] == 255 or color['B'] == 255) and (not color['dither'] and not color['is_null']): return ColorMatch(start, file_handle.tell() - start, color) except: # nopep8 return None
def _read(self, handle): if handle.debug: print('start character marker at {}'.format( hex(handle.file_handle.tell()))) self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(2) self.color = read_color(handle.file_handle) self.unicode = unpack("<L", handle.file_handle.read(4))[0] if handle.debug: print('unicode of {} at {}'.format( self.unicode, hex(handle.file_handle.tell() - 4))) self.angle = unpack("<d", handle.file_handle.read(8))[0] self.size = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('size of {} at {}'.format(self.size, hex(handle.file_handle.tell() - 8))) self.x_offset = unpack("<d", handle.file_handle.read(8))[0] self.y_offset = unpack("<d", handle.file_handle.read(8))[0] # unknown - ends with FFFF while not binascii.hexlify(handle.file_handle.read(2)) == b'ffff': handle.file_handle.seek(handle.file_handle.tell() - 1) if handle.debug: print('start font name at {}'.format(hex( handle.file_handle.tell()))) self.font = read_string(handle) # large unknown block protector = 0 while not binascii.hexlify(handle.file_handle.read(2)) == b'9001': handle.file_handle.seek(handle.file_handle.tell() - 1) protector += 1 if protector > 100: raise UnreadableSymbolException( 'Could not find end point of character marker') handle.file_handle.read(3) # repeated font name, not unicode skip = unpack(">h", handle.file_handle.read(2))[0] if handle.debug: print('duplicate font name at {} for {}'.format( hex(handle.file_handle.tell()), skip)) handle.file_handle.read(skip)
def _read(self, handle): self.read_cap(handle.file_handle) unknown = binascii.hexlify(handle.file_handle.read(3)) if unknown != b'000000': raise UnreadableSymbolException( 'Differing unknown string {}'.format(unknown)) self.read_join(handle.file_handle) unknown = binascii.hexlify(handle.file_handle.read(3)) if unknown != b'000000': raise UnreadableSymbolException( 'Differing unknown string {}'.format(unknown)) self.width = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('read width of {} at {}'.format( self.width, hex(handle.file_handle.tell() - 8))) unknown = binascii.hexlify(handle.file_handle.read(1)) if unknown != b'00': raise UnreadableSymbolException('Differing unknown byte') self.offset = unpack("<d", handle.file_handle.read(8))[0] self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(2) self.color = read_color(handle.file_handle) # 18 unknown bytes binascii.hexlify(handle.file_handle.read(18)) self.pattern_interval = unpack("<d", handle.file_handle.read(8))[0] # symbol pattern pattern_part_count = unpack("<L", handle.file_handle.read(4))[0] self.pattern_parts = [] for p in range(pattern_part_count): filled_squares = unpack("<d", handle.file_handle.read(8))[0] empty_squares = unpack("<d", handle.file_handle.read(8))[0] self.pattern_parts.append([filled_squares, empty_squares]) if handle.debug: print('deciphered cartographic line pattern') pattern = '' for p in self.pattern_parts: pattern += '-' * int(p[0]) + '.' * int(p[1]) print(pattern)
def _read(self, handle): # consume section of unknown purpose while not binascii.hexlify(handle.file_handle.read(1)) == b'40': pass consume_padding(handle.file_handle) self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(28) self.halo = unpack("<L", handle.file_handle.read(4))[0] == 1 self.halo_size = unpack("<d", handle.file_handle.read(8))[0] self.halo_symbol = create_object(handle)() self.halo_symbol.read(handle) # not sure about this - there's an extra 02 here if a full fill symbol is used for the halo if isinstance(self.halo_symbol, Symbol): while not binascii.hexlify(handle.file_handle.read(1)) == b'02': pass consume_padding(handle.file_handle) # useful stuff number_layers = unpack("<L", handle.file_handle.read(4))[0] if handle.debug: print('found {} layers at {}'.format( number_layers, hex(handle.file_handle.tell() - 4))) for i in range(number_layers): consume_padding(handle.file_handle) layer = MarkerSymbolLayer.create(handle) if handle.debug: print('marker symbol layer at {}'.format( hex(handle.file_handle.tell()))) layer.read(handle) self.levels.extend([layer]) for l in self.levels: l.read_enabled(handle) for l in self.levels: l.read_locked(handle)
def _read(self, handle): if handle.debug: print('start arrow marker at {}'.format( hex(handle.file_handle.tell()))) self.color_model = read_color_model(handle.file_handle) read_magic_2(handle) handle.file_handle.read(2) self.color = read_color(handle.file_handle) self.size = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('size of {} at {}'.format(self.size, hex(handle.file_handle.tell() - 8))) self.width = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('width of {} at {}'.format( self.width, hex(handle.file_handle.tell() - 8))) self.angle = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('angle of {} at {}'.format( self.angle, hex(handle.file_handle.tell() - 8))) # 12 bytes unknown purpose if handle.debug: print('skipping 12 unknown bytes at {}'.format( hex(handle.file_handle.tell()))) handle.file_handle.read(12) self.x_offset = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('x offset of {} at {}'.format( self.x_offset, hex(handle.file_handle.tell() - 8))) self.y_offset = unpack("<d", handle.file_handle.read(8))[0] if handle.debug: print('y offset of {} at {}'.format( self.y_offset, hex(handle.file_handle.tell() - 8)))