#include "../lib/rfxswf.h"
#include "../lib/log.h"
#include "../lib/args.h"
-#include "q.h"
+#include "../lib/q.h"
#include "parser.h"
+#include "wav.h"
//#define DEBUG
static U16 currentdepth;
static dictionary_t instances;
static dictionary_t fonts;
+static dictionary_t sounds;
typedef struct _parameters {
int x,y;
dictionary_init(&characters);
dictionary_init(&instances);
dictionary_init(&fonts);
+ dictionary_init(&sounds);
memset(&stack[stackpos], 0, sizeof(stack[0]));
stack[stackpos].type = 0;
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;
+ }
- fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ fi = open(filename, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0644);
if(fi<0) {
syntaxerror("couldn't create output file %s", filename);
}
dictionary_clear(&instances);
dictionary_clear(&characters);
dictionary_clear(&fonts);
+ dictionary_clear(&sounds);
swf_FreeTags(swf);
free(swf);
int f;
SWF swf;
SWFFONT* font;
- 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));
font = (SWFFONT*)malloc(sizeof(SWFFONT));
dictionary_put2(&fonts, name, font);
}
+typedef struct _sound_t
+{
+ U16 id;
+ TAG*tag;
+} sound_t;
+
+void s_sound(char*name, char*filename)
+{
+ struct WAV wav, wav2;
+ sound_t* sound;
+ U16*samples;
+ int numsamples;
+
+ if(!readWAV(filename, &wav)) {
+ warning("Couldn't read wav file \"%s\"", filename);
+ samples = 0;
+ numsamples = 0;
+ } else {
+ convertWAV2mono(&wav, &wav2, 44100);
+ samples = (U16*)wav2.data;
+ numsamples = wav2.size/2;
+ free(wav.data);
+ }
+
+ tag = swf_InsertTag(tag, ST_DEFINESOUND);
+ swf_SetU16(tag, id); //id
+ swf_SetSoundDefine(tag, samples, numsamples);
+
+ sound = (sound_t*)malloc(sizeof(sound_t)); /* mem leak */
+ sound->tag = tag;
+ sound->id = id;
+
+ if(dictionary_lookup(&sounds, name))
+ syntaxerror("sound %s defined twice", name);
+ dictionary_put2(&sounds, name, sound);
+
+ incrementid();
+
+ if(samples)
+ free(samples);
+}
+
+void s_playsound(char*name, int loops, int nomultiple, int stop)
+{
+ sound_t* sound = dictionary_lookup(&sounds, name);
+ SOUNDINFO info;
+ if(!sound)
+ syntaxerror("Don't know anything about sound \"%s\"", name);
+
+ tag = swf_InsertTag(tag, ST_STARTSOUND);
+ swf_SetU16(tag, sound->id); //id
+ memset(&info, 0, sizeof(info));
+ info.stop = stop;
+ info.loops = loops;
+ info.nomultiple = nomultiple;
+ swf_SetSoundInfo(tag, &info);
+}
+
void s_shape(char*name, char*filename)
{
int f;
}
int parseTwip(char*str)
{
- char*dot = strchr(str, '.');
+ char*dot;
+ int sign=1;
+ if(str[0]=='+' || str[0]=='-') {
+ if(str[0]=='-')
+ sign = -1;
+ str++;
+ }
+ dot = strchr(str, '.');
if(!dot) {
int l=strlen(str);
int t;
- return parseInt(str)*20;
+ return sign*parseInt(str)*20;
} else {
int l=strlen(++dot);
char*s;
l=2;
}
if(l==0)
- return atoi(str)*20;
+ return sign*atoi(str)*20;
if(l==1)
- return atoi(str)*20+atoi(dot)*2;
+ return sign*atoi(str)*20+atoi(dot)*2;
if(l==2)
- return atoi(str)*20+atoi(dot)/5;
+ return sign*atoi(str)*20+atoi(dot)/5;
}
return 0;
}
int l = strlen(str);
int r,g,b,a;
int t;
- char*names[8] = {"black", "blue", "green", "cyan",
- "red", "magenta", "yellow", "white"};
- a=255;
- r=g=b=0;
+
+ struct {unsigned char r,g,b;char*name;} colors[] =
+ {{255,250,250,"snow"},{220,220,220,"gainsboro"},{250,240,230,"linen"},{255,228,196,"bisque"},
+ {255,228,181,"moccasin"},{255,248,220,"cornsilk"},{255,255,240,"ivory"},{255,245,238,"seashell"},
+ {240,255,240,"honeydew"},{240,255,255,"azure"},{230,230,250,"lavender"},{255,255,255,"white"},
+ {0,0,0,"black"},{190,190,190,"gray"},{190,190,190,"grey"},{0,0,128,"navy"},{0,0,255,"blue"},
+ {64,224,208,"turquoise"},{0,255,255,"cyan"},{127,255,212,"aquamarine"}, {0,255,0,"green"},
+ {127,255,0,"chartreuse"},{240,230,140,"khaki"},{255,255,0,"yellow"},
+ {255,215,0,"gold"},{218,165,32,"goldenrod"},{160,82,45,"sienna"},{205,133,63,"peru"},
+ {222,184,135,"burlywood"},{245,245,220,"beige"},{245,222,179,"wheat"},{210,180,140,"tan"},
+ {210,105,30,"chocolate"},{178,34,34,"firebrick"},{165,42,42,"brown"},{250,128,114,"salmon"},
+ {255,165,0,"orange"},{255,127,80,"coral"},{255,99,71,"tomato"},{255,0,0,"red"},
+ {255,192,203,"pink"},{176,48,96,"maroon"},{255,0,255,"magenta"},{238,130,238,"violet"},
+ {221,160,221,"plum"},{218,112,214,"orchid"},{160,32,240,"purple"},{216,191,216,"thistle"}};
+
+ a=255;r=g=b=0;
+
if(str[0]=='#' && (l==7 || l==9)) {
if(l == 7 && !(sscanf(str, "#%02x%02x%02x", &r, &g, &b)))
return 0;
color->r = r; color->g = g; color->b = b; color->a = a;
return 1;
}
- for(t=0;t<8;t++)
- if(!strcmp(str, names[t])) {
- if(t&1)
- b = 255;
- if(t&2)
- g = 255;
- if(t&4)
- r = 255;
+ for(t=0;t<sizeof(colors)/sizeof(colors[0]);t++)
+ if(!strcmp(str, colors[t].name)) {
+ r = colors[t].r;
+ g = colors[t].g;
+ b = colors[t].b;
+ a = 255;
color->r = r; color->g = g; color->b = b; color->a = a;
return 1;
}
{
char* value = map_lookup(args, name);
if(!value) {
+ map_dump(args, stdout, "");
syntaxerror("internal error 2: value %s should be set", name);
}
return value;
SPOINT getPoint(SRECT r, char*name)
{
- int l;
+ int l=0;
if(!strcmp(name, "center")) {
SPOINT p;
p.x = (r.xmin + r.xmax)/2;
return p;
}
- l = (int)dictionary_lookup(&points, name);
+ if(points_initialized)
+ l = (int)dictionary_lookup(&points, name);
if(l==0) {
- syntaxerror("Couldn't find point \"%s\".", name);
+ syntaxerror("Invalid point: \"%s\".", name);
}
l--;
return *(SPOINT*)&mpoints.buffer[l];
dictionary_put(&points, s1, (void*)pos);
return 0;
}
+static int c_play(map_t*args)
+{
+ char*name = lu(args, "sound");
+ char*loop = lu(args, "loop");
+ char*nomultiple = lu(args, "nomultiple");
+ int nm = 0;
+ if(!strcmp(nomultiple, "nomultiple"))
+ nm = 1;
+ else
+ nm = parseInt(nomultiple);
+
+ s_playsound(name, parseInt(loop), nm, 0);
+ return 0;
+}
+
+static int c_stop(map_t*args)
+{
+ char*name = lu(args, "sound");
+ s_playsound(name, 0,0,1);
+ return 0;
+}
+
static int c_placement(map_t*args, int type)
{
char*instance = lu(args, (type==0||type==4)?"instance":"name");
return 0;
}
+static int c_sound(map_t*args)
+{
+ char*name = lu(args, "name");
+ char*filename = lu(args, "filename");
+ s_sound(name, filename);
+ return 0;
+}
+
static int c_text(map_t*args)
{
char*name = lu(args, "name");
return 0;
}
+static int c_soundtrack(map_t*args)
+{
+ return 0;
+}
+
int fakechar(map_t*args)
{
char*name = lu(args, "name");
s_box(name, 0, 0, black, 20, black, 0);
return 0;
}
-static int c_circle(map_t*args) {return fakechar(args);}
static int c_egon(map_t*args) {return fakechar(args);}
static int c_button(map_t*args) {return fakechar(args);}
static int c_morphshape(map_t*args) {return fakechar(args);}
static int c_image(map_t*args) {return fakechar(args);}
static int c_movie(map_t*args) {return fakechar(args);}
-static int c_sound(map_t*args) {return fakechar(args);}
-
-static int c_play(map_t*args) {return 0;}
-static int c_stop(map_t*args) {return 0;}
-static int c_soundtrack(map_t*args) {return 0;}
static int c_buttonsounds(map_t*args) {return 0;}
static int c_buttonput(map_t*args) {return 0;}
static int c_texture(map_t*args) {return 0;}