예제 #1
0
 def fields(self, const):
     self.F("name", ConstIndex(const["multiname"]))
     k = self.F("kind", Format("B"))
     kind = k.data & 0x0F
     f = k.data >> 4
     if kind in [0, 6]:
         self.F("slot_id", U30())
         self.F("type_name", ConstIndex(const["multiname"]))
         v = self.F("vindex", U30())
         if v.data != 0:
             self.F("vkind", Format("B"))
     elif kind in [4]:
         self.F("slot_id", U30())
         self.F("classi", U30())
     elif kind in [5]:
         self.F("slot_id", U30())
         self.F("function", U30())
     elif kind in [1, 2, 3]:
         self.F("disp_id", U30())
         self.F("method", U30())
     else:
         assert False, kind
     if f & 0x04:
         c = self.F("metadata_count", U30())
         self.F("metadata", Array(c.data, U30))
예제 #2
0
 def fields(self, strings):
     self.F("name", Index(strings, Format("I")))
     self.F("flags", Flags(Format("B"), self.flag_types))
     self.F("range", Format("ff"))
     self.F("samples", PrefixedArray(Format("H"), BVCDFlexSample))
     if "combo" in self["flags"].data:
         self.F("combo_samples", PrefixedArray(Format("H"), BVCDFlexSample))
예제 #3
0
 def fields(self):
     base = self.F("base", Offset())
     self.F("cycle", Format("f"))
     self.F("event", Format("I"))
     self.F("type", Format("I"))
     self.F("options", FixedString(64))
     self.F("szeventindex", RelativeString(base, "i"))
예제 #4
0
    def fields(self, strings):
        self.F("namecrc", Format("I"))
        self.F("offset", Format("I"))
        self.F("length", Format("I"))
        # self.F("scenesummary", Format("I"))
        self.F("scenesummary", DataPointer(Format("I"), SceneSummary(strings)))

        self.F("scene", Pointer(self["offset"].data, Scene()))
예제 #5
0
    def fields(self):
        self.F("method", Magic("LZMA"))
        self.F("uncompressed_size", Format("I"))
        self.F("compressed_size", Format("I"))

        self.F(
            "scene_data",
            LZMAField(self["uncompressed_size"].data,
                      self["compressed_size"].data))
예제 #6
0
 def unpack_data(self, s):
     data = Format("H").unpack_data(s)
     tagcode = (data >> 6)
     length = (data & ((1 << 6) - 1))
     if length == 63:
         length = Format("I").unpack_data(s)
     return OrderedDict([
         ("tagcode", tagcode),
         ("length", length),
     ])
예제 #7
0
 def pack_data(self, s, data):
     tagcode = data["tagcode"]
     length = data["length"]
     if length > 62:
         taglength = 63
     else:
         taglength = length
     Format("H").pack_data(s, (tagcode << 6) | taglength)
     if length > 62:
         Format("I").pack_data(s, length)
예제 #8
0
 def fields(self):
     self.F("minor", Format("H"))
     self.F("major", Format("H"))
     const = self.F("constant_pool", ConstantPool())
     c = self.F("method_count", U30())
     self.F("method", Array(c.data, lambda: Method(const)))
     c = self.F("metadatacount", U30())
     self.F("metadata", Array(c.data, lambda: MetaData(const)))
     c = self.F("class_count", U30())
     self.F("instance", Array(c.data, lambda: Instance(const)))
     self.F("class", Array(c.data, lambda: Class(const)))
     c = self.F("script_count", U30())
     self.F("script", Array(c.data, lambda: Script(const)))
     c = self.F("methodbody_count", U30())
     self.F("methodbody", Array(c.data, lambda: MethodBody(const)))
예제 #9
0
 def fields(self):
     f = self.F("flags", PlaceObject2Flags())
     self.F("depth", Format("H"))
     if f["character"].data == 1:
         self.F("character", Format("H"))
     if f["matrix"].data == 1:
         self.F("matrix", Matrix())
     if f["color_transform"].data == 1:
         self.F("color_transform", CXFormWithAlpha())
     if f["ratio"].data == 1:
         self.F("ratio", Format("H"))
     if f["name"].data == 1:
         self.F("name", String())
     if f["clip_depth"].data == 1:
         self.F("clip_depth", Format("H"))
     assert f["clip_actions"].data == 0
