📄 swftophp.c
字号:
if(flags) printf("\t/* button should be tracked as menu item (whatever that means..) */\n"); 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(sprite == 0) printf("\t$i%i = $m->add($s%i);\n", depth, id); else printf("\t$j%i = $s%i->add($s%i);\n", depth, sprite, id); printTransform(&m, (sprite==0)?'i':'j', depth, 0); if(fileOffset < start+length) { struct CXForm c; readCXForm(f, &c, false); printCXForm(&c, (sprite==0)?'i':'j', depth); }}#define PLACE_RESERVED (1<<7)#define PLACE_HASCLIP (1<<6)#define PLACE_HASNAME (1<<5)#define PLACE_HASRATIO (1<<4)#define PLACE_HASCXFORM (1<<3)#define PLACE_HASMATRIX (1<<2)#define PLACE_HASCHARACTER (1<<1)#define PLACE_HASMOVE (1<<0)void printPlaceObject2(FILE *f){ int flags = readUInt8(f); int depth = readUInt16(f); if(flags & PLACE_HASCHARACTER) { if(sprite == 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, sprite, readUInt16(f)); }// if it has a matrix but no character, always show xform !!! if(flags & PLACE_HASMATRIX) { struct Matrix m; readMatrix(f, &m); printTransform(&m, (sprite==0)?'i':'j', depth, !(flags & PLACE_HASCHARACTER)); } if(flags & PLACE_HASCXFORM) { struct CXForm c; readCXForm(f, &c, true); printCXForm(&c, (sprite==0)?'i':'j', depth); } if(flags & PLACE_HASRATIO) printf("\t$%c%i->setRatio(%f);\n", (sprite==0)?'i':'j', depth, (float)readUInt16(f)/(1<<16)); if(flags & PLACE_HASNAME) printf("\t$%c%i->setName('%s');\n", (sprite==0)?'i':'j', depth, readString(f)); if(flags & PLACE_HASCLIP) printf("\t/* clipDepth (%i) not implemented */\n", readUInt16(f));}void printRemoveObject(FILE *f){ /* may be cases where id matters, not sure. */ readUInt16(f); /* id */ if(sprite == 0) printf("\t$m->remove($i%i);\n", readUInt16(f)); else printf("\t$s%i->remove($j%i);\n", sprite, readUInt16(f));}void printRemoveObject2(FILE *f){ if(sprite == 0) printf("\t$m->remove($i%i);\n", readUInt16(f)); else printf("\t$s%i->remove($j%i);\n", sprite, 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(sprite == 0) printf("\t$m->labelFrame('%s');\n", readString(f)); else printf("\t$s%i->labelFrame('%s');\n", sprite, 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)#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 */ if(flags & TEXTRECORD_HASCOLOR) { if(type == DEFINETEXT2) readRGBA(f, &rgba); else readRGB(f, &rgba); } if(flags & TEXTRECORD_HASXOFF) readSInt16(f); /* x offset */ if(flags & TEXTRECORD_HASYOFF) readSInt16(f); /* y offset */ if(flags & TEXTRECORD_HASFONT) readUInt16(f); /* font height */ } else /* it's a text entry */ { numGlyphs = flags & TEXTRECORD_NUMGLYPHS; for(i=0; i<numGlyphs; ++i) { readBits(f, glyphBits); /* glyph index */ readSBits(f, advanceBits); /* glyph advance */ } } return 1;}void printDefineText(FILE *f, Blocktype type) /* type 2 allows transparency */{ int glyphBits, advanceBits; int id = readUInt16(f); struct Rect r; struct Matrix m; printf("\t$s%i = new SWFShape(); /* empty shape for text, for now */\n", id); readRect(f, &r); byteAlign(); readMatrix(f, &m); glyphBits = readUInt8(f); advanceBits = readUInt8(f); while(printTextRecord(f, glyphBits, advanceBits, type)) ;}void silentSkipBytes(FILE *f, int length){ for(; length>0; --length) readUInt8(f);}void printDoAction(FILE *f, int length){ if(sprite == 0) { printf("\t$m->add(new SWFAction(\"\n\n"); decompileAction(f, length, 0); printf("\t\"));\n"); } else { printf("\t$s%i->add(new SWFAction(\"\n\n", sprite); decompileAction(f, length, 0); printf("\t\"));\n"); }}void printSprite(FILE *f, int length){ int start = fileOffset; int block, type, l; int nFrames, frame = 0; sprite = readUInt16(f); nFrames = readUInt16(f); printf("\n\t/* -- Shape %i -- */\n", sprite); printf("\t$s%i = new SWFSprite(); /* (%i frames) */\n", sprite, nFrames); while(fileOffset < start+length) { block = readUInt16(f); type = block>>6; l = block & ((1<<6)-1); if(l == 63) /* it's a long block */ l = readUInt32(f); switch(type) { case PLACEOBJECT: printPlaceObject(f, l); break; case PLACEOBJECT2: printPlaceObject2(f); break; case REMOVEOBJECT: printRemoveObject(f); break; case REMOVEOBJECT2: printRemoveObject2(f); break; case FRAMELABEL: printFrameLabel(f); break; case DOACTION: printDoAction(f, l); break; case SHOWFRAME: printf("\t$s%i->nextFrame(); /* (end of sprite frame %i) */\n\n", sprite, frame++); break; case END: putchar('\n'); break; /* case SOUNDSTREAMHEAD: printSoundStreamHead(f, 1); break; case SOUNDSTREAMHEAD2: printSoundStreamHead(f, 2); break; case SOUNDSTREAMBLOCK: printSoundStreamBlock(f, l); break; */ default: printf("\t/* %s, %i bytes */\n", blockName(type), l); silentSkipBytes(f, l); } } sprite = 0;}#define TEXTFIELD_HASLENGTH (1<<1)#define TEXTFIELD_NOEDIT (1<<3)#define TEXTFIELD_PASSWORD (1<<4)#define TEXTFIELD_MULTILINE (1<<5)#define TEXTFIELD_WORDWRAP (1<<6)#define TEXTFIELD_DRAWBOX (1<<11)#define TEXTFIELD_NOSELECT (1<<12)#define TEXTFIELD_JUSTIFY_LEFT 0#define TEXTFIELD_JUSTIFY_RIGHT 1#define TEXTFIELD_JUSTIFY_CENTER 2#define TEXTFIELD_JUSTIFY_JUSTIFY 3void printTextField(FILE *f, int length){ int notFirst = 0, flags, num, end = fileOffset+length; struct Rect r; struct RGBA c; char *string; int id = readUInt16(f); readRect(f, &r); flags=readUInt16(f); printf("\n\t$s%i = new SWFTextField(", id); if(flags & TEXTFIELD_HASLENGTH) { puts("TEXTFIELD_HASLENGTH"); notFirst = 1; } if(flags & TEXTFIELD_NOEDIT) { printf("%sTEXTFIELD_NOEDIT", notFirst?" | ":""); notFirst = 1; } if(flags & TEXTFIELD_PASSWORD) { printf("%sTEXTFIELD_PASSWORD", notFirst?" | ":""); notFirst = 1; } if(flags & TEXTFIELD_MULTILINE) { printf("%sTEXTFIELD_MULTILINE", notFirst?" | ":""); notFirst = 1; } if(flags & TEXTFIELD_WORDWRAP) { printf("%sTEXTFIELD_WORDWRAP", notFirst?" | ":""); notFirst = 1; } if(flags & TEXTFIELD_DRAWBOX) { printf("%sTEXTFIELD_DRAWBOX", notFirst?" | ":""); notFirst = 1; } if(flags & TEXTFIELD_NOSELECT) { printf("%sTEXTFIELD_NOSELECT", notFirst?" | ":""); notFirst = 1; } puts(");\n"); printf("\t$s%i->setBounds(%i, %i);\n", id, r.xMax, r.yMax); printf("\t$s%i->setFont(new SWFFont('_serif')); /* temp hack, should be $f%i */\n", id, readUInt16(f)); printf("\t$s%i->setHeight(%i);\n", id, readUInt16(f)); readRGBA(f, &c); printf("\t$s%i->setColor(0x%02x, 0x%02x, 0x%02x, 0x%02x);\n", id, c.r, c.g, c.b, c.a); if(flags & TEXTFIELD_HASLENGTH) printf("\t$s%i->setLength(%i);\n", id, readUInt16(f)); printf("\t$s%i->align(", id); switch(num = readUInt8(f)) { case TEXTFIELD_JUSTIFY_LEFT: puts("TEXTFIELD_JUSTIFY_LEFT"); break; case TEXTFIELD_JUSTIFY_RIGHT: puts("TEXTFIELD_JUSTIFY_RIGHT"); break; case TEXTFIELD_JUSTIFY_CENTER: puts("TEXTFIELD_JUSTIFY_CENTER"); break; case TEXTFIELD_JUSTIFY_JUSTIFY: puts("TEXTFIELD_JUSTIFY_JUSTIFY"); break; default: error("unexpected justification: %i\n", num); } puts(");\n"); if((num = readUInt16(f)) != 0) printf("\t$s%i->setLeftMargin(%i);\n", id, num); if((num = readUInt16(f)) != 0) printf("\t$s%i->setRightMargin(%i);\n", id, num); if((num = readUInt16(f)) != 0) printf("\t$s%i->setIndentation(%i);\n", id, num); if((num = readUInt16(f)) != 40) printf("\t$s%i->setLineSpacing(%i);\n", id, num); string = readString(f); if(string[0] != '\0') printf("\t$s%i->setName('%s');\n", id, string); if(fileOffset<end) { string = readString(f); if(string[0] != '\0') printf("\t$s%i->addString('%s');\n", id, string); } if(fileOffset<end) { puts("/* extra garbage (i.e., we goofed):\n"); dumpBytes(f, end-fileOffset); puts("*/\n"); }}void skipBytes(FILE *f, int length){ ++gIndent; printf("%s<%i bytes skipped>\n\n", indent(), length); --gIndent; for(; length>0; --length) readUInt8(f);}int main(int argc, char *argv[]){ struct Movie m; FILE *f; int block, type, length, frame = 0, noactions = 0; if(argc == 3 && strcmp(argv[1], "-a") == 0) { noactions = 1; --argc; ++argv; } if(argc<2) error("Give me a filename.\n"); if(!(f = fopen(argv[1],"rb"))) error("Sorry, can't seem to read that file.\n"); if(!(readUInt8(f)=='F' && readUInt8(f)=='W' && readUInt8(f)=='S')) error("Doesn't look like a swf file to me..\n"); m.version = m_version = readUInt8(f); m.size = readUInt32(f); readRect(f, &(m.frame)); m.rate = readUInt8(f)/256.0+readUInt8(f); m.nFrames = readUInt16(f); printf("<?php\n"); printf("\t$m = new SWFMovie();\n"); printf("\t$m->setRate(%f);\n", m.rate); printf("\t$m->setDimension(%i, %i);\n", m.frame.xMax, m.frame.yMax); printf("\t$m->setFrames(%i);\n", m.nFrames); if(noactions) m_version = 0; for(;;) { block = readUInt16(f); type = block>>6; length = block & ((1<<6)-1); if(length == 63) /* it's a long block. */ length = readUInt32(f); if(type == 0 || fileOffset >= m.size) break; switch(type) { case DEFINESHAPE3: case DEFINESHAPE2: case DEFINESHAPE: printShape(f, length, type); break; case SETBACKGROUNDCOLOR: printSetBackgroundColor(f); break; case SHOWFRAME: printf("\t$m->nextFrame(); /* (end of frame %i) */\n\n", frame++); break; case PLACEOBJECT2: printPlaceObject2(f); break; case REMOVEOBJECT2: printRemoveObject2(f); break; case DOACTION: printDoAction(f, length); break; case DEFINESPRITE: printSprite(f, length); break; case DEFINEBUTTON: printDefineButton(f, length); break; case DEFINEBUTTON2: printDefineButton2(f, length); break; case FRAMELABEL: printFrameLabel(f); break; case DEFINETEXT: case DEFINETEXT2: printDefineText(f, type); break; case TEXTFIELD: printTextField(f, length); break; case DEFINEMORPHSHAPE: printMorphShape(f, length); break; case PLACEOBJECT: printPlaceObject(f, length); break; case REMOVEOBJECT: printRemoveObject(f); break; /* case DEFINEFONT: printDefineFont(f, length); break; case DEFINEFONT2: printDefineFont2(f, length); break; case DEFINEFONTINFO: printFontInfo(f, length); break; case DEFINESOUND: printDefineSound(f, length); break; case SOUNDSTREAMHEAD: printSoundStreamHead(f, 1); break; case SOUNDSTREAMHEAD2: printSoundStreamHead(f, 2); break; case SOUNDSTREAMBLOCK: printSoundStreamBlock(f, length); break; case JPEGTABLES: printJpegStream(f, length); break; case DEFINEBITS: case DEFINEBITSJPEG2: printDefineBitsJpeg(f,length); break; case DEFINEBITSJPEG3: */ default: printf("\t/* %s, %i bytes */\n", blockName(type), length); silentSkipBytes(f, length); } } putchar('\n'); if(fileOffset < m.size) { printf("/* extra garbage (i.e., we messed up):\n"); dumpBytes(f, m.size-fileOffset); printf("\n*/\n"); } printf("\n\theader('Content-type: application/x-shockwave-flash');\n"); printf("\t$m->output();\n"); printf("?>"); exit(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -