X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=64d07da5639872445948472451876d0d9eb2c8e3;hb=16ad05687b928ff8071118d69dc0e2bf52c7872f;hp=78be9194665466fa03358e35b7eb106a4791a349;hpb=ded7d89c8c2fcf46c5b9820dd03f5592d9df70f8;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 78be919..64d07da 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -343,11 +343,11 @@ void dumpFontInfo(char*loglevel, GfxFont*font) char*name; gstr = font->getName(); Ref r=font->getID(); - logf("%s=========== %s (ID:%d,%d) ==========\n", loglevel, gstr?gstr->getCString():"(unknown font)", r.num,r.gen); + 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, gstr->getCString()); + logf("%sTag: %s\n", loglevel, FIXNULL(gstr->getCString())); if(font->is16Bit()) logf("%sis 16 bit\n", loglevel); GfxFontType type=font->getType(); @@ -376,11 +376,11 @@ void dumpFontInfo(char*loglevel, GfxFont*font) GBool embedded = font->getEmbeddedFontID(&embRef); name = font->getEmbeddedFontName(); if(embedded) - logf("%sEmbedded name: %s id: %d\n",loglevel, name, embRef.num); + logf("%sEmbedded name: %s id: %d\n",loglevel, FIXNULL(name), embRef.num); gstr = font->getExtFontFile(); if(gstr) - logf("%sExternal Font file: %s\n", loglevel, gstr->getCString()); + logf("%sExternal Font file: %s\n", loglevel, FIXNULL(gstr->getCString())); // Get font descriptor flags. if(font->isFixedWidth()) logf("%sis fixed width\n", loglevel); @@ -602,6 +602,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]; @@ -738,7 +739,7 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) { swfoutput_namedlink(&output, named, points); } - logf(" \"%s\" link to \"%s\" (%d)\n", type, s, page); + logf(" \"%s\" link to \"%s\" (%d)\n", type, FIXNULL(s), page); } } @@ -767,8 +768,6 @@ char type3Warning=0; int SWFOutputDev::searchT1Font(char*name) { int i; - - int id=-1; int mapid=-1; char*filename=0; for(i=0;i Loading extra font %s from %s\n", FIXNULL(fontname), + FIXNULL(T1_GetFontFileName(i))); + } + if(fontname && !strcmp(name, fontname)) { + logf(" Extra font %s is being used.\n", fontname); + return i; + } + fontname = T1_GetFontFileName(i); + if(strrchr(fontname,'/')) + fontname = strrchr(fontname,'/')+1; + + if(strstr(fontname, name)) { + logf(" Extra font %s is being used.\n", fontname); + return i; + } } } - return id; + return -1; } void SWFOutputDev::updateLineWidth(GfxState *state) @@ -983,7 +1006,7 @@ char* SWFOutputDev::substituteFont(GfxFont*gfxFont, char* oldname) if(oldname) { substitutesource[substitutepos] = oldname; substitutetarget[substitutepos] = fontname; - logf(" substituting %s -> %s", oldname, fontname); + logf(" substituting %s -> %s", FIXNULL(oldname), FIXNULL(fontname)); substitutepos ++; } return fontname; @@ -1100,7 +1123,7 @@ void SWFOutputDev::updateFont(GfxState *state) return; } - logf(" Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, fileName, fontname); + logf(" Creating new SWF font: t1id: %d, filename: %s name:%s", this->t1id, FIXNULL(fileName), FIXNULL(fontname)); swfoutput_setfont(&output, fontname, this->t1id, fileName); if(fileName) unlinkfont(fileName); @@ -1123,17 +1146,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; } @@ -1142,206 +1174,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); } @@ -1356,6 +1344,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); } @@ -1499,6 +1492,11 @@ void pdfswf_storeallcharacters() storeallcharacters = 1; } +void pdfswf_enablezlib() +{ + enablezlib = 1; +} + void pdfswf_jpegquality(int val) { if(val<0) val=0; @@ -1534,7 +1532,7 @@ void pdfswf_performconversion() for(t=0;tdisplayPage((OutputDev*)output, currentpage, /*zoom*/100, /*rotate*/0, /*doLinks*/(int)1); + doc->displayPage((OutputDev*)output, currentpage, /*dpi*/72, /*rotate*/0, /*doLinks*/(int)1); } }