X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=fe84f14b2b462827886143da9d099931b74c9561;hb=963e5aae7c2083cbf3eedc799a91f15b3da1f881;hp=c0e8ec153478d297d138ff0cd555366739939158;hpb=73168a7f7ca3a242980071be43b5454456374aae;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index c0e8ec1..fe84f14 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -28,6 +28,7 @@ static char * filename = 0; static char * outputname = "output.swf"; static int verbose = 2; +static int override_outputname = 0; static struct options_t options[] = { @@ -45,6 +46,7 @@ int args_callback_option(char*name,char*val) } else if(!strcmp(name, "o")) { outputname = val; + override_outputname = 1; return 1; } else if(!strcmp(name, "v")) { @@ -181,6 +183,7 @@ typedef struct _parameters { float scalex, scaley; CXFORM cxform; float rotate; + float shear; SPOINT pivot; SPOINT pin; } parameters_t; @@ -262,12 +265,13 @@ static instance_t* s_addinstance(char*name, character_t*c, U16 depth) return i; } -static void parameters_set(parameters_t*p, int x,int y, float scalex, float scaley, float rotate, SPOINT pivot, SPOINT pin, CXFORM cxform) +static void parameters_set(parameters_t*p, int x,int y, float scalex, float scaley, float rotate, float shear, SPOINT pivot, SPOINT pin, CXFORM cxform) { p->x = x; p->y = y; p->scalex = scalex; p->scaley = scaley; p->pin = pin; p->pivot = pivot; p->rotate = rotate; p->cxform = cxform; + p->shear = shear; } static void parameters_clear(parameters_t*p) @@ -277,16 +281,29 @@ static void parameters_clear(parameters_t*p) p->pin.x = 1; p->pin.y = 0; p->pivot.x = 0; p->pivot.y = 0; p->rotate = 0; + p->shear = 0; swf_GetCXForm(0, &p->cxform, 1); } static void makeMatrix(MATRIX*m, parameters_t*p) { SPOINT h; - m->sx = p->scalex*cos(p->rotate/360*2*3.14159265358979)*65535; - m->r1 = -p->scalex*sin(p->rotate/360*2*3.14159265358979)*65535; - m->r0 = p->scaley*sin(p->rotate/360*2*3.14159265358979)*65535; - m->sy = p->scaley*cos(p->rotate/360*2*3.14159265358979)*65535; + float sx,r1,r0,sy; + + /* /sx r1\ /x\ + * \r0 sy/ \y/ + */ + + sx = p->scalex*cos(p->rotate/360*2*3.14159265358979); + r1 = -p->scalex*sin(p->rotate/360*2*3.14159265358979)+sx*p->shear; + r0 = p->scaley*sin(p->rotate/360*2*3.14159265358979); + sy = p->scaley*cos(p->rotate/360*2*3.14159265358979)+r0*p->shear; + + m->sx = (int)(sx*65536+0.5); + m->r1 = (int)(r1*65536+0.5); + m->r0 = (int)(r0*65536+0.5); + m->sy = (int)(sy*65536+0.5); + m->tx = m->ty = 0; h = swf_TurnPoint(p->pin, m); @@ -807,6 +824,7 @@ parameters_t s_interpolate(parameters_t*p1, parameters_t*p2, int pos, int num) p.scalex = (p2->scalex-p1->scalex)*ratio + p1->scalex; p.scaley = (p2->scaley-p1->scaley)*ratio + p1->scaley; p.rotate = (p2->rotate-p1->rotate)*ratio + p1->rotate; + p.shear = (p2->shear-p1->shear)*ratio + p1->shear; p.cxform.r0 = ((float)p2->cxform.r0-(float)p1->cxform.r0)*ratio + p1->cxform.r0; p.cxform.g0 = ((float)p2->cxform.g0-(float)p1->cxform.g0)*ratio + p1->cxform.g0; @@ -838,7 +856,7 @@ void s_change(char*instance, parameters_t p2) p1 = i->parameters; allframes = currentframe - i->lastFrame - 1; - if(!allframes) { + if(allframes < 0) { warning(".change ignored. can only .put/.change an object once per frame."); return; } @@ -1024,10 +1042,23 @@ int parseColor2(char*str, RGBA*color) int l = strlen(str); int r,g,b,a; int t; - char*names[8] = {"black", "blue", "green", "cyan", - "red", "violet", "yellow", "white"}; - a=255; - r=g=b=0; + + struct {unsigned char r,g,b;char*name;} colors[] = + {{255,250,250,"snow"},{220,220,220,"gainsboro"},{250,240,230,"linen"},{255,228,196,"bisque"}, + {255,228,181,"moccasin"},{255,248,220,"cornsilk"},{255,255,240,"ivory"},{255,245,238,"seashell"}, + {240,255,240,"honeydew"},{240,255,255,"azure"},{230,230,250,"lavender"},{255,255,255,"white"}, + {0,0,0,"black"},{190,190,190,"gray"},{190,190,190,"grey"},{0,0,128,"navy"},{0,0,255,"blue"}, + {64,224,208,"turquoise"},{0,255,255,"cyan"},{127,255,212,"aquamarine"}, {0,255,0,"green"}, + {127,255,0,"chartreuse"},{240,230,140,"khaki"},{255,255,0,"yellow"}, + {255,215,0,"gold"},{218,165,32,"goldenrod"},{160,82,45,"sienna"},{205,133,63,"peru"}, + {222,184,135,"burlywood"},{245,245,220,"beige"},{245,222,179,"wheat"},{210,180,140,"tan"}, + {210,105,30,"chocolate"},{178,34,34,"firebrick"},{165,42,42,"brown"},{250,128,114,"salmon"}, + {255,165,0,"orange"},{255,127,80,"coral"},{255,99,71,"tomato"},{255,0,0,"red"}, + {255,192,203,"pink"},{176,48,96,"maroon"},{255,0,255,"magenta"},{238,130,238,"violet"}, + {221,160,221,"plum"},{218,112,214,"orchid"},{160,32,240,"purple"},{216,191,216,"thistle"}}; + + a=255;r=g=b=0; + if(str[0]=='#' && (l==7 || l==9)) { if(l == 7 && !(sscanf(str, "#%02x%02x%02x", &r, &g, &b))) return 0; @@ -1036,14 +1067,12 @@ int parseColor2(char*str, RGBA*color) color->r = r; color->g = g; color->b = b; color->a = a; return 1; } - for(t=0;t<8;t++) - if(!strcmp(str, names[t])) { - if(t&1) - b = 255; - if(t&2) - g = 255; - if(t&4) - r = 255; + for(t=0;tr = r; color->g = g; color->b = b; color->a = a; return 1; } @@ -1152,7 +1181,7 @@ static int c_swf(map_t*args) int version = parseInt(lu(args, "version")); int fps = (int)(parseFloat(lu(args, "fps"))*256); int compress = 0; - if(!strcmp(name, "!default!")) + if(!strcmp(name, "!default!") || override_outputname) name = outputname; if(!strcmp(compressstr, "default")) @@ -1195,7 +1224,7 @@ int points_initialized = 0; SPOINT getPoint(SRECT r, char*name) { - int l; + int l=0; if(!strcmp(name, "center")) { SPOINT p; p.x = (r.xmin + r.xmax)/2; @@ -1203,9 +1232,10 @@ SPOINT getPoint(SRECT r, char*name) return p; } - l = (int)dictionary_lookup(&points, name); + if(points_initialized) + l = (int)dictionary_lookup(&points, name); if(l==0) { - syntaxerror("Couldn't find point \"%s\".", name); + syntaxerror("Invalid point: \"%s\".", name); } l--; return *(SPOINT*)&mpoints.buffer[l]; @@ -1239,6 +1269,7 @@ static int c_placement(map_t*args, int type) char* scalexstr = lu(args, "scalex"); char* scaleystr = lu(args, "scaley"); char* rotatestr = lu(args, "rotate"); + char* shearstr = lu(args, "shear"); char* xstr="", *pivotstr=""; char* ystr="", *anglestr=""; char*above = lu(args, "above"); /*FIXME*/ @@ -1335,6 +1366,15 @@ static int c_placement(map_t*args, int type) } } + /* shearing */ + if(shearstr[0]) { + if(isRelative(shearstr)) { + p.shear += parseFloat(getOffset(shearstr))*getSign(shearstr); + } else { + p.shear = parseFloat(shearstr); + } + } + if(pivotstr[0]) { if(isPoint(pivotstr)) p.pivot = parsePoint(pivotstr); @@ -1451,9 +1491,11 @@ static int c_frame(map_t*args) { char*framestr = lu(args, "n"); int frame; - if(framestr[0]=='+') { + if(isRelative(framestr)) { frame = s_getframe(); - frame += parseInt(framestr+1); + if(getSign(framestr)<0) + syntaxerror("relative frame expressions must be positive"); + frame += parseInt(getOffset(framestr)); } else { frame = parseInt(framestr); @@ -1573,7 +1615,7 @@ static struct { char*arguments; } arguments[] = {{"swf", c_swf, "bbox=autocrop version=5 fps=50 name=!default! @compress=default"}, - {"frame", c_frame, "n=+1"}, + {"frame", c_frame, "n=1"}, // "import" type stuff {"shape", c_shape, "name filename"}, @@ -1601,16 +1643,16 @@ static struct { {"stop", c_stop, "sound"}, // object placement tags - {"put", c_put, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= rotate= above= below="}, - {"startclip", c_startclip, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= rotate= above= below="}, - {"change", c_change, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= rotate= above= below="}, - {"arcchange", c_arcchange, "name pivot= angle= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= rotate= above= below="}, - {"qchange", c_qchange, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= rotate= above= below="}, - {"jump", c_jump, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= rotate= above= below="}, + {"put", c_put, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= shear= rotate= above= below="}, + {"startclip", c_startclip, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= shear= rotate= above= below="}, + {"change", c_change, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= shear= rotate= above= below="}, + {"arcchange", c_arcchange, "name pivot= angle= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= shear= rotate= above= below="}, + {"qchange", c_qchange, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= shear= rotate= above= below="}, + {"jump", c_jump, "name x= y= red= green= blue= alpha= luminance= scale= scalex= scaley= pivot= pin= shear= rotate= above= below="}, {"del", c_del, "name"}, // virtual object placement - {"buttonput", c_buttonput, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex=100% scaley=100% rotate=0 above= below="}, - {"texture", c_texture, " x=0 y=0 scale= scalex=100% scaley=100% rotate=0"}, + {"buttonput", c_buttonput, " x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex=100% scaley=100% shear=0 rotate=0 above= below="}, + {"texture", c_texture, " x=0 y=0 scale= scalex=100% scaley=100% shear=0 rotate=0"}, {"point", c_point, "name x=0 y=0"}, // commands which start a block