Esempio n. 1
0
    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))
Esempio n. 2
0
    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')
Esempio n. 3
0
    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
Esempio n. 4
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
Esempio n. 5
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])
Esempio n. 6
0
    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)
Esempio n. 7
0
    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)
Esempio n. 8
0
 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')
Esempio n. 9
0
 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