-#include "SplashTypes.h"
+#include "config.h"
+#include "Object.h"
+#include "InfoOutputDev.h"
#include "SplashOutputDev.h"
+#ifdef HAVE_POPPLER
+#include <splash/SplashTypes.h>
+#include <splash/SplashPath.h>
+#include <splash/SplashFont.h>
+#include <splash/SplashFontFile.h>
+#else
+#include "SplashTypes.h"
#include "SplashPath.h"
-#include "InfoOutputDev.h"
+#include "SplashFont.h"
+#include "SplashFontFile.h"
+#endif
#include "GfxState.h"
#include "../log.h"
#include <math.h>
num_links = 0;
num_images = 0;
num_fonts = 0;
+ 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);
}
id2font->killIter(&i);
- delete id2font;
- delete splash;
+ delete id2font;id2font=0;
+ delete splash;splash=0;
}
void FontInfo::grow(int size)
{
this->seen = 0;
this->num_glyphs = 0;
this->glyphs = 0;
+ this->splash_font = 0;
+ this->lastchar = -1;
+ this->lastx = 0;
+ this->lasty = 0;
}
FontInfo::~FontInfo()
{
glyphs[t]=0;
}
}
+ free(glyphs);glyphs=0;
}
GBool InfoOutputDev::upsideDown() {return gTrue;}
GBool InfoOutputDev::useDrawChar() {return gTrue;}
this->y2 = (int)y2;
msg("<verbose> Generating info structure for page %d", pageNum);
}
+void InfoOutputDev::endPage()
+{
+}
void InfoOutputDev::drawLink(Link *link, Catalog *catalog)
{
num_links++;
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) {
- /* font already known */
- free(id);
- currentfont = info;
- return;
- }
+ if(currentfont)
+ currentfont->splash_font = 0;
- info = new FontInfo;
- info->font = font;
- info->max_size = 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++;
+ }
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->setTextMat(1.0,0,0,1.0,0,0);
state->setFont(font, 1024.0);
splash->doUpdateFont(state);
- info->splash_font = splash->getCurrentFont();
-
- if(!info->splash_font) {
- delete info;
- return;
- }
-
- GString* idStr = new GString(id);
- id2font->add(idStr, (void*)info);
- num_fonts++;
- currentfont = info;
+ currentfont->splash_font = splash->getCurrentFont();
+ currentfont->ascender = currentfont->splash_font->ascender;
+ currentfont->descender = currentfont->splash_font->descender;
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);
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;
}
GlyphInfo*g = currentfont->glyphs[code];
if(!g) {
g = currentfont->glyphs[code] = new GlyphInfo();
+ g->advance_max = 0;
+ currentfont->splash_font->last_advance = -1;
g->path = currentfont->splash_font->getGlyphPath(code);
+ g->advance = currentfont->splash_font->last_advance;
g->unicode = 0;
}
if(uLen && (u[0]>=32 && u[0]<g->unicode || !g->unicode)) {
g->unicode = u[0];
}
+ if(currentfont->lastchar>=0 && currentfont->lasty == y) {
+ double xshift = x - currentfont->lastx;
+ if(xshift>=0 && xshift > g->advance_max) {
+ g->advance_max = xshift;
+ }
+ }
+ currentfont->lastx = x;
+ currentfont->lasty = y;
+ currentfont->lastchar = code;
}
GBool InfoOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, Unicode *u, int uLen)
currentglyph->x1=0;
currentglyph->y1=0;
currentglyph->x2=dx;
- currentglyph->y2=-dy;
+ currentglyph->y2=dy;
return gFalse;
} else {
return gTrue;
currentglyph->x1=0;
currentglyph->y1=0;
currentglyph->x2=wx;
- currentglyph->y2=-wy;
+ 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->y1=lly;
currentglyph->x2=urx;
- currentglyph->y2=-ury;
+ currentglyph->y2=ury;
}
void InfoOutputDev::endType3Char(GfxState *state)