listswf.c

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

C
1,999
字号
#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)void printFontInfo(FILE *f, int length){  int namelen, nGlyphs, flags, i;  println("FontID: %i", readUInt16(f));  namelen = readUInt8(f);  nGlyphs = length-namelen-4;  print("Font Name: ");  for(; namelen>0; --namelen)    putchar((unsigned char)readUInt8(f));  putchar('\n');  flags = readUInt8(f);  if(flags & FONTINFO_UNICODE)    println("Unicode character codes!");  if(flags & FONTINFO_SHIFTJIS)    println("\tShiftJIS character codes!");  if(flags & FONTINFO_ANSI)    println("\tANSI character codes!");  if(flags & FONTINFO_ITALIC)    println("\tFont is italic!");  if(flags & FONTINFO_BOLD)    println("\tFont is bold!");  if(flags & FONTINFO_WIDE)    nGlyphs /= 2;  for(i=0; i<nGlyphs; ++i)    if(flags & FONTINFO_WIDE)      println("glyph %i: %i", i, readUInt16(f));    else      println("glyph %i: %i", i, readUInt8(f));}#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;  int flags = readUInt8(f);  if(flags == 0)    return 0;  if(flags & TEXTRECORD_STATECHANGE)  {    if(flags & TEXTRECORD_HASFONT)      println("font id: %i", readUInt16(f));    if(flags & TEXTRECORD_HASCOLOR)    {      print("color: ");      if(type == 2)	printRGBA(f);      else	printRGB(f);      putchar('\n');    }    if(flags & TEXTRECORD_HASXOFF)      println("X Offset: %i", readSInt16(f));    if(flags & TEXTRECORD_HASYOFF)      println("Y Offset: %i", readSInt16(f));    if(flags & TEXTRECORD_HASFONT)      println("font height: %i", readUInt16(f));  }  else  {    numGlyphs = flags & TEXTRECORD_NUMGLYPHS;    for(i=0; i<numGlyphs; ++i)    {      println("glyph index: %i", readBits(f, glyphBits));      println("glyph x advance: %i", readSBits(f, advanceBits));    }  }  return 1;}void printDefineText(FILE *f, int length, int type) /* type 2 allows transparency */{  int glyphBits, advanceBits, end = fileOffset+length;  println("character id: %i", readUInt16(f));  print("bounds: ");  printRect(f);  putchar('\n');  byteAlign();  println("matrix:");  printMatrix(f);  glyphBits = readUInt8(f);  advanceBits = readUInt8(f);  while(fileOffset < end &&	printTextRecord(f, glyphBits, advanceBits, type)) ;}void printSoundInfo(FILE *f){  int flags = readUInt8(f), nPoints, i;  ++gIndent;  if(flags&0x40)    println("Don't start if already playing");  if(flags&0x80)    println("Stop sound");  if(flags&0x01)    println("In Point: %i", readUInt32(f));  if(flags&0x02)    println("Out Point: %i", readUInt32(f));  if(flags&0x04)    println("Loops: %i", readUInt16(f));  if(flags&0x08)  {    nPoints = readUInt8(f);    for(i=0; i<nPoints; ++i)    {      println("Envelope point %i:", i);      println("Mark44: %i", readUInt32(f));      println("Level0: %i", readUInt16(f));      println("Level1: %i", readUInt16(f));    }  }  --gIndent;}#define MP3_FRAME_SYNC       0xFFE00000#define MP3_VERSION          0x00180000#define MP3_VERSION_25       0x00000000#define MP3_VERSION_RESERVED 0x00080000#define MP3_VERSION_2        0x00100000#define MP3_VERSION_1        0x00180000#define MP3_LAYER            0x00060000#define MP3_LAYER_RESERVED   0x00000000#define MP3_LAYER_3          0x00020000#define MP3_LAYER_2          0x00040000#define MP3_LAYER_1          0x00060000#define MP3_PROTECT          0x00010000 /* 16-bit CRC after header */#define MP3_BITRATE          0x0000F000#define MP3_BITRATE_SHIFT    12int mp1l1_bitrate_table[] = { 0,   32,   64,  96, 128, 160, 192, 224,			      256, 288, 320, 352, 382, 416, 448 };int mp1l2_bitrate_table[] = { 0,   32,   48,  56,  64,  80,  96, 112,			      128, 160, 192, 224, 256, 320, 384 };int mp1l3_bitrate_table[] = { 0,    32,  40,  48,  56,  64,  80,  96,			      112, 128, 160, 192, 224, 256, 320 };int mp2l1_bitrate_table[] = { 0,    32,  48,  56,  64,  80,  96, 112,			      128, 144, 160, 176, 192, 224, 256 };int mp2l23_bitrate_table[] = { 0,    8,  16,  24,  32,  40,  48,  56,			       64,  80,  96, 112, 128, 144, 160 };#define MP3_SAMPLERATE       0x00000C00#define MP3_SAMPLERATE_SHIFT 10int mp1_samplerate_table[] = { 44100, 48000, 32000 };int mp2_samplerate_table[] = { 22050, 24000, 16000 }; /* is this right?? */int mp25_samplerate_table[] = { 11025, 12000, 8000 }; /* less samples in > versions? */#define MP3_PADDING          0x00000200 /* if set, add an extra slot - 4 bytes					   for layer 1, 1 byte for 2+3 */#define MP3_CHANNEL          0x000000C0#define MP3_CHANNEL_STEREO   0x00000000#define MP3_CHANNEL_JOINT    0x00000040#define MP3_CHANNEL_DUAL     0x00000080#define MP3_CHANNEL_MONO     0x000000C0/* rest of the header info doesn't affect frame size.. */void silentSkipBytes(FILE *f, int length){  for(; length>0; --length)    readUInt8(f);}void printMP3Headers(FILE *f, int length){  unsigned long flags;  int frameLen, frameNum = 0;  int bitrate, bitrate_idx, samplerate, samplerate_idx;  int version, layer, channels;  int padding;  while(length > 0)  {    ++frameNum;    /* get 4-byte header, bigendian */    flags = fgetc(f) << 24;    flags += fgetc(f) << 16;    flags += fgetc(f) << 8;    flags += fgetc(f);    fileOffset += 4;    if((flags & MP3_FRAME_SYNC) != MP3_FRAME_SYNC)      error("bad sync on MP3 block!");    bitrate_idx = (flags & MP3_BITRATE) >> MP3_BITRATE_SHIFT;    samplerate_idx = (flags & MP3_SAMPLERATE) >> MP3_SAMPLERATE_SHIFT;    channels = ((flags & MP3_CHANNEL) == MP3_CHANNEL_MONO) ? 1 : 2;    switch(flags & MP3_VERSION)    {      case MP3_VERSION_1:  version = 1; break;      case MP3_VERSION_2:  version = 2; break;      case MP3_VERSION_25: version = 25; break;      default: error("unknown MP3 version!");    }    switch(flags & MP3_LAYER)    {      case MP3_LAYER_1: layer = 1; break;      case MP3_LAYER_2: layer = 2; break;      case MP3_LAYER_3: layer = 3; break;      default: error("unknown MP3 layer!");    }    if(version == 1)    {      samplerate = mp1_samplerate_table[samplerate_idx];      if(layer == 1)	bitrate = mp1l1_bitrate_table[bitrate_idx];      else if(layer == 2)	bitrate = mp1l2_bitrate_table[bitrate_idx];      else if(layer == 3)	bitrate = mp1l3_bitrate_table[bitrate_idx];    }    else    {      if(version == 2)	samplerate = mp2_samplerate_table[samplerate_idx];      else	samplerate = mp25_samplerate_table[samplerate_idx];      if(layer == 1)	bitrate = mp2l1_bitrate_table[bitrate_idx];      else	bitrate = mp2l23_bitrate_table[bitrate_idx];    }    padding = (flags & MP3_PADDING) ? 1 : 0;    if(layer == 1)      padding <<= 2;    if(version == 1)      frameLen = 144 * bitrate * 1000 / samplerate + padding;    else      frameLen = 72 * bitrate * 1000 / samplerate + padding;    println("frame %i: MP%i layer %i, %i Hz, %ikbps, %s, length=%i, protect %s",	   frameNum, version, layer, samplerate, bitrate,	   (channels==2) ? "stereo" : "mono", frameLen,	   (flags&MP3_PROTECT) ? "on" : "off");    if(length < frameLen-4)      silentSkipBytes(f, length);    else      silentSkipBytes(f, frameLen-4);    length -= frameLen;  }  if(length>0)    dumpBytes(f, length);}void printDefineSound(FILE *f, int length){  int flags;  println("Character ID: %i", readUInt16(f));  flags = readUInt8(f);  switch(flags&0xf0)  {    case 0x20: print("Sound Format: mp3 ");              break;    case 0x10: print("Sound Format: ADPCM compressed "); break;    case 0x00: print("Sound Format: uncompressed ");     break;    default:   print("Sound Format: unknown compression ");  }  if((flags&0x0c) == 0)    puts("5KHz ");  else if((flags&0x0c) == 4)    puts("11KHz ");  else if((flags&0x0c) == 8)    puts("22KHz ");  else    puts("44KHz ");  if(flags&0x02)    puts("16 bit ");  else    puts("8 bit ");  if(flags&0x01)    puts("stereo\n");  else    puts("mono\n");  println("Number of samples: %i", readUInt32(f));  if((flags&0xf0) == 0x20) /* mp3 */  {    ++gIndent;    println("Delay: %i", readUInt16(f));    printMP3Headers(f, length-9);    --gIndent;  }  else    dumpBytes(f, length-7);}int streamflags;/* only difference is type 2 allows uncompressed data,   and 8-bit if uncompressed */void printSoundStreamHead(FILE *f, int type){  int recFormat = readUInt8(f);  int flags = readUInt8(f);  streamflags = flags;  println("Recommended Format: %02x", recFormat);  println("flags: %02x", flags);  if((flags&0xf0) == 0x20)  {    println("mp3 format");    println("Avg. number of Samples per Block: %i", readUInt16(f));    println("Mystery goo: %i", readUInt16(f));  }  else    println("Number of Samples: %i", readUInt16(f));}void printSoundStreamBlock(FILE *f, int length){  int samplesperframe, delay;  if((streamflags&0xf0) == 0x00)  {    println("Uncompressed samples");    skipBytes(f, length);  }  else if((streamflags&0xf0) == 0x10)  {    println("ADPCM compressed samples");    skipBytes(f, length);  }  else if((streamflags&0xf0) == 0x20)  {    samplesperframe = readUInt16(f);    delay = readUInt16(f);    println("MP3 compressed samples: %i samples, delay=%i",	    samplesperframe, delay);    printMP3Headers(f, length-4);  }  else    println("Unknown compression type!");}void printSprite(FILE *f, int length){  int start = fileOffset;  int block, type, l;  println("id: %i", readUInt16(f));  println("frame count: %i\n", readUInt16(f));  while(fileOffset < start+length)  {    println("Offset %i (0x%x)", fileOffset, fileOffset);    block = readUInt16(f);    type = block>>6;    println("Block type: %i (%s)", type, blockName(type));    l = block & ((1<<6)-1);    if(l == 63) /* it's a long block. */      l = readUInt32(f);    println("Block length: %i\n", l);    ++gIndent;    switch(type)    {      case PLACEOBJECT:		printPlaceObject(f, l);	break;      case PLACEOBJECT2:	printPlaceObject2(f, l);	break;      case REMOVEOBJECT:	printRemoveObject(f);		break;      case REMOVEOBJECT2:	printRemoveObject2(f);		break;      case FRAMELABEL:		printFrameLabel(f);		break;      case DOACTION:		decompileAction(f, l, 0);       break;      case SOUNDSTREAMHEAD:     printSoundStreamHead(f, 1);     break;      case SOUNDSTREAMHEAD2:    printSoundStreamHead(f, 2);     break;      case SOUNDSTREAMBLOCK:    printSoundStreamBlock(f, l);    break;      default:			if(l>0) dumpBytes(f, l);	break;    }    --gIndent;  /*    startsound  */  }}#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 flags, num, end = fileOffset+length;  println("Character id: %i", readUInt16(f));  print("Bounds: ");  printRect(f);  println("flags: 0x%04x", flags=readUInt16(f));  if(flags & TEXTFIELD_HASLENGTH)    println("Has Length");  if(flags & TEXTFIELD_NOEDIT)    println("Disable Editing");  if(flags & TEXTFIELD_PASSWORD)    println("Password Field");  if(flags & TEXTFIELD_MULTILINE)    println("Multiline");  if(flags & TEXTFIELD_WORDWRAP)    println("Word Wrap");  if(flags & TEXTFIELD_DRAWBOX)    println("Draw Bounding Box");  if(flags & TEXTFIELD_NOSELECT)    println("No Select");  println("Font id: %i", readUInt16(f));  println("Font height: %i", readUInt16(f));  print("Color: ");  printRGBA(f);  putchar('\n');  if(flags & TEXTFIELD_HASLENGTH)    println("Length (max chars): %i", readUInt16(f));  print("Alignment: ");  switch(num = readUInt8(f))  {    case TEXTFIELD_JUSTIFY_LEFT:    print("left\n");    break;    case TEXTFIELD_JUSTIFY_RIGHT:   print("right\n");   break;    case TEXTFIELD_JUSTIFY_CENTER:  print("center\n");  break;    case TEXTFIELD_JUSTIFY_JUSTIFY: print("justify\n"); break;    default: println("unexpected justification: %i", num);  }  println("Left margin: %i", readUInt16(f));  println("Right margin: %i", readUInt16(f));  println("First line indentation: %i", readUInt16(f));  println("Line spacing: %i", readUInt16(f));  println("Variable Name: %s", readString(f));  if(fileOffset<end)    println("Initial Text: %s", readString(f));  putchar('\n');  if(fileOffset<end)    dumpBytes(f, end-fileOffset);}void printLibrarySymbol(FILE *f, int length){  println("mystery number: %i", readUInt16(f));  println("character id: %i", readUInt16(f));  println("name: %s", readString(f));}void printPassword(FILE *f, int length){  println("mystery number: %i", readUInt16(f));  println("encrypted password: %s", readString(f));}void skipBytes(FILE *f, int length){  ++gIndent;  println("<%i bytes skipped>", length);  --gIndent;  for(; length>0; --length)    readUInt8(f);}int main(int argc, char *argv[]){  FILE *f;  int size, version, block, type, length;  if(argc > 1)  {    if(!(f = fopen(argv[1],"rb")))      error("Sorry, can't seem to read that file.\n");  }  else    f = stdin;  while(!feof(f))  {    if(fgetc(f)=='F' && fgetc(f)=='W' && fgetc(f)=='S')      break;  }  if(feof(f))    error("Doesn't look like a swf file to me..\n");  fileOffset = 3;  version = readUInt8(f);  size = readUInt32(f);  println("File size: %i", size);  print("Frame size: ");  printRect(f);  putchar('\n');  println("Frame rate: %f / sec.", readUInt8(f)/256.0+readUInt8(f));  println("Total frames: %i", readUInt16(f));  putchar('\n');  for(;;)  {    println("Offset: %i (0x%06x)", fileOffset, fileOffset);    block = readUInt16(f);    type = block>>6;    println("Block type: %i (%s)", type, blockName(type));    length = block & ((1<<6)-1);    if(length == 63) /* it's a long block. */      length = readUInt32(f);    println("Block length: %i", length);    putchar('\n');    if(type == 0 || fileOffset >= size || length < 0)      break;    ++gIndent;    switch(type)    {      case DEFINESPRITE:        printSprite(f, length);         break;      case DEFINESHAPE3:      case DEFINESHAPE2:      case DEFINESHAPE:         printShape(f, length, type);	break;      case PLACEOBJECT:		printPlaceObject(f, length);	break;      case PLACEOBJECT2:	printPlaceObject2(f, length);	break;      case REMOVEOBJECT:	printRemoveObject(f);		break;      case REMOVEOBJECT2:	printRemoveObject2(f);		break;      case SETBACKGROUNDCOLOR:	printSetBackgroundColor(f);	break;      case FRAMELABEL:		printFrameLabel(f);		break;      case DEFINEMORPHSHAPE:	printMorphShape(f, length);	break;       case DEFINEFONT:		printDefineFont(f, length);	break;      case DEFINEFONT2:		printDefineFont2(f, length);	break;      case DEFINEFONTINFO:	printFontInfo(f, length);	break;      case DEFINETEXT:		printDefineText(f, length, 1);	break;      case DEFINETEXT2:		printDefineText(f, length, 2);	break;      case DOACTION:		decompileAction(f, length, 0);	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 DEFINEBUTTON:        printDefineButton(f, length);   break;      case DEFINEBUTTON2:       printDefineButton2(f, length);  break;      case JPEGTABLES:          printJpegStream(f, length);     break;      case DEFINEBITS:      case DEFINEBITSJPEG2:     printDefineBitsJpeg(f,length);  break;      case DEFINEBITSJPEG3:     printDefineBitsJpeg3(f,length); break;      case DEFINELOSSLESS:      case DEFINELOSSLESS2:	printDefineBitsLossless(f,length); break;      case TEXTFIELD:		printTextField(f, length);	break;      case LIBRARYSYMBOL:	printLibrarySymbol(f, length);	break;      case PASSWORD:		printPassword(f, length);	break;      default:                  dumpBytes(f, length);	        break;    }    --gIndent;    putchar('\n');  }  dumpBytes(f, size-fileOffset);  return 0;}

⌨️ 快捷键说明

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