예제 #10
0
    def fields(self, include_attributes=True):
        self.F("magic", Magic("<!-- dmx encoding "))
        self.F("version", FixedString(len("binary 2 format pcf 1")))
        self.F("magic2", Magic(" -->\n\0"))
        version = self["version"].data
        assert version in ["binary 2 format pcf 1",
                           "binary 5 format pcf 2"], version

        if version == "binary 2 format pcf 1":
            prefix = Format("h")
        else:
            prefix = Format("I")
        strings = self.F("strings", PrefixedArray(prefix, String))

        if version == "binary 2 format pcf 1":
            namefield = lambda: Index(strings, Format("h"))
            stringfield = String
        else:
            namefield = lambda: Index(strings, Format("I"))
            stringfield = namefield
        self.F(
            "elements",
            PrefixedArray(Format("I"),
                          lambda: Element(namefield, stringfield)))
        if include_attributes:
            self.F(
                "attributes",
                Array(len(self["elements"]),
                      field_function=lambda i, f: PrefixedArray(
                          Format("I"), lambda: Attribute(
                              namefield, stringfield, lambda: ElementIndex(
                                  self["elements"], f, Format("i"))))))
            for i in range(len(self["elements"])):
                self["elements"][i].attribute = self["attributes"][i]
예제 #11
0
    def fields(self):
        self.F("magic", Magic("VSIF"))
        self.F("version", Format("I"))
        assert self["version"].data == 3, "Expected version 3, got {}".format(
            self["version"].data)
        self.F("nscenes", Format("I"))
        self.F("nstrings", Format("I"))
        self.F("scenesoffset", Format("I"))
        self.F(
            "strings",
            Array(self["nstrings"].data,
                  lambda: DataPointer(Format("I"), String())))

        self.F(
            "scenes",
            Pointer(
                self["scenesoffset"].data,
                Array(self["nscenes"].data,
                      lambda: SceneEntry(self["strings"]))))
예제 #12
0
 def fields(self, const):
     self.F("name", ConstIndex(const["multiname"]))
     self.F("super_name", ConstIndex(const["multiname"]))
     f = self.F("flags", Format("B"))
     if f.data & 0x08:
         self.F("protected_ns", ConstIndex(const["namespace"]))
     c = self.F("intrf_count", U30())
     self.F("interface", Array(c.data, lambda: ConstIndex(const["multiname"])))
     self.F("iinit", U30())
     c = self.F("trait_count", U30())
     self.F("trait", Array(c.data, lambda: Trait(const)))
예제 #13
0
 def fields(self, const):
     param_c = self.F("param_count", U30())
     self.F("return_type", ConstIndex(const["multiname"]))
     self.F("param_types", Array(param_c.data, lambda: ConstIndex(const["multiname"])))
     self.F("name", ConstIndex(const["string"]))
     f = self.F("flags", Format("B"))
     if f.data & 0x08:
         c = self.F("option_count", U30())
         self.F("option", Array(c.data, OptionDetail))
     if f.data & 0x80:
         self.F("param_names", Array(param_c.data, lambda: ConstIndex(const["string"])))
예제 #14
0
 def fields(self):
     c = self.F("int_count", U30())
     self.F("integer", Array(c.data-1, S32))
     c = self.F("uint_count", U30())
     self.F("uinteger", Array(c.data-1, U32))
     c = self.F("double_count", U30())
     self.F("double", Array(c.data-1, lambda: Format("d")))
     c = self.F("string_count", U30())
     s = self.F("string", Array(c.data-1, PrefixedString))
     c = self.F("namespace_count", U30())
     ns = self.F("namespace", Array(c.data-1, lambda: Namespace(s)))
     c = self.F("namespaceset_count", U30())
     nss = self.F("namespaceset", Array(c.data-1, lambda: NamespaceSet(ns)))
     c = self.F("multiname_count", U30())
     self.F("multiname", Array(c.data-1, lambda: Multiname(s, ns, nss)))
예제 #15
0
 def fields(self, s, ns, nss):
     k = self.F("kind", Format("B"))
     if k.data in [0x07, 0x0D]:
         self.F("ns", ConstIndex(ns))
         self.F("name", ConstIndex(s))
     elif k.data in [0x0F, 0x10]:
         self.F("name", ConstIndex(s))
     elif k.data in [0x11, 0x12]:
         pass
     elif k.data in [0x09, 0x0E]:
         self.F("name", ConstIndex(s))
         self.F("nsset", ConstIndex(nss))
     elif k.data in [0x1B, 0x1C]:
         self.F("nsset", ConstIndex(nss))
     elif k.data in [0x1D]:
         self.F("typedef", U30())
         c = self.F("numparams", U30())
         self.F("params", Array(c.data, U30))
     else:
         assert False, k.data
