X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=50e5a032f3c615410f13ec59bdf9ded1a0ce6521;hb=3ffd81060e9f8911291f34d458b20d52f2b4fd52;hp=5189e72aaffc054e5dead31026f50b7dd711efd1;hpb=377c53be1d1532eb887a5f619c900cc222462366;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index 5189e72..50e5a03 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -231,6 +231,7 @@ typedef struct _outline { typedef struct _gradient { GRADIENT gradient; char radial; + int rotate; } gradient_t; static void character_init(character_t*c) @@ -735,10 +736,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); @@ -760,7 +773,7 @@ void s_box(char*name, int width, int height, RGBA color, int linewidth, char*tex r2.ymin = 0; r2.xmax = width; r2.ymax = height; - tag = swf_InsertTag(tag, ST_DEFINESHAPE); + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); swf_ShapeNew(&s); ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); @@ -798,7 +811,7 @@ void s_filled(char*name, char*outlinename, RGBA color, int linewidth, char*textu } r2 = outline->bbox; - tag = swf_InsertTag(tag, ST_DEFINESHAPE); + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); swf_ShapeNew(&s); ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); if(texture) @@ -830,7 +843,7 @@ void s_circle(char*name, int r, RGBA color, int linewidth, char*texture) r2.xmax = 2*r; r2.ymax = 2*r; - tag = swf_InsertTag(tag, ST_DEFINESHAPE); + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); swf_ShapeNew(&s); ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); if(texture) @@ -911,6 +924,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 +1155,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); @@ -1231,7 +1260,7 @@ void s_includeswf(char*name, char*filename) TAG* s; int level = 0; U16 cutout[] = {ST_SETBACKGROUNDCOLOR, ST_PROTECT, ST_FREEALL, ST_REFLEX}; - f = open(filename,O_RDONLY); + f = open(filename,O_RDONLY|O_BINARY); if (f<0) { warning("Couldn't open file \"%s\": %s", filename, strerror(errno)); s_box(name, 0, 0, black, 20, 0); @@ -1829,12 +1858,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 +2305,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 +2536,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"},