listswf.c

来自「flash swf file player」· C语言 代码 · 共 1,999 行 · 第 1/3 页

C
1,999
字号
      break;    case SWFACTION_SETVARIABLE:      println("Set Variable");      break;    case SWFACTION_SETTARGETEXPRESSION:      println("Set Target Expression");      break;    case SWFACTION_STRINGCONCAT:      println("String Concat");      break;    case SWFACTION_GETPROPERTY:      println("Get Property");      break;    case SWFACTION_SETPROPERTY:      println("Set Property");      break;    case SWFACTION_DUPLICATECLIP:      println("Duplicate Clip");      break;    case SWFACTION_REMOVECLIP:      println("Remove Clip");      break;    case SWFACTION_TRACE:      println("Trace");      break;    case SWFACTION_STARTDRAGMOVIE:      println("Start Drag Movie");      break;    case SWFACTION_STOPDRAGMOVIE:      println("Stop Drag Movie");      break;    case SWFACTION_STRINGCOMPARE:      println("String Compare");      break;    case SWFACTION_RANDOM:      println("Random");      break;    case SWFACTION_MBLENGTH:      println("String MB Length");      break;    case SWFACTION_ORD:      println("Ord");      break;    case SWFACTION_CHR:      println("Chr");      break;    case SWFACTION_GETTIMER:      println("Get Timer");      break;    case SWFACTION_MBSUBSTRING:      println("MB Substring");      break;    case SWFACTION_MBORD:      println("MB Ord");      break;    case SWFACTION_MBCHR:      println("MB Chr");      break;    case SWFACTION_NEXTFRAME:      println("Next Frame");      break;    case SWFACTION_PREVFRAME:      println("Previous Frame");      break;    case SWFACTION_PLAY:      println("Play");      break;    case SWFACTION_STOP:      println("Stop");      break;    case SWFACTION_TOGGLEQUALITY:      println("Toggle Quality");      break;    case SWFACTION_STOPSOUNDS:      println("Stop Sounds");      break;    /* ops with args */    case SWFACTION_PUSHDATA:    {      int type;      int start = fileOffset;      while(fileOffset < start+length)      {	switch(type = readUInt8(f))	{	  case 0: /* string */	    println("Push String: %s", readString(f));	    break;	  case 1: /* property */	    readUInt16(f); /* always 0? */	    println("Push Property: %04x", readUInt16(f));	    break;	  case 2: /* null */	    println("Push NULL");	    break;	  case 3: /* ??? */	    println("Push type 3- ??");	    break;	  case 4: 	    println("Push Register %i", readUInt8(f));	    break;	  case 5:	    if(readUInt8(f))	      println("Push true");	    else	      println("Push false");	    break;	  case 6: /* double */	    println("Push %f", readDouble(f));	    break;	  case 7: /* int */	    println("Push %i", readSInt32(f));	    break;	  case 8: /* dictionary */	    println("Push \"%s\"", dictionary[readUInt8(f)]);	    break;	  default:	    println("unknown push type: %i", type);	}      }      break;    }    case SWFACTION_GOTOFRAME:      println("Goto Frame %i", readUInt16(f));      break;    case SWFACTION_GETURL:    {      char *url = readString(f);      println("Get URL \"%s\" target \"%s\"", url, readString(f));      break;    }    case SWFACTION_WAITFORFRAMEEXPRESSION:      println("Wait For Frame Expression, skip %i\n", readUInt8(f));      break;    case SWFACTION_BRANCHALWAYS:      println("Branch Always %i", readSInt16(f));      break;    case SWFACTION_GETURL2:    {      int flags = readUInt8(f);      switch(flags)      {        case 0: println("Get URL2 (Don't send)"); break;        case 1: println("Get URL2 (GET)"); break;        case 2: println("Get URL2 (POST)"); break;        default: println("GET URL2 (0x%x)", flags);      }      break;    }    case SWFACTION_BRANCHIFTRUE:      println("Branch If True %i", readSInt16(f));      break;    case SWFACTION_CALLFRAME:      println("Call Frame");      dumpBytes(f, length);      break;    case SWFACTION_GOTOEXPRESSION:      print("Goto Expression");      if(readUInt8(f) == 1)	printf(" and Play\n");      else	printf(" and Stop\n");      break;    case SWFACTION_WAITFORFRAME:    {      int frame = readUInt16(f);      println("Wait for frame %i else skip %i", frame, readUInt8(f));      break;    }    case SWFACTION_SETTARGET:      println("Set Target %s", readString(f));      break;    case SWFACTION_GOTOLABEL:      println("Goto Label %s", readString(f));      break;    case SWFACTION_END:      return 0;      break;    /* f5 ops */    case SWFACTION_DELETE:      println("Delete");      break;    case SWFACTION_VAR:      println("Var");      break;    case SWFACTION_VAREQUALS:      println("Var Assign");      break;    case SWFACTION_CALLFUNCTION:      println("Call Function");      break;    case SWFACTION_RETURN:      println("Return");      break;    case SWFACTION_MODULO:      println("Modulo");      break;    case SWFACTION_NEW:      println("New");      break;    case SWFACTION_TYPEOF:      println("Typeof");      break;    case SWFACTION_NEWADD:      println("New Add");      break;    case SWFACTION_NEWLESSTHAN:      println("New Less Than");      break;    case SWFACTION_NEWEQUAL:      println("New Equals");      break;    case SWFACTION_DUP:      println("Dup");      break;    case SWFACTION_GETMEMBER:      println("Get Member");      break;    case SWFACTION_SETMEMBER:      println("Set Member");      break;    case SWFACTION_INCREMENT:      println("Increment");      break;    case SWFACTION_DECREMENT:      println("Decrement");      break;    case SWFACTION_CALLMETHOD:      println("Call Method");      break;    case SWFACTION_BITWISEAND:      println("Bitwise And");      break;    case SWFACTION_BITWISEOR:      println("Bitwise Or");      break;    case SWFACTION_BITWISEXOR:      println("Bitwise Xor");      break;    case SWFACTION_SHIFTLEFT:      println("Shift Left");      break;    case SWFACTION_SHIFTRIGHT:      println("Shift Right");      break;    case SWFACTION_SHIFTRIGHT2:      println("Shift Right 2");      break;    case SWFACTION_DECLARENAMES:    {      int i, n = readUInt16(f);      print("Declare Dictionary:");      for(i=0; i<n; ++i)	printf(" %s%c", dictionary[i]=readString(f), (i<n-1)?',':'\n');      break;    }    case SWFACTION_WITH:    {      println("With");      ++gIndent;      printDoAction(f, readUInt16(f));      --gIndent;      break;    }    case SWFACTION_DEFINEFUNCTION:    {      char *name = readString(f);      int n = readUInt16(f);      print("function %s(", name);      if(n>0)      {	printf("%s", readString(f));	--n;      }      for(; n>0; --n)	printf(", %s", readString(f));      putchar(')');      putchar('\n');      ++gIndent;      printDoAction(f, readUInt16(f));      --gIndent;      break;    }    case SWFACTION_ENUMERATE:      println("Enumerate");      break;    case SWFACTION_SETREGISTER:      println("Set Register %i", readUInt8(f));      break;    default:      println("Unknown Action: %02X", type);      dumpBytes(f, length);  }  return 1;}void printDoAction(FILE *f, int length){  int start = fileOffset, end = fileOffset+length;  while(fileOffset<end)  {    printf("%i\t", fileOffset-start);    if(!printActionRecord(f))      break;  }}int printButtonRecord(FILE *f, int recordType){  int character, layer;  int flags = readUInt8(f);  if(flags == 0)    return 0;  if(flags & 0x08)    println("Hit flag: ");  if(flags & 0x04)    println("Down flag: ");  if(flags & 0x02)    println("Over flag: ");  if(flags & 0x01)    println("Up flag: ");  character = readUInt16(f);  layer = readUInt16(f);  println("character: %i, layer %i", character, layer);  printMatrix(f);  if(recordType == 2)    printCXForm(f, true); /* XXX - should be true? */  return 1;}void printDefineButton(FILE *f, int length){  int offset = fileOffset;  println("Button id: %i", readUInt16(f));  ++gIndent;  while(printButtonRecord(f, 1)) ;  decompileAction(f, length-(fileOffset-offset), 0);  --gIndent;}int printButton2ActionCondition(FILE *f, int end){  int offset = readUInt16(f);  int condition = readUInt16(f);  println("offset = %i", offset);  if(condition & 0xfe00) println("condition: keyPress(%c)", (condition&0xfe00)>>9);  if(condition & 0x100) println("condition: overDownToIdle");  if(condition & 0x80)  println("condition: idleToOverDown");  if(condition & 0x40)  println("condition: outDownToIdle");  if(condition & 0x20)  println("condition: outDownToOverDown");  if(condition & 0x10)  println("condition: overDownToOutDown");  if(condition & 0x08)  println("condition: overDownToOverUp");  if(condition & 0x04)  println("condition: overUpToOverDown");  if(condition & 0x02)  println("condition: overUpToIdle");  if(condition & 0x01)  println("condition: idleToOverUp");  if(offset == 0)    decompileAction(f, end-fileOffset, 0);  else    decompileAction(f, offset-4, 0);  return offset;}void printDefineButton2(FILE *f, int length){  int flags, offset, end = fileOffset+length;  println("Button id: %i", readUInt16(f));  flags = readUInt8(f); /* flags */  if(flags)    println("tracked as menu item (whatever that means..)");  offset = readUInt16(f); /* offset */  println("offset = %i", offset);  while(printButtonRecord(f, 2)) ;  if(offset>0)    while(printButton2ActionCondition(f, end)) ;}void printPlaceObject(FILE *f, int length){  int start = fileOffset;  println("Character ID: %i", readUInt16(f));  println("Depth: %i", readUInt16(f));  println("Matrix:");  printMatrix(f);  if(fileOffset < start+length)  {    print("CXform: ");    printCXForm(f, false);    putchar('\n');  }}#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 length){  int start = fileOffset;  int flags = readUInt8(f);  int l;  println("Depth: %i", readUInt16(f));  if(flags & PLACE_HASMOVE)    println("Has move flag");  if(flags & PLACE_HASCHARACTER)    println("Character ID: %i", readUInt16(f));  if(flags & PLACE_HASMATRIX)  {    println("Matrix:");    printMatrix(f);  }  if(flags & PLACE_HASCXFORM)  {    print("CXForm: ");    printCXForm(f, true);    putchar('\n');  }  if(flags & PLACE_HASRATIO)    println("Ratio: %i", readUInt16(f));  if(flags & PLACE_HASNAME)    println("Name: %s", readString(f));  if(flags & PLACE_HASCLIP)    println("ClipDepth: %i", readUInt16(f));  if(flags & PLACE_RESERVED)  {    println("Mystery number: %04x", readUInt16(f));    flags = readUInt16(f);    println("Clip flags: %04x", flags);    while((flags = readUInt16(f)) != 0)    {      println("Flags: %04x", flags);      l = readUInt32(f);      decompileAction(f, l, 0);    }  }  dumpBytes(f, length-(fileOffset-start));}void printRemoveObject(FILE *f){  println("ID: %i", readUInt16(f));  println("Depth: %i", readUInt16(f));}void printRemoveObject2(FILE *f){  println("Depth: %i", readUInt16(f));}void printSetBackgroundColor(FILE *f){  print("Color: ");  printRGB(f);  putchar('\n');}void printFrameLabel(FILE *f){  println("Label: %s\n", readString(f));}void printDefineFont(FILE *f, int length){  int here, off0, off, i, nShapes, fillBits=1, lineBits=1;  int *offset;  println("FontID: %i", readUInt16(f));  off0 = readUInt16(f);  nShapes = off0/2;  println("Number of shapes: %i", nShapes);  offset = (int *)malloc(nShapes*sizeof(int));  ++gIndent;  println("Offset0: 0");  for(i=1; i<nShapes; ++i)  {    off = readUInt16(f);    offset[i-1] = off-off0;    println("Offset%i: %i", i, offset[i-1]);  }  offset[nShapes-1] = length-2-(nShapes*2);  here = fileOffset;  for(i=0; i<nShapes; ++i)  {    putchar('\n');    byteAlign();    println("Shape %i:", i);    fillBits = readBits(f, 4);    lineBits = readBits(f, 4);    ++gIndent;    while(fileOffset < here+offset[i])      printShapeRec(f, &fillBits, &lineBits, 2);    --gIndent;  }  --gIndent;}#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 printDefineFont2(FILE *f, int length){  int flags, nGlyphs, namelen, off, i, fillBits, lineBits;  int here = fileOffset;  int *offset;  println("fontID: %i", readUInt16(f));  flags = readUInt8(f);  readUInt8(f); /* "reserved" */  namelen = readUInt8(f);  print("Font Name: ");  for(; namelen>0; --namelen)    putchar((unsigned char)readUInt8(f));  putchar('\n');  nGlyphs = readUInt16(f);  println("number of glyphs: %i\n", nGlyphs);  offset = (unsigned int *)malloc(nGlyphs*sizeof(int));  /* offset table */  here = fileOffset;  for(i=0; i<=nGlyphs; ++i)  {    if(flags & FONTINFO2_WIDEOFFSETS)      offset[i] = readUInt32(f)-4*nGlyphs-2;    else      offset[i] = readUInt16(f)-2*nGlyphs-2;    println("Offset%i: %i", i, offset[i]);  }  here = fileOffset;  /* shape table */  for(i=0; i<nGlyphs; ++i)  {    byteAlign();    println("Glyph %i:", i);    fillBits = readBits(f, 4);    lineBits = readBits(f, 4);    byteAlign();    while(printShapeRec(f, &fillBits, &lineBits, 2)) ;    putchar('\n');  }  /* code table */  for(i=0; i<nGlyphs; ++i)  {    if(flags & FONTINFO2_WIDECODES)      println("glyph code %i: %i", i, readUInt16(f));    else      println("glyph code %i: %i", i, readUInt8(f));  }  if(flags & FONTINFO2_HASLAYOUT)  {    int kernCount, code1, code2;    println("ascender height: %i", readSInt16(f));    println("descender height: %i", readSInt16(f));    println("leading height: %i", readSInt16(f));    for(i=0; i<nGlyphs; ++i)      printf("\tadvance %i: %i\n", i, readSInt16(f));    for(i=0; i<nGlyphs; ++i)    {      print("bounds %i: ", i);      printRect(f);      putchar('\n');    }    kernCount = readUInt16(f);    for(i=0; i<kernCount; ++i)    {      code1 = (flags & FONTINFO2_WIDECODES) ? readUInt16(f) : readUInt8(f);      code2 = (flags & FONTINFO2_WIDECODES) ? readUInt16(f) : readUInt8(f);      println("(%i,%i): adjustment = %i", code1, code2, readSInt16(f));    }  }}#define FONTINFO_RESERVED	(1<<6 | 1<<7)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?