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 + -
显示快捷键?