TAG* write_sprite_defines(TAG*tag, SWF*sprite) { TAG*rtag = sprite->firstTag; while(rtag && rtag->id!=ST_END) { if(!swf_isAllowedSpriteTag(rtag)) { msg("<debug> processing sprite tag %02x", tag->id); if(swf_isDefiningTag(rtag)) { msg("<debug> [sprite defs] write tag %02x (%d bytes in body)", tag->id, tag->len); tag = swf_InsertTag(tag, rtag->id); swf_SetBlock(tag, rtag->data, rtag->len); } else if(swf_isPseudoDefiningTag(rtag)) { msg("<debug> [sprite defs] write tag %02x (%d bytes in body)", tag->id, tag->len); tag = swf_InsertTag(tag, rtag->id); swf_SetBlock(tag, rtag->data, rtag->len); } else { switch(rtag->id) { case ST_JPEGTABLES: /* if we get here, jpeg_assert has already run, ensuring this is the only one of it's kind, so we may safely write it out */ tag = swf_InsertTag(tag, rtag->id); swf_SetBlock(tag, rtag->data, rtag->len); break; case ST_EXPORTASSETS: msg("<debug> deliberately ignoring EXPORTASSETS tag"); break; case ST_ENABLEDEBUGGER: msg("<debug> deliberately ignoring ENABLEDEBUGGER tag"); break; case ST_SETBACKGROUNDCOLOR: msg("<debug> deliberately ignoring BACKGROUNDCOLOR tag"); break; case ST_SHOWFRAME: msg("<debug> deliberately ignoring SHOWFRAME tag"); break; case ST_REFLEX: msg("<debug> deliberately ignoring REFLEX tag"); break; case 40: case 49: case 51: msg("<notice> found tag %d. This is a Generator template, isn't it?", rtag->id); break; default: msg("<notice> funny tag: %d is neither defining nor sprite", rtag->id); } } } rtag = rtag->next; } return tag; }
void write_changepos(TAG*output, TAG*tag, int movex, int movey, float scalex, float scaley, int scalepos) { if(movex || movey || scalex != 1.0 || scaley != 1.0) { switch(tag->id) { case ST_PLACEOBJECT2: { MATRIX m; U8 flags; swf_GetMatrix(0, &m); tag->pos = 0; tag->readBit = 0; flags = swf_GetU8(tag); swf_SetU8(output, flags|4); swf_SetU16(output, swf_GetU16(tag)); //depth //flags&1: move if(flags&2) { swf_SetU16(output, swf_GetU16(tag)); //id } // flags & 4 if(flags&4) { swf_GetMatrix(tag, &m); } else { swf_GetMatrix(0, &m); } matrix_adjust(&m, movex, movey, scalex, scaley, scalepos); swf_SetMatrix(output, &m); if (tag->readBit) { tag->pos++; tag->readBit = 0; } //swf_ResetReadBits(tag); swf_SetBlock(output, &tag->data[tag->pos], tag->len - tag->pos); break; } case ST_PLACEOBJECT: { MATRIX m; swf_SetU16(output, swf_GetU16(tag)); //id swf_SetU16(output, swf_GetU16(tag)); //depth swf_GetMatrix(tag, &m); matrix_adjust(&m, movex, movey, scalex, scaley, scalepos); swf_SetMatrix(output, &m); if (tag->readBit) { tag->pos++; tag->readBit = 0; } //swf_ResetReadBits(tag); swf_SetBlock(output, &tag->data[tag->pos], tag->len - tag->pos); break; } default: swf_SetBlock(output, tag->data, tag->len); } } else { swf_SetBlock(output, tag->data, tag->len); } }
static inline void add_pixel(RENDERBUF*dest, float x, int y, renderpoint_t*p) { renderbuf_internal*i = (renderbuf_internal*)dest->internal; if(x >= i->width2 || y >= i->height2 || y<0) return; p->x = x; if(y<i->ymin) i->ymin = y; if(y>i->ymax) i->ymax = y; i->lines[y].num++; swf_SetBlock(i->lines[y].points, (U8*)p, sizeof(renderpoint_t)); }
void swf_ActionSet(TAG*tag, ActionTAG*action) { if(!action) { return; } action=action->parent; while(action) { swf_SetU8(tag, action->op); if(action->op & 128) swf_SetU16(tag, action->len); swf_SetBlock(tag, action->data, action->len); action = action->next; } }
ActionTAG* swf_ActionCompile(const char* source, int version) { TAG* tag; ActionTAG* a = 0; void*buffer = 0; int len = 0; int ret; tag = swf_InsertTag(NULL, ST_DOACTION); ret = compileSWFActionCode(source, version, &buffer, &len); if(!ret || buffer==0 || len == 0) return 0; swf_SetBlock(tag, (U8*)buffer, len); swf_SetU8(tag, 0); rfx_free(buffer); a = swf_ActionGet(tag); swf_DeleteTag(0, tag); return a; }
int catcombine(SWF*master, char*slave_name, SWF*slave, SWF*newswf) { char* depths; int t; TAG*tag; TAG*mtag,*stag; if(config.isframe) { msg("<fatal> Can't combine --cat and --frame"); return 101; } if(config.flashversion) master->fileVersion = config.flashversion; tag = master->firstTag; while(tag) { if(swf_isDefiningTag(tag)) { int defineid = swf_GetDefineID(tag); msg("<debug> tagid %02x defines object %d", tag->id, defineid); masterbitmap[defineid] = 1; } tag = tag->next; } swf_Relocate(slave, masterbitmap); jpeg_assert(master, slave); memcpy(newswf, master, sizeof(SWF)); adjustheader(newswf); tag = newswf->firstTag = swf_InsertTag(0, ST_REFLEX); // to be removed later depths = malloc_safe(65536); if(!depths) { msg("<fatal> Couldn't allocate %d bytes of memory", 65536); return 111; } memset(depths, 0, 65536); mtag = master->firstTag; while(mtag && mtag->id!=ST_END) { int num=1; U16 depth; msg("<debug> [master] write tag %02x (%d bytes in body)", mtag->id, mtag->len); switch(mtag->id) { case ST_PLACEOBJECT2: num++; case ST_PLACEOBJECT: { depth = swf_GetDepth(mtag); depths[depth] = 1; } break; case ST_REMOVEOBJECT: { depth = swf_GetDepth(mtag); depths[depth] = 0; } break; case ST_REMOVEOBJECT2: { depth = swf_GetDepth(mtag); depths[depth] = 0; } break; } tag = swf_InsertTag(tag, mtag->id); swf_SetBlock(tag, mtag->data, mtag->len); mtag = mtag->next; } for(t=0;t<65536;t++) if(depths[t]) { char data[16]; int len; tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); swf_SetU16(tag, t); } free(depths); stag = slave->firstTag; while(stag && stag->id!=ST_END) { msg("<debug> [slave] write tag %02x (%d bytes in body)", stag->id, stag->len); tag = swf_InsertTag(tag, stag->id); swf_SetBlock(tag, stag->data, stag->len); stag = stag->next; } tag = swf_InsertTag(tag, ST_END); swf_DeleteTag(newswf, tag); return 0; }
TAG* write_master(TAG*tag, SWF*master, SWF*slave, int spriteid, int replaceddefine, int flags) { int outputslave = 0; int frame = 1; int sframe = 0; int slavewritten = 0; int deletedepth = -1; TAG* rtag = master->firstTag; TAG* stag = slave->firstTag; while(rtag && rtag->id!=ST_END) { if(rtag->id == ST_SHOWFRAME && outputslave) { while(stag && stag->id!=ST_END) { if(stag->id == ST_SHOWFRAME) { stag = stag->next; sframe++; break; } if(tag_ok_for_slave(stag->id)) { tag = swf_InsertTag(tag, stag->id); write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0); } stag = stag->next; } } if(rtag->id == ST_SHOWFRAME) { frame ++; tag = swf_InsertTag(tag, ST_SHOWFRAME); if(deletedepth>=0) { tag = swf_InsertTag(tag, ST_REMOVEOBJECT2); swf_SetU16(tag, deletedepth); deletedepth=-1; } rtag = rtag->next; continue; } if(swf_isDefiningTag(rtag) && (flags&FLAGS_WRITEDEFINES)) { msg("<debug> [master] write tag %02x (%d bytes in body)", rtag->id, rtag->len); if(swf_GetDefineID(rtag) == spriteid && !config.isframe) { if(config.overlay) { tag = swf_InsertTag(tag, rtag->id); swf_SetBlock(tag, rtag->data, rtag->len); swf_SetDefineID(tag, replaceddefine); } else { /* don't write this tag */ msg("<verbose> replacing tag %d ID %d with sprite", rtag->id ,spriteid); } if(flags&FLAGS_WRITESPRITE) { msg("<debug> writing sprite defines"); tag = write_sprite_defines(tag, slave); msg("<debug> writing sprite"); tag = write_sprite(tag, slave, spriteid, replaceddefine); } if(flags&FLAGS_WRITESLAVE) { msg("<debug> writing slave"); outputslave = 1; } } else { tag = swf_InsertTag(tag, rtag->id); swf_SetBlock(tag, rtag->data, rtag->len); } } if(frame == slaveframe) /* only happens with config.isframe: put slave at specific frame */ { if(flags&FLAGS_WRITESLAVE) { outputslave = 1; slavewritten = 1; } if((flags&FLAGS_WRITESPRITE) && !slavewritten) { int id = get_free_id(masterbitmap); int depth = 65535; deletedepth = 65535; if(config.clip) { msg("<fatal> Can't combine --clip and --frame"); } tag = write_sprite_defines(tag, slave); tag = write_sprite(tag, slave, id, -1); tag = swf_InsertTag(tag, ST_PLACEOBJECT2); swf_SetU8(tag, 2); //flags: id swf_SetU16(tag, depth); swf_SetU16(tag, id); slavewritten = 1; } } if(!swf_isDefiningTag(rtag) && (flags&FLAGS_WRITENONDEFINES)) { int dontwrite = 0; switch(rtag->id) { case ST_PLACEOBJECT: case ST_PLACEOBJECT2: if(frame == slaveframe && !config.overlay) dontwrite = 1; case ST_REMOVEOBJECT: /* place/removetags for the object we replaced should be discarded, too, as the object to insert isn't a sprite */ if(spriteid>=0 && swf_GetPlaceID(rtag) == spriteid && !config.isframe && config.merge) dontwrite = 1; break; case ST_REMOVEOBJECT2: break; } if(!dontwrite) { msg("<debug> [master] write tag %02x (%d bytes in body)", rtag->id, rtag->len); tag = swf_InsertTag(tag, rtag->id); write_changepos(tag, rtag, config.mastermovex, config.mastermovey, config.masterscalex, config.masterscaley, 1); } } rtag = rtag->next; } if(outputslave) while(stag && stag->id!=ST_END) { if(tag_ok_for_slave(stag->id)) { msg("<debug> [slave] write tag %02x (%d bytes in body), %.2f %.2f", rtag->id, rtag->len, config.movex /20.0, config.movey /20.0); tag = swf_InsertTag(tag, stag->id); write_changepos(tag, stag, config.movex, config.movey, config.scalex, config.scaley, 0); } stag = stag->next; } if(!slavewritten && config.isframe && (flags&(FLAGS_WRITESLAVE|FLAGS_WRITESPRITE))) { if(slaveframe>=0) msg("<warning> Frame %d doesn't exist in file. No substitution will occur", slaveframe); else msg("<warning> Frame \"%s\" doesn't exist in file. No substitution will occur", slavename); } tag = swf_InsertTag(tag, ST_END); return tag; }