예제 #16
0
    def fields(self, strings):
        self.F("magic", Magic("bvcd"))
        self.F("version", Format("B"))
        assert self["version"].data == 4, "Expected version 4, got {}".format(
            self["version"].data)
        self.F("crc", Format("I"))

        self.F("events", PrefixedArray(Format("B"),
                                       lambda: BVCDEvent(strings)))
        self.F("actors", PrefixedArray(Format("B"),
                                       lambda: BVCDActors(strings)))

        self.F("ramp", PrefixedArray(Format("B"), BVCDRamp))

        self.F("ignorephonemes", Format("B"))
예제 #17
0
 def fields(self):
     self.F("flags", Format("I"))
     self.F("name", String())
     self.F("abcdata", ABCFile())
예제 #18
0
 def fields(self, strings):
     self.F("name", Index(strings, Format("I")))
     self.F("channels",
            PrefixedArray(Format("B"), lambda: BVCDChannel(strings)))
     self.F("disabled", Format("B"))
예제 #19
0
    def fields(self, strings):
        self.F("type", Mapping(Format("B"), self.event_types))
        self.F("name", Index(strings, Format("I")))
        self.F("time", Format("ff"))
        self.F("params", Array(3, lambda: Index(strings, Format("I"))))
        self.F("ramp", PrefixedArray(Format("B"), BVCDRamp))
        self.F("flags", Flags(Format("B"), self.flag_types))
        self.F("distancetotarget", Format("f"))
        self.F(
            "tags",
            PrefixedArray(
                Format("B"),
                lambda: BVCDTag(strings, ScaledField(Format("B"), 255.))))
        self.F(
            "flextimingtags",
            PrefixedArray(
                Format("B"),
                lambda: BVCDTag(strings, ScaledField(Format("B"), 255.))))
        self.F(
            "shifted_time",
            PrefixedArray(
                Format("B"),
                lambda: BVCDTag(strings, ScaledField(Format("H"), 4096.))))
        self.F(
            "playback_time",
            PrefixedArray(
                Format("B"),
                lambda: BVCDTag(strings, ScaledField(Format("H"), 4096.))))
        if self["type"].data == "gesture":
            self.F("sequenceduration", Format("f"))
        self.F(
            "relativetag",
            PrefixedArray(
                Format("B"),
                lambda: BVCDTag(strings, Index(strings, Format("I")))))

        self.F("flex",
               PrefixedArray(Format("B"), lambda: BVCDFlexTrack(strings)))

        if self["type"].data == "loop":
            self.F("loopcount", Format("B"))

        if self["type"].data == "speak":
            self.F("cctype", Format("B"))
            self.F("cctoken", Index(strings, Format("I")))
            self.F("ccflags", Flags(Format("B"), self.cc_flag_types))
예제 #20
0
 def fields(self, strings):
     self.F("name", Index(strings, Format("I")))
     self.F("events", PrefixedArray(Format("B"),
                                    lambda: BVCDEvent(strings)))
     self.F("disabled", Format("B"))
예제 #21
0
 def fields(self):
     self.F("p", Format("f"))
     self.F("t", ScaledField(Format("B"), 255.))
     self.F("from_type", Mapping(Format("B"), self.curve_types))
     self.F("to_type", Mapping(Format("B"), self.curve_types))
예제 #22
0
 def __init__(self, field, fmt):
     self.field = field
     Format.__init__(self, fmt)
예제 #23
0
 def pack_data(self, s, data):
     if data != 0:
         data -= self.field.data
     Format.pack_data(self, s, data)
예제 #24
0
 def fields(self):
     self.F("t", Format("f"))
     self.F("v", ScaledField(Format("B"), 255.))
예제 #25
0
 def fields(self, strings):
     self.F("milliseconds", Format("I"))
     self.F("milliseconds_2", Format("I"))
     self.F("sounds",
            PrefixedArray(Format("I"), lambda: Index(strings, Format("I"))))
