X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FGFXOutputDev.cc;h=d110976967e9a7b9ee9f122cf75e5e1ab5bd48fd;hb=8d0bd23a13453101037c3dee183a90181862feb3;hp=b497db5139c4be43c97b61b69d903da4e626e2c9;hpb=95d04eff5714c6b79dd865ca297be70cf037fee8;p=swftools.git diff --git a/lib/pdf/GFXOutputDev.cc b/lib/pdf/GFXOutputDev.cc index b497db5..d110976 100644 --- a/lib/pdf/GFXOutputDev.cc +++ b/lib/pdf/GFXOutputDev.cc @@ -22,7 +22,9 @@ #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif #include "../../config.h" #include "../os.h" #ifdef HAVE_DIRENT_H @@ -57,7 +59,7 @@ #include "GHash.h" #include "GFXOutputDev.h" -//swftools header files +// swftools header files #include "../log.h" #include "../gfxdevice.h" #include "../gfxtools.h" @@ -68,7 +70,7 @@ #include "../devices/render.h" #include "../art/libart.h" -#include "../devices/artsutils.c" +#include "../devices/artsutils.h" #include "../png.h" #include "fonts.h" @@ -78,11 +80,16 @@ typedef struct _fontfile { const char*filename; + int len; // basename length int used; + struct _fontfile*next; } fontfile_t; // for pdfswf_addfont -static fontfile_t fonts[2048]; + +static fontfile_t* global_fonts = 0; +static fontfile_t* global_fonts_next = 0; + static int fontnum = 0; /* config */ @@ -325,12 +332,24 @@ DisplayFontParam *GFXGlobalParams::getDisplayFont(GString *fontName) return dfp; } } - for(t=0;tt1.fileName = new GString(fonts[t].filename); - return dfp; - } + + int bestlen = 0x7fffffff; + const char*bestfilename = 0; + + fontfile_t*f = 0; + while(f) { + if(strstr(f->filename, name)) { + if(f->len < bestlen) { + bestlen = f->len; + bestfilename = f->filename; + } + } + f = f->next; + } + if(bestfilename) { + DisplayFontParam *dfp = new DisplayFontParam(new GString(fontName), displayFontT1); + dfp->t1.fileName = new GString(bestfilename); + return dfp; } return GlobalParams::getDisplayFont(fontName); } @@ -650,7 +669,7 @@ GBool GFXOutputDev::needNonText() } void GFXOutputDev::endPage() { - msg(" endPage"); + msg(" endPage (GfxOutputDev)"); if(outer_clip_box) { device->endclip(device); outer_clip_box = 0; @@ -701,7 +720,7 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) msg(" %d dashes", dashnum); msg(" | phase: %f", dashphase); for(t=0;t | d%-3d: %f", t, ldash[t]); } dash[dashnum] = -1; @@ -709,7 +728,7 @@ void GFXOutputDev::strokeGfxline(GfxState *state, gfxline_t*line, int flags) dump_outline(line); } - line2 = gfxtool_dash_line(line, dash, dashphase); + line2 = gfxtool_dash_line(line, dash, (float)dashphase); line = line2; free(dash); msg(" After dashing:"); @@ -937,7 +956,7 @@ void GFXOutputDev::drawChar(GfxState *state, double x, double y, CharCode charid, int nBytes, Unicode *_u, int uLen) { if(!current_fontinfo || (unsigned)charid >= current_fontinfo->num_glyphs || !current_fontinfo->glyphs[charid]) { - msg(" Invalid charid %d for font %s", charid, current_font_id); + msg(" Invalid charid %d for font (%d characters)", charid, current_fontinfo?current_fontinfo->num_glyphs:0); return; } @@ -1068,7 +1087,7 @@ GBool GFXOutputDev::beginType3Char(GfxState *state, double x, double y, double d m.ty += user_movey + clipmovey; if(!current_fontinfo || (unsigned)charid >= current_fontinfo->num_glyphs || !current_fontinfo->glyphs[charid]) { - msg(" Invalid charid %d for font %s", charid, current_font_id); + msg(" Invalid charid %d for font", charid); return gFalse; } gfxcolor_t col={0,0,0,0}; @@ -1149,7 +1168,7 @@ void GFXOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl void GFXOutputDev::processLink(Link *link, Catalog *catalog) { - double x1, y1, x2, y2, w; + double x1, y1, x2, y2; gfxline_t points[5]; int x, y; @@ -1518,6 +1537,7 @@ void GFXOutputDev::updateFont(GfxState *state) this->current_fontinfo = this->info->getFont(id); if(!this->current_fontinfo) { msg(" Internal Error: no fontinfo for font %s\n", id); + return; } if(!this->current_fontinfo->seen) { dumpFontInfo("", gfxFont); @@ -1546,7 +1566,6 @@ unsigned char* antialize(unsigned char*data, int width, int height, int newwidth unsigned char*newdata; int x,y; newdata= (unsigned char*)malloc(newwidth*newheight); - int t; double fx = (double)(width)/newwidth; double fy = (double)(height)/newheight; double px = 0; @@ -1619,9 +1638,6 @@ static void drawimage(gfxdevice_t*dev, gfxcolor_t* data, int sizex,int sizey, p5.y = (int)(p5.y*20)/20.0; } - float m00,m10,tx; - float m01,m11,ty; - gfxmatrix_t m; m.m00 = (p4.x-p1.x)/sizex; m.m10 = (p2.x-p1.x)/sizey; m.m01 = (p4.y-p1.y)/sizex; m.m11 = (p2.y-p1.y)/sizey; @@ -1746,7 +1762,6 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, } if(mask) { - int i,j; unsigned char buf[8]; int x,y; unsigned char*pic = new unsigned char[width*height]; @@ -1775,7 +1790,7 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, /* the size of the drawn image is added to the identifier as the same image may require different bitmaps if displayed at different sizes (due to antialiasing): */ - int t,found = -1; + int found = -1; if(type3active) { unsigned char*pic2 = 0; numpalette = 16; @@ -1795,7 +1810,7 @@ void GFXOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, /* make a black/white palette */ - float r = 255/(numpalette-1); + float r = 255./(float)(numpalette-1); int t; for(t=0;t Adding font \"%s\".", filename); - fonts[fontnum++] = f; + fontfile_t* f = (fontfile_t*)malloc(sizeof(fontfile_t)); + memset(f, 0, sizeof(fontfile_t)); + f->filename = filename; + int len = strlen(filename); + char*r1 = strrchr(filename, '/'); + char*r2 = strrchr(filename, '\\'); + if(r2>r1) + r1 = r2; + if(r1) { + len = strlen(r1+1); + } + f->len = len; + + msg(" Adding font \"%s\".", filename); + if(global_fonts_next) { + global_fonts_next->next = f; + global_fonts_next = global_fonts_next->next; } else { - msg(" Too many external fonts. Not adding font file \"%s\".", filename); + global_fonts_next = global_fonts = f; } } @@ -2021,7 +2047,6 @@ void addGlobalLanguageDir(const char*dir) { msg(" Adding %s to language pack directories", dir); - int l; FILE*fi = 0; char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc") + 1); strcpy(config_file, dir); @@ -2075,7 +2100,7 @@ void addGlobalFontDir(const char*dirname) } closedir(dir); #else - msg(" No dirent.h- unable to add font dir %s", dir); + msg(" No dirent.h- unable to add font dir %s", dirname); #endif }