#include <string.h>
#include <unistd.h>
//xpdf header files
+#include "gfile.h"
#include "GString.h"
#include "gmem.h"
#include "Object.h"
#include "swfoutput.h"
extern "C" {
#include "../lib/log.h"
+#include "ttf2pt1.h"
}
static PDFDoc*doc = 0;
void drawGeneralImage(GfxState *state, Object *ref, Stream *str,
int width, int height, GfxImageColorMap*colorMap, GBool invert,
GBool inlineImg, int mask);
- int clipping[32];
+ int clipping[64];
int clippos;
- int setT1Font(char*name,FontEncoding*enc);
- char* substitutefont(GfxFont*gfxFont);
+ int searchT1Font(char*name);
+ char* substituteFont(GfxFont*gfxFont, char*oldname);
+ char* writeEmbeddedFontToFile(GfxFont*font);
int t1id;
int jpeginfo; // did we write "File contains jpegs" yet?
int pbminfo; // did we write "File contains jpegs" yet?
int linkinfo; // did we write "File contains links" yet?
+ int ttfinfo; // did we write "File contains TrueType Fonts" yet?
GfxState *laststate;
};
logf("<warning> The following font caused problems (substituting):");
else if(nr == 2)
logf("<warning> This document contains Type 3 Fonts: (some text may be incorrectly displayed)");
-
dumpFontInfo("<warning>", font);
}
SWFOutputDev::SWFOutputDev()
{
jpeginfo = 0;
+ ttfinfo = 0;
linkinfo = 0;
pbminfo = 0;
clippos = 0;
{
int num = path->getNumSubpaths();
int s,t;
- bezierpathsegment*start,*last;
+ bezierpathsegment*start,*last=0;
bezierpathsegment*outline = start = new bezierpathsegment();
int cpos = 0;
double lastx=0,lasty=0;
m.m13 = 0; m.m23 = 0;
T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path);
swfoutput_startclip(&output, outline, &m);
- clipping[clippos] = 1;
+ clipping[clippos] ++;
}
void SWFOutputDev::eoClip(GfxState *state)
{
m.m12 = 0; m.m13 = 0; m.m23 = 0;
T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path);
swfoutput_startclip(&output, outline, &m);
- clipping[clippos] = 1;
+ clipping[clippos] ++;
}
SWFOutputDev::~SWFOutputDev()
state->getFontTransMat(&m11, &m12, &m21, &m22);
m11 *= state->getHorizScaling();
m21 *= state->getHorizScaling();
- swfoutput_setfontmatrix(&output, m11, -m12, m21, -m22);
+ swfoutput_setfontmatrix(&output, m11, -m21, m12, -m22);
}
int charcounter = 0;
state->transform(x, y, &x1, &y1);
if(enc->getCharName(c))
- swfoutput_drawchar(&output, x1, y1, enc->getCharName(c));
+ swfoutput_drawchar(&output, x1, y1, enc->getCharName(c), c);
else
logf("<warning> couldn't get name for character %02x from Encoding", c);
}
void SWFOutputDev::saveState(GfxState *state) {
logf("<debug> saveState\n");
updateAll(state);
- clippos ++;
+ if(clippos<64)
+ clippos ++;
+ else
+ logf("<error> Too many nested states in pdf.");
clipping[clippos] = 0;
};
void SWFOutputDev::restoreState(GfxState *state) {
logf("<debug> restoreState\n");
updateAll(state);
- if(clipping[clippos])
+ while(clipping[clippos]) {
swfoutput_endclip(&output);
+ clipping[clippos]--;
+ }
clippos--;
}
char type3Warning=0;
-int SWFOutputDev::setT1Font(char*name, FontEncoding*encoding)
+int SWFOutputDev::searchT1Font(char*name)
{
int i;
pdf2t1map[i].id = mapid;
}
}
- if(id<0)
- return 0;
-
- this->t1id = id;
- return 1;
+ return id;
}
void SWFOutputDev::updateLineWidth(GfxState *state)
(char)(rgb.b*255), (char)(opaq*255));
}
-char*writeEmbeddedFontToFile(GfxFont*font)
+char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font)
{
char*tmpFileName = NULL;
- char*fileName = NULL;
FILE *f;
int c;
char *fontBuf;
strObj.free();
}
fclose(f);
- fileName = tmpFileName;
- if(!fileName) {
- logf("<error> Embedded font writer didn't create a file");
- return 0;
+
+ if(font->getType() == fontTrueType)
+ {
+ if(!ttfinfo) {
+ logf("<notice> File contains TrueType fonts");
+ ttfinfo = 1;
+ }
+ char name2[80];
+ char*tmp;
+ tmp = strdup(mktmpname((char*)name2));
+ sprintf(name2, "%s", tmp);
+ char*a[] = {"./ttf2pt1","-pttf","-b", tmpFileName, name2};
+ logf("<verbose> Invoking ttf2pt1...");
+ ttf2pt1_main(5,a);
+ unlink(tmpFileName);
+ sprintf(name2,"%s.pfb",tmp);
+ tmpFileName = strdup(name2);
}
- return fileName;
+
+ return tmpFileName;
}
char* gfxFontName(GfxFont* gfxFont)
}
}
-char* SWFOutputDev::substitutefont(GfxFont*gfxFont)
+char* substitutetarget[256];
+char* substitutesource[256];
+int substitutepos = 0;
+
+char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname)
{
//substitute font
char* fontname = 0;
}
}
}
- if(fontname)
- setT1Font(fontname, gfxFont->getEncoding());
+ if(fontname) {
+ this->t1id = searchT1Font(fontname);
+ }
+ if(substitutepos>=sizeof(substitutesource)/sizeof(char*)) {
+ logf("<fatal> Too many fonts in file.");
+ exit(1);
+ }
+ if(oldname) {
+ substitutesource[substitutepos] = oldname;
+ substitutetarget[substitutepos] = fontname;
+ logf("<verbose> substituting %s -> %s", oldname, fontname);
+ substitutepos ++;
+ }
return fontname;
}
+void unlinkfont(char* filename)
+{
+ int l;
+ if(!filename)
+ return;
+ l=strlen(filename);
+ unlink(filename);
+ if(!strncmp(&filename[l-4],".afm",4)) {
+ memcpy(&filename[l-4],".pfb",4);
+ unlink(filename);
+ memcpy(&filename[l-4],".pfa",4);
+ unlink(filename);
+ memcpy(&filename[l-4],".afm",4);
+ return;
+ } else
+ if(!strncmp(&filename[l-4],".pfa",4)) {
+ memcpy(&filename[l-4],".afm",4);
+ unlink(filename);
+ memcpy(&filename[l-4],".pfa",4);
+ return;
+ } else
+ if(!strncmp(&filename[l-4],".pfb",4)) {
+ memcpy(&filename[l-4],".afm",4);
+ unlink(filename);
+ memcpy(&filename[l-4],".pfb",4);
+ return;
+ }
+}
+
void SWFOutputDev::updateFont(GfxState *state)
{
- char * fontname = 0;
GfxFont*gfxFont = state->getFont();
char * fileName = 0;
if (!gfxFont) {
return;
}
-
- if(gfxFont->getName()) {
- fontname = gfxFont->getName()->getCString();
+ char * fontname = gfxFontName(gfxFont);
+
+ int t;
+ for(t=0;t<substitutepos;t++) {
+ if(!strcmp(fontname, substitutesource[t])) {
+ fontname = substitutetarget[t];
+ break;
+ }
}
- if(swfoutput_queryfont(&output, gfxFontName(gfxFont)))
+ if(swfoutput_queryfont(&output, fontname))
{
- swfoutput_setfont(&output, gfxFontName(gfxFont), -1, 0);
+ swfoutput_setfont(&output, fontname, -1, 0);
return;
}
if(embedded) {
if (!gfxFont->is16Bit() &&
(gfxFont->getType() == fontType1 ||
- gfxFont->getType() == fontType1C)) {
+ gfxFont->getType() == fontType1C ||
+ gfxFont->getType() == fontTrueType)) {
fileName = writeEmbeddedFontToFile(gfxFont);
- if(!fileName)
+ if(!fileName) {
+ logf("<error> Couldn't write font to file");
+ showFontError(gfxFont,0);
return ;
+ }
this->t1id = T1_AddFont(fileName);
+ if(this->t1id<0) {
+ logf("<error> Couldn't load font from file");
+ showFontError(gfxFont,0);
+ unlinkfont(fileName);
+ return ;
+ }
}
else {
showFontError(gfxFont,0);
- fontname = substitutefont(gfxFont);
+ fontname = substituteFont(gfxFont, fontname);
}
} else {
- if(!fontname || !setT1Font(state->getFont()->getName()->getCString(), gfxFont->getEncoding()))
- fontname = substitutefont(gfxFont);
+ if(fontname) {
+ int newt1id = searchT1Font(fontname);
+ if(newt1id<0) {
+ fontname = substituteFont(gfxFont, fontname);
+ } else
+ this->t1id = newt1id;
+ }
+ else
+ fontname = substituteFont(gfxFont, fontname);
}
- swfoutput_setfont(&output,gfxFontName(gfxFont),this->t1id, fileName);
+ if(t1id<0) {
+ showFontError(gfxFont,0);
+ return;
+ }
+
+ /* we may have done some substitutions here, so check
+ again if this font is cached. */
+ if(swfoutput_queryfont(&output, fontname))
+ {
+ swfoutput_setfont(&output, fontname, -1, 0);
+ return;
+ }
+
+ logf("<verbose> Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, fileName, fontname);
+ swfoutput_setfont(&output, fontname, this->t1id, fileName);
if(fileName)
- unlink(fileName);
+ unlinkfont(fileName);
}
int pic_xids[1024];
if (str->getKind() == strDCT &&
(colorMap->getNumPixelComps() == 3 || !mask) )
{
- sprintf(fileName, "/tmp/tmp%08x.jpg",lrand48());
+ sprintf(fileName, "%s.jpg",mktmpname(0));
logf("<verbose> Found jpeg. Temporary storage is %s", fileName);
if(!jpeginfo)
{
if(mask) {
imgStr = new ImageStream(str, width, 1, 1);
imgStr->reset();
- return;
+ //return;
int yes=0,i,j;
unsigned char buf[8];
int xid = 0;