def _read(self, stream: Stream, version): self.color = stream.read_object('color') number_layers = stream.read_int('layers') for i in range(number_layers): stream.consume_padding() layer = stream.read_object('symbol layer {}/{}'.format( i + 1, number_layers)) 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 stream.log('burning up to 02...') while not binascii.hexlify(stream.read(1)) == b'02': pass # jump back a known amount stream.rewind(8 * number_layers + 1) for l in self.levels: l.read_enabled(stream) for l in self.levels: l.read_locked(stream)
def _read(self, stream: Stream, version): number_layers = stream.read_uint('layer count') for i in range(number_layers): layer = stream.read_object('symbol layer {}/{}'.format( i + 1, number_layers)) 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 stream.log('burning up to 02...') while not binascii.hexlify(stream.read(1)) == b'02': pass # jump back a known amount stream.rewind(8 * number_layers + 1) # TODO - replace the fragile bit above! # stream.read(1) # stream.read_double('unknown size') # stream.read_double('unknown size') for l in self.levels: l.read_enabled(stream) for l in self.levels: l.read_locked(stream)
def read_enabled(self, stream: Stream): """ Reads the layer 'enabled' state """ enabled = stream.read_uint() self.enabled = enabled == 1 stream.log('read enabled ({})'.format(self.enabled), 4)
def read(self, stream: Stream, version): self.color = stream.read_object('color') self.width = stream.read_double('width') self.line_type = self.read_line_type(stream) stream.log('read line type of {}'.format(self.line_type)) self.read_0d_terminator(stream)
def read_locked(self, stream: Stream): """ Reads the layer 'locked' state """ locked = stream.read_uint() self.locked = locked == 1 stream.log('read layer locked ({})'.format(self.locked), 4)
def read_ramp_name_type(self, stream: Stream): """ Reads the ramp name type from a stream """ name_length = stream.read_int('name size') self.ramp_name_type = stream.read(name_length * 2).decode('utf-16') stream.log('Ramp name \'{}\''.format(self.ramp_name_type), name_length * 2) stream.read(2)
def read(self, stream: Stream, version): self.cap = self.read_cap(stream) stream.log('read cap of {}'.format(self.cap), 1) self.offset = stream.read_double('offset') self.pattern_marker = stream.read_object('pattern marker') self.template = stream.read_object('template') self.decoration = stream.read_object('decoration') self.read_0d_terminator(stream)
def read(self, stream: Stream, version): self.pattern_interval = stream.read_double('pattern interval') pattern_part_count = stream.read_int('pattern parts') self.pattern_parts = [] for p in range(pattern_part_count): filled_squares = stream.read_double() empty_squares = stream.read_double() self.pattern_parts.append([filled_squares, empty_squares]) pattern = '' for p in self.pattern_parts: pattern += '-' * int(p[0]) + '.' * int(p[1]) stream.log('deciphered line pattern {} ending'.format(pattern))
def read(self, stream: Stream, version): """ Reads the decoration information """ self.fixed_angle = not bool(stream.read_uchar()) stream.log('detected {}'.format( 'fixed angle' if self.fixed_angle else 'not fixed angle')) self.flip_first = bool(stream.read_uchar()) stream.log('detected {}'.format( 'flip first' if self.flip_first else 'no flip first')) self.flip_all = bool(stream.read_uchar()) stream.log('detected {}'.format( 'flip all' if self.flip_all else 'no flip all')) stream.read(2) # unknown -- maybe includes position as ratio? self.marker = stream.read_object('marker') # next bit is the number of doubles coming next marker_number_positions = stream.read_uint('marker positions') # next bit is the positions themselves -- maybe we can infer this from the number of positions # alone. E.g. 2 positions = 0, 1. 3 positions = 0, 0.5, 1 for _ in range(marker_number_positions): self.marker_positions.append(stream.read_double()) stream.log('marker positions are {}'.format(self.marker_positions))
def read(self, stream: Stream, version): self.color = stream.read_object('color') self.size = stream.read_double('size') self.width = stream.read_double('width') self.angle = stream.read_double('angle') # 12 bytes unknown purpose stream.log('skipping 12 unknown bytes') _ = stream.read_uint('unknown') stream.read_0d_terminator() self.x_offset = stream.read_double('x offset') self.y_offset = stream.read_double('y offset') check = binascii.hexlify(stream.read(2)) if check != b'ffff': raise UnreadableSymbolException('Expected ffff at {}, got {}'.format(check, hex(stream.tell() - 2)))
def read(self, stream: Stream, version): self.color = stream.read_object('color') self.size = stream.read_double('size') type_code = stream.read_int() type_dict = { 0: 'circle', 1: 'square', 2: 'cross', 3: 'x', 4: 'diamond' } if type_code not in type_dict: raise UnreadableSymbolException( 'Unknown marker type at {}, got {}'.format( hex(stream.tell() - 4), type_code)) stream.log('found a {}'.format(type_dict[type_code]), 4) self.type = type_dict[type_code] # look for 0d terminator if not binascii.hexlify(stream.read(8)) == b'0d00000000000000': raise UnreadableSymbolException() stream.read_double('unknown') self.x_offset = stream.read_double('x offset') self.y_offset = stream.read_double('y offset') has_outline = stream.read_uchar() if has_outline == 1: self.outline_enabled = True self.outline_width = stream.read_double('outline width') self.outline_color = stream.read_object('outline color') check = binascii.hexlify(stream.read(2)) if check != b'ffff': raise UnreadableSymbolException( 'Expected ffff at {}, got {}'.format(check, hex(stream.tell() - 2)))
def read(self, stream: Stream, version): self.cap = self.read_cap(stream) stream.log('read cap of {}'.format(self.cap), 1) self.offset = stream.read_double('offset') self.pattern_marker = stream.read_object('pattern marker') self.template = stream.read_object('template') self.decoration = stream.read_object('decoration') stream.read_0d_terminator() _ = stream.read_double('unknown double') _ = stream.read_int('unknown int') _ = stream.read_uchar('unknown char') self.join = self.read_join(stream) unknown = binascii.hexlify(stream.read(3)) if unknown != b'000000': raise UnreadableSymbolException( 'Differing unknown string {}'.format(unknown)) _ = stream.read_double('unknown double')