X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=sidebyside;f=src%2Fswfc.c;h=f6157c55544a754c8eca73eacd4849c65e5353ee;hb=92013ccec1cef810347d61538e376d53d4a444f3;hp=5a9c86eb23d12f7922582727c82293797dee19a1;hpb=aa532afae8561b330a17beec859dcf7024300793;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index 5a9c86e..f6157c5 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) @@ -641,7 +642,7 @@ static void s_endSWF() tag = swf_InsertTag(tag, ST_END); swf_OptimizeTagOrder(swf); - + if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { swf->movieSize = currentrect; /* "autocrop" */ } @@ -704,6 +705,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 +740,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 +777,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 +815,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 +847,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 +928,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 +1159,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 +1264,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 +1862,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 +2309,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"); @@ -2437,7 +2479,7 @@ static int c_edittext(map_t*args) //"name font size width height text="" color=black maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=0"}, char*name = lu(args, "name"); char*font = lu(args, "font"); - int size = (int)(100*20*parsePercent(lu(args, "size"))); + int size = (int)(1024*parsePercent(lu(args, "size"))); int width = parseTwip(lu(args, "width")); int height = parseTwip(lu(args, "height")); char*text = lu(args, "text"); @@ -2498,11 +2540,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"},