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')) self.position_as_ratio = stream.read_ushort('position as ratio') != 0 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.flip = stream.read_uchar('flip') != 0 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.symbol_level = SymbolLayer.read_symbol_level(stream) self.decoration_on_top = stream.read_uchar('decoration on top') != 0 self.line_start_offset = stream.read_double('line start offset') self.cap = self.read_cap(stream) self.join = self.read_join(stream) self.miter_limit = stream.read_double('miter limit')
def read(self, stream: Stream, version): self.color = stream.read_object('color') self.unicode = stream.read_int('unicode') self.units = stream.read_int('units') self.angle = stream.read_double('angle') self.size = stream.read_double('size') self.depth = stream.read_double('depth') self.normalized_origin_x = stream.read_double('normalized origin x') self.normalized_origin_y = stream.read_double('normalized origin y') self.normalized_origin_z = stream.read_double('normalized origin z') self.x_offset = stream.read_double('x offset') self.y_offset = stream.read_double('y offset') self.z_offset = stream.read_double('z offset') self.font = stream.read_object('font') self.read_symbol_level(stream) stream.read_ushort('unknown', expected=65535) self.character_marker_symbol = stream.read_object('character marker') self.vertical_orientation = stream.read_uchar( 'vertical orientation') != 0 self.x_rotation = stream.read_double('x rotation') self.y_rotation = stream.read_double('y rotation') self.width = stream.read_double('width') self.maintain_aspect_ratio = stream.read_ushort( 'maintain aspect ratio') != 0 self.billboard_display = stream.read_ushort('billboard display') != 0
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] self.symbol_level = SymbolLayer.read_symbol_level(stream) self.angle = stream.read_double('angle') self.x_offset = stream.read_double('x offset') self.y_offset = stream.read_double('y offset') self.outline_enabled = stream.read_uchar('has outline') != 0 self.outline_width = stream.read_double('outline width') self.outline_color = stream.read_object('outline color') if version > 1: self.rotate_with_transform = stream.read_ushort('rotate with transform') != 0
def read(self, stream: Stream, version): version = binascii.hexlify(stream.read(1)) if version != b'01': raise UnsupportedVersionException( 'Unsupported Font version {}'.format(version)) self.charset = stream.read_ushort('charset') # Not exposed in ArcMap front end: attributes = stream.read_uchar('attributes') self.italic = bool(attributes & self.Italic) self.underline = bool(attributes & self.Underline) self.strikethrough = bool(attributes & self.Strikethrough) self.weight = stream.read_ushort('weight') # From https://docs.microsoft.com/en-us/windows/desktop/api/olectl/ns-olectl-tagfontdesc # Use the int64 member of the CY structure and scale your font size (in points) by 10000. self.size = stream.read_int('font size') / 10000 name_length = stream.read_uchar('font name size') self.font_name = stream.read(name_length).decode( Font.CHARSET_MAP[self.charset])
def read(self, stream: Stream, version): if version in (3, 4, 5): self.picture = stream.read_object('picture') elif version in (7, 8): _ = stream.read_ushort('pic version?') _ = stream.read_uint('picture type?') self.picture = stream.read_object('picture') elif version == 9: self.picture = Picture.create_from_stream(stream) if version < 4: _ = stream.read_object() 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') self.x_scale = stream.read_double('x scale') self.y_scale = stream.read_double('y scale') self.symbol_level = SymbolLayer.read_symbol_level(stream) self.swap_fb_gb = bool(stream.read_uchar('swap fgbg')) self.rotate_with_transform = stream.read_ushort( 'rotate with transform') != 0 if version < 5: return stream.read_int('unknown', expected=0) stream.read_ushort('unknown', expected=0) if version == 7: return if 5 < version <= 8: size = stream.read_int('unknown size') stream.read(size)
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 = Picture.create_from_stream(stream) 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 self.outline = stream.read_object('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) self.symbol_level = SymbolLayer.read_symbol_level(stream) self.swap_fb_gb = bool(stream.read_uchar('swap fgbg')) if version < 4: return stream.read(6) if 4 < version < 8: stream.read(4)
def read(self, stream: Stream, version): stream.read_uchar('unknown', expected=0) self.offset = stream.read_double('offset') self.width = stream.read_double('width') self.fill_symbol = stream.read_object('fill symbol')
def read(self, stream: Stream, version): self.width = stream.read_double('width') self.texture_fill_symbol = stream.read_object('texture fill symbol') self.vertical_orientation = stream.read_uchar( 'vertical orientation') != 0