5 asset_resolver_t* swf_ParseAssets(SWF*swf)
7 NEW(asset_resolver_t,assets);
8 assets->name2asset = dict_new2(&charptr_type);
9 assets->id2asset = malloc(sizeof(abc_asset_t*)*65536);
11 TAG*tag = swf->firstTag;
13 if(swf_isDefiningTag(tag)) {
14 NEW(abc_asset_t, asset);
15 list_append(asset->tags, tag);
16 assets->id2asset[swf_GetDefineID(tag)] = asset;
23 if(swf_isDefiningTag(tag)) {
24 abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)];
26 int num = swf_GetNumUsedIDs(tag);
27 int*positions = malloc(sizeof(int)*num);
28 swf_GetUsedIDs(tag, positions);
31 U16 id = GET16(&tag->data[positions[t]]);
32 abc_asset_t*a = assets->id2asset[id];
34 fprintf(stderr, "Error: ID %d referenced, but not defined\n", id);
36 list_append(asset->dependencies, a);
39 } else if(swf_isPseudoDefiningTag(tag)) {
40 abc_asset_t*asset = assets->id2asset[swf_GetDefineID(tag)];
42 list_append(asset->tags, tag);
44 } else if(tag->id == ST_SYMBOLCLASS) {
45 int t, num = swf_GetU16(tag);
47 U16 id = swf_GetU16(tag);
49 assets->mainclass_id = id;
51 abc_asset_t*asset = assets->id2asset[id];
53 fprintf(stderr, "Error: ID %d referenced, but not defined\n", id);
55 char*name = swf_GetString(tag);
56 dict_put(assets->name2asset, name, asset);
66 void swf_ResolveAssets(asset_resolver_t*assets, abc_file_t*file)
68 int num = assets->name2asset->num;
71 for(t=0;t<file->classes->num;t++) {
72 abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t);
73 char*fullname = abc_class_fullname(cls);
74 abc_asset_t*a = (abc_asset_t*)dict_lookup(assets->name2asset, fullname);
83 static void dump_asset_list(FILE*fo, abc_asset_list_t*l, const char*prefix)
86 TAG_list_t*t = l->abc_asset->tags;
89 fprintf(fo, "%s[tag] %s defines ID %d\n", prefix, swf_TagGetName(tag), swf_GetDefineID(tag));
92 char*prefix2 = allocprintf("%s ", prefix);
93 dump_asset_list(fo, l->abc_asset->dependencies, prefix2);
99 void swf_DumpAsset(FILE*fo, abc_asset_t*asset, const char*prefix)
101 abc_asset_list_t*l = 0;
102 list_append(l, asset);
103 dump_asset_list(fo, l, prefix);
107 static TAG* write_tag(TAG*prev, TAG*tag, dict_t*written)
109 if(!dict_contains(written, tag)) {
110 dict_put(written, tag, 0);
120 static TAG*write_asset(TAG*tag, abc_asset_t*a, dict_t*written)
122 TAG_list_t*tags = a->tags;
123 abc_asset_list_t*deps = a->dependencies;
125 tag = write_asset(tag, deps->abc_asset, written);
129 tag = write_tag(tag, tags->TAG, written);
135 void swf_WriteABCSymbols(TAG*tag, abc_file_t*file)
139 for(t=0;t<file->classes->num;t++) {
140 abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t);
141 abc_asset_t*a = cls->asset;
146 swf_SetU16(tag, num);
147 for(t=0;t<file->classes->num;t++) {
148 abc_class_t*cls = (abc_class_t*)array_getvalue(file->classes, t);
149 abc_asset_t*a = cls->asset;
151 U16 id = swf_GetDefineID(a->tags->TAG);
152 char*fullname = abc_class_fullname(cls);
154 swf_SetString(tag, fullname);
159 TAG*swf_AssetsToTags(TAG*itag, asset_bundle_list_t*assets)
161 char* bitmap = rfx_calloc(sizeof(char)*65536);
162 asset_bundle_list_t*l = assets;
163 dict_t*written = dict_new2(&ptr_type);
165 if(l->asset_bundle->used) {
166 abc_file_t*file = l->asset_bundle->file;
169 for(t=0;t<file->classes->num;t++) {
170 abc_asset_t*a = ((abc_class_t*)array_getvalue(file->classes, t))->asset;
172 tag = write_asset(tag, a, written);
176 tag = swf_InsertTag(tag, ST_DOABC);
177 swf_WriteABC(tag, file);
178 tag = swf_InsertTag(tag, ST_SYMBOLCLASS);
179 swf_WriteABCSymbols(tag, file);
182 while(first && first->prev)
186 memset(&swf, 0, sizeof(SWF));
187 swf.firstTag = first;
188 swf_Relocate(&swf, bitmap);
199 dict_destroy(written);