double fontsizes[] =
{
- 0.833,0.833,0.889,0.889,0.788,0.722,0.833,0.778,0.600,0.600,0.600,0.600,0.576,0.576,0.576,0.576
+ 0.833,0.833,0.889,0.889,
+ 0.788,0.722,0.833,0.778,
+ 0.600,0.600,0.600,0.600,
+ 0.576,0.576,0.576,0.576,
+ 0.733 //?
};
char*fontnames[]={
"Helvetica",
{"Symbol", "s050000l.pfb"},
{"ZapfDingbats", "d050000l.pfb"}};
-static void printInfoString(Dict *infoDict, char *key, char *fmt) {
- Object obj;
- GString *s1, *s2;
- int i;
-
- if (infoDict->lookup(key, &obj)->isString()) {
- s1 = obj.getString();
- if ((s1->getChar(0) & 0xff) == 0xfe &&
- (s1->getChar(1) & 0xff) == 0xff) {
- s2 = new GString();
- for (i = 2; i < obj.getString()->getLength(); i += 2) {
- if (s1->getChar(i) == '\0') {
- s2->append(s1->getChar(i+1));
- } else {
- delete s2;
- s2 = new GString("<unicode>");
- break;
- }
- }
- printf(fmt, s2->getCString());
- delete s2;
- } else {
- printf(fmt, s1->getCString());
- }
- }
- obj.free();
-}
-
-static void printInfoDate(Dict *infoDict, char *key, char *fmt) {
- Object obj;
- char *s;
-
- if (infoDict->lookup(key, &obj)->isString()) {
- s = obj.getString()->getCString();
- if (s[0] == 'D' && s[1] == ':') {
- s += 2;
- }
- printf(fmt, s);
- }
- obj.free();
-}
-
class GfxState;
class GfxImageColorMap;
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 t1id;
- int jpeginfo; // did we write "Page contains jpegs" yet?
- int pbminfo; // did we write "Page contains jpegs" yet?
+ 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?
GfxState *laststate;
};
SWFOutputDev::SWFOutputDev()
{
jpeginfo = 0;
+ linkinfo = 0;
pbminfo = 0;
clippos = 0;
clipping[clippos] = 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()
void SWFOutputDev::beginString(GfxState *state, GString *s)
{
double m11,m21,m12,m22;
- logf("<debug> beginstring \"%s\"\n", s->getCString());
+// logf("<debug> %s beginstring \"%s\"\n", gfxstate2str(state), s->getCString());
state->getFontTransMat(&m11, &m12, &m21, &m22);
m11 *= state->getHorizScaling();
m21 *= state->getHorizScaling();
break;
}
}
+ if(!linkinfo && (page || url))
+ {
+ logf("<notice> File contains links");
+ linkinfo = 1;
+ }
if(page>0)
{
int t;
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--;
}
}
}
-void SWFOutputDev::updateFont(GfxState *state)
+char* SWFOutputDev::substitutefont(GfxFont*gfxFont)
{
- double m11, m12, m21, m22;
- char * fontname = 0;
- GfxFont*gfxFont = state->getFont();
- char * fileName = 0;
-
- if (!gfxFont) {
- return;
- }
-
- if(swfoutput_queryfont(&output, gfxFontName(gfxFont)))
- {
- swfoutput_setfont(&output, gfxFontName(gfxFont), -1, 0);
- return;
- }
-
- // look for Type 3 font
- if (!type3Warning && gfxFont->getType() == fontType3) {
- type3Warning = gTrue;
- showFontError(gfxFont, 2);
- }
- //dumpFontInfo ("<notice>", gfxFont);
-
- Ref embRef;
- GBool embedded = gfxFont->getEmbeddedFontID(&embRef);
- if(embedded) {
- if (!gfxFont->is16Bit() &&
- (gfxFont->getType() == fontType1 ||
- gfxFont->getType() == fontType1C)) {
-
- fileName = writeEmbeddedFontToFile(gfxFont);
- if(!fileName)
- return ;
- }
- else {
- showFontError(gfxFont,0);
- return ;
- }
-
- t1id = T1_AddFont(fileName);
- } else {
- fontname = NULL;
- if(gfxFont->getName()) {
- fontname = gfxFont->getName()->getCString();
- //logf("<notice> Processing font %s", fontname);
- }
- if(!fontname || !setT1Font(state->getFont()->getName()->getCString(), gfxFont->getEncoding()))
- { //substitute font
+ //substitute font
+ char* fontname = 0;
+ double m11, m12, m21, m22;
int index;
int code;
double w,w1,w2;
double*fm;
double v;
+ if(gfxFont->getName()) {
+ fontname = gfxFont->getName()->getCString();
+ }
+
+// printf("%d %s\n", t, gfxFont->getCharName(t));
showFontError(gfxFont, 1);
if (!gfxFont->is16Bit()) {
- if (gfxFont->isFixedWidth()) {
+ if(gfxFont->isSymbolic()) {
+ if(fontname && (strstr(fontname,"ing"))) //Dingbats, Wingdings etc.
+ index = 16;
+ else
+ index = 12;
+ } else if (gfxFont->isFixedWidth()) {
index = 8;
} else if (gfxFont->isSerif()) {
index = 4;
} else {
index = 0;
}
- if (gfxFont->isBold())
+ if (gfxFont->isBold() && index!=16)
index += 2;
- if (gfxFont->isItalic())
+ if (gfxFont->isItalic() && index!=16)
index += 1;
fontname = fontnames[index];
// get width of 'm' in real font and substituted font
}
if(fontname)
setT1Font(fontname, gfxFont->getEncoding());
+ return fontname;
+}
+
+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();
+ }
+
+ if(swfoutput_queryfont(&output, gfxFontName(gfxFont)))
+ {
+ swfoutput_setfont(&output, gfxFontName(gfxFont), -1, 0);
+ return;
+ }
+
+ // look for Type 3 font
+ if (!type3Warning && gfxFont->getType() == fontType3) {
+ type3Warning = gTrue;
+ showFontError(gfxFont, 2);
+ }
+ //dumpFontInfo ("<notice>", gfxFont);
+
+ Ref embRef;
+ GBool embedded = gfxFont->getEmbeddedFontID(&embRef);
+ if(embedded) {
+ if (!gfxFont->is16Bit() &&
+ (gfxFont->getType() == fontType1 ||
+ gfxFont->getType() == fontType1C)) {
+
+ fileName = writeEmbeddedFontToFile(gfxFont);
+ if(!fileName)
+ return ;
+ this->t1id = T1_AddFont(fileName);
+ }
+ else {
+ showFontError(gfxFont,0);
+ fontname = substitutefont(gfxFont);
}
+ } else {
+ if(!fontname || !setT1Font(state->getFont()->getName()->getCString(), gfxFont->getEncoding()))
+ fontname = substitutefont(gfxFont);
}
- swfoutput_setfont(&output,gfxFontName(gfxFont),t1id, fileName);
+ swfoutput_setfont(&output,gfxFontName(gfxFont),this->t1id, fileName);
if(fileName)
unlink(fileName);
}
ImageStream *imgStr;
Guchar pixBuf[4];
GfxRGB rgb;
- if(!width || !height)
+ if(!width || !height || (height<=1 && width<=1))
+ {
+ logf("<verbose> Ignoring %d by %d image", width, height);
+ int i,j;
+ if (inlineImg) {
+ j = height * ((width + 7) / 8);
+ str->reset();
+ for (i = 0; i < j; ++i) {
+ str->getChar();
+ }
+ }
return;
+ }
state->transform(0, 1, &x1, &y1);
state->transform(0, 0, &x2, &y2);
if(!pbminfo) {
logf("<notice> file contains pbm pictures %s",mask?"(masked)":"");
if(mask)
- logf("<verbose> ignoring %d by %d masked picture\n", width, height);
+ logf("<verbose> drawing %d by %d masked picture\n", width, height);
pbminfo = 1;
}
if(mask) {
- str->reset();
- int yes=0;
- while ((c = str->getChar()) != EOF)
+ imgStr = new ImageStream(str, width, 1, 1);
+ imgStr->reset();
+ return;
+ int yes=0,i,j;
+ unsigned char buf[8];
+ int xid = 0;
+ int yid = 0;
+ int x,y;
+ int width2 = (width+3)&(~3);
+ unsigned char*pic = new unsigned char[width2*height];
+ RGBA pal[256];
+ GfxRGB rgb;
+ state->getFillRGB(&rgb);
+ pal[0].r = (int)(rgb.r*255); pal[0].g = (int)(rgb.g*255);
+ pal[0].b = (int)(rgb.b*255); pal[0].a = 255;
+ pal[1].r = 0; pal[1].g = 0; pal[1].b = 0; pal[1].a = 0;
+ xid += pal[1].r*3 + pal[1].g*11 + pal[1].b*17;
+ yid += pal[1].r*7 + pal[1].g*5 + pal[1].b*23;
+ for (y = 0; y < height; ++y)
+ for (x = 0; x < width; ++x)
{
- if((c<32 || c>'z') && yes && (c!=13) && (c!=10)) {
- printf("no ascii: %02x\n", c);
- yes = 1;
- }
+ imgStr->getPixel(buf);
+ pic[width*y+x] = buf[0];
+ xid+=x*buf[0]+1;
+ yid+=y*buf[0]+1;
}
+ int t,found = -1;
+ for(t=0;t<picpos;t++)
+ {
+ if(pic_xids[t] == xid &&
+ pic_yids[t] == yid) {
+ found = t;break;
+ }
+ }
+ if(found<0) {
+ pic_ids[picpos] = swfoutput_drawimagelossless256(&output, pic, pal, width, height,
+ x1,y1,x2,y2,x3,y3,x4,y4);
+ pic_xids[picpos] = xid;
+ pic_yids[picpos] = yid;
+ if(picpos<1024)
+ picpos++;
+ } else {
+ swfoutput_drawimageagain(&output, pic_ids[found], width, height,
+ x1,y1,x2,y2,x3,y3,x4,y4);
+ }
+ free(pic);
} else {
int x,y;
int width2 = (width+3)&(~3);
imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
- colorMap->getBits());
+ colorMap->getBits());
imgStr->reset();
if(colorMap->getNumPixelComps()!=1)
SWFOutputDev*output = 0;
+static void printInfoString(Dict *infoDict, char *key, char *fmt) {
+ Object obj;
+ GString *s1, *s2;
+ int i;
+
+ if (infoDict->lookup(key, &obj)->isString()) {
+ s1 = obj.getString();
+ if ((s1->getChar(0) & 0xff) == 0xfe &&
+ (s1->getChar(1) & 0xff) == 0xff) {
+ s2 = new GString();
+ for (i = 2; i < obj.getString()->getLength(); i += 2) {
+ if (s1->getChar(i) == '\0') {
+ s2->append(s1->getChar(i+1));
+ } else {
+ delete s2;
+ s2 = new GString("<unicode>");
+ break;
+ }
+ }
+ printf(fmt, s2->getCString());
+ delete s2;
+ } else {
+ printf(fmt, s1->getCString());
+ }
+ }
+ obj.free();
+}
+
+static void printInfoDate(Dict *infoDict, char *key, char *fmt) {
+ Object obj;
+ char *s;
+
+ if (infoDict->lookup(key, &obj)->isString()) {
+ s = obj.getString()->getCString();
+ if (s[0] == 'D' && s[1] == ':') {
+ s += 2;
+ }
+ printf(fmt, s);
+ }
+ obj.free();
+}
+
void pdfswf_init(char*filename, char*userPassword)
{
GString *fileName = new GString(filename);