コード例 #1
0
ファイル: structure.py プロジェクト: algas/tomato
    def deserialize(self, serializer_version, tpl):
        # except basic attributes (tag, length, content_offset, value)
        self.depth_offset, \
        self.depth, \
        self.target_character_id_offset, \
        self.target_character_id, \
        self.matrix_offset, \
        matrix, \
        color_transform, \
        self.f_place_has_name, \
        self.name_offset, \
        name = tpl

        if matrix:
            self.matrix = MATRIX().deserialize(matrix)
        if color_transform:
            self.color_transform = CXFORMWITHALPHA().deserialize(color_transform)
        if name:
            self.name = name
コード例 #2
0
ファイル: structure.py プロジェクト: algas/tomato
    def parse(self):
        # See: http://www.m2osw.com/swf_tag_placeobject2
        # Flash Lite 1.1 (Flash Version 4) を想定したコード

        self.f_place_reserved, \
        self.f_place_has_clipping_depth, \
        self.f_place_has_name, \
        self.f_place_has_ratio, \
        self.f_place_has_color_transform, \
        self.f_place_has_matrix, \
        self.f_place_has_character, \
        self.f_place_has_move = self.read_bits(8)

        self.depth_offset = self.pos
        self.depth = le2byte(self.read(2))

        if self.f_place_has_character:
            self.target_character_id_offset = self.pos
            self.target_character_id = le2byte(self.read(2))
        else:
            self.target_character_id = None
        
        if self.f_place_has_matrix:
            self.matrix_offset = self.pos
            self.matrix = MATRIX()
            self.matrix.parse(self)
            self.align_byte()

        if self.f_place_has_color_transform:
            self.color_transform = CXFORMWITHALPHA()
            self.color_transform.parse(self)

        if self.f_place_has_ratio:
            f_ratio = le2byte(self.read(2))

        if self.f_place_has_name:
            self.name_offset = self.pos
            self.name = self.read_string()

        if self.f_place_has_clipping_depth:
            if DEBUG: print "\tClip Depth:", le2byte(self.read(2))
コード例 #3
0
ファイル: structure.py プロジェクト: algas/tomato
class PlaceObject2(SwfBlock):
    _serialize_attr_ = {
        MOVIECLIP_V1: (
            'tag',
            'length',
            'content_offset',
            'value',
            'depth_offset',
            'depth',
            'target_character_id_offset',
            'target_character_id',
            'matrix_offset',
            'matrix',
            'color_transform',
            'f_place_has_name',
            'name_offset',
            'name')
        }

    def __init__(self, *args):
        SwfBlock.__init__(self, *args)
        if self.IS_PARSE:
            self.parse()

    def serialize(self, serializer_version):
        # シリアライズ関数を PlaceObject2 専用にオーバーライドする
        ret = []
        for attr in self._serialize_attr_[serializer_version]:
            if hasattr(self, attr):
                if attr in ('matrix', 'color_transform'):
                    ret.append(getattr(self, attr).serialize())
                else:
                    ret.append(getattr(self, attr))
            else:
                ret.append(None)
        return ret
    
    def deserialize(self, serializer_version, tpl):
        # except basic attributes (tag, length, content_offset, value)
        self.depth_offset, \
        self.depth, \
        self.target_character_id_offset, \
        self.target_character_id, \
        self.matrix_offset, \
        matrix, \
        color_transform, \
        self.f_place_has_name, \
        self.name_offset, \
        name = tpl

        if matrix:
            self.matrix = MATRIX().deserialize(matrix)
        if color_transform:
            self.color_transform = CXFORMWITHALPHA().deserialize(color_transform)
        if name:
            self.name = name

    def copy(self, swf=None, base_block=None):
        """
        PlaceObject2 のパースはコストがかかるので、
        copy する際はパースしないように関数をオーバーライドする
        """
        if not base_block:
            base_block = self.base_block

        new = self.__class__(
            self.tag,
            self.length,
            self.content_offset,
            self.value,
            base_block,
            swf,
            False)    # IS_PARSE
        # attribute をコピーする
        for attr in ('matrix', 'color_transform'):
            if hasattr(self, attr):
                setattr(new, attr, getattr(self, attr).copy())
        for attr in (
            'depth_offset',
            'depth',
            'target_character_id_offset',
            'target_character_id',
            'matrix_offset',
            'name_offset',
            'name',
            ):
            if hasattr(self, attr):
                setattr(new, attr, getattr(self, attr))
        return new

    def parse(self):
        # See: http://www.m2osw.com/swf_tag_placeobject2
        # Flash Lite 1.1 (Flash Version 4) を想定したコード

        self.f_place_reserved, \
        self.f_place_has_clipping_depth, \
        self.f_place_has_name, \
        self.f_place_has_ratio, \
        self.f_place_has_color_transform, \
        self.f_place_has_matrix, \
        self.f_place_has_character, \
        self.f_place_has_move = self.read_bits(8)

        self.depth_offset = self.pos
        self.depth = le2byte(self.read(2))

        if self.f_place_has_character:
            self.target_character_id_offset = self.pos
            self.target_character_id = le2byte(self.read(2))
        else:
            self.target_character_id = None
        
        if self.f_place_has_matrix:
            self.matrix_offset = self.pos
            self.matrix = MATRIX()
            self.matrix.parse(self)
            self.align_byte()

        if self.f_place_has_color_transform:
            self.color_transform = CXFORMWITHALPHA()
            self.color_transform.parse(self)

        if self.f_place_has_ratio:
            f_ratio = le2byte(self.read(2))

        if self.f_place_has_name:
            self.name_offset = self.pos
            self.name = self.read_string()

        if self.f_place_has_clipping_depth:
            if DEBUG: print "\tClip Depth:", le2byte(self.read(2))

    def replace_matrix(self, matrix):
        diff = len(matrix) - len(self.matrix)
        
        self.value = self.value[:self.matrix_offset] + \
            matrix.value + self.value[(self.matrix_offset + len(self.matrix)):]
        self.matrix = matrix
        
        # PlaceObject2 自体のヘッダーの長さを変更する
        self.set_length(len(self.value) - self.content_offset)
        if self.base_block:
            self.base_block.update_value()

    def set_target_character_id(self, num):
        assert isinstance(num, int)
        assert hasattr(self, 'target_character_id_offset')
        self.value = \
            self.value[:self.target_character_id_offset] + _h16(num) + \
            self.value[(self.target_character_id_offset + 2):]
        self.target_character_id = num

    def set_depth(self, num):
        assert isinstance(num, int)
        self.value = \
            self.value[:self.depth_offset] + _h16(num) + \
            self.value[(self.depth_offset + 2):]
        self.depth = num
        
    def set_name(self, name):
        if self.f_place_has_name:
            new_name = name + '\x00'
            self.value = \
                self.value[:self.name_offset] + new_name + \
                self.value[(self.name_offset + len(self.name) + 1):]
            self.name = name
            self.set_length(len(self.value) - self.content_offset)
        else:
            pass