📄 swf2txt.c
字号:
/* * Copyright (c) 2002, Bob Doan * *---------------------------------------------------------------------- * This file is part of tubesock - the GTK/GNOME swf player. * * tubesock is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * tubesock is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with tubesock; if not, write to the Free Software * Foundation, Inc.: * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *---------------------------------------------------------------------- */#include <stdio.h>#include <stdlib.h>#include <swf.h>static void swf_print_rect(char *prefix, struct swf_type_rect *r) { printf("%sSWF_TYPE_RECT: minX = %d minY = %d maxX = %d maxY = %d\n", prefix, r->min_x, r->min_y, r->max_x, r->max_y);}static void swf_print_matrix(char *prefix, struct swf_type_matrix *m){ if(m->hasScale) { printf("%sMatrix Scale X= %d Y= %d\n", prefix, m->scaleX, m->scaleY); } if(m->hasRotate) { printf("%sRotate Skew 0= %d 1= %d\n", prefix, m->rotateSkew0, m->rotateSkew1); } printf("%sTranslate X= %d Y= %d\n", prefix, m->translateX, m->translateY);} static void swf_print_cxform(char *prefix, struct swf_type_cxform *f ){ if(f->hasAddTerms){ printf("%sAdd Term red =%d, green =%d, blue =%d", prefix, f->redAddTerm, f->greenAddTerm, f->blueAddTerm);} if(f->hasMultTerms){ printf("%sMultiply Term red =%d, green =%d, blue =%d", prefix, f->redMultTerm, f->greenMultTerm, f->redMultTerm);}}static void swf_print_rgb(char *prefix, struct swf_type_rgb *rgb) { printf("%sRGB: red:%0x green:%02x blue:%02x\n", prefix, rgb->r,rgb->g,rgb->b);}static void swf_print_rgba(char *prefix, struct swf_type_rgba *rgba) { printf("%sRGBA: red:%0x green:%02x blue:%02x alpha:%02x\n", prefix, rgba->r,rgba->g,rgba->b, rgba->a);}static void swf_print_shaperec_changes(char *prefix, struct swf_type_shape *shape, struct swf_element *e) { if(e->type == SWF_TYPE_SHAPEREC_MOVETO) { struct swf_type_shaperec_change_moveto *d = e->data; shape->x = d->x; shape->y = d->y; printf("%sMoveTo: %d %d\n", prefix, shape->x, shape->y); } if(e->type == SWF_TYPE_SHAPEREC_FILL0) { struct swf_type_shaperec_change_fill0 *d = e->data; printf("%sFill0: %d\n", prefix, d->fillStyle0); } if(e->type == SWF_TYPE_SHAPEREC_FILL1) { struct swf_type_shaperec_change_fill1 *d = e->data; printf("%sFill1: %d\n", prefix, d->fillStyle1); } if(e->type == SWF_TYPE_SHAPEREC_LINE) { struct swf_type_shaperec_change_line *d = e->data; printf("%sLineStyle: %d\n", prefix, d->lineStyle); } if(e->type == SWF_TYPE_SHAPEREC_LINETO) { struct swf_type_shaperec_change_lineto *d = e->data; shape->x += d->x; shape->y += d->y; printf("%sLineTo: %d %d\n", prefix, shape->x, shape->y); } if(e->type == SWF_TYPE_SHAPEREC_VLINETO) { struct swf_type_shaperec_change_vlineto *d = e->data; shape->y += d->y; printf("%sVLineTo: %d\n", prefix, shape->y); } if(e->type == SWF_TYPE_SHAPEREC_HLINETO) { struct swf_type_shaperec_change_hlineto *d = e->data; shape->x += d->x; printf("%sHLineTo: %d\n", prefix, shape->x); } if(e->type == SWF_TYPE_SHAPEREC_CURVETO) { struct swf_type_shaperec_change_curveto *d = e->data; printf("%sCurveTo: %d %d %d %d\n", prefix, d->deltaX, d->deltaY, d->deltaX2, d->deltaY2); } }static void swf_print_shaperec(char *prefix, struct swf_type_shape *shape, struct swf_type_shaperec *sr) { struct swf_element *c; char buf[MAXSTRLEN]; sprintf(buf, " %s", prefix); printf("%sSHAPERECORD Type:%d\n", prefix, sr->type); c = sr->changes; while(c != NULL) { swf_print_shaperec_changes(buf, shape, c); c = c->next; }}static void swf_print_shape(char *prefix, struct swf_type_shape *shape) { struct swf_element *sr; char buf[MAXSTRLEN]; sprintf(buf, " %s", prefix); printf("%sSHAPE numFillBits:%d, numLineBits:%d\n", prefix, shape->numFillBits, shape->numLineBits); sr = shape->shaperecs; while(sr != NULL) { swf_print_shaperec(buf, shape, sr->data); sr = sr->next; }}static void swf_print_fillstylearray(char *prefix, struct swf_type_fillstylearray *fsa) { printf("%sFILLSTYLEARRAY numRecs = %d\n", prefix, fsa->recs); if(fsa->recs > 0) { printf("TODO: Write code to print fillstyle info!!!"); /*short recs; struct swf_element *fillstyle*/ }}static void swf_print_linestyle(char *prefix, struct swf_type_linestyle *ls) { gint8 buf[MAXSTRLEN]; sprintf(buf, " %s", prefix); printf("%sLINESTYLE width=%d\n",prefix, SWF_TO_PIXEL(ls->width)); if(ls->rgba) swf_print_rgba(buf, ls->color); else swf_print_rgb(buf, ls->color);}static void swf_print_linestylearray(char *prefix, struct swf_type_linestylearray *lsa) { struct swf_element *e; gint8 buf[MAXSTRLEN]; sprintf(buf, " %s", prefix); printf("%sLINESTYLEARRAY numRecs = %d\n", prefix, lsa->recs); for(e = lsa->linestyle; e != NULL; e = e->next) { swf_print_linestyle(buf, (struct swf_type_linestyle *)e->data); }}static void swf_print_shapewithstyle(char *prefix, struct swf_type_shapewithstyle *sws) { swf_print_fillstylearray(prefix, &sws->fsa); swf_print_linestylearray(prefix, &sws->lsa); swf_print_shape(prefix, &sws->shape);}static void swf_print_defineshape3(char *prefix, struct swf_type_defineshape3 *ds) { printf("DEFINESHAPE3 shapeid=%d\n", ds->shapeid); swf_print_rect(prefix, &ds->shapeBounds); swf_print_shapewithstyle(prefix, &ds->info);}void swf_print_elements(struct swf_file *swf) { struct swf_element *e; e = swf->elements; while(e != NULL) { printf("-> "); if(e->type == SWF_TYPE_PLACEOBJECT2){ struct swf_type_placeobject2 *po = e->data; printf("PLACEOBJECT2: flags:%d place flag move:%d depth:%d\n", po->flags, po->flags & SWF_TYPE_PLACEOBJECT2_HASMOVE, po->depth); if(po-> flags & SWF_TYPE_PLACEOBJECT2_HASCHARACTER){ printf(" -> Has Character: %d\n", po->characterid); } if(po-> flags & SWF_TYPE_PLACEOBJECT2_HASMATRIX){ swf_print_matrix(" ->", po->matrix); } if(po-> flags & SWF_TYPE_PLACEOBJECT2_HASCOLORTRANSFORM){ swf_print_cxform(" ->", po->cxform); } if(po->flags & SWF_TYPE_PLACEOBJECT2_HASRATIO){ printf(" -> Has Ratio: %d\n", po->ratio); } if(po->flags & SWF_TYPE_PLACEOBJECT2_HASNAME){ printf(" -> Has Name: %s\n", po->name); } } if(e->type == SWF_TYPE_BGCOLOR) { struct swf_type_bgcolor *bgcolor = e->data; struct swf_type_rgb *rgb = &bgcolor->rgb; printf("Set Background Color\n"); swf_print_rgb(" -> ", rgb); } if(e->type == SWF_TYPE_SOUNDSTREAMHEAD2) { struct swf_type_soundstreamhead2 *ss = e->data; printf("SoundStreamHead2: mixFormat:%d compression:%d size=%d type=%d sampleCount=%d\n", ss->mixFormat, ss->compression, ss->size, ss->type, ss->sampleCount); } if(e->type == SWF_TYPE_SHOWFRAME) { struct swf_type_frameheader *f = e->data; printf("Show Frame %d\n", f->number); } if(e->type == SWF_TYPE_REMOVEOBJECT2) { struct swf_type_removeobject2 *ro = e->data; printf("Remove Object 2 %d\n", ro->depthOfChar); } if(e->type == SWF_TYPE_END) { printf("END OF MOVIE\n"); } if(e->type == SWF_TYPE_DEFINESHAPE3) { struct swf_type_defineshape3 *ds = e->data; swf_print_defineshape3(" -> ", ds); } if(e->type == SWF_TYPE_DEFINESHAPE) { printf("I'm too lazy to implement defineshape right now (bob) THE PARSE CODE IS DONE HOWEVER!!..\n"); } if(e->type == SWF_TYPE_DOACTION) { printf("I'm too lazy to implement DOACTION right now (bob) THE PARSE CODE IS DONE HOWEVER!!..\n"); } if(e->type == SWF_TYPE_DEFINETEXT) { printf("I'm too lazy to implement SWF_TYPE_DEFINETEXT right now (bob) THE PARSE CODE IS DONE HOWEVER!!..\n"); } if(e->type == SWF_TYPE_DEFINEFONT) { struct swf_type_definefont *f = e->data; struct swf_element *s; printf("Define Font, Font Id = %d, Num Glyphs = %d\n", f->fontid, f->nglyphs); s = f->shapes; while(s != NULL) { swf_print_shape(" -> ", s->data); s = s->next; } } if(e->type == SWF_TYPE_DEFINEFONTINFO) { struct swf_type_definefontinfo *f = e->data; struct swf_type_definefont *df = swf_element_seekDefineFont(swf, f->fontid); gint32 i=0; printf("Define Font Info id = %d name=%s crap=[%d %d %d %d %d]\n -> ", f->fontid, f->fontname, f->fontFlagsUnicode, f->fontFlagsShiftJIS, f->fontFlagsANSI, f->fontFlagsItalic, f->fontFlagsBold); for(i=0;i<df->nglyphs;i++) { printf("[%d] %c ", f->codeTable[i], f->codeTable[i]); } printf("\n"); } e = e->next; }}void swf_print_header(struct swf_file *swf) { printf("\nHeader Record:\n"); printf("\t%c%c%c\n", swf->header.s, swf->header.w, swf->header.f); printf("\tVersion: %d File Length: %d\n", swf->header.version, swf->header.filelength); printf("\tFrame Size %d %d %d %d\n", SWF_TO_PIXEL(swf->header.framesize.min_x), SWF_TO_PIXEL(swf->header.framesize.max_x), SWF_TO_PIXEL(swf->header.framesize.min_y), SWF_TO_PIXEL(swf->header.framesize.max_y)); printf("\tFrame Rate: %d Frame Count %d\n", swf->header.framerate, swf->header.framecount); printf("\tProtected: %s\n", swf->canedit ? "No" : "Yes");}gint32 main(gint32 argc, gchar **argv) { struct swf_file *swf; if(argc != 2) { printf("Syntax: %s filename\n", argv[0]); return 1; } swf = swf_new(argv[1]); if(swf == NULL) { printf("Couldn't allocate memory or open file... laterz\n"); return 1; } swf_read(swf); swf_print_header(swf); swf_print_elements(swf); swf_free(swf); printf("DONE\n"); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -