X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=d5a9c99e09fe7cf32079492fc9dc6235df716ab1;hb=866c8bb6feb71040e36a89c177cb1c024f3d9ba4;hp=1bcd2712c49bee6cd1a3d15f1c83b5e1948cf25f;hpb=4a6a93fe0bd0e8a252c37f76569673a91e31cf9b;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 1bcd271..d5a9c99 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -34,7 +34,6 @@ #include "Catalog.h" #include "Page.h" #include "PDFDoc.h" -#include "Params.h" #include "Error.h" #include "config.h" #include "OutputDev.h" @@ -131,6 +130,8 @@ public: // Does this device use drawChar() or drawString()? virtual GBool useDrawChar(); + + virtual GBool interpretType3Chars() {return false;} //----- initialization and control @@ -319,15 +320,15 @@ int lastdumppos = 0; */ void showFontError(GfxFont*font, int nr) { - Ref r=font->getID(); + Ref*r=font->getID(); int t; for(t=0;tnum) break; if(t < lastdumppos) return; if(lastdumpposnum; if(nr == 0) logf(" The following font caused problems:"); else if(nr == 1) @@ -340,24 +341,22 @@ void showFontError(GfxFont*font, int nr) void dumpFontInfo(char*loglevel, GfxFont*font) { GString *gstr; - char*name; + char*name = 0; gstr = font->getName(); - Ref r=font->getID(); - logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?FIXNULL(gstr->getCString()):"(unknown font)", r.num,r.gen); + Ref* r=font->getID(); + logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?FIXNULL(gstr->getCString()):"(unknown font)", r->num,r->gen); gstr = font->getTag(); if(gstr) logf("%sTag: %s\n", loglevel, FIXNULL(gstr->getCString())); - if(font->is16Bit()) logf("%sis 16 bit\n", loglevel); + + //if(font->is16Bit()) logf("%sis 16 bit\n", loglevel); //FIXME: not existing in xpdf 1.01 GfxFontType type=font->getType(); switch(type) { case fontUnknownType: logf("%sType: unknown\n",loglevel); break; - case fontType0: - logf("%sType: 0\n",loglevel); - break; case fontType1: logf("%sType: 1\n",loglevel); break; @@ -370,11 +369,21 @@ void dumpFontInfo(char*loglevel, GfxFont*font) case fontTrueType: logf("%sType: TrueType\n",loglevel); break; + case fontCIDType0: + logf("%sType: CIDType0\n",loglevel); + break; + case fontCIDType0C: + logf("%sType: CIDType0C\n",loglevel); + break; + case fontCIDType2: + logf("%sType: CIDType2\n",loglevel); + break; } Ref embRef; GBool embedded = font->getEmbeddedFontID(&embRef); - name = font->getEmbeddedFontName(); + if(font->getEmbeddedFontName()) + name = font->getEmbeddedFontName()->getCString(); if(embedded) logf("%sEmbedded name: %s id: %d\n",loglevel, FIXNULL(name), embRef.num); @@ -558,15 +567,23 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, double dx, doub // check for invisible text -- this is used by Acrobat Capture if ((state->getRender() & 3) != 3) { - FontEncoding*enc=state->getFont()->getEncoding(); + GfxFont*font = state->getFont(); + Gfx8BitFont*font8; + if(font->isCIDFont()) { + logf(" CID Font\n"); + return; + } + font8 = (Gfx8BitFont*)font; + + char**enc=font8->getEncoding(); double x1,y1; x1 = x; y1 = y; state->transform(x, y, &x1, &y1); - if(enc->getCharName(c)) - swfoutput_drawchar(&output, x1, y1, enc->getCharName(c), c); + if(enc[c]) + swfoutput_drawchar(&output, x1, y1, enc[c], c); else logf(" couldn't get name for character %02x from Encoding", c); } @@ -602,6 +619,7 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state) void SWFOutputDev::drawLink(Link *link, Catalog *catalog) { + logf(" drawlink\n"); double x1, y1, x2, y2, w; GfxRGB rgb; swfcoord points[5]; @@ -842,12 +860,12 @@ void SWFOutputDev::updateStrokeColor(GfxState *state) char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font) { - char*tmpFileName = NULL; +/* char*tmpFileName = NULL; FILE *f; int c; char *fontBuf; int fontLen; - Type1CFontConverter *cvt; +// Type1CFontConverter *cvt; Ref embRef; Object refObj, strObj; tmpFileName = "/tmp/tmpfont"; @@ -900,7 +918,9 @@ char*SWFOutputDev::writeEmbeddedFontToFile(GfxFont*font) tmpFileName = strdup(name2); } - return tmpFileName; + return tmpFileName;*/ + + return 0; } char* gfxFontName(GfxFont* gfxFont) @@ -912,8 +932,8 @@ char* gfxFontName(GfxFont* gfxFont) } else { char buf[32]; - Ref r=gfxFont->getID(); - sprintf(buf, "UFONT%d", r.num); + Ref*r=gfxFont->getID(); + sprintf(buf, "UFONT%d", r->num); return strdup(buf); } } @@ -924,7 +944,8 @@ int substitutepos = 0; char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) { - //substitute font + return "Times-Roman"; +/* //substitute font char* fontname = 0; double m11, m12, m21, m22; int index; @@ -938,7 +959,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) // printf("%d %s\n", t, gfxFont->getCharName(t)); showFontError(gfxFont, 1); - if (!gfxFont->is16Bit()) { + if(1) { //if (!gfxFont->is16Bit()) { FIXME: xpdf 1.01 does not have is16Bit() if(gfxFont->isSymbolic()) { if(fontname && (strstr(fontname,"ing"))) //Dingbats, Wingdings etc. index = 16; @@ -1008,7 +1029,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) logf(" substituting %s -> %s", FIXNULL(oldname), FIXNULL(fontname)); substitutepos ++; } - return fontname; + return fontname;*/ } void unlinkfont(char* filename) @@ -1074,7 +1095,7 @@ void SWFOutputDev::updateFont(GfxState *state) Ref embRef; GBool embedded = gfxFont->getEmbeddedFontID(&embRef); if(embedded) { - if (!gfxFont->is16Bit() && + if (//!gfxFont->is16Bit() && FIXME: not in xpdf 1.01 (gfxFont->getType() == fontType1 || gfxFont->getType() == fontType1C || gfxFont->getType() == fontTrueType)) { @@ -1145,17 +1166,26 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, ImageStream *imgStr; Guchar pixBuf[4]; GfxRGB rgb; + int ncomps = 1; + int bits = 1; + + if(colorMap) { + ncomps = colorMap->getNumPixelComps(); + bits = colorMap->getBits(); + } + imgStr = new ImageStream(str, width, ncomps,bits); + imgStr->reset(); + if(!width || !height || (height<=1 && width<=1)) { logf(" 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(); - } + unsigned char buf[8]; + int x,y; + for (y = 0; y < height; ++y) + for (x = 0; x < width; ++x) { + imgStr->getPixel(buf); } + delete imgStr; return; } @@ -1164,206 +1194,161 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, state->transform(1, 0, &x3, &y3); state->transform(1, 1, &x4, &y4); - if (str->getKind() == strDCT && - (colorMap->getNumPixelComps() == 3 || !mask) ) - { - sprintf(fileName, "%s.jpg",mktmpname(0)); - logf(" Found jpeg. Temporary storage is %s", fileName); - if(!jpeginfo) - { - logf(" file contains jpeg pictures"); - jpeginfo = 1; - } - if (!(fi = fopen(fileName, "wb"))) { - logf(" Couldn't open temporary image file '%s'", fileName); - return; - } - 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); - - int t,found = -1; - for(t=0;t file contains pbm pictures %s",mask?"(masked)":""); - if(mask) - logf(" drawing %d by %d masked picture\n", width, height); - pbminfo = 1; - } + if(!pbminfo && !(str->getKind()==strDCT)) { + logf(" file contains pbm pictures %s",mask?"(masked)":""); + if(mask) + logf(" drawing %d by %d masked picture\n", width, height); + pbminfo = 1; + } + if(!jpeginfo && (str->getKind()==strDCT)) { + logf(" file contains jpeg pictures"); + jpeginfo = 1; + } - if(mask) { - 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) - { - 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;tgetNumPixelComps(), - colorMap->getBits()); - imgStr->reset(); + if(mask) { + 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) + { + imgStr->getPixel(buf); + // if(invert) buf[0]=255-buf[0]? + pic[width*y+x] = buf[0]; + xid+=x*buf[0]+1; + yid+=y*buf[0]+1; + } + int t,found = -1; + for(t=0;tgetNumPixelComps()!=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;tgetNumPixelComps()!=1 || str->getKind()==strDCT) + { + 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; } - 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;tgetKind()==strDCT) + pic_ids[picpos] = swfoutput_drawimagejpeg(&output, pic, width, height, + x1,y1,x2,y2,x3,y3,x4,y4); + else + 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; + delete imgStr; + return; + } + else + { + U8*pic = new U8[width*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[width*y+x] = pixBuf[0]; + xid += x*pixBuf[0]*7; + yid += y*pixBuf[0]*3; } - delete imgStr; - } - + } + int found = -1; + for(t=0;t drawImageMask %dx%d, invert=%d inline=%d", width, height, invert, inlineImg); drawGeneralImage(state,ref,str,width,height,0,invert,inlineImg,1); } @@ -1378,6 +1364,11 @@ void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, GBool inlineImg) { + logf(" drawImage %dx%d, %s, inline=%d", width, height, + colorMap?"colorMap":"no colorMap", inlineImg); + if(colorMap) + logf(" colorMap pixcomps:%d bits:%d mode:%d\n", colorMap->getNumPixelComps(), + colorMap->getBits(),colorMap->getColorSpace()->getMode()); drawGeneralImage(state,ref,str,width,height,colorMap,0,inlineImg,0); } @@ -1431,13 +1422,12 @@ void pdfswf_init(char*filename, char*userPassword) GString *userPW; Object info; // init error file - errorInit(); + //errorInit(); FIXME xpdf 1.01 // read config file - initParams(xpdfConfigFile); + //initParams(xpdfConfigFile); FIXME xpdf 1.01 // open PDF file - xref = NULL; if (userPassword && userPassword[0]) { userPW = new GString(userPassword); } else { @@ -1521,6 +1511,11 @@ void pdfswf_storeallcharacters() storeallcharacters = 1; } +void pdfswf_enablezlib() +{ + enablezlib = 1; +} + void pdfswf_jpegquality(int val) { if(val<0) val=0; @@ -1571,7 +1566,7 @@ void pdfswf_close() logf(" pdfswf.cc: pdfswf_close()"); delete output; delete doc; - freeParams(); + //freeParams(); // check for memory leaks Object::memCheck(stderr); gMemReport(stderr);