X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=ab19a5a99f4f6e9bd01789fd0bdfb2569b529e37;hb=01c697d88852d3180d64f9abe4c4229e720f6906;hp=9fce9e7e7fed8729b24b6ed95a2dce5d05bd09ba;hpb=1bb89b52f094e10bc4a3469438288b9136c70956;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 9fce9e7..ab19a5a 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -63,7 +63,7 @@ #include "SWFOutputDev.h" //swftools header files -#include "swfoutput.h" +#include "../lib/devices/swf.h" #include "../lib/log.h" #include "../lib/gfxdevice.h" #include "../lib/gfxtools.h" @@ -101,6 +101,8 @@ static int forceType0Fonts = 1; static void printInfoString(Dict *infoDict, char *key, char *fmt); static void printInfoDate(Dict *infoDict, char *key, char *fmt); +static char* lastfontdir = 0; + struct mapping { char*pdffont; char*filename; @@ -163,7 +165,7 @@ public: virtual void startPage(int pageNum, GfxState *state, double x1, double y1, double x2, double y2) ; void endframe(); - void* getSWF(); + void* get(char*name); //----- get info about output device @@ -304,6 +306,51 @@ public: friend void swf_output_preparepage(swf_output_t*swf, int pdfpage, int outputpage); }; +typedef struct _drawnchar +{ + gfxcoord_t x,y; + int charid; + gfxcolor_t color; +} drawnchar_t; + +class CharBuffer +{ + drawnchar_t * chars; + int buf_size; + int num_chars; + +public: + + CharBuffer() + { + buf_size = 32; + chars = (drawnchar_t*)malloc(sizeof(drawnchar_t)*buf_size); + memset(chars, 0, sizeof(drawnchar_t)*buf_size); + num_chars = 0; + } + ~CharBuffer() + { + free(chars);chars = 0; + } + + void grow(int size) + { + if(size>=buf_size) { + buf_size += 32; + chars = (drawnchar_t*)realloc(chars, sizeof(drawnchar_t)*buf_size); + } + } + + void addChar(int charid, gfxcoord_t x, gfxcoord_t y, gfxcolor_t color) + { + grow(num_chars); + chars[num_chars].x = x; + chars[num_chars].y = y; + chars[num_chars].color = color; + chars[num_chars].charid = charid; + } +}; + static char*getFontID(GfxFont*font); struct FontInfo @@ -975,10 +1022,10 @@ int SWFOutputDev::save(char*filename) finish(); return result->save(result, filename); } -void* SWFOutputDev::getSWF() +void* SWFOutputDev::get(char*name) { finish(); - return result->get(result, "swf"); + return result->get(result, name); } SWFOutputDev::~SWFOutputDev() @@ -1135,8 +1182,10 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, { int render = state->getRender(); // check for invisible text -- this is used by Acrobat Capture - if (render == 3) + if (render == 3) { + msg(" Ignoring invisible text: char %d at %f,%f", c, x, y); return; + } if(states[statepos].textRender != render) msg(" Internal error: drawChar.render!=beginString.render"); @@ -1180,8 +1229,9 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, Gfx8BitFont*font8; font8 = (Gfx8BitFont*)font; char**enc=font8->getEncoding(); - if(enc && enc[c]) + if(enc && enc[c] && strcasecmp(enc[c], "space")) { name = enc[c]; + } } if (CIDToGIDMap) { msg(" drawChar(%f, %f, c='%c' (%d), GID=%d, u=%d <%d>) CID=%d name=\"%s\" render=%d\n", x, y, (c&127)>=32?c:'?', c, CIDToGIDMap[c], u, uLen, font->isCIDFont(), FIXNULL(name), render); @@ -1190,8 +1240,26 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, msg(" drawChar(%f,%f,c='%c' (%d), u=%d <%d>) CID=%d name=\"%s\" render=%d\n",x,y,(c&127)>=32?c:'?',c,u, uLen, font->isCIDFont(), FIXNULL(name), render); } - int charid = getGfxCharID(current_gfxfont, c, name, u); - if(charid<0) { + int charid = -1; + + if(uLen<=1) { + charid = getGfxCharID(current_gfxfont, c, name, u); + } else { + charid = getGfxCharID(current_gfxfont, c, 0, -1); + if(charid < 0) { + /* multiple unicodes- should usually map to a ligature. + if the ligature doesn't exist, we need to draw + the characters one-by-one. */ + int t; + msg(" ligature %d missing in font %s\n", c, current_font_id); + for(t=0;t Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)", FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs); @@ -1513,7 +1581,6 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) int t; int lpage = -1; for(t=1;t<=pagepos;t++) { - printf("%d) %d (%d?)\n", t, pages[t], page); if(pages[t]==page) { lpage = t; break; @@ -1857,7 +1924,7 @@ char* searchForSuitableFont(GfxFont*gfxFont) char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) { char*fontname = 0, *filename = 0; - msg(" subsituteFont(%s)", oldname); + msg(" substituteFont(%s)", oldname); if(!(fontname = searchForSuitableFont(gfxFont))) { fontname = "Times-Roman"; @@ -2034,7 +2101,12 @@ void SWFOutputDev::updateFont(GfxState *state) if(!fileName) { char * fontname = getFontName(gfxFont); msg(" Font %s %scould not be loaded.", fontname, embedded?"":"(not embedded) "); - msg(" Try putting a TTF version of that font (named \"%s.ttf\") into /swftools/fonts", fontname); + + if(lastfontdir) + msg(" Try putting a TTF version of that font (named \"%s.ttf\") into %s/swftools/fonts", fontname, lastfontdir); + else + msg(" Try specifying one or more font directories"); + fileName = substituteFont(gfxFont, fontid); if(fontid) { free(fontid);fontid = strdup(substitutetarget[substitutepos-1]); /*ugly hack*/}; msg(" Font is now %s (%s)", fontid, fileName); @@ -2547,6 +2619,7 @@ void pdfswf_addfontdir(char*dirname) { #ifdef HAVE_DIRENT_H msg(" Adding %s to font directories", dirname); + lastfontdir = strdup(dirname); DIR*dir = opendir(dirname); if(!dir) { msg(" Couldn't open directory %s\n", dirname); @@ -2793,10 +2866,10 @@ int swf_output_save(swf_output_t*swf, char*filename) return ret; } -void* swf_output_get(swf_output_t*swf) +void* swf_output_get(swf_output_t*swf,char*name) { swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; - void* ret = i->outputDev->getSWF(); + void* ret = i->outputDev->get(name); return ret; }