X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=62470751a42daa5ed17d3c2bc77ffcf893c5bcbb;hb=077c474d859547ebe1cdc40c4efeeae3e779ea93;hp=cb7aaff3bf692e78972a8b1627ca3bf51d89dc13;hpb=fe997bf80a882818506b54da45d2bb6f85098e06;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index cb7aaff..6247075 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -40,6 +40,7 @@ static char * filename = 0; static char * outputname = "output.swf"; static int verbose = 2; +static int optimize = 0; static int override_outputname = 0; static struct options_t options[] = { @@ -47,6 +48,7 @@ static struct options_t options[] = { {"V", "version"}, {"v", "verbose"}, {"o", "output"}, +{"O", "optimize"}, {0,0} }; @@ -61,6 +63,10 @@ int args_callback_option(char*name,char*val) override_outputname = 1; return 1; } + else if(!strcmp(name, "O")) { + optimize = 1; + return 0; + } else if(!strcmp(name, "v")) { verbose ++; return 0; @@ -231,6 +237,7 @@ typedef struct _outline { typedef struct _gradient { GRADIENT gradient; char radial; + int rotate; } gradient_t; static void character_init(character_t*c) @@ -641,7 +648,11 @@ static void s_endSWF() tag = swf_InsertTag(tag, ST_END); swf_OptimizeTagOrder(swf); - + + if(optimize) { + swf_Optimize(swf); + } + if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { swf->movieSize = currentrect; /* "autocrop" */ } @@ -704,6 +715,10 @@ void s_frame(int nr, int cut, char*name) swf_SetString(tag, name); } } + if(nr == 0 && currentframe == 0 && name) { + tag = swf_InsertTag(tag, ST_FRAMELABEL); + swf_SetString(tag, name); + } if(cut) { if(now == tag) { @@ -735,10 +750,22 @@ int addFillStyle(SHAPE*s, SRECT*r, char*texture) return swf_ShapeAddBitmapFillStyle(s, &m, image->id, 0); } /*else if ((texture = dictionary_lookup(&textures, texture))) { } */ else if ((gradient = dictionary_lookup(&gradients, texture))) { - MATRIX m; + SRECT r2; + MATRIX rot,m; + double ccos,csin; + swf_GetMatrix(0, &rot); + ccos = cos(-gradient->rotate*2*3.14159265358979/360); + csin = sin(-gradient->rotate*2*3.14159265358979/360); + rot.sx = ccos*65536; + rot.r1 = -csin*65536; + rot.r0 = csin*65536; + rot.sy = ccos*65536; + r2 = swf_TurnRect(*r, &rot); swf_GetMatrix(0, &m); - m.sx = (r->xmax - r->xmin)*2; - m.sy = (r->ymax - r->ymin)*2; + m.sx = (r2.xmax - r2.xmin)*2*ccos; + m.r1 = -(r2.xmax - r2.xmin)*2*csin; + m.r0 = (r2.ymax - r2.ymin)*2*csin; + m.sy = (r2.ymax - r2.ymin)*2*ccos; m.tx = r->xmin + (r->xmax - r->xmin)/2; m.ty = r->ymin + (r->ymax - r->ymin)/2; return swf_ShapeAddGradientFillStyle(s, &m, &gradient->gradient, gradient->radial); @@ -911,6 +938,21 @@ void s_text(char*name, char*fontname, char*text, int size, RGBA color) incrementid(); } +void s_quicktime(char*name, char*url) +{ + SRECT r; + MATRIX _m,*m=0; + + memset(&r, 0, sizeof(r)); + + tag = swf_InsertTag(tag, ST_DEFINEMOVIE); + swf_SetU16(tag, id); + swf_SetString(tag, url); + + s_addcharacter(name, id, tag, r); + incrementid(); +} + void s_edittext(char*name, char*fontname, int size, int width, int height, char*text, RGBA*color, int maxlength, char*variable, int flags) { SWFFONT*font; @@ -1127,13 +1169,14 @@ GRADIENT parseGradient(const char*str) return gradient; } -void s_gradient(char*name, const char*text, int radial) +void s_gradient(char*name, const char*text, int radial, int rotate) { gradient_t* gradient; gradient = malloc(sizeof(gradient_t)); memset(gradient, 0, sizeof(gradient_t)); gradient->gradient = parseGradient(text); gradient->radial = radial; + gradient->rotate = rotate; if(dictionary_lookup(&gradients, name)) syntaxerror("gradient %s defined twice", name); @@ -1829,12 +1872,13 @@ static int c_gradient(map_t*args) { char*name = lu(args, "name"); int radial= strcmp(lu(args, "radial"), "radial")?0:1; + int rotate = parseInt(lu(args, "rotate")); readToken(); if(type != RAWDATA) syntaxerror("colon (:) expected"); - s_gradient(name, text, radial); + s_gradient(name, text, radial,rotate); return 0; } static int c_point(map_t*args) @@ -2275,6 +2319,14 @@ static int c_soundtrack(map_t*args) return 0; } +static int c_quicktime(map_t*args) +{ + char*name = lu(args, "name"); + char*url = lu(args, "url"); + s_quicktime(name, url); + return 0; +} + static int c_image(map_t*args) { char*command = lu(args, "commandname"); @@ -2498,11 +2550,12 @@ static struct { {"sound", c_sound, "name filename"}, {"font", c_font, "name filename"}, {"soundtrack", c_soundtrack, "filename"}, + {"quicktime", c_quicktime, "url"}, // generators of primitives {"point", c_point, "name x=0 y=0"}, - {"gradient", c_gradient, "name @radial=0"}, + {"gradient", c_gradient, "name @radial=0 rotate=0"}, {"outline", c_outline, "name format=simple"}, {"textshape", c_textshape, "name font size=100% text"},