Example #1
0
 def write(self, fp, padding=4):
     written = 0
     for item in self:
         written += write_fmt(fp, 'H', item.selector.value)
         written += item.write(fp)
     written += write_padding(fp, written, padding)
     return written
Example #2
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
Example #3
0
    def write(self, fp, version=1):
        """Write the element to a file-like object.

        :param fp: file-like object
        :param version: psd file version
        """
        return write_fmt(fp, ('hI', 'hQ')[version - 1], *attr.astuple(self))
Example #4
0
def write_length_and_key(fp, value):
    """
    Helper to write descriptor key.
    """
    written = write_fmt(fp, 'I', 0 if value in _TERMS else len(value))
    written += write_bytes(fp, value)
    return written
Example #5
0
    def write(self, fp, **kwargs):
        written = write_fmt(
            fp, 'BHI', self.is_map, self.version, self.count_map
        )
        if self.is_map:
            written += sum(write_fmt(fp, '256B', *item) for item in self.data)
        else:
            for points in self.data:
                written += write_fmt(fp, 'H', len(points))
                written += sum(write_fmt(fp, '2H', *item) for item in points)

        if self.extra is not None:
            written += self.extra.write(fp)

        written += write_padding(fp, written, 4)
        return written
Example #6
0
 def write(self, fp):
     written = 0
     written += write_fmt(
         fp, 'B', ((1 if self.user_mask_density is not None else 0) |
                   (2 if self.user_mask_feather is not None else 0) |
                   (4 if self.vector_mask_density is not None else 0) |
                   (8 if self.vector_mask_feather is not None else 0)))
     if self.user_mask_density is not None:
         written += write_fmt(fp, 'B', self.user_mask_density)
     if self.user_mask_feather is not None:
         written += write_fmt(fp, 'd', self.user_mask_feather)
     if self.vector_mask_density is not None:
         written += write_fmt(fp, 'B', self.vector_mask_density)
     if self.vector_mask_feather is not None:
         written += write_fmt(fp, 'd', self.vector_mask_feather)
     return written
Example #7
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
Example #8
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        written = write_fmt(fp, 'I', self.items_count)
        written += self._write_body(fp)
        return written
Example #9
0
    def write(self, fp, padding=1, **kwargs):
        written = write_fmt(fp, '4sI', self.kind.value, self.version)
        written += write_pascal_string(fp, self.uuid, 'macroman', padding=1)
        written += write_unicode_string(fp, self.filename)
        written += write_fmt(fp, '4s4sQB', self.filetype, self.creator,
                             len(self.data) if self.data is not None else 0,
                             self.open_file is not None)
        if self.open_file is not None:
            written += self.open_file.write(fp, padding=1)

        if self.kind == LinkedLayerType.EXTERNAL:
            written += self.linked_file.write(fp, padding=1)
            if self.version > 3:
                written += write_fmt(fp, 'I4Bd', *self.timestamp)
            written += write_fmt(fp, 'Q', self.filesize)
            if self.version > 2:
                written += write_bytes(fp, self.data)
        elif self.kind == LinkedLayerType.ALIAS:
            written += write_fmt(fp, '8x')
        if self.kind == LinkedLayerType.DATA:
            written += write_bytes(fp, self.data)

        if self.child_id is not None:
            written += write_unicode_string(fp, self.child_id)
        if self.mod_time is not None:
            written += write_fmt(fp, 'd', self.mod_time)
        if self.lock_state is not None:
            written += write_fmt(fp, 'B', self.lock_state)

        if self.kind == LinkedLayerType.EXTERNAL and self.version == 2:
            written += write_bytes(fp, self.data)

        written += write_padding(fp, written, padding)
        return written
 def write(self, fp):
     written = write_fmt(
         fp, '3I', self.slice_id, self.group_id, self.origin
     )
     if self.origin == 1 and self.associated_id is not None:
         written += write_fmt(fp, 'I', self.associated_id)
     written += write_unicode_string(fp, self.name, padding=1)
     written += write_fmt(fp, 'I', self.slice_type)
     written += write_fmt(fp, '4I', *self.bbox)
     written += write_unicode_string(fp, self.url, padding=1)
     written += write_unicode_string(fp, self.target, padding=1)
     written += write_unicode_string(fp, self.message, padding=1)
     written += write_unicode_string(fp, self.alt_tag, padding=1)
     written += write_fmt(fp, '?', self.cell_is_html)
     written += write_unicode_string(fp, self.cell_text, padding=1)
     written += write_fmt(
         fp, '2I', self.horizontal_align, self.vertical_align
     )
     written += write_fmt(
         fp, '4B', self.alpha, self.red, self.green, self.blue
     )
     if self.data is not None:
         if hasattr(self.data, 'write'):
             written += self.data.write(fp, padding=1)
         elif self.data:
             written += write_bytes(fp, self.data)
     return written
Example #11
0
    def _write_body(self, fp):
        written = write_fmt(fp, '4iB', self.top, self.left, self.bottom, self.right, self.background_color)
        written += self.flags.write(fp)

        # if self.real_flags is None and self.parameters is None:
        #     written += write_fmt(fp, '2x')
        #     assert written == 20

        if self.real_flags:
            written += self.real_flags.write(fp)
            written += write_fmt(fp, 'B4i', self.real_background_color, self.real_top, self.real_left, self.real_bottom,
                                 self.real_right)

        if self.flags.parameters_applied and self.parameters:
            written += self.parameters.write(fp)

        written += write_padding(fp, written, 4)
        return written
