#include "../lib/log.h"
#include "../lib/rfxswf.h"
}
+#define standardEncodingSize 335
+extern char *standardEncodingNames[standardEncodingSize];
+int opennewwindow=0;
int ignoredraworder=0;
int drawonlyshapes=0;
int jpegquality=85;
+int storeallcharacters=0;
+int enablezlib=0;
static int flag_protected = 0;
typedef unsigned char u8;
int CHARMIDX = 0;
int CHARMIDY = 0;
-void startshape(struct swfoutput* obj);
-void starttext(struct swfoutput* obj);
-void endshape();
-void endtext();
+char fillstylechanged = 0;
+
+static void startshape(struct swfoutput* obj);
+static void starttext(struct swfoutput* obj);
+static void endshape();
+static void endtext();
// matrix multiplication. changes p0
-void transform (plotxy*p0,struct swfmatrix*m)
+static void transform (plotxy*p0,struct swfmatrix*m)
{
double x,y;
x = m->m11*p0->x+m->m12*p0->y;
}
// write a move-to command into the swf
-void moveto(TAG*tag, plotxy p0)
+static void moveto(TAG*tag, plotxy p0)
{
int rx = (int)(p0.x*20);
int ry = (int)(p0.y*20);
- if(rx!=swflastx || ry!=swflasty) {
- ShapeSetMove (tag, shape, rx,ry);
+ if(rx!=swflastx || ry!=swflasty || fillstylechanged) {
+ swf_ShapeSetMove (tag, shape, rx,ry);
+ fillstylechanged = 0;
}
swflastx=rx;
swflasty=ry;
}
// write a line-to command into the swf
-void lineto(TAG*tag, plotxy p0)
+static void lineto(TAG*tag, plotxy p0)
{
int rx = ((int)(p0.x*20)-swflastx);
int ry = ((int)(p0.y*20)-swflasty);
/* we can't skip this for rx=0,ry=0, those
are plots */
- ShapeSetLine (tag, shape, rx,ry);
+ swf_ShapeSetLine (tag, shape, rx,ry);
swflastx+=rx;
swflasty+=ry;
}
// write a spline-to command into the swf
-void splineto(TAG*tag, plotxy control,plotxy end)
+static void splineto(TAG*tag, plotxy control,plotxy end)
{
int cx = ((int)(control.x*20)-swflastx);
int cy = ((int)(control.y*20)-swflasty);
int ey = ((int)(end.y*20)-swflasty);
swflastx += ex;
swflasty += ey;
- ShapeSetCurve(tag, shape, cx,cy,ex,ey);
+ if(cx || cy || ex || ey)
+ swf_ShapeSetCurve(tag, shape, cx,cy,ex,ey);
}
/* write a line, given two points and the transformation
matrix. */
-void line(TAG*tag, plotxy p0, plotxy p1, struct swfmatrix*m)
+static void line(TAG*tag, plotxy p0, plotxy p1, struct swfmatrix*m)
{
transform(&p0,m);
transform(&p1,m);
/* write a cubic (!) spline. This involves calling the approximate()
function out of spline.cc to convert it to a quadratic spline. */
-void spline(TAG*tag,plotxy p0,plotxy p1,plotxy p2,plotxy p3,struct swfmatrix*m)
+static void spline(TAG*tag,plotxy p0,plotxy p1,plotxy p2,plotxy p3,struct swfmatrix*m)
{
double d;
struct qspline q[16];
num = approximate(p0,p1,p2,p3,q);
for(t=0;t<num;t++) {
- moveto(tag,q[t].start);
- splineto(tag,q[t].control, q[t].end);
+ moveto(tag,q[t].start);
+ splineto(tag,q[t].control, q[t].end);
}
}
+void resetdrawer()
+{
+ swflastx = 0;
+ swflasty = 0;
+}
+
/* draw a T1 outline. These are generated by pdf2swf and by t1lib.
(representing characters) */
-void drawpath(TAG*tag, T1_OUTLINE*outline, struct swfmatrix*m)
+void drawpath(TAG*tag, T1_OUTLINE*outline, struct swfmatrix*m, int log)
{
if(tag->id != ST_DEFINEFONT &&
- tag->id != ST_DEFINESHAPE &&
- tag->id != ST_DEFINESHAPE2 &&
- tag->id != ST_DEFINESHAPE3)
+ tag->id != ST_DEFINESHAPE &&
+ tag->id != ST_DEFINESHAPE2 &&
+ tag->id != ST_DEFINESHAPE3)
{
- logf("<error> internal error: drawpath needs a shape tag, not %d\n",tag->id);
- exit(1);
+ logf("<error> internal error: drawpath needs a shape tag, not %d\n",tag->id);
+ exit(1);
}
- int log = 0;
-
double x=0,y=0;
double lastx=0,lasty=0;
double firstx=0,firsty=0;
while (outline)
{
- x += (outline->dest.x/(float)0xffff);
- y += (outline->dest.y/(float)0xffff);
- if(outline->type == T1_PATHTYPE_MOVE)
- {
- if(((int)(lastx*20) != (int)(firstx*20) ||
- (int)(lasty*20) != (int)(firsty*20)) &&
- fill && !init)
- {
- plotxy p0;
- plotxy p1;
- p0.x=lastx;
- p0.y=lasty;
- p1.x=firstx;
- p1.y=firsty;
- if(log) printf("fix: %f,%f -> %f,%f\n",p0.x,p0.y,p1.x,p1.y);
- line(tag, p0, p1, m);
- }
- firstx=x;
- firsty=y;
- init = 0;
- }
- else if(outline->type == T1_PATHTYPE_LINE)
- {
- plotxy p0;
- plotxy p1;
- p0.x=lastx;
- p0.y=lasty;
- p1.x=x;
- p1.y=y;
- if(log) printf("line: %f,%f -> %f,%f\n",p0.x,p0.y,p1.x,p1.y);
- line(tag, p0,p1,m);
- }
- else if(outline->type == T1_PATHTYPE_BEZIER)
- {
- plotxy p0;
- plotxy p1;
- plotxy p2;
- plotxy p3;
- T1_BEZIERSEGMENT*o2 = (T1_BEZIERSEGMENT*)outline;
- p0.x=x;
- p0.y=y;
- p1.x=o2->C.x/(float)0xffff+lastx;
- p1.y=o2->C.y/(float)0xffff+lasty;
- p2.x=o2->B.x/(float)0xffff+lastx;
- p2.y=o2->B.y/(float)0xffff+lasty;
- p3.x=lastx;
- p3.y=lasty;
- if(log) printf("spline: %f,%f -> %f,%f\n",p3.x,p3.y,p0.x,p0.y);
- spline(tag,p0,p1,p2,p3,m);
- }
- else {
- logf("<error> drawpath: unknown outline type:%d\n", outline->type);
- }
- lastx=x;
- lasty=y;
- outline = outline->link;
+ x += (outline->dest.x/(float)0xffff);
+ y += (outline->dest.y/(float)0xffff);
+ if(outline->type == T1_PATHTYPE_MOVE)
+ {
+ if(((int)(lastx*20) != (int)(firstx*20) ||
+ (int)(lasty*20) != (int)(firsty*20)) &&
+ fill && !init)
+ {
+ plotxy p0;
+ plotxy p1;
+ p0.x=lastx;
+ p0.y=lasty;
+ p1.x=firstx;
+ p1.y=firsty;
+ if(log) printf("fix: %f,%f -> %f,%f\n",p0.x,p0.y,p1.x,p1.y);
+ line(tag, p0, p1, m);
+ }
+ firstx=x;
+ firsty=y;
+ init = 0;
+ }
+ else if(outline->type == T1_PATHTYPE_LINE)
+ {
+ plotxy p0;
+ plotxy p1;
+ p0.x=lastx;
+ p0.y=lasty;
+ p1.x=x;
+ p1.y=y;
+ if(log) printf("line: %f,%f -> %f,%f\n",p0.x,p0.y,p1.x,p1.y);
+ line(tag, p0,p1,m);
+ }
+ else if(outline->type == T1_PATHTYPE_BEZIER)
+ {
+ plotxy p0;
+ plotxy p1;
+ plotxy p2;
+ plotxy p3;
+ T1_BEZIERSEGMENT*o2 = (T1_BEZIERSEGMENT*)outline;
+ p0.x=x;
+ p0.y=y;
+ p1.x=o2->C.x/(float)0xffff+lastx;
+ p1.y=o2->C.y/(float)0xffff+lasty;
+ p2.x=o2->B.x/(float)0xffff+lastx;
+ p2.y=o2->B.y/(float)0xffff+lasty;
+ p3.x=lastx;
+ p3.y=lasty;
+ if(log) printf("spline: %f,%f -> %f,%f\n",p3.x,p3.y,p0.x,p0.y);
+ spline(tag,p0,p1,p2,p3,m);
+ }
+ else {
+ logf("<error> drawpath: unknown outline type:%d\n", outline->type);
+ }
+ lastx=x;
+ lasty=y;
+ outline = outline->link;
}
if(((int)(lastx*20) != (int)(firstx*20) ||
- (int)(lasty*20) != (int)(firsty*20)) &&
- fill)
+ (int)(lasty*20) != (int)(firsty*20)) &&
+ fill)
{
- plotxy p0;
- plotxy p1;
- p0.x=lastx;
- p0.y=lasty;
- p1.x=firstx;
- p1.y=firsty;
- if(log) printf("fix: %f,%f -> %f,%f\n",p0.x,p0.y,p1.x,p1.y);
- line(tag, p0, p1, m);
+ plotxy p0;
+ plotxy p1;
+ p0.x=lastx;
+ p0.y=lasty;
+ p1.x=firstx;
+ p1.y=firsty;
+ if(log) printf("fix: %f,%f -> %f,%f\n",p0.x,p0.y,p1.x,p1.y);
+ line(tag, p0, p1, m);
}
}
-int colorcompare(RGBA*a,RGBA*b)
+static inline int colorcompare(RGBA*a,RGBA*b)
{
if(a->r!=b->r ||
a->g!=b->g ||
a->b!=b->b ||
a->a!=b->a) {
- return 0;
+ return 0;
}
return 1;
}
} chardata[CHARDATAMAX];
int chardatapos = 0;
-void putcharacters(TAG*tag)
+static void putcharacters(TAG*tag)
{
int t;
SWFFONT font;
int advancebits=1;
if(tag->id != ST_DEFINETEXT &&
- tag->id != ST_DEFINETEXT2) {
- logf("<error> internal error: putcharacters needs an text tag, not %d\n",tag->id);
- exit(1);
+ tag->id != ST_DEFINETEXT2) {
+ logf("<error> internal error: putcharacters needs an text tag, not %d\n",tag->id);
+ exit(1);
}
if(!chardatapos) {
- logf("<warning> putcharacters called with zero characters");
+ logf("<warning> putcharacters called with zero characters");
}
for(pass = 0; pass < 2; pass++)
{
- charstorepos = 0;
- lastfontid = -1;
- lastx = CHARMIDX;
- lasty = CHARMIDY;
- lastsize = -1;
-
- if(pass==1)
- {
- advancebits++; // add sign bit
- SetU8(tag, glyphbits);
- SetU8(tag, advancebits);
+ charstorepos = 0;
+ lastfontid = -1;
+ lastx = CHARMIDX;
+ lasty = CHARMIDY;
+ lastsize = -1;
+
+ if(pass==1)
+ {
+ advancebits++; // add sign bit
+ swf_SetU8(tag, glyphbits);
+ swf_SetU8(tag, advancebits);
}
- for(t=0;t<=chardatapos;t++)
- {
- if(lastfontid != chardata[t].fontid ||
- lastx!=chardata[t].x ||
- lasty!=chardata[t].y ||
- !colorcompare(&color, &chardata[t].color) ||
- charstorepos==127 ||
- lastsize != chardata[t].size ||
- t == chardatapos)
- {
- if(charstorepos && pass==0)
- {
- int s;
- for(s=0;s<charstorepos;s++)
- {
- while(charids[s]>=(1<<glyphbits))
- glyphbits++;
- while(charadvance[s]>=(1<<advancebits))
- advancebits++;
- }
- }
- if(charstorepos && pass==1)
- {
- tag->bitcount = 0;
- SetBits(tag, 0, 1); // GLYPH Record
- SetBits(tag, charstorepos, 7); // number of glyphs
- int s;
- for(s=0;s<charstorepos;s++)
- {
- SetBits(tag, charids[s], glyphbits);
- SetBits(tag, charadvance[s], advancebits);
- }
- }
- charstorepos = 0;
-
- if(pass == 1 && t<chardatapos)
- {
- RGBA*newcolor=0;
- SWFFONT*newfont=0;
- int newx = 0;
- int newy = 0;
- if(lastx != chardata[t].x ||
- lasty != chardata[t].y)
- {
- newx=chardata[t].x;
- newy=chardata[t].y;
- }
- if(!colorcompare(&color, &chardata[t].color))
- {
- color = chardata[t].color;
- newcolor = &color;
- }
- font.id = chardata[t].fontid;
- if(lastfontid != chardata[t].fontid || lastsize != chardata[t].size)
- newfont = &font;
-
- tag->bitcount = 0;
- TextSetInfoRecord(tag, newfont, chardata[t].size, newcolor, newx,newy);
- }
-
- lastfontid = chardata[t].fontid;
- lastx = chardata[t].x;
- lasty = chardata[t].y;
- lastsize = chardata[t].size;
- }
-
- if(t==chardatapos)
- break;
-
- int advance;
- int nextt = t==chardatapos-1?t:t+1;
- int rel = chardata[nextt].x-chardata[t].x;
- if(rel>=0 && (rel<(1<<(advancebits-1)) || pass==0)) {
- advance = rel;
- lastx=chardata[nextt].x;
- }
- else {
- advance = 0;
- lastx=chardata[t].x;
- }
- charids[charstorepos] = chardata[t].charid;
- charadvance[charstorepos] = advance;
- charstorepos ++;
- }
+ for(t=0;t<=chardatapos;t++)
+ {
+ if(lastfontid != chardata[t].fontid ||
+ lastx!=chardata[t].x ||
+ lasty!=chardata[t].y ||
+ !colorcompare(&color, &chardata[t].color) ||
+ charstorepos==127 ||
+ lastsize != chardata[t].size ||
+ t == chardatapos)
+ {
+ if(charstorepos && pass==0)
+ {
+ int s;
+ for(s=0;s<charstorepos;s++)
+ {
+ while(charids[s]>=(1<<glyphbits))
+ glyphbits++;
+ while(charadvance[s]>=(1<<advancebits))
+ advancebits++;
+ }
+ }
+ if(charstorepos && pass==1)
+ {
+ tag->writeBit = 0; // Q&D
+ swf_SetBits(tag, 0, 1); // GLYPH Record
+ swf_SetBits(tag, charstorepos, 7); // number of glyphs
+ int s;
+ for(s=0;s<charstorepos;s++)
+ {
+ swf_SetBits(tag, charids[s], glyphbits);
+ swf_SetBits(tag, charadvance[s], advancebits);
+ }
+ }
+ charstorepos = 0;
+
+ if(pass == 1 && t<chardatapos)
+ {
+ RGBA*newcolor=0;
+ SWFFONT*newfont=0;
+ int newx = 0;
+ int newy = 0;
+ if(lastx != chardata[t].x ||
+ lasty != chardata[t].y)
+ {
+ newx=chardata[t].x;
+ newy=chardata[t].y;
+ }
+ if(!colorcompare(&color, &chardata[t].color))
+ {
+ color = chardata[t].color;
+ newcolor = &color;
+ }
+ font.id = chardata[t].fontid;
+ if(lastfontid != chardata[t].fontid || lastsize != chardata[t].size)
+ newfont = &font;
+
+ tag->writeBit = 0; // Q&D
+ swf_TextSetInfoRecord(tag, newfont, chardata[t].size, newcolor, newx,newy);
+ }
+
+ lastfontid = chardata[t].fontid;
+ lastx = chardata[t].x;
+ lasty = chardata[t].y;
+ lastsize = chardata[t].size;
+ }
+
+ if(t==chardatapos)
+ break;
+
+ int advance;
+ int nextt = t==chardatapos-1?t:t+1;
+ int rel = chardata[nextt].x-chardata[t].x;
+ if(rel>=0 && (rel<(1<<(advancebits-1)) || pass==0)) {
+ advance = rel;
+ lastx=chardata[nextt].x;
+ }
+ else {
+ advance = 0;
+ lastx=chardata[t].x;
+ }
+ charids[charstorepos] = chardata[t].charid;
+ charadvance[charstorepos] = advance;
+ charstorepos ++;
+ }
}
chardatapos = 0;
}
-void putcharacter(struct swfoutput*obj, int fontid, int charid,
- int x,int y, int size)
+static void putcharacter(struct swfoutput*obj, int fontid, int charid,
+ int x,int y, int size)
{
if(chardatapos == CHARDATAMAX)
{
- endtext();
- starttext(obj);
+ endtext();
+ starttext(obj);
}
chardata[chardatapos].fontid = fontid;
chardata[chardatapos].charid = charid;
/* process a character. */
-void drawchar(struct swfoutput*obj, SWFFont*font, char*character, swfmatrix*m)
+static void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int charnr, swfmatrix*m)
{
int usefonts=1;
if(m->m12!=0 || m->m21!=0)
- usefonts=0;
+ usefonts=0;
if(m->m11 != m->m22)
- usefonts=0;
+ usefonts=0;
if(usefonts && ! drawonlyshapes)
{
- int charid = font->getSWFCharID(character);
- if(shapeid>=0)
- endshape();
- if(textid<0)
- starttext(obj);
- putcharacter(obj, font->swfid, charid,(int)(m->m13*20),(int)(m->m23*20),
- (int)(m->m11*20/2+0.5)); //where does the /2 come from?
+ int charid = font->getSWFCharID(character, charnr);
+ if(shapeid>=0)
+ endshape();
+ if(textid<0)
+ starttext(obj);
+ putcharacter(obj, font->swfid, charid,(int)(m->m13*20),(int)(m->m23*20),
+ (int)(m->m11*20/2+0.5)); //where does the /2 come from?
}
else
{
- T1_OUTLINE*outline = font->getOutline(character);
- char* charname = character;
+ T1_OUTLINE*outline = font->getOutline(character);
+ char* charname = character;
- if(!outline) {
- logf("<warning> Didn't find %s in current charset (%s)",
- character,font->getName());
- return;
+ if(!outline) {
+ logf("<warning> Didn't find %s in current charset (%s)",
+ FIXNULL(character),FIXNULL(font->getName()));
+ return;
+ }
+
+ swfmatrix m2=*m;
+ m2.m11/=100;
+ m2.m21/=100;
+ m2.m12/=100;
+ m2.m22/=100;
+
+ if(textid>=0)
+ endtext();
+ if(shapeid<0)
+ startshape(obj);
+
+ if(!lastwasfill) {
+ swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0);
+ fillstylechanged = 1;
}
-
- swfmatrix m2=*m;
- m2.m11/=100;
- m2.m21/=100;
- m2.m12/=100;
- m2.m22/=100;
-
- if(textid>=0)
- endtext();
- if(shapeid<0)
- startshape(obj);
-
- if(!lastwasfill)
- ShapeSetStyle(tag,shape,0x8000,fillstyleid,0);
- lastwasfill = 1;
-
- int lf = fill;
- fill = 1;
- drawpath(tag, outline, &m2);
- fill = lf;
+ lastwasfill = 1;
+
+ int lf = fill;
+ fill = 1;
+ drawpath(tag, outline, &m2, 0);
+ fill = lf;
}
}
/* draw a curved polygon. */
void swfoutput_drawpath(swfoutput*output, T1_OUTLINE*outline,
- struct swfmatrix*m)
+ struct swfmatrix*m)
{
if(textid>=0)
- endtext();
+ endtext();
+
+ /* Multiple polygons in one shape don't overlap correctly,
+ so we better start a new shape here if the polygon is filled
+ */
+ if(shapeid>=0 && fill && !ignoredraworder) {
+ endshape();
+ }
+
if(shapeid<0)
- startshape(output);
+ startshape(output);
if(lastwasfill && !fill)
{
- ShapeSetStyle(tag,shape,linestyleid,0x8000,0);
+ swf_ShapeSetStyle(tag,shape,linestyleid,0x8000,0);
+ fillstylechanged = 1;
lastwasfill = 0;
}
if(!lastwasfill && fill)
{
- ShapeSetStyle(tag,shape,0x8000,fillstyleid,0);
+ swf_ShapeSetStyle(tag,shape,0x8000,fillstyleid,0);
+ fillstylechanged = 1;
lastwasfill = 1;
}
- drawpath(tag, outline,m);
+ drawpath(tag, outline,m, 0);
}
/* SWFFont: copy all t1 font outlines to a local
SWFFont::SWFFont(char*name, int id, char*filename)
{
if(!T1_GetFontName(id))
- T1_LoadFont(id);
+ T1_LoadFont(id);
this->name = strdup(T1_GetFontFileName(id));
this->fontid = strdup(name);
this->t1id = id;
-
+
char**a= T1_GetAllCharNames(id);
- int t=0, outlinepos=0;
+ int t, outlinepos=0;
char*map[256];
+
+ t=0;
while(a[t])
- t++;
-
+ t++;
this->charnum = t;
- if(!t)
- return;
- logf("<verbose> Font %s(%d): Storing %d outlines.\n", name, id, t);
+
+ if(!charnum)
+ return;
+ logf("<verbose> Font %s(%d): Storing %d outlines.\n", FIXNULL(name), id, charnum);
+
+ this->standardtablesize = 256;
+ if(this->charnum < this->standardtablesize)
+ this->standardtablesize = this->charnum;
+ this->standardtable = (char**)malloc(standardtablesize*sizeof(char*));
+
+ for(t = 0; t < this->standardtablesize; t++) {
+ char*name = T1_GetCharName(id,t);
+ if(!name)
+ name = "";
+ standardtable[t] = strdup(name);
+ }
- outline = (T1_OUTLINE**)malloc(t*sizeof(T1_OUTLINE*));
- charname = (char**)malloc(t*sizeof(char*));
- used = (char*)malloc(t*sizeof(char));
- char2swfcharid = (U16*)malloc(t*2);
- swfcharid2char = (U16*)malloc(t*2);
+ outline = (T1_OUTLINE**)malloc(charnum*sizeof(T1_OUTLINE*));
+ charname = (char**)malloc(charnum*sizeof(char*));
+ width = (int*)malloc(charnum*sizeof(int));
+ memset(width, 0, charnum*sizeof(int));
+ memset(charname, 0, charnum*sizeof(char*));
+ used = (char*)malloc(charnum*sizeof(char));
+ char2swfcharid = (U16*)malloc(charnum*2);
+ swfcharid2char = (U16*)malloc(charnum*2);
swfcharpos = 0;
- memset(used,0,t*sizeof(char));
+ memset(used,0,charnum*sizeof(char));
this->swfid = ++currentswfid;
-
t=0;
while(*a)
{
- map[t] = *a;
- a++;
- t++;
- if(t==256 || !*a) {
- int s;
- for(s=t;s<256;s++)
- map[s] = ".notdef";
-
- int ret = T1_ReencodeFont(id, map);
- if(ret) {
- T1_DeleteFont(id);
- T1_LoadFont(id);
- int ret = T1_ReencodeFont(id, map);
- if(ret)
- fprintf(stderr,"Can't reencode font: (%s) ret:%d\n",filename, ret);
- }
-
- // parsecharacters
- for(s=0;s<t;s++)
- {
- this->outline[outlinepos] = T1_CopyOutline(T1_GetCharOutline(id, s, 100.0, 0));
- this->charname[outlinepos] = strdup(T1_GetCharName(id, s));
- outlinepos++;
- }
- t=0;
- }
+ map[t] = *a;
+ a++;
+ t++;
+ if(t==256 || !*a) {
+ int s;
+ for(s=t;s<256;s++)
+ map[s] = ".notdef";
+
+ int ret = T1_ReencodeFont(id, map);
+ if(ret) {
+ T1_DeleteFont(id);
+ T1_LoadFont(id);
+ int ret = T1_ReencodeFont(id, map);
+ if(ret)
+ fprintf(stderr,"Can't reencode font: (%s) ret:%d\n",filename, ret);
+ }
+
+ // parsecharacters
+ for(s=0;s<t;s++)
+ {
+ char* name = T1_GetCharName(id, s);
+ if(!name) name = "";
+ this->outline[outlinepos] = T1_CopyOutline(T1_GetCharOutline(id, s, 100.0, 0));
+ this->width[outlinepos] = T1_GetCharWidth(id, s);
+ this->charname[outlinepos] = strdup(name);
+ outlinepos++;
+ }
+ t=0;
+ }
}
}
SWFFont::~SWFFont()
{
int t,usednum=0;
- int*ptr = (int*)malloc(swfcharpos*sizeof(int));
+ int*ptr;
+
+ if(storeallcharacters)
+ {
+ int t;
+ for(t=0;t<this->charnum;t++)
+ {
+ if(this->charname[t])
+ getSWFCharID(this->charname[t], -1);
+ }
+ }
+
+ ptr = (int*)malloc(swfcharpos*sizeof(int));
for(t=0;t<charnum;t++)
- if(used[t]) usednum++;
+ if(used[t]) usednum++;
if(usednum && !drawonlyshapes)
{
- logf("<verbose> Font %s has %d used characters",fontid, usednum);
- TAG*ftag = InsertTag(swf.FirstTag,ST_DEFINEFONT);
- SetU16(ftag, this->swfid);
- int initpos = GetDataSize(ftag);
- swfmatrix m;
- m.m11 = m.m22 = 1;
- m.m21 = m.m12 = 0;
- m.m13 = CHARMIDX;
- m.m23 = CHARMIDY;
- for(t=0;t<swfcharpos;t++)
- {
- ptr[t] = GetDataSize(ftag);
- SetU16(ftag, 0x1234);
+ logf("<verbose> Font %s has %d used characters",FIXNULL(fontid), usednum);
+ TAG*ftag = swf_InsertTag(swf.firstTag,ST_DEFINEFONT);
+ swf_SetU16(ftag, this->swfid);
+ int initpos = swf_GetTagLen(ftag);
+ swfmatrix m;
+ m.m11 = m.m22 = 1;
+ m.m21 = m.m12 = 0;
+ m.m13 = CHARMIDX;
+ m.m23 = CHARMIDY;
+
+ for(t=0;t<swfcharpos;t++)
+ {
+ ptr[t] = swf_GetTagLen(ftag);
+ swf_SetU16(ftag, 0x1234);
+ }
+ for(t=0;t<swfcharpos;t++)
+ {
+ *(U16*)&ftag->data[ptr[t]] =
+ SWAP16(swf_GetTagLen(ftag)-initpos);
+
+ swflastx=0;
+ swflasty=0;
+ swf_SetU8(ftag,0x10); //0 fill bits, 0 linestyle bits
+ SHAPE s;
+ s.bits.fill = 1;
+ s.bits.line = 0;
+ swf_ShapeSetStyle(ftag,&s,0,1,0);
+ fillstylechanged = 1;
+ int lastfill = fill;
+ fill = 1;
+ storefont = 1;
+ drawpath(ftag, outline[swfcharid2char[t]],&m, 0);
+ storefont = 0;
+ fill = lastfill;
+ swf_ShapeSetEnd(ftag);
+ }
+ ftag = swf_InsertTag(ftag,ST_DEFINEFONTINFO);
+ swf_SetU16(ftag, this->swfid);
+ if(this->fontid) {
+ swf_SetU8(ftag, strlen(this->fontid));
+ swf_SetBlock(ftag, (U8*)this->fontid, strlen(this->fontid));
+ } else {
+ swf_SetU8(ftag, 0);
}
+ swf_SetU8(ftag, 0); //flags
for(t=0;t<swfcharpos;t++)
{
- *(U16*)&ftag->data[ptr[t]] = GetDataSize(ftag)-initpos;
- swflastx=0;
- swflasty=0;
- SetU8(ftag,0x10); //0 fill bits, 0 linestyle bits
- SHAPE s;
- s.bits.fill = 1;
- s.bits.line = 0;
- ShapeSetStyle(ftag,&s,0,1,0);
- int lastfill = fill;
- fill = 1;
- storefont = 1;
- drawpath(ftag, outline[swfcharid2char[t]],&m);
- storefont = 0;
- fill = lastfill;
- ShapeSetEnd(ftag);
+ int s;
+ char * name = this->charname[this->swfcharid2char[t]];
+ for(s=0;s<256;s++) {
+ if(standardEncodingNames[s] &&
+ !strcmp(name,standardEncodingNames[s]))
+ break;
+ }
+ swf_SetU8(ftag, (U8)s);
}
}
free(ptr);
free(outline);
for(t=0;t<charnum;t++)
- free(charname[t]);
+ free(charname[t]);
+ for(t=0;t<standardtablesize;t++)
+ if(standardtable[t]) {
+ free(standardtable[t]);
+ }
+ free(standardtable);
free(charname);
+ free(width);
free(used);
free(swfcharid2char);
free(char2swfcharid);
{
int t;
for(t=0;t<this->charnum;t++) {
- if(!strcmp(this->charname[t],name)) {
- if(!used[t])
- {
- swfcharid2char[swfcharpos] = t;
- char2swfcharid[t] = swfcharpos;
- swfcharpos++;
- used[t] = 1;
- }
- return outline[t];
- }
+ if(!strcmp(this->charname[t],name)) {
+ if(!used[t])
+ {
+ swfcharid2char[swfcharpos] = t;
+ char2swfcharid[t] = swfcharpos;
+ swfcharpos++;
+ used[t] = 1;
+ }
+ return outline[t];
+ }
}
return 0;
}
-int SWFFont::getSWFCharID(char*name)
+int SWFFont::getWidth(char*name)
{
int t;
for(t=0;t<this->charnum;t++) {
- if(!strcmp(this->charname[t],name)) {
- if(!used[t])
- {
- swfcharid2char[swfcharpos] = t;
- char2swfcharid[t] = swfcharpos++;
- used[t] = 1;
- }
- return char2swfcharid[t];
- }
+ if(!strcmp(this->charname[t],name)) {
+ return this->width[t];
+ }
}
- logf("<warning> Didn't find character '%s' in font '%s'", name, this->name);
+ return 0;
+}
+
+int SWFFont::getSWFCharID(char*name, int charnr)
+{
+ int t;
+ for(t=0;t<this->charnum;t++) {
+ if(!strcmp(this->charname[t],name)) {
+ if(!used[t])
+ {
+ swfcharid2char[swfcharpos] = t;
+ char2swfcharid[t] = swfcharpos++;
+ used[t] = 1;
+ }
+ return char2swfcharid[t];
+ }
+ }
+ if(this->standardtable && charnr>=0 && charnr < this->standardtablesize) {
+ return getSWFCharID(this->standardtable[charnr], -1);
+ }
+ logf("<warning> Didn't find character '%s' in font '%s'", FIXNULL(name), this->name);
return 0;
}
{
fontlist_t*last=0,*iterator;
if(obj->font && !strcmp(obj->font->fontid,fontid))
- return;
+ return;
iterator = fontlist;
while(iterator) {
- if(!strcmp(iterator->font->fontid,fontid))
- break;
- last = iterator;
- iterator = iterator->next;
+ if(!strcmp(iterator->font->fontid,fontid))
+ break;
+ last = iterator;
+ iterator = iterator->next;
}
if(iterator)
{
- obj->font = iterator->font;
- return ;
+ obj->font = iterator->font;
+ return ;
}
if(t1id<0) {
- logf("<error> internal error: t1id:%d, fontid:%s\n", t1id,fontid);
+ logf("<error> internal error: t1id:%d, fontid:%s\n", t1id,FIXNULL(fontid));
}
SWFFont*font = new SWFFont(fontid, t1id, filename);
iterator->next = 0;
if(last)
- last->next = iterator;
+ last->next = iterator;
else
- fontlist = iterator;
+ fontlist = iterator;
obj->font = font;
}
{
fontlist_t *iterator = fontlist;
while(iterator) {
- if(!strcmp(iterator->font->fontid,fontid))
- return 1;
- iterator = iterator->next;
+ if(!strcmp(iterator->font->fontid,fontid))
+ return 1;
+ iterator = iterator->next;
}
return 0;
}
obj->fontm12 == m12 &&
obj->fontm21 == m21 &&
obj->fontm22 == m22)
- return;
+ return;
// if(textid>=0)
-// endtext();
+// endtext();
obj->fontm11 = m11;
obj->fontm12 = m12;
obj->fontm21 = m21;
}
/* draws a character at x,y. */
-void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character)
+void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character, int charnr)
{
swfmatrix m;
m.m11 = obj->fontm11;
m.m22 = obj->fontm22;
m.m13 = x;
m.m23 = y;
- drawchar(obj, obj->font, character, &m);
+ drawchar(obj, obj->font, character, charnr, &m);
}
/* initialize the swf writer */
memset(&swf,0x00,sizeof(SWF));
- swf.FileVersion = 4;
- swf.FrameRate = 0x0040; // 1 frame per 4 seconds
- swf.MovieSize.xmax = 20*sizex;
- swf.MovieSize.ymax = 20*sizey;
+ swf.fileVersion = 4;
+ swf.frameRate = 0x0040; // 1 frame per 4 seconds
+ swf.movieSize.xmax = 20*sizex;
+ swf.movieSize.ymax = 20*sizey;
- swf.FirstTag = InsertTag(NULL,ST_SETBACKGROUNDCOLOR);
- tag = swf.FirstTag;
+ swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR);
+ tag = swf.firstTag;
rgb.r = 0xff;
rgb.g = 0xff;
rgb.b = 0xff;
- SetRGB(tag,&rgb);
- if(flag_protected)
- tag = InsertTag(tag, ST_PROTECT);
+ swf_SetRGB(tag,&rgb);
+ if(flag_protected) // good practice! /r
+ tag = swf_InsertTag(tag, ST_PROTECT);
depth = 1;
startdepth = depth;
}
flag_protected = 1;
}
-void startshape(struct swfoutput*obj)
+static void startshape(struct swfoutput*obj)
{
RGBA rgb;
SRECT r;
if(textid>=0)
endtext();
- tag = InsertTag(tag,ST_DEFINESHAPE);
+ tag = swf_InsertTag(tag,ST_DEFINESHAPE);
- NewShape(&shape);
- linestyleid = ShapeAddLineStyle(shape,obj->linewidth,&obj->strokergb);
+ swf_ShapeNew(&shape);
+ linestyleid = swf_ShapeAddLineStyle(shape,obj->linewidth,&obj->strokergb);
rgb.r = obj->fillrgb.r;
rgb.g = obj->fillrgb.g;
rgb.b = obj->fillrgb.b;
- fillstyleid = ShapeAddSolidFillStyle(shape,&obj->fillrgb);
+ fillstyleid = swf_ShapeAddSolidFillStyle(shape,&obj->fillrgb);
shapeid = ++currentswfid;
- SetU16(tag,shapeid); // ID
+ swf_SetU16(tag,shapeid); // ID
r.xmin = 0;
r.ymin = 0;
r.xmax = 20*sizex;
r.ymax = 20*sizey;
- SetRect(tag,&r);
+ swf_SetRect(tag,&r);
- SetShapeStyles(tag,shape);
- ShapeCountBits(shape,NULL,NULL);
- SetShapeBits(tag,shape);
+ swf_SetShapeStyles(tag,shape);
+ swf_ShapeCountBits(shape,NULL,NULL);
+ swf_SetShapeBits(tag,shape);
- ShapeSetAll(tag,shape,/*x*/0,/*y*/0,linestyleid,0,0);
+ swf_ShapeSetAll(tag,shape,/*x*/0,/*y*/0,linestyleid,0,0);
swflastx=swflasty=0;
lastwasfill = 0;
}
-void starttext(struct swfoutput*obj)
+static void starttext(struct swfoutput*obj)
{
SRECT r;
MATRIX m;
if(shapeid>=0)
endshape();
- tag = InsertTag(tag,ST_DEFINETEXT);
+ tag = swf_InsertTag(tag,ST_DEFINETEXT);
textid = ++currentswfid;
- SetU16(tag, textid);
+ swf_SetU16(tag, textid);
r.xmin = 0;
r.ymin = 0;
r.xmax = 20*sizex;
r.ymax = 20*sizey;
- SetRect(tag,&r);
+ swf_SetRect(tag,&r);
m.sx = 65536;
m.sy = 65536;
m.tx = 0;
m.ty = 0;
- SetMatrix(tag,&m);
+ swf_SetMatrix(tag,&m);
swflastx=swflasty=0;
}
-void endshape()
+static void endshape()
{
if(shapeid<0)
- return;
- ShapeSetEnd(tag);
- tag = InsertTag(tag,ST_PLACEOBJECT2);
- ObjectPlace(tag,shapeid,/*depth*/depth++,NULL,NULL,NULL);
+ return;
+ swf_ShapeSetEnd(tag);
+ tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
+ swf_ObjectPlace(tag,shapeid,/*depth*/depth++,NULL,NULL,NULL);
shapeid = -1;
}
-void endtext()
+static void endtext()
{
if(textid<0)
- return;
+ return;
putcharacters(tag);
- SetU8(tag,0);
- tag = InsertTag(tag,ST_PLACEOBJECT2);
- ObjectPlace(tag,textid,/*depth*/depth++,NULL,NULL,NULL);
+ swf_SetU8(tag,0);
+ tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
+ swf_ObjectPlace(tag,textid,/*depth*/depth++,NULL,NULL,NULL);
textid = -1;
}
-void endpage(struct swfoutput*obj)
+static void endpage(struct swfoutput*obj)
{
if(shapeid>=0)
endshape();
if(textid>=0)
endtext();
while(clippos)
- swfoutput_endclip(obj);
- tag = InsertTag(tag,ST_SHOWFRAME);
+ swfoutput_endclip(obj);
+ tag = swf_InsertTag(tag,ST_SHOWFRAME);
}
void swfoutput_newpage(struct swfoutput*obj)
endpage(obj);
for(depth--;depth>=startdepth;depth--) {
- tag = InsertTag(tag,ST_REMOVEOBJECT2);
- SetU16(tag,depth);
+ tag = swf_InsertTag(tag,ST_REMOVEOBJECT2);
+ swf_SetU16(tag,depth);
}
depth = 1;
endpage(obj);
fontlist_t *tmp,*iterator = fontlist;
while(iterator) {
- delete iterator->font;
- iterator->font = 0;
- tmp = iterator;
- iterator = iterator->next;
- delete tmp;
+ delete iterator->font;
+ iterator->font = 0;
+ tmp = iterator;
+ iterator = iterator->next;
+ delete tmp;
}
T1_CloseLib();
if(!filename)
- return;
+ return;
if(filename)
fi = open(filename, O_CREAT|O_TRUNC|O_WRONLY, 0777);
else
fi = 1; // stdout
if(fi<=0) {
- logf("<fatal> Could not create \"%s\". ", filename);
+ logf("<fatal> Could not create \"%s\". ", FIXNULL(filename));
exit(1);
}
- tag = InsertTag(tag,ST_END);
+ tag = swf_InsertTag(tag,ST_END);
+
+ if(enablezlib) {
+ if FAILED(swf_WriteSWC(fi,&swf))
+ logf("<error> WriteSWC() failed.\n");
+ } else {
+ if FAILED(swf_WriteSWF(fi,&swf))
+ logf("<error> WriteSWF() failed.\n");
+ }
- if FAILED(WriteSWF(fi,&swf))
- logf("<error> WriteSWF() failed.\n");
if(filename)
close(fi);
logf("<notice> SWF written\n");
obj->fillrgb.g == g &&
obj->fillrgb.b == b &&
obj->fillrgb.a == a) return;
-
if(shapeid>=0)
endshape();
+
obj->fillrgb.r = r;
obj->fillrgb.g = g;
obj->fillrgb.b = b;
void swfoutput_setlinewidth(struct swfoutput*obj, double linewidth)
{
if(obj->linewidth == (u16)(linewidth*20))
- return;
+ return;
if(shapeid>=0)
endshape();
if(clippos >= 127)
{
- logf("<warning> Too many clip levels.");
- clippos --;
+ logf("<warning> Too many clip levels.");
+ clippos --;
}
startshape(obj);
int olddrawmode = drawmode;
swfoutput_setdrawmode(obj, DRAWMODE_CLIP);
swfoutput_drawpath(obj, outline, m);
- ShapeSetEnd(tag);
+ swf_ShapeSetEnd(tag);
swfoutput_setdrawmode(obj, olddrawmode);
- tag = InsertTag(tag,ST_PLACEOBJECT2);
+ tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
cliptags[clippos] = tag;
clipshapes[clippos] = shapeid;
clipdepths[clippos] = depth++;
endshape();
if(!clippos) {
- logf("<error> Invalid end of clipping region");
- return;
+ logf("<error> Invalid end of clipping region");
+ return;
}
clippos--;
- PlaceObject(cliptags[clippos],clipshapes[clippos],clipdepths[clippos],NULL,NULL,NULL,depth++);
+ swf_ObjectPlaceClip(cliptags[clippos],clipshapes[clippos],clipdepths[clippos],NULL,NULL,NULL,depth++);
}
+static void drawlink(struct swfoutput*obj, ActionTAG*,ActionTAG*, swfcoord*points, char mouseover);
-void drawimage(struct swfoutput*obj, int bitid, int sizex,int sizey,
- double x1,double y1,
- double x2,double y2,
- double x3,double y3,
- double x4,double y4)
+void swfoutput_linktourl(struct swfoutput*obj, char*url, swfcoord*points)
+{
+ ActionTAG* actions;
+
+ if(shapeid>=0)
+ endshape();
+ if(textid>=0)
+ endtext();
+
+ if(opennewwindow)
+ actions = action_GetUrl(0, url, "_parent");
+ else
+ actions = action_GetUrl(0, url, "_this");
+ actions = action_End(actions);
+
+ drawlink(obj, actions, 0, points,0);
+}
+void swfoutput_linktopage(struct swfoutput*obj, int page, swfcoord*points)
+{
+ ActionTAG* actions;
+
+ if(shapeid>=0)
+ endshape();
+ if(textid>=0)
+ endtext();
+
+ actions = action_GotoFrame(0, page);
+ actions = action_End(actions);
+
+ drawlink(obj, actions, 0, points,0);
+}
+void swfoutput_namedlink(struct swfoutput*obj, char*name, swfcoord*points)
+{
+ ActionTAG *actions1,*actions2;
+
+ if(shapeid>=0)
+ endshape();
+ if(textid>=0)
+ endtext();
+
+ actions1 = action_PushString(0, "/:subtitle");
+ actions1 = action_PushString(actions1, name);
+ actions1 = action_SetVariable(actions1);
+ actions1 = action_End(actions1);
+
+ actions2 = action_PushString(0, "/:subtitle");
+ actions2 = action_PushString(actions2, "");
+ actions2 = action_SetVariable(actions2);
+ actions2 = action_End(actions2);
+
+ drawlink(obj, actions1, actions2, points,1);
+
+ swf_ActionFree(actions1);
+ swf_ActionFree(actions2);
+}
+
+static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions2, swfcoord*points, char mouseover)
+{
+ RGBA rgb;
+ SRECT r;
+ int lsid=0;
+ int fsid;
+ struct plotxy p1,p2,p3,p4;
+ int myshapeid;
+ int myshapeid2;
+ double xmin,ymin;
+ double xmax=xmin=points[0].x,ymax=ymin=points[0].y;
+ double posx = 0;
+ double posy = 0;
+ int t;
+ int buttonid = ++currentswfid;
+ for(t=1;t<4;t++)
+ {
+ if(points[t].x>xmax) xmax=points[t].x;
+ if(points[t].y>ymax) ymax=points[t].y;
+ if(points[t].x<xmin) xmin=points[t].x;
+ if(points[t].y<ymin) ymin=points[t].y;
+ }
+
+ p1.x=points[0].x; p1.y=points[0].y; p2.x=points[1].x; p2.y=points[1].y;
+ p3.x=points[2].x; p3.y=points[2].y; p4.x=points[3].x; p4.y=points[3].y;
+
+ /* the following code subtracts the upper left edge from all coordinates,
+ and set's posx,posy so that ST_PLACEOBJECT is used with a matrix.
+ Necessary for preprocessing with swfcombine. */
+ posx = xmin; posy = ymin;
+ p1.x-=posx;p2.x-=posx;p3.x-=posx;p4.x-=posx;
+ p1.y-=posy;p2.y-=posy;p3.y-=posy;p4.y-=posy;
+ xmin -= posx; ymin -= posy;
+ xmax -= posx; ymax -= posy;
+
+ /* shape */
+ myshapeid = ++currentswfid;
+ tag = swf_InsertTag(tag,ST_DEFINESHAPE3);
+ swf_ShapeNew(&shape);
+ rgb.r = rgb.b = rgb.a = rgb.g = 0;
+ fsid = swf_ShapeAddSolidFillStyle(shape,&rgb);
+ swf_SetU16(tag, myshapeid);
+ r.xmin = (int)(xmin*20);
+ r.ymin = (int)(ymin*20);
+ r.xmax = (int)(xmax*20);
+ r.ymax = (int)(ymax*20);
+ swf_SetRect(tag,&r);
+ swf_SetShapeStyles(tag,shape);
+ swf_ShapeCountBits(shape,NULL,NULL);
+ swf_SetShapeBits(tag,shape);
+ swf_ShapeSetAll(tag,shape,/*x*/0,/*y*/0,0,fsid,0);
+ swflastx = swflasty = 0;
+ moveto(tag, p1);
+ lineto(tag, p2);
+ lineto(tag, p3);
+ lineto(tag, p4);
+ lineto(tag, p1);
+ swf_ShapeSetEnd(tag);
+
+ /* shape2 */
+ myshapeid2 = ++currentswfid;
+ tag = swf_InsertTag(tag,ST_DEFINESHAPE3);
+ swf_ShapeNew(&shape);
+ rgb.r = rgb.b = rgb.a = rgb.g = 255;
+ rgb.a = 40;
+ fsid = swf_ShapeAddSolidFillStyle(shape,&rgb);
+ swf_SetU16(tag, myshapeid2);
+ r.xmin = (int)(xmin*20);
+ r.ymin = (int)(ymin*20);
+ r.xmax = (int)(xmax*20);
+ r.ymax = (int)(ymax*20);
+ swf_SetRect(tag,&r);
+ swf_SetShapeStyles(tag,shape);
+ swf_ShapeCountBits(shape,NULL,NULL);
+ swf_SetShapeBits(tag,shape);
+ swf_ShapeSetAll(tag,shape,/*x*/0,/*y*/0,0,fsid,0);
+ swflastx = swflasty = 0;
+ moveto(tag, p1);
+ lineto(tag, p2);
+ lineto(tag, p3);
+ lineto(tag, p4);
+ lineto(tag, p1);
+ swf_ShapeSetEnd(tag);
+
+ if(!mouseover)
+ {
+ tag = swf_InsertTag(tag,ST_DEFINEBUTTON);
+ swf_SetU16(tag,buttonid); //id
+ swf_ButtonSetFlags(tag, 0); //menu=no
+ swf_ButtonSetRecord(tag,0x01,myshapeid,depth,0,0);
+ swf_ButtonSetRecord(tag,0x02,myshapeid2,depth,0,0);
+ swf_ButtonSetRecord(tag,0x04,myshapeid2,depth,0,0);
+ swf_ButtonSetRecord(tag,0x08,myshapeid,depth,0,0);
+ swf_SetU8(tag,0);
+ swf_ActionSet(tag,actions1);
+ swf_SetU8(tag,0);
+ }
+ else
+ {
+ tag = swf_InsertTag(tag,ST_DEFINEBUTTON2);
+ swf_SetU16(tag,buttonid); //id
+ swf_ButtonSetFlags(tag, 0); //menu=no
+ swf_ButtonSetRecord(tag,0x01,myshapeid,depth,0,0);
+ swf_ButtonSetRecord(tag,0x02,myshapeid2,depth,0,0);
+ swf_ButtonSetRecord(tag,0x04,myshapeid2,depth,0,0);
+ swf_ButtonSetRecord(tag,0x08,myshapeid,depth,0,0);
+ swf_SetU8(tag,0); // end of button records
+ swf_ButtonSetCondition(tag, BC_IDLE_OVERUP);
+ swf_ActionSet(tag,actions1);
+ if(actions2) {
+ swf_ButtonSetCondition(tag, BC_OVERUP_IDLE);
+ swf_ActionSet(tag,actions2);
+ swf_SetU8(tag,0);
+ swf_ButtonPostProcess(tag, 2);
+ } else {
+ swf_SetU8(tag,0);
+ swf_ButtonPostProcess(tag, 1);
+ }
+ }
+
+ tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
+
+ if(posx!=0 || posy!=0) {
+ MATRIX m;
+ swf_GetMatrix(0,&m);
+ m.tx = (int)(posx*20);
+ m.ty = (int)(posy*20);
+ swf_ObjectPlace(tag, buttonid, depth++,&m,0,0);
+ }
+ else {
+ swf_ObjectPlace(tag, buttonid, depth++,0,0,0);
+ }
+}
+
+static void drawimage(struct swfoutput*obj, int bitid, int sizex,int sizey,
+ double x1,double y1,
+ double x2,double y2,
+ double x3,double y3,
+ double x4,double y4)
{
RGBA rgb;
SRECT r;
/* shape */
myshapeid = ++currentswfid;
- tag = InsertTag(tag,ST_DEFINESHAPE);
- NewShape(&shape);
+ tag = swf_InsertTag(tag,ST_DEFINESHAPE);
+ swf_ShapeNew(&shape);
//lsid = ShapeAddLineStyle(shape,obj->linewidth,&obj->strokergb);
//fsid = ShapeAddSolidFillStyle(shape,&obj->fillrgb);
- fsid = ShapeAddBitmapFillStyle(shape,&m,bitid,0);
- SetU16(tag, myshapeid);
+ fsid = swf_ShapeAddBitmapFillStyle(shape,&m,bitid,0);
+ swf_SetU16(tag, myshapeid);
r.xmin = (int)(xmin*20);
r.ymin = (int)(ymin*20);
r.xmax = (int)(xmax*20);
r.ymax = (int)(ymax*20);
- SetRect(tag,&r);
- SetShapeStyles(tag,shape);
- ShapeCountBits(shape,NULL,NULL);
- SetShapeBits(tag,shape);
- ShapeSetAll(tag,shape,/*x*/0,/*y*/0,lsid,fsid,0);
+ swf_SetRect(tag,&r);
+ swf_SetShapeStyles(tag,shape);
+ swf_ShapeCountBits(shape,NULL,NULL);
+ swf_SetShapeBits(tag,shape);
+ swf_ShapeSetAll(tag,shape,/*x*/0,/*y*/0,lsid,fsid,0);
swflastx = swflasty = 0;
moveto(tag, p1);
lineto(tag, p2);
ShapeSetLine (tag, shape, x*20,0);
ShapeSetLine (tag, shape, 0,-y*20);
ShapeSetLine (tag, shape, -x*20,0);*/
- ShapeSetEnd(tag);
+ swf_ShapeSetEnd(tag);
/* instance */
- tag = InsertTag(tag,ST_PLACEOBJECT2);
- ObjectPlace(tag,myshapeid,/*depth*/depth++,NULL,NULL,NULL);
+ tag = swf_InsertTag(tag,ST_PLACEOBJECT2);
+ swf_ObjectPlace(tag,myshapeid,/*depth*/depth++,NULL,NULL,NULL);
}
-int swfoutput_drawimagejpeg(struct swfoutput*obj, char*filename, int sizex,int sizey,
- double x1,double y1,
- double x2,double y2,
- double x3,double y3,
- double x4,double y4)
+int swfoutput_drawimagejpeg_old(struct swfoutput*obj, char*filename, int sizex,int sizey,
+ double x1,double y1,
+ double x2,double y2,
+ double x3,double y3,
+ double x4,double y4)
{
+ TAG*oldtag;
if(shapeid>=0)
endshape();
if(textid>=0)
endtext();
int bitid = ++currentswfid;
- tag = InsertTag(tag,ST_DEFINEBITSJPEG2);
- SetU16(tag, bitid);
- SetJPEGBits(tag, filename, jpegquality);
+ oldtag = tag;
+ tag = swf_InsertTag(tag,ST_DEFINEBITSJPEG2);
+ swf_SetU16(tag, bitid);
+ if(swf_SetJPEGBits(tag, filename, jpegquality)<0) {
+ swf_DeleteTag(tag);
+ tag = oldtag;
+ return -1;
+ }
drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4);
return bitid;
}
+int swfoutput_drawimagejpeg(struct swfoutput*obj, RGBA*mem, int sizex,int sizey,
+ double x1,double y1,
+ double x2,double y2,
+ double x3,double y3,
+ double x4,double y4)
+{
+ TAG*oldtag;
+ JPEGBITS*jpeg;
+
+ if(shapeid>=0)
+ endshape();
+ if(textid>=0)
+ endtext();
+
+ int bitid = ++currentswfid;
+ oldtag = tag;
+ tag = swf_InsertTag(tag,ST_DEFINEBITSJPEG2);
+ swf_SetU16(tag, bitid);
+ swf_SetJPEGBits2(tag,sizex,sizey,mem,jpegquality);
+ drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4);
+ return bitid;
+}
+
int swfoutput_drawimagelossless(struct swfoutput*obj, RGBA*mem, int sizex,int sizey,
- double x1,double y1,
- double x2,double y2,
- double x3,double y3,
- double x4,double y4)
+ double x1,double y1,
+ double x2,double y2,
+ double x3,double y3,
+ double x4,double y4)
{
+ TAG*oldtag;
if(shapeid>=0)
endshape();
if(textid>=0)
endtext();
int bitid = ++currentswfid;
- tag = InsertTag(tag,ST_DEFINEBITSLOSSLESS);
- SetU16(tag, bitid);
- SetLosslessBits(tag,sizex,sizey,mem, BMF_32BIT);
+ oldtag = tag;
+ tag = swf_InsertTag(tag,ST_DEFINEBITSLOSSLESS);
+ swf_SetU16(tag, bitid);
+ if(swf_SetLosslessBits(tag,sizex,sizey,mem, BMF_32BIT)<0) {
+ swf_DeleteTag(tag);
+ tag = oldtag;
+ return -1;
+ }
drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4);
return bitid;
}
int swfoutput_drawimagelossless256(struct swfoutput*obj, U8*mem, RGBA*pal, int sizex,int sizey,
- double x1,double y1,
- double x2,double y2,
- double x3,double y3,
- double x4,double y4)
+ double x1,double y1,
+ double x2,double y2,
+ double x3,double y3,
+ double x4,double y4)
{
+ TAG*oldtag;
+ U8*mem2 = 0;
if(shapeid>=0)
endshape();
if(textid>=0)
endtext();
+ if(sizex&3)
+ {
+ /* SWF expects scanlines to be 4 byte aligned */
+ int x,y;
+ U8*ptr;
+ mem2 = (U8*)malloc(BYTES_PER_SCANLINE(sizex)*sizey);
+ ptr = mem2;
+ for(y=0;y<sizey;y++)
+ {
+ for(x=0;x<sizex;x++)
+ *ptr++ = mem[y*sizex+x];
+ ptr+= BYTES_PER_SCANLINE(sizex)-sizex;
+ }
+ mem = mem2;
+ }
+
int bitid = ++currentswfid;
- tag = InsertTag(tag,ST_DEFINEBITSLOSSLESS2);
- SetU16(tag, bitid);
- SetLosslessBitsIndexed(tag,sizex,sizey,mem, pal, 256);
+ oldtag = tag;
+ tag = swf_InsertTag(tag,ST_DEFINEBITSLOSSLESS2);
+ swf_SetU16(tag, bitid);
+ if(swf_SetLosslessBitsIndexed(tag,sizex,sizey,mem, pal, 256)<0) {
+ swf_DeleteTag(tag);
+ tag = oldtag;
+ return -1;
+ }
+ if(mem2)
+ free(mem2);
drawimage(obj, bitid, sizex, sizey, x1,y1,x2,y2,x3,y3,x4,y4);
return bitid;
}
void swfoutput_drawimageagain(struct swfoutput*obj, int id, int sizex,int sizey,
- double x1,double y1,
- double x2,double y2,
- double x3,double y3,
- double x4,double y4)
+ double x1,double y1,
+ double x2,double y2,
+ double x3,double y3,
+ double x4,double y4)
{
+ if(id<0) return;
if(shapeid>=0)
endshape();
if(textid>=0)