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)
Esempio n. 4
0
    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))
Esempio n. 6
0
 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
Esempio n. 7
0
    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)
Esempio n. 8
0
    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)
Esempio n. 9
0
    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)
Esempio n. 10
0
    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)))