Example #1
0
 def test_fields_io_serialize_and_deserialize(self):
     m1 = MATRIX().generate(
         scale=(2.4, 3.7),
         translate=(1500, 1500))
     tpl = m1.serialize()
     m2 = MATRIX().deserialize(tpl)
     self.assertEqual(m1.value, m2.value)
Example #2
0
class FILLSTYLE(StructBlock):
    def __init__(self, block):
        StructBlock.__init__(self, block)
        
        self.FillStyleType = self.read(1)
        
        if self.FillStyleType == '\x00':
            if self.block.tag_name in ('DefineShape', 'DefineShape2'):
                self.color = RGB(self.block)
            elif self.block.tag_name == 'DefineShape3':
                self.color = RGBA(self.block)

        if self.FillStyleType in ('\x10', '\x12', '\x13'):
            self.GradientMatrix = MATRIX()
            self.GradientMatrix.parse(self.block)
        
        if self.FillStyleType in ('\x10', '\x12'):
            self.Gradient = GRADIENT(self.block)
        # elif self.FillStyleTYPE == '\x13':  # SWF 8 or later
        #     self.Gradient = FOCALGRADIENT(self.block)

        if self.FillStyleType in ('\x40', '\x41', '\x42', '\x43'):
            self.BitmapId = le2byte(self.read(2))
            self.BitmapMatrix = MATRIX()
            self.BitmapMatrix.parse(self.block)
Example #3
0
def test_matrix(scale=None, rotate=None, translate=(0,0)):
    m1 = MATRIX().generate(
        scale=scale,
        translate=translate,
        rotate=rotate
        )
    m2 = MATRIX()
    if scale:
        m2.setattr_value('scale_x', scale[0])
        m2.setattr_value('scale_y', scale[1])
    if rotate:
        m2.setattr_value('rotate_skew0', rotate[0])
        m2.setattr_value('rotate_skew1', rotate[1])
    if translate:
        m2.setattr_value('translate_x', translate[0])
        m2.setattr_value('translate_y', translate[1])
    m2.generate_bits()
    return m1.value == m2.value
Example #4
0
    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
Example #5
0
    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))
Example #6
0
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