+ tag = firstTag;
+ while(tag) {
+ if(swf_isPlaceTag(tag)) {
+ SWFPLACEOBJECT p;
+ swf_GetPlaceObject(tag, &p);
+ /* TODO: add move and deletion */
+ placements[numplacements++] = p;
+ swf_PlaceObjectFree(&p); //dirty! but it only frees fields we don't use
+ }
+ if(tag->id == ST_SHOWFRAME || tag->id == ST_END)
+ break;
+ tag = tag->next;
+ }
+
+ qsort(placements, numplacements, sizeof(SWFPLACEOBJECT), compare_placements);
+
+ int t;
+ for(t=0;t<numplacements;t++) {
+ SWFPLACEOBJECT*p = &placements[t];
+ int id = p->id;
+ MATRIX m2;
+ swf_MatrixJoin(&m2, m, &p->matrix);
+
+ if(!idtable[id].tag) {
+ fprintf(stderr, "rfxswf: Id %d is unknown\n", id);
+ continue;
+ }
+
+ if(idtable[id].type == shape_type) {
+ //SRECT sbbox = swf_TurnRect(*idtable[id].bbox, &p->matrix);
+ swf_RenderShape(buf, idtable[id].obj.shape, &m2, &p->cxform, p->depth, p->clipdepth);
+ } else if(idtable[id].type == sprite_type) {
+ swf_UnFoldSprite(idtable[id].tag);
+ renderFromTag(buf, idtable, idtable[id].tag->next, &m2);
+ swf_FoldSprite(idtable[id].tag);
+ } else if(idtable[id].type == text_type) {
+ TAG* tag = idtable[id].tag;
+ textcallbackblock_t info;
+ MATRIX mt;
+
+ swf_SetTagPos(tag, 0);
+ swf_GetU16(tag);
+ swf_GetRect(tag,0);
+ swf_GetMatrix(tag,&mt);
+ swf_MatrixJoin(&info.m, &m2, &mt);
+ /*printf("Text matrix:\n");
+ swf_DumpMatrix(stdout, &m);
+ printf("Placement matrix:\n");
+ swf_DumpMatrix(stdout, &p->matrix);
+ printf("Final matrix:\n");
+ swf_DumpMatrix(stdout, &info.m);*/
+
+ info.idtable = idtable;
+ info.depth = p->depth;
+ info.cxform = &p->cxform;
+ info.clipdepth = p->clipdepth;
+ info.buf = buf;
+
+ swf_ParseDefineText(tag, textcallback, &info);
+ } else if(idtable[id].type == edittext_type) {
+ TAG* tag = idtable[id].tag;
+ U16 flags = swf_GetBits(tag, 16);
+ if(flags & ET_HASTEXT) {
+ fprintf(stderr, "edittext not supported yet (id %d)\n", id);
+ }
+ } else {
+ fprintf(stderr, "Unknown/Unsupported Object Type for id %d: %s\n", id, swf_TagGetName(idtable[id].tag));
+ }
+ }
+
+ free(placements);
+}
+
+void swf_RenderSWF(RENDERBUF*buf, SWF*swf)
+{
+ TAG*tag;
+ int t;
+ RGBA color;
+
+ swf_FoldAll(swf);
+
+ character_t* idtable = (character_t*)rfx_calloc(sizeof(character_t)*65536); // id to character mapping
+