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[] = {
{"V", "version"},
{"v", "verbose"},
{"o", "output"},
+{"O", "optimize"},
{0,0}
};
override_outputname = 1;
return 1;
}
+ else if(!strcmp(name, "O")) {
+ optimize = 1;
+ return 0;
+ }
else if(!strcmp(name, "v")) {
verbose ++;
return 0;
typedef struct _gradient {
GRADIENT gradient;
char radial;
+ int rotate;
} gradient_t;
static void character_init(character_t*c)
{
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;
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;
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");
incrementid();
}
+typedef struct _buttonrecord
+{
+ U16 id;
+ MATRIX matrix;
+ CXFORM cxform;
+ char set;
+} buttonrecord_t;
+
typedef struct _button
{
int endofshapes;
- int shapes[4];
int nr_actions;
+ buttonrecord_t records[4];
} button_t;
static button_t mybutton;
swf_SetU16(tag, id); //id
swf_ButtonSetFlags(tag, 0); //menu=no
- mybutton.endofshapes = 0;
- mybutton.shapes[0] = mybutton.shapes[1] = mybutton.shapes[2] = mybutton.shapes[3] = 0;
- mybutton.nr_actions = 0;
+ memset(&mybutton, 0, sizeof(mybutton));
memset(&stack[stackpos], 0, sizeof(stack[0]));
stack[stackpos].type = 3;
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);
}
- if(strstr(as, "idle")) {flags |= BS_UP;mybutton.shapes[0]=c->id;}
- if(strstr(as, "hover")) {flags |= BS_OVER;mybutton.shapes[1]=c->id;}
- if(strstr(as, "pressed")) {flags |= BS_DOWN;mybutton.shapes[2]=c->id;}
- if(strstr(as, "area")) {flags |= BS_HIT;mybutton.shapes[3]=c->id;}
- if(!flags)
- flags = BS_HIT;
-
if(mybutton.endofshapes) {
syntaxerror("a .do may not precede a .show", character, character);
}
m = s_instancepos(c->size, &p);
- swf_ButtonSetRecord(stack[stackpos-1].tag,flags,c->id,1,&m,&p.cxform);
+ r.id = c->id;
+ r.matrix = m;
+ r.cxform = p.cxform;
+ r.set = 1;
+
+ 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) {
+ 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;
+ }
}
+
void s_buttonaction(int flags, char*action)
{
ActionTAG* a = 0;
if(flags==0) {
return;
}
- if(!mybutton.endofshapes) {
- swf_SetU8(stack[stackpos-1].tag,0); // end of button records
- mybutton.endofshapes = 1;
- }
-
+ setbuttonrecords(stack[stackpos-1].tag);
a = swf_ActionCompile(text, stack[0].swf->fileVersion);
if(!a) {
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--;
- if(!mybutton.endofshapes) {
- swf_SetU8(stack[stackpos].tag,0); // end of button records
- mybutton.endofshapes = 1;
- }
- /* end of actions */
swf_ButtonPostProcess(stack[stackpos].tag, mybutton.nr_actions);
- SRECT r = currentrect;
+ r = currentrect;
tag = stack[stackpos].tag;
currentrect = stack[stackpos].oldrect;
currentdepth = stack[stackpos].olddepth;
instances = stack[stackpos].oldinstances;
+ tag = swf_InsertTag(tag, ST_SHOWFRAME);
tag = swf_InsertTag(tag, ST_END);
tag = stack[stackpos].tag;
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" */
}
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);
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;t<nr;t++) {
tag = swf_InsertTag(tag, ST_SHOWFRAME);
+ if(t==nr-1 && name && *name) {
+ tag = swf_InsertTag(tag, ST_FRAMELABEL);
+ swf_SetString(tag, name);
+ }
+ }
+ if(nr == 0 && currentframe == 0 && name) {
+ tag = swf_InsertTag(tag, ST_FRAMELABEL);
+ swf_SetString(tag, name);
}
if(cut) {
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);
{
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);
}
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=<color/texture> argument");
+
swf_SetU16(tag,id);
rect.xmin = r2.xmin-linewidth-linewidth/2;
rect.ymin = r2.ymin-linewidth-linewidth/2;
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);
{
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);
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;
{
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);
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)
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)
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);
sound_t* sound;
U16*samples;
int numsamples;
+ int t;
if(!readWAV(filename, &wav)) {
warning("Couldn't read wav file \"%s\"", filename);
samples = (U16*)wav2.data;
numsamples = wav2.size/2;
free(wav.data);
+#ifdef WORDS_BIGENDIAN
+ /* swap bytes */
+ for(t=0;t<numsamples;t++) {
+ samples[t] = (samples[t]>>8)&0xff | (samples[t]<<8)&0xff00;
+ }
+#endif
}
tag = swf_InsertTag(tag, ST_DEFINESOUND);
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);
swf_ActionFree(a);
}
+int s_swf3action(char*name, char*action)
+{
+ ActionTAG* a = 0;
+ 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);
+ if(!strcmp(action, "nextframe")) a = action_NextFrame(a);
+ else if(!strcmp(action, "previousframe")) a = action_PreviousFrame(a);
+ else if(!strcmp(action, "stop")) a = action_Stop(a);
+ else if(!strcmp(action, "play")) a = action_Play(a);
+ a = action_SetTarget(a, "");
+ a = action_End(a);
+
+ tag = swf_InsertTag(tag, ST_DOACTION);
+ swf_ActionSet(tag, a);
+ swf_ActionFree(a);
+ return 1;
+}
+
void s_outline(char*name, char*format, char*source)
{
outline_t* outline;
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;
dictionary_put2(&outlines, name, outline);
}
-void s_playsound(char*name, int loops, int nomultiple, int stop)
+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)
- syntaxerror("Don't know anything about sound \"%s\"", name);
+ return 0;
tag = swf_InsertTag(tag, ST_STARTSOUND);
swf_SetU16(tag, sound->id); //id
info.loops = loops;
info.nomultiple = nomultiple;
swf_SetSoundInfo(tag, &info);
+ return 1;
}
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);
s = tag = swf_InsertTag(tag, ST_DEFINESPRITE);
swf_SetU16(tag, id);
- swf_SetU16(tag, 0);
+ swf_SetU16(tag, swf.frameCount);
swf_Relocate(&swf, idmap);
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++;
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;
}
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("<warning> line %d: .flash name=... is deprecated, use .flash filename=...", line);
+ msg("<notice> line %d: .flash name=... is deprecated, use .flash filename=...", line);
+ }
+ }
+
+ if(!filename || override_outputname)
+ filename = outputname;
if(!strcmp(compressstr, "default"))
compress = version==6;
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)
{
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)
}
static int c_play(map_t*args)
{
- char*name = lu(args, "sound");
+ char*name = lu(args, "name");
char*loop = lu(args, "loop");
char*nomultiple = lu(args, "nomultiple");
int nm = 0;
else
nm = parseInt(nomultiple);
- s_playsound(name, parseInt(loop), nm, 0);
+ if(s_playsound(name, parseInt(loop), nm, 0)) {
+ return 0;
+ } else if(s_swf3action(name, "play")) {
+ return 0;
+ }
return 0;
}
static int c_stop(map_t*args)
{
- char*name = lu(args, "sound");
- s_playsound(name, 0,0,1);
+ char*name = map_lookup(args, "name");
+
+ if(s_playsound(name, 0,0,1)) {
+ return 0;
+ } else if(s_swf3action(name, "stop")) {
+ return 0;
+ }
+ syntaxerror("I don't know anything about sound/movie \"%s\"", name);
+ return 0;
+}
+
+static int c_nextframe(map_t*args)
+{
+ char*name = lu(args, "name");
+
+ if(s_swf3action(name, "nextframe")) {
+ return 0;
+ }
+ syntaxerror("I don't know anything about movie \"%s\"", name);
+ return 0;
+}
+
+static int c_previousframe(map_t*args)
+{
+ char*name = lu(args, "name");
+
+ if(s_swf3action(name, "previousframe")) {
+ return 0;
+ }
+ syntaxerror("I don't know anything about movie \"%s\"", name);
return 0;
}
{
char*framestr = lu(args, "n");
char*cutstr = lu(args, "cut");
+ char*name = lu(args, "name");
int frame;
int cut = 0;
if(strcmp(cutstr, "no"))
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)
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;
}
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");
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")) {
} 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;
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")) {
} 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;
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")) {
} 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;
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")) {
} 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;
static int c_on_key(map_t*args)
{
char*key = lu(args, "key");
+ char*action = "";
if(strlen(key)==1) {
/* ascii */
if(key[0]>=32) {
*/
syntaxerror("invalid key: %s",key);
}
- char*action = "";
readToken();
if(type == RAWDATA) {
action = text;
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);}
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;
}
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=<plus>1 @cut=no"},
+{{"flash", c_flash, "bbox=autocrop background=black version=6 fps=50 name= filename= @compress=default"},
+ {"frame", c_frame, "n=<plus>1 name= @cut=no"},
// "import" type stuff
{"swf", c_swf, "name filename"},
{"shape", c_swf, "name filename"},
{"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"},
{"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, "sound loop=0 @nomultiple=0"},
- {"stop", c_stop, "sound"},
+ {"play", c_play, "name loop=0 @nomultiple=0"},
+ {"stop", c_stop, "name= "},
+ {"nextframe", c_nextframe, "name"},
+ {"previousframe", c_previousframe, "name"},
// object placement tags
{"put", c_put, "<i> x=0 y=0 red=+0 green=+0 blue=+0 alpha=+0 luminance= scale= scalex= scaley= pivot= pin= shear= rotate= ratio= above= below="},
// commands which start a block
//startclip (see above)
{"sprite", c_sprite, "name"},
- {"action", c_action, ""},
+ {"action", c_action, "filename="},
{"end", c_end, ""}
};
}
}
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