From 4280bce95855945638777a1964581d0440d28ff4 Mon Sep 17 00:00:00 2001 From: kramm Date: Mon, 29 Oct 2001 09:37:37 +0000 Subject: [PATCH] implement picture cache, so pictures that are referenced multiple times only get stored once. --- pdf2swf/SWFOutputDev.cc | 108 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 94 insertions(+), 14 deletions(-) diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 51f051a..55b6028 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -944,6 +944,12 @@ void SWFOutputDev::updateFont(GfxState *state) 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) @@ -955,7 +961,9 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, 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); @@ -977,10 +985,37 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, } 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_drawimagejpeg(&output, fileName, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + + 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 = (U8)(rgb.r * 255 + 0.5); - pic[width*y+x].g = (U8)(rgb.g * 255 + 0.5); - pic[width*y+x].b = (U8)(rgb.b * 255 + 0.5); - pic[width*y+x].a = 255;//(U8)(rgb.a * 255 + 0.5); + 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; } } - swfoutput_drawimagelossless(&output, pic, width, height, - x1,y1,x2,y2,x3,y3,x4,y4); + int t,found = -1; + for(t=0;tgetRGB(pixBuf, &rgb); - pal[t].r = (U8)(rgb.r * 255 + 0.5); - pal[t].g = (U8)(rgb.g * 255 + 0.5); - pal[t].b = (U8)(rgb.b * 255 + 0.5); - pal[t].a = 255;//(U8)(rgb.b * 255 + 0.5); + 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; } } - swfoutput_drawimagelossless256(&output, pic, pal, width, height, - x1,y1,x2,y2,x3,y3,x4,y4); + int found = -1; + for(t=0;t