Пример #1
0
def test_write_length_block():
    data = b'\x00\x00\x00\x07\x01\x01\x01\x01\x01\x01\x01\x00'
    body = data[4:11]
    with io.BytesIO() as f:
        write_length_block(f, lambda fp: fp.write(body), padding=1)
        assert f.getvalue() == data[:11]
        assert f.tell() == 11
    with io.BytesIO() as f:
        write_length_block(f, lambda fp: fp.write(body), padding=2)
        assert f.getvalue() == data
        assert f.tell() == 12
Пример #2
0
 def write(self, fp, **kwargs):
     written = 0
     for item in self:
         written += write_length_block(fp,
                                       lambda f: item.write(f),
                                       padding=4)
     return written
Пример #3
0
 def write(self, fp, padding=4, **kwargs):
     written = 0
     for item in self:
         written += write_length_block(fp,
                                       lambda f: write_bytes(f, item),
                                       fmt='Q')
     written += write_padding(fp, written, padding)
     return written
Пример #4
0
    def write(self, fp, **kwargs):
        written = write_fmt(fp, 'I', self.is_written)
        if self.is_written == 0:
            return written
        if self.depth is None:
            written += write_fmt(fp, 'I', 0)
            return written

        return written + write_length_block(fp, lambda f: self._write_body(f))
Пример #5
0
 def write(self, fp, **kwargs):
     written = write_fmt(fp, '2H', self.version, len(self))
     for key in self:
         written += write_fmt(fp, '4s4s', b'8BIM', key.value)
         written += write_length_block(
             fp, lambda f: self[key].write(f)
         )
     written += write_padding(fp, written, 4)
     return written
Пример #6
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        def writer(f):
            return write_bytes(f, self.value)

        logger.debug('writing color mode data, len=%d' % (len(self.value)))
        return write_length_block(fp, writer)
Пример #7
0
    def write(self, fp, encoding='macroman'):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        def writer(f):
            written = sum(self[key].write(f, encoding) for key in self)
            logger.debug('writing image resources, len=%d' % (written))
            return written

        return write_length_block(fp, writer)
Пример #8
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        def writer(f):
            if hasattr(self.value, 'write'):
                return self.value.write(f)
            return write_bytes(f, self.value)

        return write_length_block(fp, writer)
Пример #9
0
    def write(self, fp):
        written = write_fmt(fp, 'B', self.is_written)

        def writer(f):
            length = write_fmt(f, 'H', self.compression)
            length += write_bytes(f, self.data)
            return length

        if self.is_written:
            written += write_fmt(fp, '4i', *self.rectangle)
            written += write_length_block(fp, writer, fmt='Q')
        return written
Пример #10
0
    def write(self, fp, **kwargs):
        written = write_pascal_string(fp, self.uuid, encoding='ascii',
                                      padding=1)
        written += write_fmt(fp, 'I', self.version)

        def writer(f):
            return self._write_body(f)

        written += write_length_block(fp, writer, fmt='Q')

        if self.extra is not None:
            written += self.extra.write(fp)
        return written
Пример #11
0
    def write(self, fp, **kwargs):
        written = write_fmt(fp, '4s4s?3x', self.signature, self.key,
                            self.copy_on_sheet)

        def writer(f):
            if hasattr(self.data, 'write'):
                return self.data.write(f, padding=4)
            elif isinstance(self.data, int):
                return write_fmt(fp, 'I', self.data)
            return write_bytes(f, self.data)

        written += write_length_block(fp, writer)
        return written
Пример #12
0
    def write(self, fp, encoding='macroman', version=1, padding=4):
        """Write the element to a file-like object.

        :param fp: file-like object
        :param encoding: encoding of the string
        :param version: psd file version
        """
        def writer(f):
            written = self._write_body(f, encoding, version, padding)
            logger.debug('writing layer and mask info, len=%d' % (written))
            return written

        fmt = ('I', 'Q')[version - 1]
        return write_length_block(fp, writer, fmt=fmt)
