X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fswfc.c;h=9d9772a474a7215c7fe335370dd5d74aaab5c34f;hb=feddb673cf8404df91270489b130a72c65195866;hp=05003f8aff6cb410f01cb3efebc1a6d3f4f8ed66;hpb=fb267666dad42925f9b143f899c7ffd54a662311;p=swftools.git diff --git a/src/swfc.c b/src/swfc.c index 05003f8..9d9772a 100644 --- a/src/swfc.c +++ b/src/swfc.c @@ -40,6 +40,7 @@ static char * filename = 0; static char * outputname = "output.swf"; static int verbose = 2; +static int optimize = 0; static int override_outputname = 0; static struct options_t options[] = { @@ -47,6 +48,7 @@ static struct options_t options[] = { {"V", "version"}, {"v", "verbose"}, {"o", "output"}, +{"O", "optimize"}, {0,0} }; @@ -61,6 +63,10 @@ int args_callback_option(char*name,char*val) override_outputname = 1; return 1; } + else if(!strcmp(name, "O")) { + optimize = 1; + return 0; + } else if(!strcmp(name, "v")) { verbose ++; return 0; @@ -231,6 +237,7 @@ typedef struct _outline { typedef struct _gradient { GRADIENT gradient; char radial; + int rotate; } gradient_t; static void character_init(character_t*c) @@ -320,7 +327,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 +355,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; @@ -381,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"); @@ -476,6 +484,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); } @@ -485,30 +498,39 @@ void s_buttonput(char*character, char*as, parameters_t p) m = s_instancepos(c->size, &p); - buttonrecord_t r; r.id = c->id; 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;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++; + } } 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,14 +557,29 @@ 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); - SRECT r = currentrect; + r = currentrect; tag = stack[stackpos].tag; currentrect = stack[stackpos].oldrect; @@ -581,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; @@ -602,16 +640,22 @@ static void s_endSWF() tag = removeFromTo(stack[stackpos].cut, tag); stackpos--; - + swf = stack[stackpos].swf; filename = stack[stackpos].filename; - - //tag = swf_InsertTag(tag, ST_SHOWFRAME); //? + + //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); - + + if(optimize) { + swf_Optimize(swf); + } + if(!(swf->movieSize.xmax-swf->movieSize.xmin) || !(swf->movieSize.ymax-swf->movieSize.ymin)) { swf->movieSize = currentrect; /* "autocrop" */ } @@ -619,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); @@ -659,16 +704,28 @@ void s_close() int s_getframe() { - return currentframe; + return currentframe+1; } -void s_frame(int nr, int cut) +void s_frame(int nr, int cut, char*name) { int t; TAG*now = tag; + if(nr<1) + syntaxerror("Illegal frame number"); + nr--; // internally, frame 1 is frame 0 + for(t=currentframe;tid, 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); @@ -721,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_DEFINESHAPE); + 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); @@ -764,13 +833,13 @@ 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(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; @@ -779,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); @@ -791,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_DEFINESHAPE); + 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); @@ -818,7 +891,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; @@ -844,7 +917,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); @@ -859,7 +932,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) @@ -877,6 +950,51 @@ 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 = 0; + EditTextLayout layout; + SRECT r; + + 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; + 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, r, text, color, maxlength, font?font->id:0, 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) @@ -961,6 +1079,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); @@ -986,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); @@ -996,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); @@ -1065,13 +1192,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); @@ -1096,8 +1224,11 @@ void s_action(const char*text) int s_swf3action(char*name, char*action) { ActionTAG* a = 0; - instance_t* object = dictionary_lookup(&instances, name); - if(!object) { + instance_t* object = 0; + if(name) + dictionary_lookup(&instances, name); + if(!object && name && *name) { + /* we have a name, but couldn't find it. Abort. */ return 0; } a = action_SetTarget(0, name); @@ -1127,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; @@ -1145,8 +1272,11 @@ void s_outline(char*name, char*format, char*source) int s_playsound(char*name, int loops, int nomultiple, int stop) { - sound_t* sound = dictionary_lookup(&sounds, name); + sound_t* sound; SOUNDINFO info; + if(!name) + return 0; + sound = dictionary_lookup(&sounds, name); if(!sound) return 0; @@ -1169,7 +1299,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); @@ -1191,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); @@ -1280,6 +1410,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++; @@ -1519,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; } @@ -1696,15 +1827,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; @@ -1714,7 +1857,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) @@ -1766,12 +1909,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) @@ -1814,7 +1958,7 @@ static int c_play(map_t*args) static int c_stop(map_t*args) { - char*name = lu(args, "name"); + char*name = map_lookup(args, "name"); if(s_playsound(name, 0,0,1)) { return 0; @@ -2096,6 +2240,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")) @@ -2109,10 +2254,10 @@ static int c_frame(map_t*args) else { frame = parseInt(framestr); if(s_getframe() >= frame - && !(frame==0 && s_getframe()==frame)) // equality is o.k. for frame 0 + && !(frame==1 && 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) @@ -2162,8 +2307,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; } @@ -2210,6 +2356,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"); @@ -2254,6 +2408,7 @@ static int current_button_flags = 0; static int c_on_press(map_t*args) { char*position = lu(args, "position"); + char*action = ""; if(!strcmp(position, "inside")) { current_button_flags |= BC_OVERUP_OVERDOWN; } else if(!strcmp(position, "outside")) { @@ -2262,7 +2417,6 @@ static int c_on_press(map_t*args) } else if(!strcmp(position, "anywhere")) { current_button_flags |= /*BC_IDLE_OUTDOWN|*/BC_OVERUP_OVERDOWN|BC_IDLE_OVERDOWN; } - char*action = ""; readToken(); if(type == RAWDATA) { action = text; @@ -2276,6 +2430,7 @@ static int c_on_press(map_t*args) static int c_on_release(map_t*args) { char*position = lu(args, "position"); + char*action = ""; if(!strcmp(position, "inside")) { current_button_flags |= BC_OVERDOWN_OVERUP; } else if(!strcmp(position, "outside")) { @@ -2283,7 +2438,6 @@ static int c_on_release(map_t*args) } else if(!strcmp(position, "anywhere")) { current_button_flags |= BC_OVERDOWN_OVERUP|BC_OUTDOWN_IDLE|BC_OVERDOWN_IDLE; } - char*action = ""; readToken(); if(type == RAWDATA) { action = text; @@ -2297,6 +2451,7 @@ static int c_on_release(map_t*args) static int c_on_move_in(map_t*args) { char*position = lu(args, "state"); + char*action = ""; if(!strcmp(position, "pressed")) { current_button_flags |= BC_OUTDOWN_OVERDOWN; } else if(!strcmp(position, "not_pressed")) { @@ -2304,7 +2459,6 @@ static int c_on_move_in(map_t*args) } else if(!strcmp(position, "any")) { current_button_flags |= BC_OUTDOWN_OVERDOWN|BC_IDLE_OVERUP|BC_IDLE_OVERDOWN; } - char*action = ""; readToken(); if(type == RAWDATA) { action = text; @@ -2318,6 +2472,7 @@ static int c_on_move_in(map_t*args) static int c_on_move_out(map_t*args) { char*position = lu(args, "state"); + char*action = ""; if(!strcmp(position, "pressed")) { current_button_flags |= BC_OVERDOWN_OUTDOWN; } else if(!strcmp(position, "not_pressed")) { @@ -2325,7 +2480,6 @@ static int c_on_move_out(map_t*args) } else if(!strcmp(position, "any")) { current_button_flags |= BC_OVERDOWN_OUTDOWN|BC_OVERUP_IDLE|BC_OVERDOWN_IDLE; } - char*action = ""; readToken(); if(type == RAWDATA) { action = text; @@ -2339,6 +2493,7 @@ static int c_on_move_out(map_t*args) static int c_on_key(map_t*args) { char*key = lu(args, "key"); + char*action = ""; if(strlen(key)==1) { /* ascii */ if(key[0]>=32) { @@ -2355,7 +2510,6 @@ static int c_on_key(map_t*args) */ syntaxerror("invalid key: %s",key); } - char*action = ""; readToken(); if(type == RAWDATA) { action = text; @@ -2367,7 +2521,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);} @@ -2376,12 +2561,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; } @@ -2391,8 +2593,8 @@ static struct { command_func_t* func; 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"}, +{{"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"}, {"shape", c_swf, "name filename"}, @@ -2402,13 +2604,14 @@ 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 text font"}, + {"textshape", c_textshape, "name font size=100% text"}, // character generators {"box", c_primitive, "name width height color=white line=1 @fill=none"}, @@ -2417,19 +2620,19 @@ 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"}, // control tags {"play", c_play, "name loop=0 @nomultiple=0"}, - {"stop", c_stop, "name"}, + {"stop", c_stop, "name= "}, {"nextframe", c_nextframe, "name"}, {"previousframe", c_previousframe, "name"}, @@ -2447,7 +2650,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, ""} }; @@ -2586,7 +2789,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