X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=deef3f4306bc612b5a043865b243b7b0d2ed9d6f;hb=04c3312de54408aaf6afe487b6a9cdfaf707949c;hp=fd9cdc04ae36ba227fb16ff8c3f96484cdfe279f;hpb=eba7ba10fa1cb6e8b6d76d1eb6a9f2fb8c340d4a;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index fd9cdc0..deef3f4 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -48,8 +48,8 @@ #include "Error.h" #include "Link.h" #include "OutputDev.h" -#include "GfxState.h" #include "GfxFont.h" +#include "GfxState.h" #include "CharCodeToUnicode.h" #include "NameToUnicodeTable.h" #include "GlobalParams.h" @@ -143,7 +143,7 @@ public: gfxdevice_t* output; // Constructor. - SWFOutputDev(); + SWFOutputDev(gfxdevice_t*output); // Destructor. virtual ~SWFOutputDev() ; @@ -153,15 +153,12 @@ public: void setInfo(InfoOutputDev*info) {this->info = info;} - int save(char*filename); - // Start a page. void startFrame(int width, int height); virtual void startPage(int pageNum, GfxState *state, double x1, double y1, double x2, double y2) ; void endframe(); - void* get(char*name); //----- get info about output device @@ -172,10 +169,9 @@ public: // Does this device use drawChar() or drawString()? virtual GBool useDrawChar(); - // Can this device draw gradients? - virtual GBool useGradients(); - virtual GBool interpretType3Chars() {return gTrue;} + + //virtual GBool useShadedFills() { return gTrue; } //----- initialization and control @@ -250,20 +246,18 @@ public: virtual void type3D0(GfxState *state, double wx, double wy); virtual void type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury); + void finish(); + private: void drawGeneralImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap*colorMap, GBool invert, GBool inlineImg, int mask, int *maskColors, Stream *maskStr, int maskWidth, int maskHeight, GBool maskInvert, GfxImageColorMap*maskColorMap); - int SWFOutputDev::setGfxFont(char*id, char*filename, double quality); + int SWFOutputDev::setGfxFont(char*id, char*name, char*filename, double quality); void strokeGfxline(GfxState *state, gfxline_t*line); void clipToGfxLine(GfxState *state, gfxline_t*line); void fillGfxLine(GfxState *state, gfxline_t*line); - void finish(); - - gfxresult_t*result; //filled when complete - char outer_clip_box; //whether the page clip box is still on InfoOutputDev*info; @@ -311,7 +305,7 @@ public: int pagebuflen; int pagepos; - friend void swf_output_preparepage(swf_output_t*swf, int pdfpage, int outputpage); + friend void dev_output_preparepage(dev_output_t*swf, int pdfpage, int outputpage); }; typedef struct _drawnchar @@ -390,7 +384,6 @@ class InfoOutputDev: public OutputDev } virtual GBool upsideDown() {return gTrue;} virtual GBool useDrawChar() {return gTrue;} - virtual GBool useGradients() {return gTrue;} virtual GBool interpretType3Chars() {return gTrue;} virtual void startPage(int pageNum, GfxState *state, double crop_x1, double crop_y1, double crop_x2, double crop_y2) { @@ -471,34 +464,33 @@ class InfoOutputDev: public OutputDev } }; -SWFOutputDev::SWFOutputDev() -{ - jpeginfo = 0; - textmodeinfo = 0; - ttfinfo = 0; - linkinfo = 0; - pbminfo = 0; - type3active = 0; - statepos = 0; - xref = 0; - substitutepos = 0; - type3Warning = 0; - user_movex = 0; - user_movey = 0; - user_clipx1 = 0; - user_clipy1 = 0; - user_clipx2 = 0; - user_clipy2 = 0; - current_text_stroke = 0; - current_text_clip = 0; - fontlist = 0; - result = 0; - outer_clip_box = 0; - pages = 0; - pagebuflen = 0; - pagepos = 0; - output = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); - gfxdevice_swf_init(output); +SWFOutputDev::SWFOutputDev(gfxdevice_t*output) +{ + this->output = output; + this->jpeginfo = 0; + this->textmodeinfo = 0; + this->ttfinfo = 0; + this->linkinfo = 0; + this->pbminfo = 0; + this->type3active = 0; + this->statepos = 0; + this->xref = 0; + this->substitutepos = 0; + this->type3Warning = 0; + this->user_movex = 0; + this->user_movey = 0; + this->user_clipx1 = 0; + this->user_clipy1 = 0; + this->user_clipx2 = 0; + this->user_clipy2 = 0; + this->current_text_stroke = 0; + this->current_text_clip = 0; + this->fontlist = 0; + this->outer_clip_box = 0; + this->pages = 0; + this->pagebuflen = 0; + this->pagepos = 0; + /* configure device */ parameter_t*p = device_config; while(p) { @@ -526,20 +518,31 @@ void SWFOutputDev::setClip(int x1,int y1,int x2,int y2) static char*getFontID(GfxFont*font) { + Ref*ref = font->getID(); GString*gstr = font->getName(); - char* fontname = gstr==0?0:gstr->getCString(); - if(fontname==0) { - char buf[32]; - Ref*r=font->getID(); - sprintf(buf, "UFONT%d", r->num); - return strdup(buf); + char* fname = gstr==0?0:gstr->getCString(); + char buf[128]; + if(fname==0) { + sprintf(buf, "font-%d-%d", ref->num, ref->gen); + } else { + sprintf(buf, "%s-%d-%d", fname, ref->num, ref->gen); } - return strdup(fontname); + return strdup(buf); } static char*getFontName(GfxFont*font) { - char*fontid = getFontID(font); + char*fontid; + GString*gstr = font->getName(); + char* fname = gstr==0?0:gstr->getCString(); + if(fname==0) { + char buf[32]; + Ref*r=font->getID(); + sprintf(buf, "UFONT%d", r->num); + fontid = strdup(buf); + } + fontid = strdup(fname); + char*fontname= 0; char* plus = strchr(fontid, '+'); if(plus && plus < &fontid[strlen(fontid)-1]) { @@ -1021,32 +1024,12 @@ void SWFOutputDev::finish() } outer_clip_box = 0; } - if(output) { - this->result = output->finish(output); - free(output);output=0; - } -} - -int SWFOutputDev::save(char*filename) -{ - finish(); - return result->save(result, filename); -} -void* SWFOutputDev::get(char*name) -{ - finish(); - return result->get(result, name); } SWFOutputDev::~SWFOutputDev() { finish(); - if(this->result) { - this->result->destroy(this->result); - this->result = 0; - } - if(this->pages) { free(this->pages); this->pages = 0; } @@ -1056,8 +1039,8 @@ SWFOutputDev::~SWFOutputDev() fontlist_t*next = l->next; l->next = 0; gfxfont_free(l->font); - free(l->id); - free(l->filename); + free(l->id);l->id=0; + free(l->filename);l->filename=0; free(l); l = next; } @@ -1071,15 +1054,6 @@ GBool SWFOutputDev::useDrawChar() { return gTrue; } -GBool SWFOutputDev::useGradients() -{ - if(!gradientinfo) - { - msg(" File contains gradients"); - gradientinfo = 1; - } - return gTrue; -} char*renderModeDesc[]= {"fill", "stroke", "fill+stroke", "invisible", "clip+fill", "stroke+clip", "fill+stroke+clip", "clip"}; @@ -1155,7 +1129,7 @@ int getGfxCharID(gfxfont_t*font, int charnr, char *charname, int u) int t; for(t=0;tnum_glyphs;t++) { if(font->glyphs[t].name && !strcmp(font->glyphs[t].name,uniname)) { - msg(" Char [%d,>%s<,%d] maps to %d\n", charnr, uniname, u, t); + msg(" Char [%d,%s,>%d(%s)<] maps to %d\n", charnr, charname, u, uniname, t); return t; } } @@ -1163,7 +1137,7 @@ int getGfxCharID(gfxfont_t*font, int charnr, char *charname, int u) we can find the capitalized version */ for(t=0;tnum_glyphs;t++) { if(font->glyphs[t].name && !strcasecmp(font->glyphs[t].name,uniname)) { - msg(" Char [%d,>>%s<<,%d] maps to %d\n", charnr, uniname, u, t); + msg(" Char [%d,%s,>>%d(%s)<<] maps to %d\n", charnr, charname, u, uniname, t); return t; } } @@ -1241,6 +1215,9 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, Unicode u=0; char*name=0; + if(uLen) + u = _u[0]; + if(font->isCIDFont()) { GfxCIDFont*cfont = (GfxCIDFont*)font; @@ -1278,12 +1255,9 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, return; } } - if(charid<0) { - if(!name) { - msg(" Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)", - FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs); - } + msg(" Didn't find character '%s' (c=%d,u=%d) in current charset (%s, %d characters)", + FIXNULL(name),c, u, FIXNULL((char*)current_font_id), current_gfxfont->num_glyphs); return; } @@ -1327,6 +1301,7 @@ void SWFOutputDev::endString(GfxState *state) now (as there may be texts of other rendering modes in this text object)- clipping objects have to wait until endTextObject, however */ + output->setparameter(output, "mark","TXT"); if((render&3) == RENDER_FILL) { fillGfxLine(state, current_text_stroke); gfxline_free(current_text_stroke); @@ -1341,6 +1316,7 @@ void SWFOutputDev::endString(GfxState *state) gfxline_free(current_text_stroke); current_text_stroke = 0; } + output->setparameter(output, "mark",""); } } @@ -1352,7 +1328,9 @@ void SWFOutputDev::endTextObject(GfxState *state) msg(" Internal error: drawChar.render!=beginString.render"); if(current_text_clip) { + output->setparameter(output, "mark","TXT"); clipToGfxLine(state, current_text_clip); + output->setparameter(output, "mark",""); gfxline_free(current_text_clip); current_text_clip = 0; } @@ -1453,10 +1431,11 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl void SWFOutputDev::drawLink(Link *link, Catalog *catalog) { - msg(" drawlink\n"); double x1, y1, x2, y2, w; gfxline_t points[5]; int x, y; + + msg(" drawlink\n"); link->getRect(&x1, &y1, &x2, &y2); cvtUserToDev(x1, y1, &x, &y); @@ -1484,14 +1463,20 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) points[4].x = x + user_movex; points[4].y = y + user_movey; points[4].next = 0; + + msg(" drawlink %.2f/%.2f %.2f/%.2f %.2f/%.2f %.2f/%.2f\n", + points[0].x, points[0].y, + points[1].x, points[1].y, + points[2].x, points[2].y, + points[3].x, points[3].y); LinkAction*action=link->getAction(); char buf[128]; char*s = 0; char*type = "-?-"; - char*url = 0; char*named = 0; int page = -1; + msg(" drawlink action=%d\n", action->getKind()); switch(action->getKind()) { case actionGoTo: { @@ -1554,12 +1539,15 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) type = "Launch"; LinkLaunch*l = (LinkLaunch*)action; GString * str = new GString(l->getFileName()); - str->append(l->getParams()); + GString * params = l->getParams(); + if(params) + str->append(params); s = strdup(str->getCString()); delete str; } break; case actionURI: { + char*url = 0; type = "URI"; LinkURI*l = (LinkURI*)action; GString*g = l->getURI(); @@ -1580,9 +1568,12 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) break; } } + if(!s) s = strdup("-?-"); + + msg(" drawlink s=%s\n", s); - if(!linkinfo && (page || url)) + if(!linkinfo && (page || s)) { msg(" File contains links"); linkinfo = 1; @@ -1605,9 +1596,9 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) sprintf(buf, "page%d", lpage); output->drawlink(output, points, buf); } - else if(url) + else if(s) { - output->drawlink(output, points, url); + output->drawlink(output, points, s); } msg(" \"%s\" link to \"%s\" (%d)\n", type, FIXNULL(s), page); @@ -1983,7 +1974,7 @@ void SWFOutputDev::setXRef(PDFDoc*doc, XRef *xref) this->xref = xref; } -int SWFOutputDev::setGfxFont(char*id, char*filename, double maxSize) +int SWFOutputDev::setGfxFont(char*id, char*name, char*filename, double maxSize) { gfxfont_t*font = 0; fontlist_t*last=0,*l = this->fontlist; @@ -2035,7 +2026,10 @@ void SWFOutputDev::updateFont(GfxState *state) if (!gfxFont) { return; } + char * fontid = getFontID(gfxFont); + char * fontname = getFontName(gfxFont); + double maxSize = 1.0; if(this->info) { @@ -2056,8 +2050,9 @@ void SWFOutputDev::updateFont(GfxState *state) /* second, see if this is a font which was used before- if so, we are done */ - if(setGfxFont(fontid, 0, 0)) { + if(setGfxFont(fontid, fontname, 0, 0)) { free(fontid); + free(fontname); return; } /* if(swfoutput_queryfont(&output, fontid)) @@ -2074,6 +2069,7 @@ void SWFOutputDev::updateFont(GfxState *state) showFontError(gfxFont, 2); } free(fontid); + free(fontname); return; } @@ -2096,10 +2092,8 @@ void SWFOutputDev::updateFont(GfxState *state) if(!fileName) showFontError(gfxFont,0); else del = 1; } else { - char * fontname = getFontName(gfxFont); fileName = searchFont(fontname); if(!fileName) showFontError(gfxFont,0); - free(fontname); } if(!fileName) { char * fontname = getFontName(gfxFont); @@ -2111,6 +2105,8 @@ void SWFOutputDev::updateFont(GfxState *state) msg(" Try specifying one or more font directories"); fileName = substituteFont(gfxFont, fontid); + if(!fileName) + exit(1); if(fontid) { free(fontid);fontid = strdup(substitutetarget[substitutepos-1]); /*ugly hack*/}; msg(" Font is now %s (%s)", fontid, fileName); } @@ -2118,6 +2114,7 @@ void SWFOutputDev::updateFont(GfxState *state) if(!fileName) { msg(" Couldn't set font %s\n", fontid); free(fontid); + free(fontname); return; } @@ -2126,15 +2123,17 @@ void SWFOutputDev::updateFont(GfxState *state) //swfoutput_setfont(&output, fontid, fileName); - if(!setGfxFont(fontid, 0, 0)) { - setGfxFont(fontid, fileName, maxSize); + if(!setGfxFont(fontid, fontname, 0, 0)) { + setGfxFont(fontid, fontname, fileName, maxSize); } if(fileName && del) unlinkfont(fileName); + if(fileName) free(fileName); free(fontid); + free(fontname); msg(" |"); } @@ -2273,7 +2272,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, ncomps = colorMap->getNumPixelComps(); bits = colorMap->getBits(); } - + if(maskStr) { int x,y; unsigned char buf[8]; @@ -2309,8 +2308,9 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, } delete imgMaskStr; } + maskStr->close(); } - + imgStr = new ImageStream(str, width, ncomps,bits); imgStr->reset(); @@ -2334,6 +2334,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, state->transform(1, 0, &x3, &y3); x3 += user_movex; y3 += user_movey; state->transform(1, 1, &x4, &y4); x4 += user_movex; y4 += user_movey; + if(!pbminfo && !(str->getKind()==strDCT)) { if(!type3active) { msg(" file contains pbm pictures %s",mask?"(masked)":""); @@ -2690,7 +2691,7 @@ void pdfswf_addlanguagedir(char*dir) int l; FILE*fi = 0; - char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc")); + char* config_file = (char*)malloc(strlen(dir) + 1 + sizeof("add-to-xpdfrc") + 1); strcpy(config_file, dir); strcat(config_file, dirseparator()); strcat(config_file, "add-to-xpdfrc"); @@ -2758,10 +2759,10 @@ typedef struct _pdf_doc_internal typedef struct _pdf_page_internal { } pdf_page_internal_t; -typedef struct _swf_output_internal +typedef struct _dev_output_internal { SWFOutputDev*outputDev; -} swf_output_internal_t; +} dev_output_internal_t; pdf_doc_t* pdf_init(char*filename, char*userPassword) { @@ -2889,38 +2890,44 @@ void pdf_page_destroy(pdf_page_t*pdf_page) free(pdf_page);pdf_page=0; } -swf_output_t* swf_output_init() +dev_output_t* dev_output_init(gfxdevice_t*dev) { - swf_output_t*swf_output = (swf_output_t*)malloc(sizeof(swf_output_t)); - memset(swf_output, 0, sizeof(swf_output_t)); - swf_output_internal_t*i= (swf_output_internal_t*)malloc(sizeof(swf_output_internal_t)); - memset(i, 0, sizeof(swf_output_internal_t)); - swf_output->internal = i; + dev_output_t*dev_output = (dev_output_t*)malloc(sizeof(dev_output_t)); + memset(dev_output, 0, sizeof(dev_output_t)); + dev_output_internal_t*i= (dev_output_internal_t*)malloc(sizeof(dev_output_internal_t)); + memset(i, 0, sizeof(dev_output_internal_t)); + dev_output->internal = i; - i->outputDev = new SWFOutputDev(); - return swf_output; + i->outputDev = new SWFOutputDev(dev); + return dev_output; } -void swf_output_setparameter(swf_output_t*swf, char*name, char*value) +void dev_output_setparameter(dev_output_t*swf, char*name, char*value) { pdfswf_setparameter(name, value); } -void swf_output_startframe(swf_output_t*swf, int width, int height) +void dev_output_startframe(dev_output_t*swf, int width, int height) { - swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; + dev_output_internal_t*i= (dev_output_internal_t*)swf->internal; i->outputDev->startFrame(width, height); } -void swf_output_endframe(swf_output_t*swf) +void dev_output_endframe(dev_output_t*swf) { - swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; + dev_output_internal_t*i= (dev_output_internal_t*)swf->internal; i->outputDev->endframe(); } -void swf_output_preparepage(swf_output_t*swf, int pdfpage, int outputpage) +void dev_output_finish(dev_output_t*swf) +{ + dev_output_internal_t*i= (dev_output_internal_t*)swf->internal; + i->outputDev->finish(); +} + +void dev_output_preparepage(dev_output_t*swf, int pdfpage, int outputpage) { - swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; + dev_output_internal_t*i= (dev_output_internal_t*)swf->internal; SWFOutputDev*o = i->outputDev; if(pdfpage < 0) @@ -2944,32 +2951,18 @@ void swf_output_preparepage(swf_output_t*swf, int pdfpage, int outputpage) o->pagepos = pdfpage; } -int swf_output_save(swf_output_t*swf, char*filename) -{ - swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; - int ret = i->outputDev->save(filename); - return ret; -} - -void* swf_output_get(swf_output_t*swf,char*name) -{ - swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; - void* ret = i->outputDev->get(name); - return ret; -} - -void swf_output_destroy(swf_output_t*output) +void dev_output_destroy(dev_output_t*output) { - swf_output_internal_t*i = (swf_output_internal_t*)output->internal; + dev_output_internal_t*i = (dev_output_internal_t*)output->internal; delete i->outputDev; i->outputDev=0; free(output->internal);output->internal=0; free(output); } -void pdf_page_render2(pdf_page_t*page, swf_output_t*swf) +void pdf_page_render2(pdf_page_t*page, dev_output_t*swf) { pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; - swf_output_internal_t*si = (swf_output_internal_t*)swf->internal; + dev_output_internal_t*si = (dev_output_internal_t*)swf->internal; if(!pi) { msg(" pdf_page_render: Parent PDF this page belongs to doesn't exist yet/anymore"); @@ -2985,10 +2978,10 @@ void pdf_page_render2(pdf_page_t*page, swf_output_t*swf) pi->doc->displayPage((OutputDev*)si->outputDev, page->nr, zoom, zoom, /*rotate*/0, true, true, /*doLinks*/(int)1); } -void pdf_page_rendersection(pdf_page_t*page, swf_output_t*output, int x, int y, int x1, int y1, int x2, int y2) +void pdf_page_rendersection(pdf_page_t*page, dev_output_t*output, int x, int y, int x1, int y1, int x2, int y2) { pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; - swf_output_internal_t*si = (swf_output_internal_t*)output->internal; + dev_output_internal_t*si = (dev_output_internal_t*)output->internal; si->outputDev->setMove(x,y); if((x1|y1|x2|y2)==0) x2++; @@ -2996,10 +2989,10 @@ void pdf_page_rendersection(pdf_page_t*page, swf_output_t*output, int x, int y, pdf_page_render2(page, output); } -void pdf_page_render(pdf_page_t*page, swf_output_t*output) +void pdf_page_render(pdf_page_t*page, dev_output_t*output) { pdf_doc_internal_t*pi = (pdf_doc_internal_t*)page->parent->internal; - swf_output_internal_t*si = (swf_output_internal_t*)output->internal; + dev_output_internal_t*si = (dev_output_internal_t*)output->internal; si->outputDev->setMove(0,0); si->outputDev->setClip(0,0,0,0);