#include <stddef.h>
#include <string.h>
#include <unistd.h>
+#include "../config.h"
//xpdf header files
+#include "config.h"
#include "gfile.h"
#include "GString.h"
#include "gmem.h"
#include "Page.h"
#include "PDFDoc.h"
#include "Error.h"
-#include "config.h"
#include "OutputDev.h"
#include "GfxState.h"
#include "GfxFont.h"
+#include "CharCodeToUnicode.h"
+#include "NameToUnicodeTable.h"
#include "FontFile.h"
#include "GlobalParams.h"
//swftools header files
#include "ttf2pt1.h"
}
+#define logf logarithmf // logf is also used by ../lib/log.h
+#include <math.h>
+#undef logf
+
static PDFDoc*doc = 0;
static char* swffilename = 0;
int numpages;
bezierpathsegment*outline = start = new bezierpathsegment();
int cpos = 0;
double lastx=0,lasty=0;
+ if(!num) {
+ logf("<warning> empty path");
+ outline->type = T1_PATHTYPE_MOVE;
+ outline->dest.x = 0;
+ outline->dest.y = 0;
+ outline->link = 0;
+ return (T1_OUTLINE*)outline;
+ }
for(t = 0; t < num; t++) {
GfxSubpath *subpath = path->getSubpath(t);
int subnum = subpath->getNumPoints();
void SWFOutputDev::drawChar(GfxState *state, double x, double y,
double dx, double dy,
double originX, double originY,
- CharCode c, Unicode *u, int uLen)
+ CharCode c, Unicode *_u, int uLen)
{
logf("<debug> drawChar(%f,%f,%f,%f,'%c')\n",x,y,dx,dy,c);
+
// check for invisible text -- this is used by Acrobat Capture
- if ((state->getRender() & 3) != 3)
- {
- GfxFont*font = state->getFont();
- Gfx8BitFont*font8;
- if(font->isCIDFont()) {
- logf("<error> CID Font");
- return;
- }
- if(font->getType() == fontType3) {
- /* type 3 chars are passed primarily as graphics */
- return;
- }
- font8 = (Gfx8BitFont*)font;
-
- char**enc=font8->getEncoding();
-
- double x1,y1;
- x1 = x;
- y1 = y;
- state->transform(x, y, &x1, &y1);
-
- if(enc[c])
- swfoutput_drawchar(&output, x1, y1, enc[c], c);
- else
- logf("<warning> couldn't get name for character %02x from Encoding", c);
+ if ((state->getRender() & 3) == 3)
+ return;
+
+ GfxFont*font = state->getFont();
+
+ if(font->getType() == fontType3) {
+ /* type 3 chars are passed primarily as graphics */
+ return;
+ }
+ double x1,y1;
+ x1 = x;
+ y1 = y;
+ state->transform(x, y, &x1, &y1);
+
+ if(font->isCIDFont()) {
+ GfxCIDFont*cfont = (GfxCIDFont*)font;
+ Unicode u=0;
+ char*name=0;
+ if(_u)
+ u = *_u;
+ if(u) {
+ int t;
+ for(t=0;t<sizeof(nameToUnicodeTab)/sizeof(nameToUnicodeTab[0]);t++)
+ /* todo: should be precomputed */
+ if(nameToUnicodeTab[t].u == u) {
+ name = nameToUnicodeTab[t].name;
+ break;
+ }
+ }
+/* printf("%02x %04x/%04x-%d \"%s\" %s %d\n", c,u, *_u, uLen, name, cfont->getName()->getCString(),
+ cfont->getType());*/
+
+ if(name)
+ swfoutput_drawchar(&output, x1, y1, name, c);
+ else
+ logf("<warning> couldn't get name for CID character %02x from Encoding", c);
+ } else {
+ Gfx8BitFont*font8;
+ font8 = (Gfx8BitFont*)font;
+ char**enc=font8->getEncoding();
+
+ if(enc && enc[c])
+ swfoutput_drawchar(&output, x1, y1, enc[c], c);
+ else {
+ logf("<warning> couldn't get name for character %02x from Encoding", c);
+ }
}
}
LinkNamed*l = (LinkNamed*)action;
GString*name = l->getName();
if(name) {
- s = name->lowerCase()->getCString();
- named = name->getCString();
- if(strstr(s, "next") || strstr(s, "forward"))
- {
- page = currentpage + 1;
- }
- else if(strstr(s, "prev") || strstr(s, "back"))
- {
- page = currentpage - 1;
- }
- else if(strstr(s, "last") || strstr(s, "end"))
- {
- page = pages[pagepos-1]; //:)
- }
- else if(strstr(s, "first") || strstr(s, "top"))
- {
- page = 1;
- }
+ s = name->lowerCase()->getCString();
+ named = name->getCString();
+ if(!strchr(s,':'))
+ {
+ if(strstr(s, "next") || strstr(s, "forward"))
+ {
+ page = currentpage + 1;
+ }
+ else if(strstr(s, "prev") || strstr(s, "back"))
+ {
+ page = currentpage - 1;
+ }
+ else if(strstr(s, "last") || strstr(s, "end"))
+ {
+ page = pages[pagepos-1]; //:)
+ }
+ else if(strstr(s, "first") || strstr(s, "top"))
+ {
+ page = 1;
+ }
+ }
}
}
break;
int i;
int mapid=-1;
char*filename=0;
+
for(i=0;i<sizeof(pdf2t1map)/sizeof(mapping);i++)
{
if(!strcmp(name, pdf2t1map[i].pdffont))
logf("<verbose> Loading extra font %s from %s\n", FIXNULL(fontname),
FIXNULL(T1_GetFontFileName(i)));
}
+
if(fontname && !strcmp(name, fontname)) {
- logf("<notice> Extra font %s is being used.\n", fontname);
+ logf("<notice> Extra font %d, \"%s\" is being used.\n", i, fontname);
return i;
}
fontname = T1_GetFontFileName(i);
fontname = strrchr(fontname,'/')+1;
if(strstr(fontname, name)) {
- logf("<notice> Extra font %s is being used.\n", fontname);
+ logf("<notice> Extra font %d, \"%s\" is being used.\n", i, fontname);
return i;
}
}
ret = font->getEmbeddedFontID(&embRef);
if(!ret) {
+ logf("<verbose> Didn't get embedded font id");
/* not embedded- the caller should now search the font
directories for this font */
return 0;
refObj.fetch(ref, &strObj);
refObj.free();
strObj.streamReset();
- while ((c = strObj.streamGetChar()) != EOF) {
- fputc(c, f);
+ int f4[4];
+ char f4c[4];
+ int t;
+ for(t=0;t<4;t++) {
+ f4[t] = strObj.streamGetChar();
+ f4c[t] = (char)f4[t];
+ if(f4[t] == EOF)
+ break;
+ }
+ if(t==4) {
+ if(!strncmp(f4c, "true", 4)) {
+ /* some weird TTF fonts don't start with 0,1,0,0 but with "true".
+ Change this on the fly */
+ f4[0] = f4[2] = f4[3] = 0;
+ f4[1] = 1;
+ }
+ fputc(f4[0], f);
+ fputc(f4[1], f);
+ fputc(f4[2], f);
+ fputc(f4[3], f);
+
+ while ((c = strObj.streamGetChar()) != EOF) {
+ fputc(c, f);
+ }
}
strObj.streamClose();
strObj.free();
}
fclose(f);
- if(font->getType() == fontTrueType)
+ if(font->getType() == fontTrueType ||
+ font->getType() == fontCIDType2)
{
if(!ttfinfo) {
logf("<notice> File contains TrueType fonts");
/* ------------------------------ V1 */
char*fontname = "Times-Roman";
+ logf("<verbose> substituteFont(,%s)", FIXNULL(oldname));
this->t1id = searchT1Font(fontname);
if(substitutepos>=sizeof(substitutesource)/sizeof(char*)) {
logf("<fatal> Too many fonts in file.");
Ref embRef;
GBool embedded = gfxFont->getEmbeddedFontID(&embRef);
if(embedded) {
- if (!gfxFont->isCIDFont() &&
- (gfxFont->getType() == fontType1 ||
- gfxFont->getType() == fontType1C ||
- gfxFont->getType() == fontTrueType)) {
-
+ if (gfxFont->getType() == fontType1 ||
+ gfxFont->getType() == fontType1C ||
+ gfxFont->getType() == fontTrueType ||
+ gfxFont->getType() == fontCIDType2)
+ {
fileName = writeEmbeddedFontToFile(xref, gfxFont);
if(!fileName) {
logf("<error> Couldn't write font to file");
}
}
else {
- showFontError(gfxFont,0);
- fontname = substituteFont(gfxFont, fontname);
+ /* in case the font is embedded, but has an
+ unsupported format, we just look through the
+ font directories */
+ int newt1id = searchT1Font(fontname);
+ if(newt1id<0) {
+ showFontError(gfxFont,0);
+ fontname = substituteFont(gfxFont, fontname);
+ } else
+ this->t1id = newt1id;
}
} else {
if(fontname) {
int newt1id = searchT1Font(fontname);
if(newt1id<0) {
+ showFontError(gfxFont,1);
fontname = substituteFont(gfxFont, fontname);
} else
this->t1id = newt1id;
}
- else
+ else {
+ showFontError(gfxFont,1);
fontname = substituteFont(gfxFont, fontname);
+ }
}
if(t1id<0) {
return doc->getNumPages();
}
+void pdfswf_insertstop()
+{
+ insertstoptag = 1;
+}
+
+void pdfswf_setversion(int n)
+{
+ flashversion = n;
+}
+
int closed=0;
void pdfswf_close()
{