X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=db03652e5f3001fbeaae66143cd5b93826b6059e;hb=f1f20af550c019b3f21312bf971d4b06dbe8a49d;hp=ad923d3f9b3f908075151b381aaaa7d618fd9ead;hpb=1b376de4a5d3ee2905cf962ecbde7766616d5347;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index ad923d3..db03652 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -476,7 +476,11 @@ void s_buttonput(char*character, char*as, parameters_t p) character_t* c = dictionary_lookup(&characters, character); MATRIX m; int flags = 0; + char*o = as,*s = as; buttonrecord_t r; + if(!stackpos || (stack[stackpos-1].type != 3)) { + syntaxerror(".show may only appear in .button"); + } if(!c) { syntaxerror("character %s not known (in .shape %s)", character, character); } @@ -490,25 +494,35 @@ void s_buttonput(char*character, char*as, parameters_t p) r.matrix = m; r.cxform = p.cxform; r.set = 1; - - if(strstr(as, "idle")) mybutton.records[0]=r; - if(strstr(as, "hover")) mybutton.records[1]=r; - if(strstr(as, "pressed")) mybutton.records[2]=r; - if(strstr(as, "area")) mybutton.records[3]=r; + + 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; + else syntaxerror("unknown \"as\" argument: \"%s\"", strdup_n(o,s-o)); + } + if(!*s) + break; + s++; + } } static void setbuttonrecords(TAG*tag) { int flags[] = {BS_UP,BS_OVER,BS_DOWN,BS_HIT}; if(!mybutton.endofshapes) { int t; - + if(!mybutton.records[3].set) { memcpy(&mybutton.records[3], &mybutton.records[0], sizeof(buttonrecord_t)); } for(t=0;t<4;t++) { - if(mybutton.records[t].set) + if(mybutton.records[t].set) { swf_ButtonSetRecord(tag,flags[t],mybutton.records[t].id,1,&mybutton.records[t].matrix,&mybutton.records[t].cxform); + } } swf_SetU8(tag,0); // end of button records mybutton.endofshapes = 1; @@ -535,10 +549,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); @@ -878,6 +906,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) @@ -2368,7 +2422,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)(100*20*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);} @@ -2418,7 +2503,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 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="},