X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=15b2425a710187cfd15e1791623760a396f86fed;hb=b8a45d1939cbe39f547b1be17880bf9da6eb43f7;hp=9e004fea3e6408c02641647fd36cec703aec662c;hpb=6d0a7c06e00c5706ae3fe7220d704b419efc9ff5;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index 9e004fe..15b2425 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -389,7 +389,7 @@ void s_swf(char*name, SRECT r, int version, int fps, int compress, RGBA backgrou swf->firstTag = tag = swf_InsertTag(0, ST_SETBACKGROUNDCOLOR); swf->compressed = compress; swf_SetRGB(tag,&background); - + if(stackpos==sizeof(stack)/sizeof(stack[0])) syntaxerror("too many levels of recursion"); @@ -618,6 +618,7 @@ static void s_endSprite() currentdepth = stack[stackpos].olddepth; instances = stack[stackpos].oldinstances; + tag = swf_InsertTag(tag, ST_SHOWFRAME); tag = swf_InsertTag(tag, ST_END); tag = stack[stackpos].tag; @@ -639,11 +640,14 @@ static void s_endSWF() tag = removeFromTo(stack[stackpos].cut, tag); stackpos--; - + swf = stack[stackpos].swf; filename = stack[stackpos].filename; - + + //if(tag->prev && tag->prev->id != ST_SHOWFRAME) + // tag = swf_InsertTag(tag, ST_SHOWFRAME); tag = swf_InsertTag(tag, ST_SHOWFRAME); + tag = swf_InsertTag(tag, ST_END); swf_OptimizeTagOrder(swf); @@ -659,8 +663,9 @@ static void s_endSWF() if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { swf->movieSize.xmax += 20; /* 1 by 1 pixels */ swf->movieSize.ymax += 20; + warning("Empty bounding box for movie"); } - + fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644); if(fi<0) { syntaxerror("couldn't create output file %s", filename); @@ -785,15 +790,15 @@ void s_box(char*name, int width, int height, RGBA color, int linewidth, char*tex { SRECT r,r2; SHAPE* s; - int ls1,fs1=0; + int ls1=0,fs1=0; r2.xmin = 0; r2.ymin = 0; r2.xmax = width; r2.ymax = height; tag = swf_InsertTag(tag, ST_DEFINESHAPE3); swf_ShapeNew(&s); - ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); - + if(linewidth) + ls1 = swf_ShapeAddLineStyle(s,linewidth>=20?linewidth-20:0,&color); if(texture) fs1 = addFillStyle(s, &r2, texture); @@ -830,11 +835,11 @@ void s_filled(char*name, char*outlinename, RGBA color, int linewidth, char*textu tag = swf_InsertTag(tag, ST_DEFINESHAPE3); swf_ShapeNew(&s); - ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); + if(linewidth) + ls1 = swf_ShapeAddLineStyle(s,linewidth>=20?linewidth-20:0,&color); if(texture) fs1 = addFillStyle(s, &r2, texture); - else - syntaxerror("non filled outlines not yet supported- please supply a fill= argument"); + swf_SetU16(tag,id); rect.xmin = r2.xmin-linewidth-linewidth/2; rect.ymin = r2.ymin-linewidth-linewidth/2; @@ -843,8 +848,11 @@ void s_filled(char*name, char*outlinename, RGBA color, int linewidth, char*textu swf_SetRect(tag,&rect); swf_SetShapeStyles(tag, s); - swf_SetShapeBits(tag, outline->shape); //does not count bits! - swf_SetBlock(tag, outline->shape->data, (outline->shape->bitlen+7)/8); + swf_ShapeCountBits(s,0,0); + swf_RecodeShapeData(outline->shape->data, outline->shape->bitlen, 1, 1, + &s->data, &s->bitlen, s->bits.fill, s->bits.line); + swf_SetShapeBits(tag, s); + swf_SetBlock(tag, s->data, (s->bitlen+7)/8); swf_ShapeFree(s); s_addcharacter(name, id, tag, rect); @@ -855,14 +863,15 @@ void s_circle(char*name, int r, RGBA color, int linewidth, char*texture) { SRECT rect,r2; SHAPE* s; - int ls1,fs1=0; + int ls1=0,fs1=0; r2.xmin = r2.ymin = 0; r2.xmax = 2*r; r2.ymax = 2*r; tag = swf_InsertTag(tag, ST_DEFINESHAPE3); swf_ShapeNew(&s); - ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); + if(linewidth) + ls1 = swf_ShapeAddLineStyle(s,linewidth>=20?linewidth-20:0,&color); if(texture) fs1 = addFillStyle(s, &r2, texture); swf_SetU16(tag,id); @@ -958,13 +967,16 @@ void s_quicktime(char*name, char*url) 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; + SWFFONT*font = 0; EditTextLayout layout; SRECT r; - font = dictionary_lookup(&fonts, fontname); - if(!font) - syntaxerror("font \"%s\" not known!", fontname); + if(fontname && *fontname) { + flags |= ET_USEOUTLINES; + font = dictionary_lookup(&fonts, fontname); + if(!font) + syntaxerror("font \"%s\" not known!", fontname); + } tag = swf_InsertTag(tag, ST_DEFINEEDITTEXT); swf_SetU16(tag, id); layout.align = 0; @@ -976,7 +988,8 @@ void s_edittext(char*name, char*fontname, int size, int width, int height, char* r.ymin = 0; r.xmax = width; r.ymax = height; - swf_SetEditText(tag, flags|ET_USEOUTLINES, r, text, color, maxlength, font->id, size, &layout, variable); + + swf_SetEditText(tag, flags, r, text, color, maxlength, font?font->id:0, size, &layout, variable); s_addcharacter(name, id, tag, r); incrementid(); @@ -1093,6 +1106,7 @@ void s_sound(char*name, char*filename) sound_t* sound; U16*samples; int numsamples; + int t; if(!readWAV(filename, &wav)) { warning("Couldn't read wav file \"%s\"", filename); @@ -1103,6 +1117,12 @@ void s_sound(char*name, char*filename) samples = (U16*)wav2.data; numsamples = wav2.size/2; free(wav.data); +#ifdef WORDS_BIGENDIAN + /* swap bytes */ + for(t=0;t>8)&0xff | (samples[t]<<8)&0xff00; + } +#endif } tag = swf_InsertTag(tag, ST_DEFINESOUND); @@ -1238,14 +1258,10 @@ void s_outline(char*name, char*format, char*source) draw_string(&draw, source); draw.finish(&draw); shape = swf_ShapeDrawerToShape(&draw); - //shape2 = swf_ShapeToShape2(shape); - //bounds = swf_GetShapeBoundingBox(shape2); - //swf_Shape2Free(shape2); bounds = swf_ShapeDrawerGetBBox(&draw); draw.dealloc(&draw); - outline = (outline_t*)malloc(sizeof(outline_t)); - memset(outline, 0, sizeof(outline_t)); + outline = (outline_t*)rfx_calloc(sizeof(outline_t)); outline->shape = shape; outline->bbox = bounds; @@ -1257,10 +1273,10 @@ void s_outline(char*name, char*format, char*source) int s_playsound(char*name, int loops, int nomultiple, int stop) { sound_t* sound; + SOUNDINFO info; if(!name) return 0; sound = dictionary_lookup(&sounds, name); - SOUNDINFO info; if(!sound) return 0; @@ -1305,7 +1321,7 @@ void s_includeswf(char*name, char*filename) s = tag = swf_InsertTag(tag, ST_DEFINESPRITE); swf_SetU16(tag, id); - swf_SetU16(tag, 0); + swf_SetU16(tag, swf.frameCount); swf_Relocate(&swf, idmap); @@ -1634,8 +1650,8 @@ int parseTwip(char*str) if(*s<'0' || *s>'9') syntaxerror("Not a coordinate: \"%s\"", str); } - if(l>2 || (l==2 && (dot[1]!='0' || dot[1]!='5'))) { - warning("precision loss: %s converted to twip", str); + if(l>2 || (l==2 && (dot[1]!='0' && dot[1]!='5'))) { + warning("precision loss: %s converted to twip: %s", str, dot); dot[2] = 0; l=2; } @@ -1770,6 +1786,19 @@ MULADD mergeMulAdd(MULADD m1, MULADD m2) return r; } +float parsePxOrPercent(char*fontname, char*str) +{ + int l = strlen(str); + if(strchr(str, '%')) + return parsePercent(str); + if(l>2 && str[l-2]=='p' && str[l-1]=='t') { + float p = atof(str); + return p/64.0; /*64 = FT_SUBPIXELS- see ../lib/modules/swffont.c */ + } + syntaxerror("Expression '%s' is neither a point size (?pt) nor a percentage (?%)", str); + return 0; +} + float parsePercent(char*str) { int l = strlen(str); @@ -1811,15 +1840,27 @@ static char* lu(map_t* args, char*name) static int c_flash(map_t*args) { - char* name = lu(args, "name"); + char* filename = map_lookup(args, "filename"); char* compressstr = lu(args, "compress"); SRECT bbox = parseBox(lu(args, "bbox")); int version = parseInt(lu(args, "version")); int fps = (int)(parseFloat(lu(args, "fps"))*256); int compress = 0; RGBA color = parseColor(lu(args, "background")); - if(!strcmp(name, "!default!") || override_outputname) - name = outputname; + + if(!filename || !*filename) { + /* for compatibility */ + filename = map_lookup(args, "name"); + if(!filename || !*filename) { + filename = 0; + } else { + //msg(" line %d: .flash name=... is deprecated, use .flash filename=...", line); + msg(" line %d: .flash name=... is deprecated, use .flash filename=...", line); + } + } + + if(!filename || override_outputname) + filename = outputname; if(!strcmp(compressstr, "default")) compress = version==6; @@ -1829,7 +1870,7 @@ static int c_flash(map_t*args) compress = 0; else syntaxerror("value \"%s\" not supported for the compress argument", compressstr); - s_swf(name, bbox, version, fps, compress, color); + s_swf(filename, bbox, version, fps, compress, color); return 0; } int isRelative(char*str) @@ -2279,7 +2320,7 @@ static int c_textshape(map_t*args) char*name = lu(args, "name"); char*text = lu(args, "text"); char*font = lu(args, "font"); - float size = parsePercent(lu(args, "size")); + float size = parsePxOrPercent(font, lu(args, "size")); s_textshape(name, font, size, text); return 0; @@ -2317,7 +2358,7 @@ static int c_text(map_t*args) char*name = lu(args, "name"); char*text = lu(args, "text"); char*font = lu(args, "font"); - float size = parsePercent(lu(args, "size")); + float size = parsePxOrPercent(font, lu(args, "size")); RGBA color = parseColor(lu(args, "color")); s_text(name, font, text, (int)(size*100), color); return 0; @@ -2498,7 +2539,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)(1024*parsePercent(lu(args, "size"))); + int size = (int)(1024*parsePxOrPercent(font, lu(args, "size"))); int width = parseTwip(lu(args, "width")); int height = parseTwip(lu(args, "height")); char*text = lu(args, "text"); @@ -2533,12 +2574,29 @@ static int c_texture(map_t*args) {return 0;} static int c_action(map_t*args) { - readToken(); - if(type != RAWDATA) { - syntaxerror("colon (:) expected"); + char* filename = map_lookup(args, "filename"); + if(!filename ||!*filename) { + readToken(); + if(type != RAWDATA) { + syntaxerror("colon (:) expected"); + } + s_action(text); + } else { + FILE*fi = fopen(filename, "rb"); + int l; + char*text; + if(!fi) + syntaxerror("Couldn't find file %s: %s", filename, strerror(errno)); + fseek(fi, 0, SEEK_END); + l = ftell(fi); + fseek(fi, 0, SEEK_SET); + text = rfx_alloc(l+1); + fread(text, l, 1, fi); + text[l]=0; + fclose(fi); + + s_action(text); } - - s_action(text); return 0; } @@ -2548,7 +2606,7 @@ static struct { command_func_t* func; char*arguments; } arguments[] = -{{"flash", c_flash, "bbox=autocrop background=black version=5 fps=50 name=!default! @compress=default"}, +{{"flash", c_flash, "bbox=autocrop background=black version=6 fps=50 name= filename= @compress=default"}, {"frame", c_frame, "n=1 name= @cut=no"}, // "import" type stuff {"swf", c_swf, "name filename"}, @@ -2575,7 +2633,7 @@ static struct { {"egon", c_egon, "name vertices color=white line=1 @fill=none"}, {"text", c_text, "name text font size=100% color=white"}, - {"edittext", c_edittext, "name font size=100% width height text="" color=white maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=0 @border=0"}, + {"edittext", c_edittext, "name font= size=100% width height text="" color=white maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=0 @border=0"}, {"morphshape", c_morphshape, "name start end"}, {"button", c_button, "name"}, {"show", c_show, "name x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= shear= rotate= ratio= above= below= as="}, @@ -2605,7 +2663,7 @@ static struct { // commands which start a block //startclip (see above) {"sprite", c_sprite, "name"}, - {"action", c_action, ""}, + {"action", c_action, "filename="}, {"end", c_end, ""} }; @@ -2744,7 +2802,7 @@ static map_t parseArguments(char*command, char*pattern) } } if(pos==len) { - syntaxerror("don't know what to do with \"%s\". (All parameters for .%s already set)", text, command); + syntaxerror("Illegal argument \"%s\" to .%s", text, command); } } #if 0//def DEBUG