def serialize_style(self): bits = BitStream() bits += serialize_style_list(self.fills) bits += serialize_style_list(self.strokes) self.fillbits = nbits(len(self.fills)) self.linebits = nbits(len(self.strokes)) bits.write(self.fillbits, UB[4]) bits.write(self.linebits, UB[4]) return bits
def test_nbits(): assert nbits(0) == 0 assert nbits(1) == 1 assert nbits(2) == 2 assert nbits(4) == 3 assert nbits(-1) == 1 assert nbits(-2) == 2 assert nbits(-4) == 3 assert nbits(0, 1, 4, 2) == 3 assert nbits(0, 1, -4, 2) == 3
def _write(self, bs, cursor, argument): length = self.length argument = int(argument) nb = nbits(argument) if length is None: length = nbits(argument) elif length == 0: return elif length < nb: raise ValueError(("length of %d is not large " "enough to store %d") % (length, argument)) elif length == 1: return bs.write_bit(argument) elif length & 7 == 0: return bs.write(argument, Byte[length//8:self.endianness]) R = reversed(xrange(length)) if self.endianness == "<": R = (b for a in izip_longest(*[iter(R)]*8) for b in reversed(a) if b is not None) bs.write_bits(argument & (1 << b) for b in R)
def _write(self, bs, cursor, bytes): if isinstance(bytes, float): bytes = int(bytes) if isinstance(bytes, (int, long)): if bytes in xrange(-128, 256) and self.length in (1, None): return bs.write_byte(bytes) Len = int(ceil(nbits(bytes)/8.)) if self.length: leftover = (self.length - Len) * 8 if leftover > 0 and self.endianness != "<": if self.signed and bytes < 0: bs.write(One[leftover]) else: bs.write(Zero[leftover]) elif leftover < 0: raise ValueError("%r does not fit in %d bytes" ""% (bytes, self.length)) else: leftover = 0 R = xrange(0, Len*8, 8) if self.endianness != "<": R = reversed(R) for i in R: bs.write_byte((bytes & (0xFF << i)) >> i) if self.endianness == "<": if self.signed and bytes < 0: bs.write(One[leftover]) else: bs.write(Zero[leftover]) elif isinstance(bytes, str): length = self.length if length is not None: leftover = length - len(bytes) if leftover > 0: bytes = "\0" * leftover + bytes elif leftover < 0: raise ValueError("%r does not fit in %d bytes" "" % (bytes, self.length)) else: leftover, length = 0, len(bytes)*8 if self.endianness == "<": bytes = reversed(bytes) bs.write_bytes(ord(B) for B in bytes) else: raise TypeError("Invalid type for Byte/ByteString")
def _write(self, bs, cursor, bytes): if isinstance(bytes, float): bytes = int(bytes) if isinstance(bytes, (int, long)): if bytes in xrange(-128, 256) and self.length in (1, None): return bs.write_byte(bytes) Len = int(ceil(nbits(bytes) / 8.)) if self.length: leftover = (self.length - Len) * 8 if leftover > 0 and self.endianness != "<": if self.signed and bytes < 0: bs.write(One[leftover]) else: bs.write(Zero[leftover]) elif leftover < 0: raise ValueError("%r does not fit in %d bytes" "" % (bytes, self.length)) else: leftover = 0 R = xrange(0, Len * 8, 8) if self.endianness != "<": R = reversed(R) for i in R: bs.write_byte((bytes & (0xFF << i)) >> i) if self.endianness == "<": if self.signed and bytes < 0: bs.write(One[leftover]) else: bs.write(Zero[leftover]) elif isinstance(bytes, str): length = self.length if length is not None: leftover = length - len(bytes) if leftover > 0: bytes = "\0" * leftover + bytes elif leftover < 0: raise ValueError("%r does not fit in %d bytes" "" % (bytes, self.length)) else: leftover, length = 0, len(bytes) * 8 if self.endianness == "<": bytes = reversed(bytes) bs.write_bytes(ord(B) for B in bytes) else: raise TypeError("Invalid type for Byte/ByteString")
def _write(self, bs, cursor, argument): length = self.length argument = int(argument) nb = nbits(argument) if length is None: length = nbits(argument) elif length == 0: return elif length < nb: raise ValueError(("length of %d is not large " "enough to store %d") % (length, argument)) elif length == 1: return bs.write_bit(argument) elif length & 7 == 0: return bs.write(argument, Byte[length // 8:self.endianness]) R = reversed(xrange(length)) if self.endianness == "<": R = (b for a in izip_longest(*[iter(R)] * 8) for b in reversed(a) if b is not None) bs.write_bits(argument & (1 << b) for b in R)
def create_fields(self): if self.writing: from fusion.swf.tags import DefineShape new_styles = (DefineShape._current_variant > 1) and bool( self.linestyles or self.fillstyles) self.set_local("HasNewStyles", new_styles) self.fillstyles = self.fillstyles or [] self.linestlyes = self.linestyles or [] self.set_local("FillStyleCount", len(self.fillstyles or [])) self.set_local("FillStyleBits", nbits(len(self.fillstyles or []))) self.set_local("LineStyleCount", len(self.linestyles or [])) self.set_local("LineStyleBits", nbits(len(self.linestyles or []))) self.set_local("HasLineStyle", bool(self.linestyle)) self.set_local("LineStyleIndex", self.linestyle.index if self.linestyle else 0) self.set_local("HasFillStyle1", bool(self.fillstyle1)) self.set_local("FillStyle1Index", self.fillstyle1.index if self.fillstyle1 else 0) self.set_local("HasFillStyle0", bool(self.fillstyle0)) self.set_local("FillStyle0Index", self.fillstyle0.index if self.fillstyle0 else 0) self.set_local("HasMoveTo", bool(self.delta_x or self.delta_y)) yield Zero # TypeFlag yield Local("HasNewStyles", Bit) yield Local("HasLineStyle", Bit) yield Local("HasFillStyle1", Bit) yield Local("HasFillStyle0", Bit) yield Local("HasMoveTo", Bit) if self.get_local("HasMoveTo", True): yield NBits[5] yield Fields("delta_x delta_y", SB[NBits]) * 20 if self.get_local("HasFillStyle0", True): yield Local("FillStyle0Index", UB[self.parent.fillbits]) if self.reading: self.fillstyle0 = self.parent.fills[self.get_local( "FillStyle0Index")] if self.get_local("HasFillStyle1", True): yield Local("FillStyle1Index", UB[self.parent.fillbits]) if self.reading: self.fillstyle1 = self.parent.fills[self.get_local( "FillStyle1Index")] if self.get_local("HasLineStyle", True): yield Local("LineStyleIndex", UB[self.parent.linebits]) if self.reading: self.linestyle = self.parent.fills[self.get_local( "LineStyleIndex")] if self.get_local("HasNewStyles", True): yield Local("FillStyleCount", UI8) & 0xFF if self.get_local("FillStyleCount", 0xFF) & 0xFF == 0xFF: yield Local("FillStyleCount", UI16) yield Field("fillstyles", FillStyle) yield Local("LineStyleCount", UI8) & 0xFF if self.get_local("LineStyleCount", 0xFF) & 0xFF == 0xFF: yield Local("LineStyleCount", UI16) # TODO: SWF version yield Field("linestyles", LineStyle2) yield Local("FillStyleBits", UB[4]) yield Local("LineStyleBits", UB[4]) if self.writing: self.parent.fills = self.fillstyles or [] self.parent.strokes = self.linestyles or []
def _nbits(*args): return nbits(*(int(a) for a in args))
def create_fields(self): if self.writing: from fusion.swf.tags import DefineShape new_styles = (DefineShape._current_variant > 1) and bool(self.linestyles or self.fillstyles) self.set_local("HasNewStyles", new_styles) self.fillstyles = self.fillstyles or [] self.linestlyes = self.linestyles or [] self.set_local("FillStyleCount", len(self.fillstyles or [])) self.set_local("FillStyleBits", nbits(len(self.fillstyles or []))) self.set_local("LineStyleCount", len(self.linestyles or [])) self.set_local("LineStyleBits", nbits(len(self.linestyles or []))) self.set_local("HasLineStyle", bool(self.linestyle)) self.set_local("LineStyleIndex", self.linestyle.index if self.linestyle else 0) self.set_local("HasFillStyle1", bool(self.fillstyle1)) self.set_local("FillStyle1Index", self.fillstyle1.index if self.fillstyle1 else 0) self.set_local("HasFillStyle0", bool(self.fillstyle0)) self.set_local("FillStyle0Index", self.fillstyle0.index if self.fillstyle0 else 0) self.set_local("HasMoveTo", bool(self.delta_x or self.delta_y)) yield Zero # TypeFlag yield Local("HasNewStyles", Bit) yield Local("HasLineStyle", Bit) yield Local("HasFillStyle1", Bit) yield Local("HasFillStyle0", Bit) yield Local("HasMoveTo", Bit) if self.get_local("HasMoveTo", True): yield NBits[5] yield Fields("delta_x delta_y", SB[NBits]) * 20 if self.get_local("HasFillStyle0", True): yield Local("FillStyle0Index", UB[self.parent.fillbits]) if self.reading: self.fillstyle0 = self.parent.fills[self.get_local("FillStyle0Index")] if self.get_local("HasFillStyle1", True): yield Local("FillStyle1Index", UB[self.parent.fillbits]) if self.reading: self.fillstyle1 = self.parent.fills[self.get_local("FillStyle1Index")] if self.get_local("HasLineStyle", True): yield Local("LineStyleIndex", UB[self.parent.linebits]) if self.reading: self.linestyle = self.parent.fills[self.get_local("LineStyleIndex")] if self.get_local("HasNewStyles", True): yield Local("FillStyleCount", UI8) & 0xFF if self.get_local("FillStyleCount", 0xFF) & 0xFF == 0xFF: yield Local("FillStyleCount", UI16) yield Field("fillstyles", FillStyle) yield Local("LineStyleCount", UI8) & 0xFF if self.get_local("LineStyleCount", 0xFF) & 0xFF == 0xFF: yield Local("LineStyleCount", UI16) # TODO: SWF version yield Field("linestyles", LineStyle2) yield Local("FillStyleBits", UB[4]) yield Local("LineStyleBits", UB[4]) if self.writing: self.parent.fills = self.fillstyles or [] self.parent.strokes = self.linestyles or []