Example #12
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        flags = ((self.pos_relative_to_layer * 1) | (self.mask_disabled * 2) | (self.invert_mask * 4) |
                 (self.user_mask_from_render * 8) | (self.parameters_applied * 16) | (self.undocumented_1 * 32) |
                 (self.undocumented_2 * 64) | (self.undocumented_3 * 128))
        return write_fmt(fp, 'B', flags)
Example #13
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        flags = ((self.transparency_protected * 1) | ((not self.visible) * 2) | (self.obsolete * 4) |
                 (self.photoshop_v5_later * 8) | (self.pixel_data_irrelevant * 16) | (self.undocumented_1 * 32) |
                 (self.undocumented_2 * 64) | (self.undocumented_3 * 128))
        return write_fmt(fp, 'B', flags)
Example #14
0
    def write(self, fp, **kwargs):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        written = write_fmt(fp, 'H', self.compression.value)
        written += write_bytes(fp, self.data)
        # written += write_padding(fp, written, 2)  # Seems no padding here.
        return written
Example #15
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        written = write_unicode_string(fp, self.name)
        written += write_length_and_key(fp, self.classID)
        written += write_fmt(fp, 'I', self.value)
        return written
Example #16
0
 def _write_body(self, fp):
     written = write_unicode_string(fp, self.name, padding=1)
     written += write_length_and_key(fp, self.classID)
     written += write_fmt(fp, 'I', len(self))
     for key in self:
         written += write_length_and_key(fp, key)
         written += write_bytes(fp, self[key].ostype.value)
         written += self[key].write(fp)
     return written
Example #17
0
    def write(self, fp, encoding='macroman', version=1):
        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
Example #18
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        written = write_fmt(fp, 'I', len(self))
        for item in self:
            written += write_bytes(fp, item.ostype.value)
            written += item.write(fp)
        return written
Example #19
0
    def write(self, fp, encoding='macroman', version=1, padding=4):
        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)
Example #20
0
 def write(self, fp):
     written = write_fmt(
         fp, 'Ii2I', self.version, self.angle, self.depth, self.blur
     )
     written += write_fmt(
         fp, '4s4s4s4s', b'8BIM', self.highlight_blend_mode.value, b'8BIM',
         self.shadow_blend_mode.value
     )
     written += self.highlight_color.write(fp)
     written += self.shadow_color.write(fp)
     written += write_fmt(
         fp, '6B', self.bevel_style, self.highlight_opacity,
         self.shadow_opacity, self.enabled, self.use_global_angle,
         self.direction
     )
     if self.version >= 2:
         written += self.highlight_color.write(fp)
         written += self.shadow_color.write(fp)
     return written
Example #21
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        """
        written = 0
        written += write_fmt(
            fp, 'B',
            ((1 if self.user_mask_density is not None else 0) | (2 if self.user_mask_feather is not None else 0) |
             (4 if self.vector_mask_density is not None else 0) | (8 if self.vector_mask_feather is not None else 0)))
        if self.user_mask_density is not None:
            written += write_fmt(fp, 'B', self.user_mask_density)
        if self.user_mask_feather is not None:
            written += write_fmt(fp, 'd', self.user_mask_feather)
        if self.vector_mask_density is not None:
            written += write_fmt(fp, 'B', self.vector_mask_density)
        if self.vector_mask_feather is not None:
            written += write_fmt(fp, 'd', self.vector_mask_feather)
        return written
Example #22
0
    def write(self, fp):
        """Write the element to a file-like object.

        :param fp: file-like object
        :rtype: int
        """
        start_pos = fp.tell()
        written = write_fmt(fp, 'H', self.compression.value)
        written += write_bytes(fp, self.data)
        logger.debug('  wrote image data, len=%d' % (fp.tell() - start_pos))
        return written
Example #23
0
    def _write_extra(self, fp, encoding, version):
        written = 0
        if self.mask_data:
            written += self.mask_data.write(fp)
        else:
            written += write_fmt(fp, 'I', 0)

        written += self.blending_ranges.write(fp)
        written += write_pascal_string(fp, self.name, encoding, padding=4)
        written += self.tagged_blocks.write(fp, version, padding=1)
        written += write_padding(fp, written, 2)
        return written
Example #24
0
 def _write_body(self, fp, encoding, version, padding):
     start_pos = fp.tell()
     written = write_fmt(fp, 'h', self.layer_count)
     if self.layer_records:
         self._update_channel_length()
         written += self.layer_records.write(fp, encoding, version)
     logger.debug('  wrote layer records, len=%d' % (fp.tell() - start_pos))
     if self.channel_image_data:
         written += self.channel_image_data.write(fp)
     # Seems the padding size here is different between Photoshop and GIMP.
     written += write_padding(fp, written, padding)
     return written
Example #25
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
Example #26
0
    def write(self, fp, encoding='macroman'):
        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
Example #27
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
Example #28
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
Example #29
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)
Example #30
0
    def write(self, fp, version=1, padding=1):
        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