typedef struct _swfoutput_internal
{
+ SWF swf;
+
fontlist_t* fontlist;
char storefont;
-
- SWF swf;
+
+ MATRIX page_matrix;
+
TAG *tag;
int currentswfid;
int depth;
chardata_t chardata[CHARDATAMAX];
int chardatapos;
int firstpage;
+ char pagefinished;
} swfoutput_internal;
static swfoutput_internal* init_internal_struct()
i->bboxrectpos = -1;
i->chardatapos = 0;
i->firstpage = 1;
+ i->pagefinished = 1;
return i;
};
putcharacters(obj, i->tag);
swf_SetU8(i->tag,0);
i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2);
- swf_ObjectPlace(i->tag,i->textid,/*depth*/i->depth++,&obj->fontmatrix,NULL,NULL);
+ //swf_ObjectPlace(i->tag,i->textid,/*depth*/i->depth++,&i->page_matrix,NULL,NULL);
+ MATRIX m2;
+ swf_MatrixJoin(&m2,&obj->fontmatrix, &i->page_matrix);
+
+ swf_ObjectPlace(i->tag,i->textid,/*depth*/i->depth++,&m2,NULL,NULL);
i->textid = -1;
}
}
}
- if(u>0) {
+ if(u>0 && font->encoding != 255) {
/* try to use the unicode id */
if(u>=0 && u<font->maxascii && font->ascii2glyph[u]>=0) {
msg("<debug> Char [%d,%s,>%d<] maps to %d\n", charnr, charname, u, font->ascii2glyph[u]);
msg("<warning> Couldn't load font %s (%s)", fontid, filename);
swffont = swf_LoadFont(0);
}
+
+ if(swffont->glyph2ascii) {
+ int t;
+ int bad = 0;
+ /* check whether the Unicode indices look o.k.
+ If they don't, disable the unicode lookup by setting
+ the encoding to 255 */
+ for(t=0;t<swffont->numchars;t++) {
+ int c = swffont->glyph2ascii[t];
+ if(c && c < 32 && swffont->glyph[t].shape->bitlen > 16) {
+ // the character maps into the unicode control character range
+ // between 0001-001f. Yet it is not empty. Treat the one
+ // mapping as broken, and look how many of those we find.
+ bad ++;
+ }
+ }
+ if(bad>5) {
+ msg("<warning> Font %s has bad unicode mapping", swffont->name);
+ swffont->encoding = 255;
+ }
+ }
swf_FontSetID(swffont, ++i->currentswfid);
- if(screenloglevel >= LOGLEVEL_DEBUG) {
+ if(getScreenLogLevel() >= LOGLEVEL_DEBUG) {
// print font information
msg("<debug> Font %s (%s)",swffont->name, filename);
msg("<debug> | ID: %d", swffont->id);
endtext(obj);
while(i->clippos)
swfoutput_endclip(obj);
+ i->pagefinished = 1;
+}
+
+void swfoutput_pagefeed(struct swfoutput*obj)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+
+ if(!i->pagefinished)
+ endpage(obj);
if(config_insertstoptag) {
ActionTAG*atag=0;
i->tag = swf_InsertTag(i->tag,ST_SHOWFRAME);
}
-void swfoutput_newpage(struct swfoutput*obj, int pageNum, int x1, int y1, int x2, int y2)
+void swfoutput_newpage(struct swfoutput*obj, int pageNum, int movex, int movey, int x1, int y1, int x2, int y2)
{
swfoutput_internal*i = (swfoutput_internal*)obj->internal;
- if(!i->firstpage)
+ if(!i->firstpage && !i->pagefinished)
endpage(obj);
+ swf_GetMatrix(0, &i->page_matrix);
+ i->page_matrix.tx = movex*20;
+ i->page_matrix.ty = movey*20;
+
for(i->depth--;i->depth>=i->startdepth;i->depth--) {
i->tag = swf_InsertTag(i->tag,ST_REMOVEOBJECT2);
swf_SetU16(i->tag,i->depth);
}
+ /* TODO: this should all be done in SWFOutputDev */
+
i->depth = i->startdepth = 3; /* leave room for clip and background rectangle */
i->sizex = x2;
swf_ExpandRect2(&i->swf.movieSize, &i->lastpagesize);
i->firstpage = 0;
+ i->pagefinished = 0;
}
/* initialize the swf writer */
changeRect(obj, i->tag, i->bboxrectpos, &i->bboxrect);
i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2);
+
if(clipdepth)
- swf_ObjectPlaceClip(i->tag,i->shapeid,i->depth++,NULL,NULL,NULL,clipdepth);
+ swf_ObjectPlaceClip(i->tag,i->shapeid,i->depth++,&i->page_matrix,NULL,NULL,clipdepth);
else
- swf_ObjectPlace(i->tag,i->shapeid,/*depth*/i->depth++,NULL,NULL,NULL);
+ swf_ObjectPlace(i->tag,i->shapeid,/*depth*/i->depth++,&i->page_matrix,NULL,NULL);
swf_ShapeFree(i->shape);
i->shape = 0;
i->bboxrectpos = -1;
}
-void swfoutput_save(struct swfoutput* obj, char*filename)
+void swfoutput_finalize(struct swfoutput*obj)
{
swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+
+ if(i->tag && i->tag->id == ST_END)
+ return; //already done
+
endpage(obj);
fontlist_t *tmp,*iterator = i->fontlist;
while(iterator) {
iterator = iterator->next;
}
- int fi;
+ i->tag = swf_InsertTag(i->tag,ST_END);
+}
+
+SWF* swfoutput_get(struct swfoutput*obj)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+
+ swfoutput_finalize(obj);
+
+ return swf_CopySWF(&i->swf);
+}
+
+void swfoutput_getdimensions(struct swfoutput*obj, int*x1, int*y1, int*x2, int*y2)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ if(x1) *x1 = i->swf.movieSize.xmin/20;
+ if(y1) *y1 = i->swf.movieSize.ymin/20;
+ if(x2) *x2 = i->swf.movieSize.xmax/20;
+ if(y2) *y2 = i->swf.movieSize.ymax/20;
+}
+int swfoutput_save(struct swfoutput* obj, char*filename)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ swfoutput_finalize(obj);
+
+ int fi;
if(filename)
fi = open(filename, O_BINARY|O_CREAT|O_TRUNC|O_WRONLY, 0777);
else
if(fi<=0) {
msg("<fatal> Could not create \"%s\". ", FIXNULL(filename));
- exit(1);
+ return 0;
}
-
- i->tag = swf_InsertTag(i->tag,ST_END);
-
+
if(config_enablezlib || config_flashversion>=6) {
if FAILED(swf_WriteSWC(fi,&i->swf))
msg("<error> WriteSWC() failed.\n");
if(filename)
close(fi);
msg("<notice> SWF written\n");
+ return 1;
}
/* Perform cleaning up, complete the swf, and write it out. */
void swfoutput_destroy(struct swfoutput* obj)
{
swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ if(!i) {
+ /* not initialized yet- nothing to destroy */
+ return;
+ }
fontlist_t *tmp,*iterator = i->fontlist;
while(iterator) {
if(iterator->swffont) {
- swf_FontFree(iterator->swffont);
+ swf_FontFree(iterator->swffont);iterator->swffont=0;
}
tmp = iterator;
iterator = iterator->next;
return;
}
i->clippos--;
- swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],NULL,NULL,NULL,i->depth++);
+ swf_ObjectPlaceClip(i->cliptags[i->clippos],i->clipshapes[i->clippos],i->clipdepths[i->clippos],&i->page_matrix,NULL,NULL,i->depth++);
}
static void drawlink(struct swfoutput*obj, ActionTAG*,ActionTAG*, swfcoord*points, char mouseover);
i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2);
if(posx!=0 || posy!=0) {
+ SPOINT p;
+ p.x = (int)(posx*20);
+ p.y = (int)(posy*20);
+ p = swf_TurnPoint(p, &i->page_matrix);
MATRIX m;
- swf_GetMatrix(0,&m);
- m.tx = (int)(posx*20);
- m.ty = (int)(posy*20);
+ m = i->page_matrix;
+ m.tx = p.x;
+ m.ty = p.y;
swf_ObjectPlace(i->tag, buttonid, i->depth++,&m,0,0);
}
else {
- swf_ObjectPlace(i->tag, buttonid, i->depth++,0,0,0);
+ swf_ObjectPlace(i->tag, buttonid, i->depth++,&i->page_matrix,0,0);
}
}
/* instance */
i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2);
- swf_ObjectPlace(i->tag,myshapeid,/*depth*/i->depth++,NULL,NULL,NULL);
+
+ swf_ObjectPlace(i->tag,myshapeid,/*depth*/i->depth++,&i->page_matrix,NULL,NULL);
}
int swfoutput_drawimagejpeg_old(struct swfoutput*obj, char*filename, int sizex,int sizey,