swftoperl.c
来自「flash swf file player」· C语言 代码 · 共 1,914 行 · 第 1/4 页
C
1,914 行
printf("\t$s%i->addShape($s%i, ", id, character); readMatrix(f, &m); if(flags & 0x08) { printf("SWFBUTTON_HIT"); notFirst = 1; } if(flags & 0x04) { printf("%sSWFBUTTON_DOWN", (notFirst?" | ":"")); notFirst = 1; } if(flags & 0x02) { printf("%sSWFBUTTON_OVER", (notFirst?" | ":"")); notFirst = 1; } if(flags & 0x01) { printf("%sSWFBUTTON_UP", (notFirst?" | ":"")); notFirst = 1; } printf(");\n"); printf("\t# Button character transforms not implemented, sorry.\n"); if(recordType == 2) { struct CXForm s; readCXForm(f, &s, true); printf("\t# Button cxforms not implemented, either.. \n"); } return 1;}void printDefineButtonSound(FILE *f, int length){ int i; int id = readUInt16(f); for(i=0;i<4;i++){ int soundid = readUInt16(f); if (soundid != 0){ printf("\t$si%i_%i = $s%i->addSound($snd%i,",id,i,id,soundid); switch(i){ case 0: printf("SWFBUTTON_UP);\n"); break; case 1: printf("SWFBUTTON_OVER);\n"); break; case 2: printf("SWFBUTTON_DOWN);\n"); break; default: printf("SWFBUTTON_HIT);\n"); } printSoundInstance(f,id,soundid); } }}#define SWFSOUNDINFO_SYNCSTOPSOUND (1<<5)#define SWFSOUNDINFO_SYNCNOMULTIPLE (1<<4)#define SWFSOUNDINFO_HASENVELOPE (1<<3)#define SWFSOUNDINFO_HASLOOPS (1<<2)#define SWFSOUNDINFO_HASOUTPOINT (1<<1)#define SWFSOUNDINFO_HASINPOINT (1<<0)void printSoundInstance(FILE *f, int id, int soundid){ int e,point,left,right; int flags = readUInt8(f); if (flags & SWFSOUNDINFO_SYNCSTOPSOUND){ printf("\t# stopsound??"); } if (flags & SWFSOUNDINFO_SYNCNOMULTIPLE){ printf("\t$si->setNoMultiple();\n"); } if(flags & SWFSOUNDINFO_HASINPOINT){ int inpoint = readUInt32(f); printf("\t$si->setInPoint(%i);\n", inpoint); } if(flags & SWFSOUNDINFO_HASOUTPOINT){ int outpoint = readUInt32(f); printf("\t$si->setOutPoint(%i);\n", outpoint); } if(flags & SWFSOUNDINFO_HASLOOPS){ int loopcount = readUInt16(f); printf("\t$si->setLoops(%i);\n", loopcount); } if(flags & SWFSOUNDINFO_HASENVELOPE) { int envpoints = readUInt8(f); for (e=0; e<envpoints;e++){ point = readUInt32(f); left = readUInt16(f); left = readUInt16(f); printf("\t$si->addEnvelopePoint(%i,%i,%i);\n", point,left,right); } }} void printDefineButton(FILE *f, int length){ int offset = fileOffset; int id = readUInt16(f); printf("\n\t### Button %i ###\n", id); printf("\t$s%i = new SWF::Button();\n", id); while(printButtonRecord(f, 1, id)) ; printf("\t$a = new SWF::Action(\"\n"); decompileAction(f, length-(fileOffset-offset), 0); printf("\");\n"); printf("\t$s%i->setAction($a);\n", id);}int printButton2ActionCondition(FILE *f, int end, int id){ int offset = readUInt16(f); int condition = readUInt16(f); int notFirst = 0; printf("\t$a = new SWF::Action(\"\n"); if(offset == 0) {decompileAction(f, end-fileOffset, 0);} else {decompileAction(f, offset-4, 0);} printf("\");\n"); printf("\t$s%i->addAction($a, ", id); if(condition & 0xfe00) { printf("SWFBUTTON_KEYPRESS(%c)", (condition&0xfe00)>>9); notFirst = 1; } if(condition & 0x100 || condition & 0x10) { printf("%sSWFBUTTON_DRAGOUT", (notFirst?" | ":"")); notFirst = 1; } if(condition & 0x80 || condition & 0x20) { printf("%sSWFBUTTON_DRAGIN", (notFirst?" | ":"")); notFirst = 1; } if(condition & 0x40) { printf("%sSWFBUTTON_MOUSEUPOUTSIDE", (notFirst?" | ":"")); notFirst = 1; } if(condition & 0x08) { printf("%sSWFBUTTON_MOUSEUP", (notFirst?" | ":"")); notFirst = 1; } if(condition & 0x04) { printf("%sSWFBUTTON_MOUSEDOWN", (notFirst?" | ":"")); notFirst = 1; } if(condition & 0x02) { printf("%sSWFBUTTON_MOUSEOUT", (notFirst?" | ":"")); notFirst = 1; } if(condition & 0x01) { printf("%sSWFBUTTON_MOUSEOVER", (notFirst?" | ":"")); notFirst = 1; } printf(");\n"); return offset;}void printDefineButton2(FILE *f, int length){ int offset, end = fileOffset+length; int id = readUInt16(f); int flags = readUInt8(f); printf("\n\t### Button2 %i ###\n", id); printf("\t$s%i = new SWF::Button();\n", id); if(flags){printf("\t$s%i->setMenu();\n",id);} offset = readUInt16(f); while(printButtonRecord(f, 2, id)) ; if(offset>0) while(printButton2ActionCondition(f, end, id)) ;}void printCXForm(struct CXForm *c, char ch, int num){ if(c->aMult != 0x100) printf("\t$%c%i->multColor(%f, %f, %f, %f);\n", ch, num, c->rMult/256.0, c->gMult/256.0, c->bMult/256.0, c->aMult/256.0); else printf("\t$%c%i->multColor(%f, %f, %f);\n", ch, num, c->rMult/256.0, c->gMult/256.0, c->bMult/256.0); if(c->aAdd != 0) printf("\t$%c%i->addColor(0x%02x, 0x%02x, 0x%02x, 0x%02x);\n", ch, num, c->rAdd, c->gAdd, c->bAdd, c->aAdd); else printf("\t$%c%i->addColor(0x%02x, 0x%02x, 0x%02x);\n", ch, num, c->rAdd, c->gAdd, c->bAdd);}void printPlaceObject(FILE *f, int length){ int start = fileOffset; struct Matrix m; int id = readUInt16(f); int depth = readUInt16(f); readMatrix(f, &m); if(movieclip == 0) printf("\t$i%i = $m->add($s%i);\n", depth, id); else printf("\t$j%i = $s%i->add($s%i);\n", depth, movieclip, id); printTransform(&m, (movieclip==0)?'i':'j', depth); if(fileOffset < start+length) { struct CXForm c; readCXForm(f, &c, false); printCXForm(&c, (movieclip==0)?'i':'j', depth); }}#define PLACE_HAS_ACTION (1<<7)#define PLACE_HAS_MASK (1<<6)#define PLACE_HAS_NAME (1<<5)#define PLACE_HAS_RATIO (1<<4)#define PLACE_HAS_CXFORM (1<<3)#define PLACE_HAS_MATRIX (1<<2)#define PLACE_HAS_CHARACTER (1<<1)#define PLACE_HAS_MOVE (1<<0)void printPlaceObject2(FILE *f){ int flags = readUInt8(f); int depth = readUInt16(f); int l; if(flags & PLACE_HAS_CHARACTER){ if(movieclip == 0){ printf("\t$i%i = $m->add($s%i);\n", depth, readUInt16(f)); } else { printf("\t$j%i = $s%i->add($s%i);\n", depth, movieclip, readUInt16(f)); } } if(flags & PLACE_HAS_MATRIX){ struct Matrix m; readMatrix(f, &m); printTransform(&m, (movieclip==0)?'i':'j', depth); } if(flags & PLACE_HAS_CXFORM){ struct CXForm c; readCXForm(f, &c, true); printCXForm(&c, (movieclip==0)?'i':'j', depth); } if(flags & PLACE_HAS_RATIO){ printf("\t$%c%i->setRatio(%f);\n",(movieclip==0)?'i':'j', depth, (float)readUInt16(f)/(1<<16)); } if(flags & PLACE_HAS_NAME){ printf("\t$%c%i->setName('%s');\n",(movieclip==0)?'i':'j', depth, readString(f)); } if(flags & PLACE_HAS_MASK){ //printf("\t# clipDepth (%i) not implemented \n", readUInt16(f)); /*added by Peter*/ printf("\t$%c%i->setMaskLevel(%i);\n", (movieclip==0)?'i':'j', depth, readUInt16(f)); } if(flags & PLACE_HAS_ACTION){ printf("#Mystery number: %04x\n", readUInt16(f)); flags = readUInt16(f); //printf("#Clip flags: %04x\n", flags); printf("\t$%c%i->addAction(new SWF::Action(\"\n", (movieclip==0)?'i':'j', depth);#define PLACEACTION_ONLOAD (1<<0)#define PLACEACTION_ENTERFRAME (1<<1)#define PLACEACTION_UNLOAD (1<<2)#define PLACEACTION_MOUSEMOVE (1<<3)#define PLACEACTION_MOUSEDOWN (1<<4)#define PLACEACTION_MOUSEUP (1<<5)#define PLACEACTION_KEYDOWN (1<<6)#define PLACEACTION_KEYUP (1<<7)#define PLACEACTION_DATA (1<<8) while((flags = readUInt16(f)) != 0){ //printf("//flags: %04x\n", flags); switch(flags){ case PLACEACTION_ONLOAD: printf("onClipEvent(load){\n"); break; case PLACEACTION_ENTERFRAME:printf("onClipEvent(enterFrame){\n"); break; case PLACEACTION_UNLOAD: printf("onClipEvent(unload){\n"); break; case PLACEACTION_MOUSEMOVE: printf("onClipEvent(mouseMove){\n"); break; case PLACEACTION_MOUSEDOWN: printf("onClipEvent(mouseDown){\n"); break; case PLACEACTION_MOUSEUP: printf("onClipEvent(mouseUp){\n"); break; case PLACEACTION_KEYDOWN: printf("onClipEvent(keyDown){\n"); break; case PLACEACTION_KEYUP: printf("onClipEvent(keyUp){\n"); break; case PLACEACTION_DATA: printf("onClipEvent(data){\n"); break; default: printf("// unknown clipEvent: %04x\n", flags); } l = readUInt32(f); decompileAction(f, l, 0); printf("}\n"); } printf("));\n"); }}void printRemoveObject(FILE *f){ /* may be cases where id matters, not sure. */ readUInt16(f); /* id */ if(movieclip == 0) printf("\t$m->remove($i%i);\n", readUInt16(f)); else printf("\t$s%i->remove($j%i);\n", movieclip, readUInt16(f));}void printRemoveObject2(FILE *f){ if(movieclip == 0) printf("\t$m->remove($i%i);\n", readUInt16(f)); else printf("\t$s%i->remove($j%i);\n", movieclip, readUInt16(f));}void printSetBackgroundColor(FILE *f){ struct RGBA s; readRGB(f, &s); printf("\t$m->setBackground(0x%02x, 0x%02x, 0x%02x);\n", s.r, s.g, s.b);}void printFrameLabel(FILE *f){ if(movieclip == 0) printf("\t$m->labelFrame('%s');\n", readString(f)); else printf("\t$s%i->labelFrame('%s');\n", movieclip, readString(f));}#define FONTINFO2_HASLAYOUT (1<<7)#define FONTINFO2_SHIFTJIS (1<<6)#define FONTINFO2_UNICODE (1<<5)#define FONTINFO2_ANSI (1<<4)#define FONTINFO2_WIDEOFFSETS (1<<3)#define FONTINFO2_WIDECODES (1<<2)#define FONTINFO2_ITALIC (1<<1)#define FONTINFO2_BOLD (1<<0)void printDefineFont(FILE *f, int length) { printf("\t# DefineFont, %i bytes \n", length); silentSkipBytes(f, length);}void printDefineFont2(FILE *f, int length){ int flags, namelen, i, reserved; char name[264]; FILE *out; int wide = 0; int id = readUInt16(f); /* font id */ flags = readUInt8(f); if(flags & FONTINFO2_WIDECODES) {#if 1 wide = 1; warning("Sorry, wide code fonts not supported.");#else error("Sorry, wide code fonts not supported.");#endif } if(!(flags & FONTINFO2_HASLAYOUT)){ //error("Hrm. I was expecting some layout info."); fprintf(stderr,"Hrm. I was expecting some layout info!\n"); } reserved = readUInt8(f); /* "reserved" */ namelen = readUInt8(f); for(i=0; i<namelen; ++i){ name[i] = (unsigned char)readUInt8(f); if (name[i] == ' ') {name[i] = '_';} } if(flags & FONTINFO2_BOLD) { name[i++] = '-'; name[i++] = 'B'; } if(flags & FONTINFO2_ITALIC) { name[i++] = '-'; name[i++] = 'I'; } name[i++] = '.'; name[i++] = 'f'; name[i++] = 'd'; name[i++] = 'b'; name[i] = '\0'; printf("\t$f%i = new SWF::Font(\"%s\"); # This file should exist. \n", id, name); /* writing fontdatabase */ fprintf(stderr,"Writing %s, %i bytes\n", name, length+2); if((out=fopen(name,"wb"))==NULL) {error("Couldn't open output file!"); } fputc('f', out); fputc('d', out); fputc('b', out); fputc('0', out); fputc(flags, out); fputc(reserved, out); fputc(namelen, out); for(i=0; i<namelen; ++i) {fputc(name[i], out); } length -= namelen + 5; /*for(; length>0; --length) { fputc(fgetc(f), out); }*/ for(; length>0; --length) { fputc(readUInt8(f), out); } fclose(out); if(wide) { printf("Removing %s\n", name); unlink(name); }}#define FONTINFO_RESERVED (1<<6 | 1<<7)#define FONTINFO_UNICODE (1<<5)#define FONTINFO_SHIFTJIS (1<<4)#define FONTINFO_ANSI (1<<3)#define FONTINFO_ITALIC (1<<2)#define FONTINFO_BOLD (1<<1)#define FONTINFO_WIDE (1<<0)#define TEXTRECORD_STATECHANGE (1<<7)#define TEXTRECORD_RESERVED (1<<6 | 1<<5 | 1<<4)#define TEXTRECORD_HASFONT (1<<3)#define TEXTRECORD_HASCOLOR (1<<2)#define TEXTRECORD_HASYOFF (1<<1)#define TEXTRECORD_HASXOFF (1<<0)#define TEXTRECORD_NUMGLYPHS 0x7fint printTextRecord(FILE *f, int glyphBits, int advanceBits, int type){ int i, numGlyphs, fontid; int flags = readUInt8(f); struct RGBA rgba; if(flags == 0) {return 0; } if(flags & TEXTRECORD_STATECHANGE) { if(flags & TEXTRECORD_HASFONT) {fontid = readUInt16(f); /* fontid */ }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?