X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=pdf2swf%2FSWFOutputDev.cc;h=4ee30d7a2a1df4e1f65b487e9a4b321b7ace2f17;hb=6fa3168316941d0cfd703d598e4f33257cd87a38;hp=0769800f9a77208412e793e76528714e97968a7a;hpb=ae8a7acad94dd9c9d7b5d477ce96c5674935ff9b;p=swftools.git diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index 0769800..4ee30d7 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -76,6 +76,16 @@ typedef struct _fontfile int used; } fontfile_t; +typedef struct _parameter +{ + char*name; + char*value; + struct _parameter*next; +} parameter_t; + +static parameter_t* device_config = 0; +static parameter_t* device_config_next = 0; + // for pdfswf_addfont static fontfile_t fonts[2048]; static int fontnum = 0; @@ -134,9 +144,8 @@ typedef struct _fontlist } fontlist_t; class SWFOutputDev: public OutputDev { - int outputstarted; - struct swfoutput output; public: + gfxdevice_t* output; // Constructor. SWFOutputDev(); @@ -148,7 +157,13 @@ public: void setClip(int x1,int y1,int x2,int y2); int save(char*filename); - void pagefeed(); + + // 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* getSWF(); void getDimensions(int*x1,int*y1,int*x2,int*y2); @@ -171,9 +186,6 @@ public: void setXRef(PDFDoc*doc, XRef *xref); - // Start a page. - virtual void startPage(int pageNum, GfxState *state, double x1, double y1, double x2, double y2) ; - //----- link borders virtual void drawLink(Link *link, Catalog *catalog) ; @@ -241,6 +253,12 @@ public: 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 + SWFOutputState states[64]; int statepos; @@ -351,7 +369,6 @@ SWFOutputDev::SWFOutputDev() pbminfo = 0; type3active = 0; statepos = 0; - outputstarted = 0; xref = 0; substitutepos = 0; type3Warning = 0; @@ -364,8 +381,16 @@ SWFOutputDev::SWFOutputDev() current_text_stroke = 0; current_text_clip = 0; fontlist = 0; - memset(&output, 0, sizeof(output)); -// printf("SWFOutputDev::SWFOutputDev() \n"); + result = 0; + outer_clip_box = 0; + output = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); + gfxdevice_swf_init(output); + /* configure device */ + parameter_t*p = device_config; + while(p) { + output->setparameter(output, p->name, p->value); + p = p->next; + } }; void SWFOutputDev::setMove(int x,int y) @@ -384,9 +409,17 @@ void SWFOutputDev::setClip(int x1,int y1,int x2,int y2) this->user_clipx2 = x2; this->user_clipy2 = y2; } + void SWFOutputDev::getDimensions(int*x1,int*y1,int*x2,int*y2) { - return swfoutput_getdimensions(&output, x1,y1,x2,y2); + if(result) { + *x1 = (int)result->get(result, "xmin"); + *y1 = (int)result->get(result, "ymin"); + *x2 = (int)result->get(result, "xmax"); + *y2 = (int)result->get(result, "ymax"); + } else { + *x1 = *y1 = *x2 = *y2 = 0; + } } static char*getFontID(GfxFont*font) @@ -633,7 +666,7 @@ void dump_outline(gfxline_t*line) } } -gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed) +gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed, int user_movex, int user_movey) { int num = path->getNumSubpaths(); int s,t; @@ -654,7 +687,11 @@ gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed) for(s=0;stransform(subpath->getX(s),subpath->getY(s),&x,&y); + x += user_movex; + y += user_movey; + if(s==0) { if(closed && needsfix && (fabs(posx-lastx)+fabs(posy-lasty))>0.001) { draw.lineTo(&draw, lastx, lasty); @@ -700,7 +737,7 @@ gfxline_t* gfxPath_to_gfxline(GfxState*state, GfxPath*path, int closed) void SWFOutputDev::stroke(GfxState *state) { GfxPath * path = state->getPath(); - gfxline_t*line= gfxPath_to_gfxline(state, path, 0); + gfxline_t*line= gfxPath_to_gfxline(state, path, 0, user_movex, user_movey); strokeGfxline(state, line); gfxline_free(line); } @@ -759,6 +796,7 @@ void SWFOutputDev::strokeGfxline(GfxState *state, gfxline_t*line) line2 = gfxtool_dash_line(line, dash, dashphase); line = line2; + free(dash); msg(" After dashing:"); } @@ -776,7 +814,8 @@ void SWFOutputDev::strokeGfxline(GfxState *state, gfxline_t*line) dump_outline(line); } - swfoutput_drawgfxline(&output, line, width, &col, capType, joinType, miterLimit); + //swfoutput_drawgfxline(output, line, width, &col, capType, joinType, miterLimit); + output->stroke(output, line, width, &col, capType, joinType, miterLimit); if(line2) gfxline_free(line2); @@ -803,12 +842,12 @@ void SWFOutputDev::fillGfxLine(GfxState *state, gfxline_t*line) msg(" fill %02x%02x%02x%02x\n", col.r, col.g, col.b, col.a); dump_outline(line); } - swfoutput_fillgfxline(&output, line, &col); + output->fill(output, line, &col); } void SWFOutputDev::fill(GfxState *state) { GfxPath * path = state->getPath(); - gfxline_t*line= gfxPath_to_gfxline(state, path, 1); + gfxline_t*line= gfxPath_to_gfxline(state, path, 1, user_movex, user_movey); fillGfxLine(state, line); gfxline_free(line); } @@ -817,21 +856,21 @@ void SWFOutputDev::eoFill(GfxState *state) GfxPath * path = state->getPath(); gfxcolor_t col = getFillColor(state); - gfxline_t*line= gfxPath_to_gfxline(state, path, 1); + gfxline_t*line= gfxPath_to_gfxline(state, path, 1, user_movex, user_movey); if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" eofill\n"); dump_outline(line); } - swfoutput_fillgfxline(&output, line, &col); + output->fill(output, line, &col); gfxline_free(line); } void SWFOutputDev::clip(GfxState *state) { GfxPath * path = state->getPath(); - gfxline_t*line = gfxPath_to_gfxline(state, path, 1); + gfxline_t*line = gfxPath_to_gfxline(state, path, 1, user_movex, user_movey); clipToGfxLine(state, line); gfxline_free(line); } @@ -843,42 +882,67 @@ void SWFOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line) dump_outline(line); } - swfoutput_startclip(&output, line); + output->startclip(output, line); states[statepos].clipping++; } void SWFOutputDev::eoClip(GfxState *state) { GfxPath * path = state->getPath(); - gfxline_t*line = gfxPath_to_gfxline(state, path, 1); + gfxline_t*line = gfxPath_to_gfxline(state, path, 1, user_movex, user_movey); if(getLogLevel() >= LOGLEVEL_TRACE) { msg(" eoclip\n"); dump_outline(line); } - swfoutput_startclip(&output, line); + output->startclip(output, line); states[statepos].clipping++; gfxline_free(line); } -/* pass through functions for swf_output */ -int SWFOutputDev::save(char*filename) +void SWFOutputDev::endframe() { - return swfoutput_save(&output, filename); + if(outer_clip_box) { + output->endclip(output); + outer_clip_box = 0; + } + + output->endpage(output); +} + +void SWFOutputDev::finish() +{ + if(outer_clip_box) { + if(output) { + output->endclip(output); + } + outer_clip_box = 0; + } + if(output) { + this->result = output->finish(output); + free(output);output=0; + } } -void SWFOutputDev::pagefeed() + +int SWFOutputDev::save(char*filename) { - swfoutput_pagefeed(&output); + finish(); + return result->save(result, filename); } void* SWFOutputDev::getSWF() { - return (void*)swfoutput_get(&output); + finish(); + return result->get(result, "swf"); } SWFOutputDev::~SWFOutputDev() { - swfoutput_destroy(&output); - outputstarted = 0; + finish(); + + if(this->result) { + this->result->destroy(this->result); + this->result = 0; + } fontlist_t*l = this->fontlist; while(l) { @@ -890,10 +954,10 @@ SWFOutputDev::~SWFOutputDev() free(l); l = next; } + this->fontlist = 0; }; GBool SWFOutputDev::upsideDown() { - msg(" upsidedown? yes"); return gTrue; }; GBool SWFOutputDev::useDrawChar() @@ -1080,9 +1144,11 @@ void SWFOutputDev::drawChar(GfxState *state, double x, double y, gfxmatrix_t m = this->current_font_matrix; state->transform(x, y, &m.tx, &m.ty); + m.tx += user_movex; + m.ty += user_movey; if(render == RENDER_FILL) { - swfoutput_gfxdrawchar(&output, current_font_id, charid, &col, &m); + output->drawchar(output, current_font_id, charid, &col, &m); } else { msg(" Drawing glyph %d as shape", charid); gfxline_t*glyph = current_gfxfont->glyphs[charid].line; @@ -1176,15 +1242,21 @@ void SWFOutputDev::endType3Char(GfxState *state) msg(" endType3Char"); } +void SWFOutputDev::startFrame(int width, int height) +{ + output->startpage(output, width, height); +} + void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, double crop_y1, double crop_x2, double crop_y2) { this->currentpage = pageNum; double x1,y1,x2,y2; int rot = doc->getPageRotate(1); + gfxcolor_t white; laststate = state; - msg(" startPage %d (%f,%f,%f,%f)\n", pageNum, crop_x1, crop_y1, crop_x2, crop_y2); - if(rot!=0) - msg(" page is rotated %d degrees\n", rot); + gfxline_t clippath[5]; + + white.r = white.g = white.b = white.a = 255; /* state->transform(state->getX1(),state->getY1(),&x1,&y1); state->transform(state->getX2(),state->getY2(),&x2,&y2); @@ -1195,12 +1267,13 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl y1 = crop_y1; x2 = crop_x2; y2 = crop_y2;*/ - state->transform(crop_x1,crop_y1,&x1,&y1); - state->transform(crop_x2,crop_y2,&x2,&y2); + state->transform(crop_x1,crop_y1,&x1,&y1); //x1 += user_movex; y1 += user_movey; + state->transform(crop_x2,crop_y2,&x2,&y2); //x2 += user_movex; y2 += user_movey; if(x2 x1)*/ x1 = user_clipx1; @@ -1209,13 +1282,24 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl /*if(user_clipy2 < y2)*/ y2 = user_clipy2; } - if(!outputstarted) { - msg(" Bounding box is (%f,%f)-(%f,%f)", x1,y1,x2,y2); - swfoutput_init(&output); - outputstarted = 1; + //msg(" Bounding box is (%f,%f)-(%f,%f) [shifted by %d/%d]", x1,y1,x2,y2, user_movex, user_movey); + + if(outer_clip_box) { + output->endclip(output); + outer_clip_box = 0; } - - swfoutput_newpage(&output, pageNum, user_movex, user_movey, (int)x1, (int)y1, (int)x2, (int)y2); + + msg(" processing PDF page %d (%dx%d:%d:%d) (move:%d:%d)", pageNum, (int)x2-(int)x1,(int)y2-(int)y1, (int)x1, (int)y1, user_movex, user_movey); + if(rot!=0) + msg(" page is rotated %d degrees\n", rot); + + clippath[0].type = gfx_moveTo;clippath[0].x = x1; clippath[0].y = y1; clippath[0].next = &clippath[1]; + clippath[1].type = gfx_lineTo;clippath[1].x = x2; clippath[1].y = y1; clippath[1].next = &clippath[2]; + clippath[2].type = gfx_lineTo;clippath[2].x = x2; clippath[2].y = y2; clippath[2].next = &clippath[3]; + clippath[3].type = gfx_lineTo;clippath[3].x = x1; clippath[3].y = y2; clippath[3].next = &clippath[4]; + clippath[4].type = gfx_lineTo;clippath[4].x = x1; clippath[4].y = y1; clippath[4].next = 0; + output->startclip(output, clippath); outer_clip_box = 1; + output->fill(output, clippath, &white); } void SWFOutputDev::drawLink(Link *link, Catalog *catalog) @@ -1223,7 +1307,7 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) msg(" drawlink\n"); double x1, y1, x2, y2, w; GfxRGB rgb; - swfcoord points[5]; + gfxline_t points[5]; int x, y; #ifdef XPDF_101 @@ -1235,17 +1319,30 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) rgb.g = 0; rgb.b = 1; cvtUserToDev(x1, y1, &x, &y); - points[0].x = points[4].x = (int)x; - points[0].y = points[4].y = (int)y; + points[0].type = gfx_moveTo; + points[0].x = points[4].x = x + user_movex; + points[0].y = points[4].y = y + user_movey; + points[0].next = &points[1]; cvtUserToDev(x2, y1, &x, &y); - points[1].x = (int)x; - points[1].y = (int)y; + points[1].type = gfx_lineTo; + points[1].x = x + user_movex; + points[1].y = y + user_movey; + points[1].next = &points[2]; cvtUserToDev(x2, y2, &x, &y); - points[2].x = (int)x; - points[2].y = (int)y; + points[2].type = gfx_lineTo; + points[2].x = x + user_movex; + points[2].y = y + user_movey; + points[2].next = &points[3]; cvtUserToDev(x1, y2, &x, &y); - points[3].x = (int)x; - points[3].y = (int)y; + points[3].type = gfx_lineTo; + points[3].x = x + user_movex; + points[3].y = y + user_movey; + points[3].next = &points[4]; + cvtUserToDev(x1, y1, &x, &y); + points[4].type = gfx_lineTo; + points[4].x = x + user_movex; + points[4].y = y + user_movey; + points[4].next = 0; LinkAction*action=link->getAction(); char buf[128]; @@ -1348,23 +1445,24 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) msg(" File contains links"); linkinfo = 1; } + if(page>0) { int t; for(t=0;tdrawlink(output, points, buf); + } } else if(url) { - swfoutput_linktourl(&output, url, points); - } - else if(named) - { - swfoutput_namedlink(&output, named, points); + output->drawlink(output, points, url); } + msg(" \"%s\" link to \"%s\" (%d)\n", type, FIXNULL(s), page); free(s);s=0; } @@ -1385,7 +1483,7 @@ void SWFOutputDev::restoreState(GfxState *state) { msg(" restoreState\n"); updateAll(state); while(states[statepos].clipping) { - swfoutput_endclip(&output); + output->endclip(output); states[statepos].clipping--; } statepos--; @@ -1761,7 +1859,7 @@ int SWFOutputDev::setGfxFont(char*id, char*filename) current_font_id = l->id; current_gfxfont = l->font; font = l->font; - swfoutput_gfxaddfont(&this->output, id, current_gfxfont); + output->addfont(output, id, current_gfxfont); return 1; } l = l->next; @@ -1780,7 +1878,7 @@ int SWFOutputDev::setGfxFont(char*id, char*filename) } else { this->fontlist = l; } - swfoutput_gfxaddfont(&this->output, id, current_gfxfont); + output->addfont(output, id, current_gfxfont); return 1; } @@ -1850,6 +1948,7 @@ void SWFOutputDev::updateFont(GfxState *state) char * fontname = getFontName(gfxFont); fileName = searchFont(fontname); if(!fileName) showFontError(gfxFont,0); + free(fontname); } if(!fileName) { char * fontname = getFontName(gfxFont); @@ -1932,6 +2031,73 @@ unsigned char* antialize(unsigned char*data, int width, int height, int newwidth return newdata; } +#define IMAGE_TYPE_JPEG 0 +#define IMAGE_TYPE_LOSSLESS 1 + +static void drawimage(gfxdevice_t*dev, RGBA* data, int sizex,int sizey, + double x1,double y1, + double x2,double y2, + double x3,double y3, + double x4,double y4, int type) +{ + RGBA*newpic=0; + + double l1 = sqrt((x4-x1)*(x4-x1) + (y4-y1)*(y4-y1)); + double l2 = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); + + gfxline_t p1,p2,p3,p4,p5; + p1.type=gfx_moveTo;p1.x=x1; p1.y=y1;p1.next=&p2; + p2.type=gfx_lineTo;p2.x=x2; p2.y=y2;p2.next=&p3; + p3.type=gfx_lineTo;p3.x=x3; p3.y=y3;p3.next=&p4; + p4.type=gfx_lineTo;p4.x=x4; p4.y=y4;p4.next=&p5; + p5.type=gfx_lineTo;p5.x=x1; p5.y=y1;p5.next=0; + + {p1.x = (int)(p1.x*20)/20.0; + p1.y = (int)(p1.y*20)/20.0; + p2.x = (int)(p2.x*20)/20.0; + p2.y = (int)(p2.y*20)/20.0; + p3.x = (int)(p3.x*20)/20.0; + p3.y = (int)(p3.y*20)/20.0; + p4.x = (int)(p4.x*20)/20.0; + p4.y = (int)(p4.y*20)/20.0; + p5.x = (int)(p5.x*20)/20.0; + p5.y = (int)(p5.y*20)/20.0; + } + + float m00,m10,tx; + float m01,m11,ty; + + gfxmatrix_t m; + m.m00 = (p4.x-p1.x)/sizex; m.m10 = (p2.x-p1.x)/sizey; + m.m01 = (p4.y-p1.y)/sizex; m.m11 = (p2.y-p1.y)/sizey; + m.tx = p1.x - 0.5; + m.ty = p1.y - 0.5; + + gfximage_t img; + img.data = (gfxcolor_t*)data; + img.width = sizex; + img.height = sizey; + + if(type == IMAGE_TYPE_JPEG) + /* TODO: pass image_dpi to device instead */ + dev->setparameter(dev, "next_bitmap_is_jpeg", "1"); + + dev->fillbitmap(dev, &p1, &img, &m, 0); +} + +void drawimagejpeg(gfxdevice_t*dev, RGBA*mem, int sizex,int sizey, + double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4) +{ + drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_JPEG); +} + +void drawimagelossless(gfxdevice_t*dev, RGBA*mem, int sizex,int sizey, + double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4) +{ + drawimage(dev,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_LOSSLESS); +} + + void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap*colorMap, GBool invert, GBool inlineImg, int mask, int*maskColors) @@ -1966,10 +2132,10 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, return; } - state->transform(0, 1, &x1, &y1); - state->transform(0, 0, &x2, &y2); - state->transform(1, 0, &x3, &y3); - state->transform(1, 1, &x4, &y4); + state->transform(0, 1, &x1, &y1); x1 += user_movex; y1+= user_movey; + state->transform(0, 0, &x2, &y2); x2 += user_movex; y2+= user_movey; + 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) { @@ -2053,7 +2219,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, pic2[width*y+x] = pal[pic[y*width+x]]; } } - swfoutput_drawimagelossless(&output, pic2, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagelossless(output, pic2, width, height, x1,y1,x2,y2,x3,y3,x4,y4); free(pic2); free(pic); delete imgStr; @@ -2075,9 +2241,9 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, } } if(str->getKind()==strDCT) - swfoutput_drawimagejpeg(&output, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagejpeg(output, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); else - swfoutput_drawimagelossless(&output, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagelossless(output, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); delete pic; delete imgStr; return; @@ -2121,7 +2287,7 @@ void SWFOutputDev::drawGeneralImage(GfxState *state, Object *ref, Stream *str, pic[width*y+x] = pal[pixBuf[0]]; } } - swfoutput_drawimagelossless(&output, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); + drawimagelossless(output, pic, width, height, x1,y1,x2,y2,x3,y3,x4,y4); delete pic; delete imgStr; @@ -2156,7 +2322,7 @@ void SWFOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, drawGeneralImage(state,ref,str,width,height,colorMap,0,inlineImg,0,maskColors); } -SWFOutputDev*output = 0; +//SWFOutputDev*output = 0; static void printInfoString(Dict *infoDict, char *key, char *fmt) { Object obj; @@ -2203,6 +2369,21 @@ static void printInfoDate(Dict *infoDict, char *key, char *fmt) { int jpeg_dpi = 0; int ppm_dpi = 0; +void storeDeviceParameter(char*name, char*value) +{ + parameter_t*p = new parameter_t(); + p->name = strdup(name); + p->value = strdup(value); + p->next = 0; + if(device_config_next) { + device_config_next->next = p; + device_config_next = p; + } else { + device_config = p; + device_config_next = p; + } +} + void pdfswf_setparameter(char*name, char*value) { msg(" setting parameter %s to \"%s\"", name, value); @@ -2212,19 +2393,19 @@ void pdfswf_setparameter(char*name, char*value) char buf[80]; zoom = atof(value); sprintf(buf, "%f", (double)jpeg_dpi/(double)zoom); - swfoutput_setparameter("jpegsubpixels", buf); + storeDeviceParameter("jpegsubpixels", buf); sprintf(buf, "%f", (double)ppm_dpi/(double)zoom); - swfoutput_setparameter("ppmsubpixels", buf); + storeDeviceParameter("ppmsubpixels", buf); } else if(!strcmp(name, "jpegdpi")) { char buf[80]; jpeg_dpi = atoi(value); sprintf(buf, "%f", (double)jpeg_dpi/(double)zoom); - swfoutput_setparameter("jpegsubpixels", buf); + storeDeviceParameter("jpegsubpixels", buf); } else if(!strcmp(name, "ppmdpi")) { char buf[80]; ppm_dpi = atoi(value); sprintf(buf, "%f", (double)ppm_dpi/(double)zoom); - swfoutput_setparameter("ppmsubpixels", buf); + storeDeviceParameter("ppmsubpixels", buf); } else if(!strcmp(name, "forceType0Fonts")) { forceType0Fonts = atoi(value); } else if(!strcmp(name, "fontdir")) { @@ -2234,7 +2415,7 @@ void pdfswf_setparameter(char*name, char*value) } else if(!strcmp(name, "fontconfig")) { config_use_fontconfig = atoi(value); } else { - swfoutput_setparameter(name, value); + storeDeviceParameter(name,value); } } void pdfswf_addfont(char*filename) @@ -2409,7 +2590,7 @@ pdf_doc_t* pdf_init(char*filename, char*userPassword) return pdf_doc; } -void pdfswf_preparepage(int page) +static void pdfswf_preparepage(int page) { /*FIXME*/ if(!pages) { @@ -2439,7 +2620,6 @@ void pdf_destroy(pdf_doc_t*pdf_doc) { pdf_doc_internal_t*i= (pdf_doc_internal_t*)pdf_doc->internal; - msg(" pdfswf.cc: pdfswf_close()"); delete i->doc; i->doc=0; free(pages); pages = 0; //FIXME @@ -2484,16 +2664,22 @@ swf_output_t* swf_output_init() return swf_output; } -void swf_output_setparameter(swf_output_t*swf_output, char*name, char*value) +void swf_output_setparameter(swf_output_t*swf, char*name, char*value) { - /* FIXME */ pdfswf_setparameter(name, value); } -void swf_output_pagefeed(swf_output_t*swf) +void swf_output_startframe(swf_output_t*swf, int width, int height) +{ + swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; + i->outputDev->startFrame(width, height); + i->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2); +} + +void swf_output_endframe(swf_output_t*swf) { swf_output_internal_t*i= (swf_output_internal_t*)swf->internal; - i->outputDev->pagefeed(); + i->outputDev->endframe(); i->outputDev->getDimensions(&swf->x1, &swf->y1, &swf->x2, &swf->y2); } @@ -2527,7 +2713,8 @@ void pdf_page_render2(pdf_page_t*page, swf_output_t*swf) swf_output_internal_t*si = (swf_output_internal_t*)swf->internal; if(pi->protect) { - swfoutput_setparameter("protect", "1"); + gfxdevice_t*dev = si->outputDev->output; + dev->setparameter(dev, "protect", "1"); } si->outputDev->setXRef(pi->doc, pi->doc->getXRef()); #ifdef XPDF_101