#include <stdlib.h>
#include <stddef.h>
#include <string.h>
+#include <unistd.h>
//xpdf header files
#include "GString.h"
#include "gmem.h"
#include "../lib/log.h"
}
-static char* filename = 0;
+static char* swffilename = 0;
static void printInfoString(Dict *infoDict, char *key, char *fmt);
static void printInfoDate(Dict *infoDict, char *key, char *fmt);
int clippos;
int setT1Font(char*name,FontEncoding*enc);
- int initT1Font(int id, FontEncoding*encoding);
int t1id;
};
char*name;
gstr = font->getName();
Ref r=font->getID();
- logf("%s=========== %s (ID:%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num);
+ logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num,r.gen);
gstr = font->getTag();
if(gstr)
y1 = y;
state->transform(x, y, &x1, &y1);
- swfoutput_drawchar(&output, x1, y1, c);
+ swfoutput_drawchar(&output, x1, y1, enc->getCharName(c));
}
}
state->transform(state->getX1(),state->getY1(),&x1,&y1);
state->transform(state->getX2(),state->getY2(),&x2,&y2);
if(!outputstarted) {
- swfoutput_init(&output, filename, abs((int)(x2-x1)),abs((int)(y2-y1)));
+ swfoutput_init(&output, swffilename, abs((int)(x2-x1)),abs((int)(y2-y1)));
outputstarted = 1;
}
else
if(id<0)
return 0;
- /* T1 allows us to recode only once. Therefore, remove
- and reload the font to reset it */
- T1_DeleteFont(id);
- T1_LoadFont(id);
- initT1Font(id, encoding);
-}
-
-int SWFOutputDev::initT1Font(int id, FontEncoding*encoding)
-{
- int encStrSize;
- char *encPtr;
- int i;
-
- if(!T1_GetFontName(id))
- T1_LoadFont(id);
-
- /* reencode the font:
- * This is the only way to get the unmapped characters
- * from t1lib
- */
- encStrSize = 0;
- for (i = 0; i < 256 && i < encoding->getSize(); ++i) {
- if (encoding->getCharName(i)) {
- encStrSize += strlen(encoding->getCharName(i)) + 1;
- }
- }
- char**enc = (char **)gmalloc(257 * sizeof(char *));
- char*encStr = (char *)gmalloc(encStrSize * sizeof(char));
- encPtr = encStr;
- for (i = 0; i < 256 && i < encoding->getSize(); ++i) {
- if (encoding->getCharName(i)) {
- strcpy(encPtr, encoding->getCharName(i));
- enc[i] = encPtr;
- encPtr += strlen(encPtr) + 1;
- } else {
- enc[i] = ".notdef";
- }
- }
- for (; i < 256; ++i) {
- enc[i] = ".notdef";
- }
- enc[256] = "custom";
- int ret=T1_ReencodeFont(id, enc);
- t1id = id;
- return 1;
+ this->t1id = id;
}
void SWFOutputDev::updateLineWidth(GfxState *state)
int embedded_mappos = 0;
int embedded_maxpos = 128;
+char* gfxFontName(GfxFont* gfxFont)
+{
+ GString *gstr;
+ gstr = gfxFont->getName();
+ if(gstr) {
+ return gstr->getCString();
+ }
+ else {
+ char buf[32];
+ Ref r=gfxFont->getID();
+ sprintf(buf, "UFONT%d", r.num);
+ return strdup(buf);
+ }
+}
+
void SWFOutputDev::updateFont(GfxState *state)
{
double m11, m12, m21, m22;
char * fontname = 0;
GfxFont*gfxFont = state->getFont();
+ char * fileName = 0;
if (!gfxFont) {
return;
}
- if(swfoutput_queryfont(&output, gfxFont->getID().num))
+ if(swfoutput_queryfont(&output, gfxFontName(gfxFont)))
{
- swfoutput_setfont(&output, gfxFont->getID().num, -1);
+ swfoutput_setfont(&output, gfxFontName(gfxFont), -1, 0);
return;
}
for(t=0;t<embedded_mappos;t++)
if(embeddedids[t] == embRef.num)
break;
- if(t==embedded_mappos)
+ if(t==embedded_mappos || 1)
{
- char*fileName;
if (!gfxFont->is16Bit() &&
(gfxFont->getType() == fontType1 ||
gfxFont->getType() == fontType1C)) {
showFontError(gfxFont,0);
return ;
}
+
t1id = T1_AddFont(fileName);
embeddedids[embedded_mappos] = embRef.num;
embeddedt1ids[embedded_mappos] = t1id;
{
t1id = embeddedt1ids[t];
}
- initT1Font(t1id, gfxFont->getEncoding());
} else {
fontname = NULL;
if(gfxFont->getName()) {
}
}
- swfoutput_setfont(&output,gfxFont->getID().num,t1id);
+ swfoutput_setfont(&output,gfxFontName(gfxFont),t1id, fileName);
+ if(fileName)
+ unlink(fileName);
}
void SWFOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
fputc(c, fi);
fclose(fi);
swfoutput_drawimagefile(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4);
+ unlink(fileName);
} else {
logf("<notice> File contains pbm pictures.");
}
fputc(c, fi);
fclose(fi);
swfoutput_drawimagefile(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4);
+ unlink(fileName);
} else {
logf("<notice> File contains pbm pictures.");
}
void pdfswf_setoutputfilename(char*_filename)
{
- filename = _filename;
+ swffilename = _filename;
}
void pdfswf_convertpage(int page)
//char*charname = T1_GetCharName(t1fontindex, character);
/* process a character. */
-void drawchar(struct swfoutput*obj, SWFFont*font, char character, swfmatrix*m)
+void drawchar(struct swfoutput*obj, SWFFont*font, char*character, swfmatrix*m)
{
T1_OUTLINE*outline = font->getOutline(character);
- char* charname = font->getCharName(character);
+ char* charname = character;
if(!outline)
- {
- /* for newline, we don't print an error. FIXME: We shouldn't get newlines here
- in the first place
- */
- if(character != '\n') {
- logf("<error> Char to set is not defined!");
- logf("<error> - font file is %s\n", font->getName());
- logf("<error> - char 0x%02x is named %s\n",character, charname);
- }
return;
- }
+
swfmatrix m2=*m;
m2.m11/=100;
m2.m21/=100;
drawpath(outline,m, 0);
}
-SWFFont::SWFFont(int t1fontindex)
+SWFFont::SWFFont(char*name, int id, char*filename)
{
- int t;
- for(t=0;t<256;t++)
- {
- int width = T1_GetCharWidth(t1fontindex, t);
- BBox bbox = T1_GetCharBBox(t1fontindex, t);
- T1_OUTLINE*outline = T1_GetCharOutline(t1fontindex,t,100.0,0);
+ if(!T1_GetFontName(id))
+ T1_LoadFont(id);
- char*name;
- this->outline[t] = T1_CopyOutline(outline);
+ this->name = strdup(T1_GetFontFileName(id));
+ this->fontid = name;
+ this->t1id = id;
- name = T1_GetCharName(t1fontindex, t);
- if(!name || name[0]=='.')
- {
- this->charname[t] = 0;
- this->outline[t] = 0;
+ char**a= T1_GetAllCharNames(id);
+ int t=0, outlinepos=0;
+ char*map[256];
+ while(a[t])
+ t++;
+
+ this->charnum = t;
+ if(!t)
+ return;
+ logf("<notice> Font %s(%d): Storing %d outlines.\n", name, id, t);
+
+ outline = (T1_OUTLINE**)malloc(t*sizeof(T1_OUTLINE*));
+ charname = (char**)malloc(t*sizeof(char*));
+
+ t=0;
+ while(*a)
+ {
+ map[t] = *a;
+ a++;
+ t++;
+ if(t==256 || !*a) {
+ int s;
+ for(s=t;s<256;s++)
+ map[s] = ".notdef";
+
+ int ret = T1_ReencodeFont(id, map);
+ if(ret) {
+ T1_DeleteFont(id);
+ T1_LoadFont(id);
+ int ret = T1_ReencodeFont(id, map);
+ if(ret)
+ fprintf(stderr,"Can't reencode font: (%s) ret:%d\n",filename, ret);
+ }
+
+ // parsecharacters
+ for(s=0;s<t;s++)
+ {
+ this->outline[outlinepos] = T1_CopyOutline(T1_GetCharOutline(id, s, 100.0, 0));
+ this->charname[outlinepos] = strdup(T1_GetCharName(id, s));
+ outlinepos++;
+ }
+ t=0;
}
- else
- this->charname[t] = strdup(name);
}
- this->name = strdup(T1_GetFontFileName(t1fontindex));
-}
-
-T1_OUTLINE*SWFFont::getOutline(unsigned char nr)
-{
- return outline[nr];
}
-char*SWFFont::getCharName(int t)
+T1_OUTLINE*SWFFont::getOutline(char*name)
{
- return this->charname[t];
+ int t;
+ for(t=0;t<this->charnum;t++) {
+ if(!strcmp(this->charname[t],name))
+ return outline[t];
+ }
+ return 0;
}
char*SWFFont::getName()
} *fontlist = 0;
/* set's the t1 font index of the font to use for swfoutput_drawchar(). */
-void swfoutput_setfont(struct swfoutput*obj, int fontid, int t1id)
+void swfoutput_setfont(struct swfoutput*obj, char*fontid, int t1id, char*filename)
{
fontlist_t*last=0,*iterator;
- if(obj->font && obj->font->id == fontid)
+ if(obj->font && !strcmp(obj->font->fontid,fontid))
return;
iterator = fontlist;
while(iterator) {
- if(iterator->font->id == fontid)
+ if(!strcmp(iterator->font->fontid,fontid))
break;
last = iterator;
iterator = iterator->next;
}
if(t1id<0) {
- logf("<error> internal error: t1id:%d, fontid:%d\n", t1id,fontid);
+ logf("<error> internal error: t1id:%d, fontid:%s\n", t1id,fontid);
}
- SWFFont*font = new SWFFont(t1id);
+ SWFFont*font = new SWFFont(fontid, t1id, filename);
iterator = new fontlist_t;
iterator->font = font;
iterator->next = 0;
obj->font = font;
}
-int swfoutput_queryfont(struct swfoutput*obj, int fontid)
+int swfoutput_queryfont(struct swfoutput*obj, char*fontid)
{
fontlist_t *iterator = fontlist;
while(iterator) {
- if(iterator->font->id == fontid)
+ if(!strcmp(iterator->font->fontid,fontid))
return 1;
iterator = iterator->next;
}
}
/* draws a character at x,y. */
-void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char character)
+void swfoutput_drawchar(struct swfoutput* obj,double x,double y,char*character)
{
swfmatrix m;
m.m11 = obj->fontm11;
class SWFFont
{
- T1_OUTLINE*(outline[256]);
- char*(charname[256]);
+ T1_OUTLINE**outline;
+ char**charname;
char*name;
+ int charnum;
public:
- int id;
+ int t1id;
+ char*fontid;
- SWFFont(int t1id);
- T1_OUTLINE*getOutline(unsigned char nr);
+ SWFFont(char*name, int t1id, char*filename);
+ T1_OUTLINE*getOutline(char*charname);
char*getName();
char*getCharName(int t);
};
void swfoutput_newpage(struct swfoutput*);
-void swfoutput_setfont(struct swfoutput*, int fontid, int t1font);
-int swfoutput_queryfont(struct swfoutput*, int fontid);
+void swfoutput_setfont(struct swfoutput*, char*fontid, int t1font, char*filename);
+int swfoutput_queryfont(struct swfoutput*, char*fontid);
void swfoutput_setdrawmode(struct swfoutput*, int drawmode);
void swfoutput_setfillcolor(struct swfoutput*, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
void swfoutput_setstrokecolor(struct swfoutput*, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
void swfoutput_setfontmatrix(struct swfoutput*,double,double,double,double);
void swfoutput_setlinewidth(struct swfoutput*, double linewidth);
-void swfoutput_drawchar(struct swfoutput*,double x,double y,char a);
+void swfoutput_drawchar(struct swfoutput*,double x,double y,char*a);
void swfoutput_drawpath(struct swfoutput*, T1_OUTLINE*outline, struct swfmatrix*m);
void swfoutput_startclip(struct swfoutput*, T1_OUTLINE*outline, struct swfmatrix*m);
void swfoutput_endclip(struct swfoutput*);