コード例 #1
0
ファイル: records.py プロジェクト: haibocheng/fusion
 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
コード例 #2
0
 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
コード例 #3
0
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
コード例 #4
0
ファイル: test_util.py プロジェクト: haibocheng/fusion
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
コード例 #5
0
ファイル: formats.py プロジェクト: haibocheng/fusion
    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)
コード例 #6
0
ファイル: formats.py プロジェクト: haibocheng/fusion
    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")
コード例 #7
0
    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")
コード例 #8
0
    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)
コード例 #9
0
    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 []
コード例 #10
0
ファイル: formats.py プロジェクト: haibocheng/fusion
 def _nbits(*args):
     return nbits(*(int(a) for a in args))
コード例 #11
0
 def _nbits(*args):
     return nbits(*(int(a) for a in args))
コード例 #12
0
ファイル: records.py プロジェクト: haibocheng/fusion
    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 []