int CHARMIDX = 0;
int CHARMIDY = 0;
-void startshape(struct swfoutput* obj);
-void starttext(struct swfoutput* obj);
-void endshape();
-void endtext();
+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);
}
// 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);
}
// 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);
/* 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];
}
}
+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 &&
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;
}
}
-int colorcompare(RGBA*a,RGBA*b)
+static inline int colorcompare(RGBA*a,RGBA*b)
{
if(a->r!=b->r ||
} chardata[CHARDATAMAX];
int chardatapos = 0;
-void putcharacters(TAG*tag)
+static void putcharacters(TAG*tag)
{
int t;
SWFFONT font;
chardatapos = 0;
}
-void putcharacter(struct swfoutput*obj, int fontid, int charid,
+static void putcharacter(struct swfoutput*obj, int fontid, int charid,
int x,int y, int size)
{
if(chardatapos == CHARDATAMAX)
/* process a character. */
-void drawchar(struct swfoutput*obj, SWFFont*font, char*character, int charnr, 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)
int lf = fill;
fill = 1;
- drawpath(tag, outline, &m2);
+ drawpath(tag, outline, &m2, 0);
fill = lf;
}
}
lastwasfill = 1;
}
- drawpath(tag, outline,m);
+ drawpath(tag, outline,m, 0);
}
/* SWFFont: copy all t1 font outlines to a local
logf("<verbose> Font %s has %d used characters",fontid, usednum);
TAG*ftag = swf_InsertTag(swf.firstTag,ST_DEFINEFONT);
swf_SetU16(ftag, this->swfid);
- int initpos = swf_GetDataSize(ftag);
+ int initpos = swf_GetTagLen(ftag);
swfmatrix m;
m.m11 = m.m22 = 1;
m.m21 = m.m12 = 0;
for(t=0;t<swfcharpos;t++)
{
- ptr[t] = swf_GetDataSize(ftag);
+ ptr[t] = swf_GetTagLen(ftag);
swf_SetU16(ftag, 0x1234);
}
for(t=0;t<swfcharpos;t++)
{
- *(U16*)&ftag->data[ptr[t]] = swf_GetDataSize(ftag)-initpos;
+ *(U16*)&ftag->data[ptr[t]] =
+ SWAP16(swf_GetTagLen(ftag)-initpos);
+
swflastx=0;
swflasty=0;
swf_SetU8(ftag,0x10); //0 fill bits, 0 linestyle bits
int lastfill = fill;
fill = 1;
storefont = 1;
- drawpath(ftag, outline[swfcharid2char[t]],&m);
+ drawpath(ftag, outline[swfcharid2char[t]],&m, 0);
storefont = 0;
fill = lastfill;
swf_ShapeSetEnd(ftag);
return 0;
}
+int SWFFont::getWidth(char*name)
+{
+ int t;
+ for(t=0;t<this->charnum;t++) {
+ if(!strcmp(this->charname[t],name)) {
+ return this->width[t];
+ }
+ }
+ return 0;
+}
+
int SWFFont::getSWFCharID(char*name, int charnr)
{
int t;
flag_protected = 1;
}
-void startshape(struct swfoutput*obj)
+static void startshape(struct swfoutput*obj)
{
RGBA rgb;
SRECT r;
lastwasfill = 0;
}
-void starttext(struct swfoutput*obj)
+static void starttext(struct swfoutput*obj)
{
SRECT r;
MATRIX m;
swflastx=swflasty=0;
}
-void endshape()
+static void endshape()
{
if(shapeid<0)
return;
shapeid = -1;
}
-void endtext()
+static void endtext()
{
if(textid<0)
return;
textid = -1;
}
-void endpage(struct swfoutput*obj)
+static void endpage(struct swfoutput*obj)
{
if(shapeid>=0)
endshape();
swf_ObjectPlaceClip(cliptags[clippos],clipshapes[clippos],clipdepths[clippos],NULL,NULL,NULL,depth++);
}
-void drawlink(struct swfoutput*obj, ActionTAG*, swfcoord*points);
+static void drawlink(struct swfoutput*obj, ActionTAG*,ActionTAG*, swfcoord*points, char mouseover);
void swfoutput_linktourl(struct swfoutput*obj, char*url, swfcoord*points)
{
action_End();
swf_ActionEnd();
- drawlink(obj, actions, points);
+ drawlink(obj, actions, 0, points,0);
}
void swfoutput_linktopage(struct swfoutput*obj, int page, swfcoord*points)
{
action_End();
swf_ActionEnd();
- drawlink(obj, actions, points);
+ 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 = swf_ActionStart();
+ action_PushString("/:subtitle");
+ action_PushString(name);
+ action_SetVariable();
+ action_End();
+ swf_ActionEnd();
+
+ actions2 = swf_ActionStart();
+ action_PushString("/:subtitle");
+ action_PushString("");
+ action_SetVariable();
+ action_End();
+ swf_ActionEnd();
+
+ drawlink(obj, actions1, actions2, points,1);
+
+ swf_ActionFree(actions1);
+ swf_ActionFree(actions2);
}
-void drawlink(struct swfoutput*obj, ActionTAG*actions, swfcoord*points)
+static void drawlink(struct swfoutput*obj, ActionTAG*actions1, ActionTAG*actions2, swfcoord*points, char mouseover)
{
RGBA rgb;
SRECT r;
lineto(tag, p1);
swf_ShapeSetEnd(tag);
- 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,actions);
- swf_SetU8(tag,0);
+ 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);
swf_ObjectPlace(tag, buttonid, depth++,0,0,0);
}
-void drawimage(struct swfoutput*obj, int bitid, int sizex,int sizey,
+static void drawimage(struct swfoutput*obj, int bitid, int sizex,int sizey,
double x1,double y1,
double x2,double y2,
double x3,double y3,