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): """ 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): 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_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(self, stream: Stream, version): self.ramp = stream.read_object('Color ramp') _ = stream.read_object('unused color') # either an entire LineSymbol or just a LineSymbolLayer outline = stream.read_object('outline') if outline is not None: if issubclass(outline.__class__, SymbolLayer): self.outline_layer = outline else: self.outline_symbol = outline self.percent = stream.read_double('percent') self.intervals = stream.read_uint('intervals') self.angle = stream.read_double('angle') self.type = stream.read_uint('Gradient type') stream.read_0d_terminator()
def read(self, stream: Stream, version): """ Reads the decoration information """ # next bit is probably number of decorations? count = stream.read_uint('count of decorations') for i in range(count): decoration = stream.read_object('decoration element {}/{}'.format( i, count)) self.decorations.append(decoration)
def read_line_type(stream: Stream): """ Interprets the line type bytes """ line_type = stream.read_uint() types = {0: 'solid', 1: 'dashed', 2: 'dotted', 3: 'dash dot', 4: 'dash dot dot', 5: 'null'} if line_type not in types: raise UnreadableSymbolException('unknown line type {} at {}'.format(line_type, hex(stream.tell() - 4))) return types[line_type]
def read(self, stream: Stream, version): if not stream.read_0d_terminator(): raise UnreadableSymbolException('Could not find 0d terminator at {}'.format(hex(stream.tell() - 8))) 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]) for l in self.levels: l.read_enabled(stream) for l in self.levels: l.read_locked(stream) if version >= 2: for l in self.levels: l.read_tags(stream)
def read(self, stream: Stream, version): if version == 4: self.picture = stream.read_object('picture') elif version == 7: _ = stream.read_ushort('pic version?') _ = stream.read_uint('picture type?') self.picture = stream.read_object('picture') elif version == 8: self.picture = stream.read_picture('picture') self.color_background = stream.read_object('color bg') self.color_foreground = stream.read_object('color fg') self.color_transparent = stream.read_object('color trans') # either an entire LineSymbol or just a LineSymbolLayer outline = stream.read_object('outline') if outline is not None: if issubclass(outline.__class__, SymbolLayer): self.outline_layer = outline else: self.outline_symbol = outline self.angle = stream.read_double('angle') self.scale_x = stream.read_double('scale_x') self.scale_y = stream.read_double('scale_y') self.offset_x = stream.read_double('offset x') self.offset_y = stream.read_double('offset y') self.separation_x = stream.read_double('separation x') self.separation_y = stream.read_double('separation y') stream.read(16) stream.read_0d_terminator() self.swap_fb_gb = bool(stream.read_uchar('swap fgbg')) if version <= 4: return stream.read(6) if version < 8: stream.read(4)
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): if version in (4, 5): self.picture = stream.read_object('picture') elif version == 8: _ = stream.read_ushort('pic version?') _ = stream.read_uint('picture type?') self.picture = stream.read_object('picture') elif version == 9: self.picture = stream.read_picture('picture') if version <= 8: _ = stream.read_object() self.color_foreground = stream.read_object('color 1') self.color_background = stream.read_object('color 2') if version >= 9: self.color_transparent = stream.read_object('color 3') self.angle = stream.read_double('angle') self.size = stream.read_double('size') self.x_offset = stream.read_double('x offset') self.y_offset = stream.read_double('y offset') stream.read_double('unknown') stream.read_double('unknown') stream.read_0d_terminator() self.swap_fb_gb = bool(stream.read_uchar('swap fgbg')) check = binascii.hexlify(stream.read(2)) if check != b'ffff': raise UnreadableSymbolException('Expected ffff at {}, got {}'.format(check, hex(stream.tell() - 2))) if version < 6: return stream.read(6) if version <= 8: stream.read(4)