X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=e15f5a63d660d7d96e484dadcd1dc2d59680a963;hb=fe44431e261dde7a617fa1f01a1e68909bae6a3f;hp=b993199029931af09d2e94f17a9b5ce8cd4f6c5d;hpb=e8d1f81d0e29b2c37972a55a21e18b930b842c89;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index b993199..e15f5a6 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -320,7 +320,8 @@ static void parameters_clear(parameters_t*p) { p->x = 0; p->y = 0; p->scalex = 1.0; p->scaley = 1.0; - p->pin.x = 1; p->pin.y = 0; + p->pin.x = 0; //1?? + p->pin.y = 0; p->pivot.x = 0; p->pivot.y = 0; p->rotate = 0; p->shear = 0; @@ -347,7 +348,7 @@ static void makeMatrix(MATRIX*m, parameters_t*p) m->sy = (int)(sy*65536+0.5); m->tx = m->ty = 0; - + h = swf_TurnPoint(p->pin, m); m->tx = p->x - h.x; m->ty = p->y - h.y; @@ -497,20 +498,17 @@ void s_buttonput(char*character, char*as, parameters_t p) while(1) { if(*s==',' || *s==0) { - if(!strncmp(o,"idle",s-o)) mybutton.records[0]=r; - else if(!strncmp(o,"shape",s-o)) mybutton.records[0]=r; - else if(!strncmp(o,"hover",s-o)) mybutton.records[1]=r; - else if(!strncmp(o,"pressed",s-o)) mybutton.records[2]=r; - else if(!strncmp(o,"area",s-o)) mybutton.records[3]=r; + if(!strncmp(o,"idle",s-o)) {mybutton.records[0]=r;o=s+1;} + else if(!strncmp(o,"shape",s-o)) {mybutton.records[0]=r;o=s+1;} + else if(!strncmp(o,"hover",s-o)) {mybutton.records[1]=r;o=s+1;} + else if(!strncmp(o,"pressed",s-o)) {mybutton.records[2]=r;o=s+1;} + else if(!strncmp(o,"area",s-o)) {mybutton.records[3]=r;o=s+1;} else syntaxerror("unknown \"as\" argument: \"%s\"", strdup_n(o,s-o)); } if(!*s) break; s++; } - printf("%s\n", as); - swf_DumpMatrix(stdout,&mybutton.records[0].matrix); - } static void setbuttonrecords(TAG*tag) { @@ -552,10 +550,24 @@ void s_buttonaction(int flags, char*action) swf_ActionFree(a); } +static void setactionend(TAG*tag) +{ + if(!mybutton.nr_actions) { + /* no actions means we didn't have an actionoffset, + which means we can't signal the end of the + buttonaction records, so, *sigh*, we have + to insert a dummy record */ + swf_SetU16(tag, 0); //offset + swf_SetU16(tag, 0); //condition + swf_SetU8(tag, 0); //action + } +} + static void s_endButton() { SRECT r; setbuttonrecords(stack[stackpos-1].tag); + setactionend(stack[stackpos-1].tag); stackpos--; swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions); @@ -680,13 +692,17 @@ int s_getframe() return currentframe; } -void s_frame(int nr, int cut) +void s_frame(int nr, int cut, char*name) { int t; TAG*now = tag; for(t=currentframe;tbbox; - tag = swf_InsertTag(tag, ST_DEFINESHAPE); + tag = swf_InsertTag(tag, ST_DEFINESHAPE3); swf_ShapeNew(&s); ls1 = swf_ShapeAddLineStyle(s,linewidth,&color); if(texture) @@ -814,7 +830,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) @@ -836,7 +852,7 @@ void s_circle(char*name, int r, RGBA color, int linewidth, char*texture) incrementid(); } -void s_textshape(char*name, char*fontname, char*_text) +void s_textshape(char*name, char*fontname, float size, char*_text) { int g; U8*text = (U8*)_text; @@ -862,7 +878,7 @@ void s_textshape(char*name, char*fontname, char*_text) { drawer_t draw; swf_Shape11DrawerInit(&draw, 0); - swf_DrawText(&draw, font, _text); + swf_DrawText(&draw, font, (int)(size*100), _text); draw.finish(&draw); outline->shape = swf_ShapeDrawerToShape(&draw); outline->bbox = swf_ShapeDrawerGetBBox(&draw); @@ -877,7 +893,7 @@ void s_textshape(char*name, char*fontname, char*_text) void s_text(char*name, char*fontname, char*text, int size, RGBA color) { SRECT r; - + MATRIX _m,*m=0; SWFFONT*font; font = dictionary_lookup(&fonts, fontname); if(!font) @@ -895,6 +911,32 @@ void s_text(char*name, char*fontname, char*text, int size, RGBA color) 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; + EditTextLayout layout; + SRECT r; + + 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; + layout.leftmargin = 0; + layout.rightmargin = 0; + layout.indent = 0; + layout.leading = 0; + r.xmin = 0; + r.ymin = 0; + r.xmax = width; + r.ymax = height; + swf_SetEditText(tag, flags|ET_USEOUTLINES, r, text, color, maxlength, font->id, size, &layout, variable); + + s_addcharacter(name, id, tag, r); + incrementid(); +} + /* type: either "jpeg" or "png" */ void s_image(char*name, char*type, char*filename, int quality) @@ -979,6 +1021,8 @@ void s_font(char*name, char*filename) font->layout = 0; swf_FontCreateLayout(font); } + /* just in case this thing is used in .edittext later on */ + swf_FontPrepareForEditText(font); font->id = id; tag = swf_InsertTag(tag, ST_DEFINEFONT2); @@ -1298,6 +1342,7 @@ void s_endClip() swf_SetTagPos(stack[stackpos].tag, 0); swf_GetPlaceObject(stack[stackpos].tag, &p); p.clipdepth = currentdepth; + p.name = 0; swf_ClearTag(stack[stackpos].tag); swf_SetPlaceObject(stack[stackpos].tag, &p); currentdepth++; @@ -2114,6 +2159,7 @@ static int c_frame(map_t*args) { char*framestr = lu(args, "n"); char*cutstr = lu(args, "cut"); + char*name = lu(args, "name"); int frame; int cut = 0; if(strcmp(cutstr, "no")) @@ -2130,7 +2176,7 @@ static int c_frame(map_t*args) && !(frame==0 && s_getframe()==frame)) // equality is o.k. for frame 0 syntaxerror("frame expression must be >%d (is:%s)", s_getframe(), framestr); } - s_frame(frame, cut); + s_frame(frame, cut, name); return 0; } static int c_primitive(map_t*args) @@ -2180,8 +2226,9 @@ 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")); - s_textshape(name, font, text); + s_textshape(name, font, size, text); return 0; } @@ -2385,7 +2432,38 @@ static int c_on_key(map_t*args) return 0; } -static int c_edittext(map_t*args) {return fakechar(args);} +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 width = parseTwip(lu(args, "width")); + int height = parseTwip(lu(args, "height")); + char*text = lu(args, "text"); + RGBA color = parseColor(lu(args, "color")); + int maxlength = parseInt(lu(args, "maxlength")); + char*variable = lu(args, "variable"); + char*passwordstr = lu(args, "password"); + char*wordwrapstr = lu(args, "wordwrap"); + char*multilinestr = lu(args, "multiline"); + char*htmlstr = lu(args, "html"); + char*noselectstr = lu(args, "noselect"); + char*readonlystr = lu(args, "readonly"); + char*borderstr = lu(args, "border"); + + int flags = 0; + if(!strcmp(passwordstr, "password")) flags |= ET_PASSWORD; + if(!strcmp(wordwrapstr, "wordwrap")) flags |= ET_WORDWRAP; + if(!strcmp(multilinestr, "multiline")) flags |= ET_MULTILINE; + if(!strcmp(readonlystr, "readonly")) flags |= ET_READONLY; + if(!strcmp(htmlstr, "html")) flags |= ET_HTML; + if(!strcmp(noselectstr, "noselect")) flags |= ET_NOSELECT; + if(!strcmp(borderstr, "border")) flags |= ET_BORDER; + + s_edittext(name, font, size, width, height, text, &color, maxlength, variable, flags); + return 0; +} static int c_morphshape(map_t*args) {return fakechar(args);} static int c_movie(map_t*args) {return fakechar(args);} @@ -2410,7 +2488,7 @@ static struct { char*arguments; } arguments[] = {{"flash", c_flash, "bbox=autocrop background=black version=5 fps=50 name=!default! @compress=default"}, - {"frame", c_frame, "n=1 @cut=no"}, + {"frame", c_frame, "n=1 name= @cut=no"}, // "import" type stuff {"swf", c_swf, "name filename"}, {"shape", c_swf, "name filename"}, @@ -2426,7 +2504,7 @@ static struct { {"point", c_point, "name x=0 y=0"}, {"gradient", c_gradient, "name @radial=0"}, {"outline", c_outline, "name format=simple"}, - {"textshape", c_textshape, "name text font"}, + {"textshape", c_textshape, "name font size=100% text"}, // character generators {"box", c_primitive, "name width height color=white line=1 @fill=none"}, @@ -2435,13 +2513,13 @@ 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 width height text="" color=black maxlength=0 variable="" @password=0 @wordwrap=0 @multiline=0 @html=0 @noselect=0 @readonly=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="}, {"on_press", c_on_press, "position=inside"}, {"on_release", c_on_release, "position=anywhere"}, - {"on_move_in", c_on_move_out, "state=not_pressed"}, + {"on_move_in", c_on_move_in, "state=not_pressed"}, {"on_move_out", c_on_move_out, "state=not_pressed"}, {"on_key", c_on_key, "key=any"},