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;
currentdepth = stack[stackpos].olddepth;
instances = stack[stackpos].oldinstances;
+ tag = swf_InsertTag(tag, ST_SHOWFRAME);
tag = swf_InsertTag(tag, ST_END);
tag = stack[stackpos].tag;
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" */
}
int s_getframe()
{
- return currentframe;
+ return currentframe+1;
}
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) {
swf_SetString(tag, name);
}
}
+ if(nr == 0 && currentframe == 0 && name) {
+ tag = swf_InsertTag(tag, ST_FRAMELABEL);
+ swf_SetString(tag, name);
+ }
if(cut) {
if(now == tag) {
{
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);
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_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_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;
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);
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);
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;
int s_playsound(char*name, int loops, int nomultiple, int stop)
{
- sound_t* sound = dictionary_lookup(&sounds, name);
+ sound_t* sound;
+ if(!name)
+ return 0;
+ sound = dictionary_lookup(&sounds, name);
SOUNDINFO info;
if(!sound)
return 0;
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_stop(map_t*args)
{
- char*name = lu(args, "name");
+ char*name = map_lookup(args, "name");
if(s_playsound(name, 0,0,1)) {
return 0;
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, name);
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");
{"sound", c_sound, "name filename"},
{"font", c_font, "name filename"},
{"soundtrack", c_soundtrack, "filename"},
+ {"quicktime", c_quicktime, "url"},
// generators of primitives
// 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"},
}
}
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