예제 #26
0
    def fields(self):
        self.F("magic", Magic("IDST"))
        self.F("version", Format("I"))
        self.F("checksum", Format("I"))
        self.F("name", FixedString(64))
        self.F("datalength", Format("I"))

        self.F("eyepos", Format("3f"))
        self.F("illum", Format("3f"))
        self.F("hull_min", Format("3f"))
        self.F("hull_max", Format("3f"))
        self.F("view_bbmin", Format("3f"))
        self.F("view_bbmax", Format("3f"))

        self.F("flags", Format("I"))

        self.F("bone", Format("II"))
        self.F("bonecontroller", Format("II"))
        self.F("hitbox", Format("II"))

        self.F("numlocalanim", Format("I"))
        self.F("localanimoffset", Format("I"))

        self.F("numlocalsequence", Format("I"))
        self.F("localsequenceoffset", Format("I"))

        self.F("texture", Format("II"))
        self.F("cdtexture", Format("II"))

        self.F("unknown", Format("II"))

        self.F("numskinref", Format("I"))
        self.F("numskinfamilies", Format("I"))
        self.F("skinindex", Format("I"))

        self.F("bodypart", Format("II"))
        self.F("localattachment", Format("II"))

        self.F("numlocalnodes", Format("I"))
        self.F("localnodeindex", Format("I"))
        self.F("localnodenameindex", Format("I"))

        self.F("flexdesc", Format("II"))
        self.F("flexcontroller", Format("II"))
        self.F("flexrule", Format("II"))
        self.F("ikchain", Format("II"))
        self.F("mouth", Format("II"))

        self.F("localposeparameters", Format("II"))
        self.F("surfacepropindex", Format("I"))

        self.F("keyvalueindex", Format("I"))
        self.F("keyvaluesize", Format("I"))

        # pointed fields
        # self.F("localanim", Pointer(self["localanimoffset"].data, Array(self["numlocalanim"].data, LocalAnim)))
        self.F("localsequence", Pointer(self["localsequenceoffset"].data, Array(self["numlocalsequence"].data, LocalSequence)))
        self.F("skin",
            Pointer(self["skinindex"].data,
                Array(self["numskinfamilies"].data,
                    lambda: Array(self["numskinref"].data,
                        lambda: Format("h")))))
        self.F("keyvalue", Pointer(self["keyvalueindex"].data, FixedString(self["keyvaluesize"].data)))

        # here be dragons
        return

        self.F("localikautoplaylock", Format("II"))

        self.F("mass", Format("f"))
        self.F("contents", Format("I"))

        self.F("includemodels", Format("II"))

        self.F("bonetablebynameindex", Format("I"))
        self.F("vertexbase", Format("I"))
        self.F("indexbase", Format("I"))
        self.F("constdirectionallightdot", Format("B"))
        self.F("rootLOD", Format("B"))
        self.F("numAllowedRootLODs", Format("B"))
        self.F("unused", Format("B"))
        self.F("unused4", Format("I"))

        self.F("flexcontrollerui", Format("II"))

        self.F("unused3", Format("2I"))
        self.F("studiohdr2index", Format("I"))
        self.F("unused2", Format("1I"))
예제 #27
0
 def __init__(self, fmt):
     Format.__init__(self, fmt)
예제 #28
0
 def fields(self):
     self.F("sprite_id", Format("H"))
     self.F("frame_count", Format("H"))
     self.F("tags", TagArray())
예제 #29
0
 def pack(self, s):
     this = s.tell()
     self.data = s
     Format.pack(self, s)
예제 #30
0
 def pack(self, s):
     self.data = -s.tell()
     Format.pack(self, s)
예제 #31
0
 def unpack_data(self, s):
     this = s.tell()
     data = Format.unpack_data(self, s)
     assert data == -this
     return data
예제 #32
0
 def fields(self):
     self.F("frame_size", Rect())
     self.F("frame_rate", Format("H"))
     self.F("frame_count", Format("H"))
     self.F("tags", TagArray())
예제 #33
0
 def fields(self):
     self.F("magic", Magic(b"CFX\x0a"))
     self.F("content", ZlibField(Format("I"), SWFContent()))
예제 #34
0
 def fields(self, strings, paramfield):
     self.F("name", Index(strings, Format("I")))
     self.F("param", paramfield)
예제 #35
0
 def unpack_data(self, s):
     data = Format.unpack_data(self, s)
     if data != 0:
         data += self.field.data
     return data