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 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))
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