if(lastdumppos<sizeof(lastdumps)/sizeof(int))
lastdumps[lastdumppos++] = r.num;
if(nr == 0)
- logf("<error> The following font caused problems:");
+ logf("<warning> The following font caused problems:");
else if(nr == 1)
- logf("<error> The following font caused problems (substituting):");
+ logf("<warning> The following font caused problems (substituting):");
else if(nr == 2)
- logf("<error> This document contains Type 3 Fonts: (some text may be incorrectly displayed)");
+ logf("<warning> This document contains Type 3 Fonts: (some text may be incorrectly displayed)");
- dumpFontInfo("<error>", font);
+ dumpFontInfo("<warning>", font);
}
void dumpFontInfo(char*loglevel, GfxFont*font)
SWFOutputDev::SWFOutputDev()
{
+ jpeginfo = 0;
+ pbminfo = 0;
clippos = 0;
clipping[clippos] = 0;
outputstarted = 0;
GfxPath * path = state->getPath();
struct swfmatrix m;
m.m11 = 1; m.m21 = 0; m.m22 = 1;
- m.m21 = 0; m.m13 = 0; m.m23 = 0;
+ m.m12 = 0; m.m13 = 0; m.m23 = 0;
T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path);
swfoutput_setdrawmode(&output, DRAWMODE_STROKE);
swfoutput_drawpath(&output, outline, &m);
GfxPath * path = state->getPath();
struct swfmatrix m;
m.m11 = 1; m.m21 = 0; m.m22 = 1;
- m.m21 = 0; m.m13 = 0; m.m23 = 0;
+ m.m12 = 0; m.m13 = 0; m.m23 = 0;
T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path);
swfoutput_setdrawmode(&output, DRAWMODE_FILL);
swfoutput_drawpath(&output, outline, &m);
GfxPath * path = state->getPath();
struct swfmatrix m;
m.m11 = 1; m.m21 = 0; m.m22 = 1;
- m.m21 = 0; m.m13 = 0; m.m23 = 0;
+ m.m12 = 0; m.m13 = 0; m.m23 = 0;
T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path);
swfoutput_setdrawmode(&output, DRAWMODE_EOFILL);
swfoutput_drawpath(&output, outline, &m);
logf("<debug> clip\n");
GfxPath * path = state->getPath();
struct swfmatrix m;
- m.m11 = 1; m.m21 = 0; m.m22 = 1;
- m.m21 = 0; m.m13 = 0; m.m23 = 0;
+ m.m11 = 1; m.m22 = 1;
+ m.m12 = 0; m.m21 = 0;
+ m.m13 = 0; m.m23 = 0;
T1_OUTLINE*outline = gfxPath_to_T1_OUTLINE(state, path);
swfoutput_startclip(&output, outline, &m);
clipping[clippos] = 1;
GfxPath * path = state->getPath();
struct swfmatrix m;
m.m11 = 1; m.m21 = 0; m.m22 = 1;
- m.m21 = 0; m.m13 = 0; m.m23 = 0;
+ 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;
y1 = y;
state->transform(x, y, &x1, &y1);
- swfoutput_drawchar(&output, x1, y1, enc->getCharName(c));
+ if(enc->getCharName(c))
+ swfoutput_drawchar(&output, x1, y1, enc->getCharName(c));
+ else
+ logf("<warning> couldn't get name for character %02x from Encoding", c);
}
}
double x1,y1,x2,y2;
logf("<debug> startPage %d\n", pageNum);
logf("<notice> processing page %d", pageNum);
- jpeginfo = 0;
- pbminfo = 0;
state->transform(state->getX1(),state->getY1(),&x1,&y1);
state->transform(state->getX2(),state->getY2(),&x2,&y2);
void SWFOutputDev::updateLineWidth(GfxState *state)
{
- double width = state->getLineWidth();
+ double width = state->getTransformedLineWidth();
swfoutput_setlinewidth(&output, width);
}
unlink(fileName);
}
+int pic_xids[1024];
+int pic_yids[1024];
+int pic_ids[1024];
+int picpos = 0;
+int pic_id = 0;
+
void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str,
int width, int height, GfxImageColorMap*colorMap, GBool invert,
GBool inlineImg, int mask)
int c;
char fileName[128];
double x1,y1,x2,y2,x3,y3,x4,y4;
+ ImageStream *imgStr;
+ Guchar pixBuf[4];
+ GfxRGB rgb;
+ if(!width || !height)
+ return;
+
state->transform(0, 1, &x1, &y1);
state->transform(0, 0, &x2, &y2);
state->transform(1, 0, &x3, &y3);
logf("<verbose> Found jpeg. Temporary storage is %s", fileName);
if(!jpeginfo)
{
- logf("<notice> Page contains jpeg pictures");
+ logf("<notice> file contains jpeg pictures");
jpeginfo = 1;
}
if (!(fi = fopen(fileName, "wb"))) {
}
str = ((DCTStream *)str)->getRawStream();
str->reset();
+ int xid = 0;
+ int yid = 0;
+ int count = 0;
while ((c = str->getChar()) != EOF)
+ {
fputc(c, fi);
+ xid += count*c;
+ yid += (~count)*c;
+ count++;
+ }
fclose(fi);
- swfoutput_drawimagefile(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4);
+
+ 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_drawimagejpeg(&output, fileName, 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);
+ }
unlink(fileName);
} else {
- if(!pbminfo)
- {
- logf("<notice> Page contains pbm pictures");
- pbminfo = 1;
- }
+
+ if(!pbminfo) {
+ logf("<notice> file contains pbm pictures %s",mask?"(masked)":"");
+ if(mask)
+ logf("<verbose> ignoring %d by %d masked picture\n", width, height);
+ pbminfo = 1;
+ }
+
+ if(mask) {
+ str->reset();
+ int yes=0;
+ while ((c = str->getChar()) != EOF)
+ {
+ if((c<32 || c>'z') && yes && (c!=13) && (c!=10)) {
+ printf("no ascii: %02x\n", c);
+ yes = 1;
+ }
+ }
+ } else {
+ int x,y;
+ int width2 = (width+3)&(~3);
+ imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
+ colorMap->getBits());
+ imgStr->reset();
+
+ if(colorMap->getNumPixelComps()!=1)
+ {
+ RGBA*pic=new RGBA[width*height];
+ int xid = 0;
+ int yid = 0;
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; ++x) {
+ int r,g,b,a;
+ imgStr->getPixel(pixBuf);
+ colorMap->getRGB(pixBuf, &rgb);
+ pic[width*y+x].r = r = (U8)(rgb.r * 255 + 0.5);
+ pic[width*y+x].g = g = (U8)(rgb.g * 255 + 0.5);
+ pic[width*y+x].b = b = (U8)(rgb.b * 255 + 0.5);
+ pic[width*y+x].a = a = 255;//(U8)(rgb.a * 255 + 0.5);
+ xid += x*r+x*b*3+x*g*7+x*a*11;
+ yid += y*r*3+y*b*17+y*g*19+y*a*11;
+ }
+ }
+ 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_drawimagelossless(&output, pic, 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);
+ }
+ delete pic;
+ }
+ else
+ {
+ U8*pic = new U8[width2*height];
+ RGBA pal[256];
+ int t;
+ int xid=0,yid=0;
+ for(t=0;t<256;t++)
+ {
+ int r,g,b,a;
+ pixBuf[0] = t;
+ colorMap->getRGB(pixBuf, &rgb);
+ pal[t].r = r = (U8)(rgb.r * 255 + 0.5);
+ pal[t].g = g = (U8)(rgb.g * 255 + 0.5);
+ pal[t].b = b = (U8)(rgb.b * 255 + 0.5);
+ pal[t].a = a = 255;//(U8)(rgb.b * 255 + 0.5);
+ xid += t*r+t*b*3+t*g*7+t*a*11;
+ xid += (~t)*r+t*b*3+t*g*7+t*a*11;
+ }
+ for (y = 0; y < height; ++y) {
+ for (x = 0; x < width; ++x) {
+ imgStr->getPixel(pixBuf);
+ pic[width2*y+x] = pixBuf[0];
+ xid += x*pixBuf[0]*7;
+ yid += y*pixBuf[0]*3;
+ }
+ }
+ int 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);
+ }
+ delete pic;
+ }
+ delete imgStr;
+ }
+
}
}