Пример #13
0
    def write(self, fp, **kwargs):
        written = write_fmt(fp, 'I', self.is_written)
        if self.is_written == 0:
            return written

        def writer(f):
            if self.compression is None:
                return 0
            length = write_fmt(f, 'H', self.compression)
            length += write_bytes(f, self.data)
            return length

        written += write_length_block(fp, writer, fmt='Q')
        return written
Пример #14
0
    def write(self, fp, encoding='macroman', version=1, padding=4):
        """Write the element to a file-like object.

        :param fp: file-like object
        :rtype: int
        """
        def writer(f):
            written = self._write_body(f, encoding, version, padding)
            logger.debug('writing layer info, len=%d' % (written))
            return written

        fmt = ('I', 'Q')[version - 1]
        if self.layer_count == 0:
            return write_fmt(fp, fmt, 0)
        return write_length_block(fp, writer, fmt=fmt)
Пример #15
0
 def write(self, fp, **kwargs):
     written = write_fmt(fp, '4s2BH', self.kind, self.is_open, self.flags,
                         self.optional_blocks)
     written += write_fmt(fp, '4i', *self.icon_location)
     written += write_fmt(fp, '4i', *self.popup_location)
     written += self.color.write(fp)
     written += write_pascal_string(fp, self.author, 'macroman', padding=2)
     written += write_pascal_string(fp, self.name, 'macroman', padding=2)
     written += write_pascal_string(fp,
                                    self.mod_date,
                                    'macroman',
                                    padding=2)
     written += write_fmt(fp, 'I4s', len(self.data) + 12, self.marker)
     written += write_length_block(fp, lambda f: write_bytes(f, self.data))
     return written
Пример #16
0
    def write(self, fp, encoding='macroman'):
        """Write the element to a file-like object.

        :param fp: file-like object
        :rtype: int
        """
        written = write_fmt(fp, '4sH', self.signature,
                            getattr(self.key, 'value', self.key))
        written += write_pascal_string(fp, self.name, encoding, 2)

        def writer(f):
            if hasattr(self.data, 'write'):
                return self.data.write(f, padding=1)
            return write_bytes(f, self.data)

        written += write_length_block(fp, writer, padding=2)
        return written
Пример #17
0
    def write(self, fp, version=1, padding=1):
        """Write the element to a file-like object.

        :param fp: file-like object
        :param version: psd file version
        """
        key = self.key if isinstance(self.key, bytes) else self.key.value
        written = write_fmt(fp, '4s4s', self.signature, key)

        def writer(f):
            if hasattr(self.data, 'write'):
                # It seems padding size applies at the block level here.
                inner_padding = 1 if padding == 4 else 4
                return self.data.write(f,
                                       padding=inner_padding,
                                       version=version)
            return write_bytes(f, self.data)

        fmt = self._length_format(self.key, version)
        written += write_length_block(fp, writer, fmt=fmt, padding=padding)
        return written
Пример #18
0
    def write(self, fp, encoding='macroman', version=1):
        """Write the element to a file-like object.

        :param fp: file-like object
        :param encoding: encoding of the string
        :param version: psd file version
        """
        start_pos = fp.tell()
        written = write_fmt(fp, '4iH', self.top, self.left, self.bottom,
                            self.right, len(self.channel_info))
        written += sum(c.write(fp, version) for c in self.channel_info)
        written += write_fmt(fp, '4s4sBB', self.signature,
                             self.blend_mode.value, self.opacity,
                             self.clipping.value)
        written += self.flags.write(fp)

        def writer(f):
            written = self._write_extra(f, encoding, version)
            logger.debug('  wrote layer record, len=%d' %
                         (fp.tell() - start_pos))
            return written

        written += write_length_block(fp, writer, fmt='xI')
        return written
Пример #19
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        return write_length_block(fp, lambda f: self._write_body(f))
Пример #20
0
 def write(self, fp, **kwargs):
     written = write_fmt(fp, 'I', self.version)
     for item in self:
         written += write_length_block(fp, lambda f: item.write(f),
                                       fmt='Q', padding=4)
     return written
Пример #21
0
 def write(self, fp, **kwargs):
     written = write_fmt(fp, 'I', self.version)
     return written + write_length_block(fp, lambda f: self._write_body(f))