X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fpdf%2FInfoOutputDev.cc;h=a0a4cacd73630b40649575260bbfbfa54cd76d15;hb=dcb935d31dc5cb66997bbca2445b6e4c4eff3257;hp=6574d76fcc4c22b4c8a3e4cc95659fab639e280e;hpb=e0f1832e0ff5bc24a47fe86ceefe0275c633af7c;p=swftools.git diff --git a/lib/pdf/InfoOutputDev.cc b/lib/pdf/InfoOutputDev.cc index 6574d76..a0a4cac 100644 --- a/lib/pdf/InfoOutputDev.cc +++ b/lib/pdf/InfoOutputDev.cc @@ -1,22 +1,78 @@ +#include "Object.h" +#include "SplashTypes.h" +#include "SplashOutputDev.h" +#include "SplashPath.h" +#include "SplashFontFile.h" #include "InfoOutputDev.h" #include "GfxState.h" #include "../log.h" #include -InfoOutputDev::InfoOutputDev() +InfoOutputDev::InfoOutputDev(XRef*xref) { num_links = 0; num_images = 0; num_fonts = 0; - id2font = new GHash(); + num_polygons= 0; + currentfont = 0; + currentglyph = 0; + id2font = new GHash(1); + SplashColor white = {255,255,255}; + splash = new SplashOutputDev(splashModeRGB8,320,0,white,0,0); + splash->startDoc(xref); } InfoOutputDev::~InfoOutputDev() { - delete id2font; + GHashIter*i; + id2font->startIter(&i); + GString*key; + FontInfo*fontinfo; + while(id2font->getNext(&i, &key, (void**)&fontinfo)) { + delete fontinfo; + } + id2font->killIter(&i); + + delete id2font;id2font=0; + delete splash;splash=0; +} +void FontInfo::grow(int size) +{ + if(size >= this->num_glyphs) { + this->glyphs = (GlyphInfo**)realloc(this->glyphs, sizeof(GlyphInfo*)*(size)); + memset(&this->glyphs[this->num_glyphs], 0, sizeof(SplashPath*)*((size)-this->num_glyphs)); + this->num_glyphs = size; + } +} +FontInfo::FontInfo() +{ + this->charid2glyph = 0; + this->seen = 0; + this->num_glyphs = 0; + this->glyphs = 0; + this->splash_font = 0; +} +FontInfo::~FontInfo() +{ + this->font = 0; + if(this->charid2glyph) { + free(this->charid2glyph); + this->charid2glyph = 0; + } + int t; + for(t=0;tpath;glyphs[t]->path = 0; + delete glyphs[t]; + glyphs[t]=0; + } + } + free(glyphs);glyphs=0; } GBool InfoOutputDev::upsideDown() {return gTrue;} GBool InfoOutputDev::useDrawChar() {return gTrue;} GBool InfoOutputDev::interpretType3Chars() {return gTrue;} +GBool InfoOutputDev::useTilingPatternFill() {return gTrue;} + void InfoOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, double crop_y1, double crop_x2, double crop_y2) { double x1,y1,x2,y2; @@ -28,6 +84,10 @@ void InfoOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doub this->y1 = (int)y1; this->x2 = (int)x2; this->y2 = (int)y2; + msg(" Generating info structure for page %d", pageNum); +} +void InfoOutputDev::endPage() +{ } void InfoOutputDev::drawLink(Link *link, Catalog *catalog) { @@ -43,39 +103,72 @@ double InfoOutputDev::getMaximumFontSize(char*id) return info->max_size; } -static char*getFontID(GfxFont*font) +char*getFontID(GfxFont*font) { Ref*ref = font->getID(); GString*gstr = font->getName(); char* fname = gstr==0?0:gstr->getCString(); char buf[128]; if(fname==0) { - sprintf(buf, "font-%d-%d", ref->num, ref->gen); + if(font->getType() == fontType3) { + sprintf(buf, "t3font-%d-%d", ref->num, ref->gen); + } else { + sprintf(buf, "font-%d-%d", ref->num, ref->gen); + } } else { sprintf(buf, "%s-%d-%d", fname, ref->num, ref->gen); } return strdup(buf); } - void InfoOutputDev::updateFont(GfxState *state) { GfxFont*font = state->getFont(); - if(!font) + if(!font) { + currentfont = 0; return; + } + if(font->getType() == fontType3) { + currentfont = 0; + return; + } char*id = getFontID(font); - - FontInfo*info = (FontInfo*)id2font->lookup(id); - if(!info) { - GString* idStr = new GString(id); - info = new FontInfo; - info->font = font; - info->max_size = 0; - id2font->add(idStr, (void*)info); - free(id); - num_fonts++; + + if(currentfont) + currentfont->splash_font = 0; + + currentfont = (FontInfo*)id2font->lookup(id); + if(!currentfont) { + currentfont = new FontInfo; + currentfont->font = font; + currentfont->max_size = 0; + GString* idStr = new GString(id); + id2font->add(idStr, (void*)currentfont); + num_fonts++; } - currentfont = info; + + state->setCTM(1.0,0,0,1.0,0,0); + splash->updateCTM(state, 0,0,0,0,0,0); + state->setTextMat(1.0,0,0,1.0,0,0); + state->setFont(font, 1024.0); + splash->doUpdateFont(state); + currentfont->splash_font = splash->getCurrentFont(); + free(id); +} + +void InfoOutputDev::fill(GfxState *state) +{ + num_polygons++; +} + +void InfoOutputDev::eoFill(GfxState *state) +{ + num_polygons++; +} + +FontInfo* InfoOutputDev::getFont(char*id) +{ + return (FontInfo*)id2font->lookup(id); } void InfoOutputDev::drawChar(GfxState *state, double x, double y, @@ -83,9 +176,6 @@ void InfoOutputDev::drawChar(GfxState *state, double x, double y, double originX, double originY, CharCode code, int nBytes, Unicode *u, int uLen) { - int render = state->getRender(); - if (render == 3) - return; double m11,m21,m12,m22; state->getFontTransMat(&m11, &m12, &m21, &m22); m11 *= state->getHorizScaling(); @@ -93,20 +183,119 @@ void InfoOutputDev::drawChar(GfxState *state, double x, double y, double lenx = sqrt(m11*m11 + m12*m12); double leny = sqrt(m21*m21 + m22*m22); double len = lenx>leny?lenx:leny; + if(!currentfont || !currentfont->splash_font) { + return; //error + } if(currentfont && currentfont->max_size < len) { currentfont->max_size = len; } + currentfont->grow(code+1); + GlyphInfo*g = currentfont->glyphs[code]; + if(!g) { + g = currentfont->glyphs[code] = new GlyphInfo(); + g->path = currentfont->splash_font->getGlyphPath(code); + g->unicode = 0; + } + if(uLen && (u[0]>=32 && u[0]unicode || !g->unicode)) { + g->unicode = u[0]; + } + } + +GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen) +{ + GfxFont*font = state->getFont(); + if(!font) + return gTrue; + if(font->getType() != fontType3) + return gTrue; + + char*id = getFontID(font); + currentfont = (FontInfo*)id2font->lookup(id); + if(!currentfont) { + currentfont = new FontInfo; + currentfont->font = font; + GString* idStr = new GString(id); + id2font->add(idStr, (void*)currentfont); + num_fonts++; + } + currentfont = currentfont; + free(id); + + currentfont->grow(code+1); + if(!currentfont->glyphs[code]) { + currentglyph = currentfont->glyphs[code] = new GlyphInfo(); + currentglyph->unicode = uLen?u[0]:0; + currentglyph->path = new SplashPath(); + currentglyph->x1=0; + currentglyph->y1=0; + currentglyph->x2=dx; + currentglyph->y2=dy; + return gFalse; + } else { + return gTrue; + } +} + +void InfoOutputDev::type3D0(GfxState *state, double wx, double wy) +{ + currentglyph->x1=0; + currentglyph->y1=0; + currentglyph->x2=wx; + currentglyph->y2=wy; +} + +void InfoOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury) +{ + currentglyph->x1=llx; + currentglyph->y1=lly; + currentglyph->x2=urx; + currentglyph->y2=ury; +} + +void InfoOutputDev::endType3Char(GfxState *state) +{ + double x1 = currentglyph->x1; + double y1 = currentglyph->y1; + double x2 = currentglyph->x2; + double y2 = currentglyph->y2; + currentglyph->path->moveTo(x1,y1); + currentglyph->path->lineTo(x2,y1); + currentglyph->path->lineTo(x2,y2); + currentglyph->path->lineTo(x1,y2); + currentglyph->path->close(); +} + void InfoOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, GBool invert, GBool inlineImg) { num_images++; + OutputDev::drawImageMask(state,ref,str,width,height,invert,inlineImg); } void InfoOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, int *maskColors, GBool inlineImg) { num_images++; + OutputDev::drawImage(state,ref,str,width,height,colorMap,maskColors,inlineImg); +} +void InfoOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GBool maskInvert) +{ + OutputDev::drawMaskedImage(state,ref,str,width,height,colorMap,maskStr,maskWidth,maskHeight,maskInvert); } +void InfoOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, + int width, int height, + GfxImageColorMap *colorMap, + Stream *maskStr, + int maskWidth, int maskHeight, + GfxImageColorMap *maskColorMap) +{ + OutputDev::drawSoftMaskedImage(state,ref,str,width,height,colorMap,maskStr,maskWidth,maskHeight,maskColorMap); +}