From: kramm Date: Thu, 2 Jun 2005 17:06:41 +0000 (+0000) Subject: implemented new version of finish() X-Git-Tag: release-0-7-0~58 X-Git-Url: http://git.asbjorn.it/?a=commitdiff_plain;h=242870f51bcada26c934f5229f1d7aac9117eee5;p=swftools.git implemented new version of finish() --- diff --git a/pdf2swf/SWFOutputDev.cc b/pdf2swf/SWFOutputDev.cc index e246867..b0fd6cb 100644 --- a/pdf2swf/SWFOutputDev.cc +++ b/pdf2swf/SWFOutputDev.cc @@ -253,7 +253,9 @@ public: void finish(); - SWF*swf; //filled upon completion + gfxresult_t*result; //filled when complete + + char outer_clip_box; //whether the page clip box is still on SWFOutputState states[64]; int statepos; @@ -378,7 +380,8 @@ SWFOutputDev::SWFOutputDev() current_text_stroke = 0; current_text_clip = 0; fontlist = 0; - swf = 0; + result = 0; + outer_clip_box = 0; output = (gfxdevice_t*)malloc(sizeof(gfxdevice_t)); memset(output, 0, sizeof(output)); }; @@ -399,9 +402,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 gfxdevice_swf_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) @@ -648,7 +659,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; @@ -669,7 +680,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); @@ -715,7 +730,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); } @@ -824,7 +839,7 @@ void SWFOutputDev::fillGfxLine(GfxState *state, gfxline_t*line) 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); } @@ -833,7 +848,7 @@ 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"); @@ -847,7 +862,7 @@ void SWFOutputDev::eoFill(GfxState *state) 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); } @@ -865,7 +880,7 @@ void SWFOutputDev::clipToGfxLine(GfxState *state, gfxline_t*line) 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"); @@ -880,21 +895,32 @@ void SWFOutputDev::eoClip(GfxState *state) /* pass through functions for swf_output */ int SWFOutputDev::save(char*filename) { - return gfxdevice_swf_save(output, filename); + finish(); + return result->save(result, filename); } void SWFOutputDev::pagefeed() { + if(outer_clip_box) { + output->endclip(output); + outer_clip_box = 0; + } + swfoutput_pagefeed(output); } void* SWFOutputDev::getSWF() { - return (void*)gfxdevice_swf_get(output); + finish(); + return result->get(result, "swf"); } void SWFOutputDev::finish() { + if(outer_clip_box) { + output->endclip(output); + outer_clip_box = 0; + } if(output) { - this->swf = (SWF*)output->finish(output); + this->result = output->finish(output); free(output);output=0; } } @@ -904,10 +930,9 @@ SWFOutputDev::~SWFOutputDev() finish(); outputstarted = 0; - if(this->swf) { - swf_FreeTags(this->swf); - free(this->swf); - this->swf = 0; + if(this->result) { + this->result->destroy(this->result); + this->result = 0; } fontlist_t*l = this->fontlist; @@ -1110,6 +1135,8 @@ 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) { output->drawchar(output, current_font_id, charid, &col, &m); @@ -1211,7 +1238,12 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl this->currentpage = pageNum; double x1,y1,x2,y2; int rot = doc->getPageRotate(1); + gfxcolor_t white; laststate = state; + gfxline_t clippath[5]; + + white.r = white.g = white.b = white.a = 255; + 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); @@ -1253,8 +1285,23 @@ void SWFOutputDev::startPage(int pageNum, GfxState *state, double crop_x1, doubl outputstarted = 1; } - - swfoutput_newpage(output, pageNum, user_movex, user_movey, (int)x1, (int)y1, (int)x2, (int)y2); + + if(outer_clip_box) { + output->endclip(output); + outer_clip_box = 0; + } + + msg(" processing page %d (%dx%d:%d:%d)", pageNum, (int)x2-(int)x1,(int)y2-(int)y1, (int)x1, (int)y1); + + swfoutput_newpage(output, (int)x1, (int)y1, (int)x2, (int)y2); + + 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) @@ -1275,28 +1322,28 @@ void SWFOutputDev::drawLink(Link *link, Catalog *catalog) rgb.b = 1; cvtUserToDev(x1, y1, &x, &y); points[0].type = gfx_moveTo; - points[0].x = points[4].x = (int)x; - points[0].y = points[4].y = (int)y; + 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].type = gfx_lineTo; - points[1].x = (int)x; - points[1].y = (int)y; + points[1].x = x + user_movex; + points[1].y = y + user_movey; points[1].next = &points[2]; cvtUserToDev(x2, y2, &x, &y); points[2].type = gfx_lineTo; - points[2].x = (int)x; - points[2].y = (int)y; + points[2].x = x + user_movex; + points[2].y = y + user_movey; points[2].next = &points[3]; cvtUserToDev(x1, y2, &x, &y); points[3].type = gfx_lineTo; - points[3].x = (int)x; - points[3].y = (int)y; + 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 = (int)x; - points[4].y = (int)y; + points[4].x = x + user_movex; + points[4].y = y + user_movey; points[4].next = 0; LinkAction*action=link->getAction(); @@ -2086,10 +2133,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) { diff --git a/pdf2swf/swfoutput.cc b/pdf2swf/swfoutput.cc index 8e57b3a..179d9ed 100644 --- a/pdf2swf/swfoutput.cc +++ b/pdf2swf/swfoutput.cc @@ -88,7 +88,7 @@ typedef struct _swfoutput_internal float config_minlinewidth; double config_caplinewidth; - SWF swf; + SWF* swf; fontlist_t* fontlist; @@ -138,8 +138,6 @@ typedef struct _swfoutput_internal int bboxrectpos; SRECT bboxrect; - TAG*cliptag; - chardata_t chardata[CHARDATAMAX]; int chardatapos; int firstpage; @@ -157,7 +155,6 @@ typedef struct _swfoutput_internal } swfoutput_internal; -static void* swf_finish(gfxdevice_t*driver); static void swf_fillbitmap(gfxdevice_t*driver, gfxline_t*line, gfximage_t*img, gfxmatrix_t*move, gfxcxform_t*cxform); static int swf_setparameter(gfxdevice_t*driver, const char*key, const char*value); static void swf_drawstroke(gfxdevice_t*dev, gfxline_t*line, gfxcoord_t width, gfxcolor_t*color, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit); @@ -170,6 +167,7 @@ static void swf_fillgradient(gfxdevice_t*dev, gfxline_t*line, gfxgradient_t*grad static void swf_drawchar(gfxdevice_t*dev, char*fontid, int glyph, gfxcolor_t*color, gfxmatrix_t*matrix); static void swf_addfont(gfxdevice_t*dev, char*fontid, gfxfont_t*font); static void swf_drawlink(gfxdevice_t*dev, gfxline_t*line, char*action); +static gfxresult_t* swf_finish(gfxdevice_t*driver); int getCharID(SWFFONT *font, int charnr, char *charname, int u); @@ -1142,40 +1140,27 @@ static void setBackground(gfxdevice_t*dev, int x1, int y1, int x2, int y2) swf_ObjectPlace(i->tag,shapeid,getNewDepth(dev),0,0,0); i->tag = swf_InsertTag(i->tag, ST_PLACEOBJECT2); swf_ObjectPlaceClip(i->tag,shapeid,getNewDepth(dev),0,0,0,65535); - i->cliptag = i->tag; } -void swfoutput_newpage(gfxdevice_t*dev, int pageNum, int movex, int movey, int x1, int y1, int x2, int y2) +void swfoutput_newpage(gfxdevice_t*dev, int x1, int y1, int x2, int y2) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; if(!i->firstpage && !i->pagefinished) endpage(dev); swf_GetMatrix(0, &i->page_matrix); - i->page_matrix.tx = movex*20; - i->page_matrix.ty = movey*20; - - if(i->cliptag && i->frameno == i->lastframeno) { - SWFPLACEOBJECT dev; - swf_GetPlaceObject(i->cliptag, &dev); - dev.clipdepth = i->depth; - swf_ResetTag(i->cliptag, i->cliptag->id); - swf_SetPlaceObject(i->cliptag, &dev); - swf_PlaceObjectFree(&dev); - } - + i->page_matrix.tx = 0; + i->page_matrix.ty = 0; i->min_x = x1; i->min_y = y1; i->max_x = x2; i->max_y = y2; - msg(" processing page %d (%dx%d:%d:%d)", pageNum,x2-x1,y2-y1, x1, y1); - x1*=20;y1*=20;x2*=20;y2*=20; /* set clipping/background rectangle */ /* TODO: this should all be done in SWFOutputDev */ - setBackground(dev, x1, y1, x2, y2); + //setBackground(dev, x1, y1, x2, y2); /* increase SWF's bounding box */ SRECT r; @@ -1183,7 +1168,7 @@ void swfoutput_newpage(gfxdevice_t*dev, int pageNum, int movex, int movey, int x r.ymin = y1; r.xmax = x2; r.ymax = y2; - swf_ExpandRect2(&i->swf.movieSize, &r); + swf_ExpandRect2(&i->swf->movieSize, &r); i->lastframeno = i->frameno; i->firstpage = 0; @@ -1220,18 +1205,17 @@ void gfxdevice_swf_init(gfxdevice_t* dev) msg(" initializing swf output for size %d*%d\n", i->max_x,i->max_y); i->swffont = 0; + + i->swf = (SWF*)rfx_calloc(sizeof(SWF)); + i->swf->fileVersion = i->config_flashversion; + i->swf->frameRate = 0x0040; // 1 frame per 4 seconds + i->swf->movieSize.xmin = 0; + i->swf->movieSize.ymin = 0; + i->swf->movieSize.xmax = 0; + i->swf->movieSize.ymax = 0; - memset(&i->swf,0x00,sizeof(SWF)); - - i->swf.fileVersion = i->config_flashversion; - i->swf.frameRate = 0x0040; // 1 frame per 4 seconds - i->swf.movieSize.xmin = 0; - i->swf.movieSize.ymin = 0; - i->swf.movieSize.xmax = 0; - i->swf.movieSize.ymax = 0; - - i->swf.firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); - i->tag = i->swf.firstTag; + i->swf->firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); + i->tag = i->swf->firstTag; rgb.a = rgb.r = rgb.g = rgb.b = 0xff; swf_SetRGB(i->tag,&rgb); @@ -1451,25 +1435,25 @@ void swfoutput_finalize(gfxdevice_t*dev) return; //already done if(i->config_bboxvars) { - TAG* tag = swf_InsertTag(i->swf.firstTag, ST_DOACTION); + TAG* tag = swf_InsertTag(i->swf->firstTag, ST_DOACTION); ActionTAG*a = 0; a = action_PushString(a, "xmin"); - a = action_PushFloat(a, i->swf.movieSize.xmin / 20.0); + a = action_PushFloat(a, i->swf->movieSize.xmin / 20.0); a = action_SetVariable(a); a = action_PushString(a, "ymin"); - a = action_PushFloat(a, i->swf.movieSize.ymin / 20.0); + a = action_PushFloat(a, i->swf->movieSize.ymin / 20.0); a = action_SetVariable(a); a = action_PushString(a, "xmax"); - a = action_PushFloat(a, i->swf.movieSize.xmax / 20.0); + a = action_PushFloat(a, i->swf->movieSize.xmax / 20.0); a = action_SetVariable(a); a = action_PushString(a, "ymax"); - a = action_PushFloat(a, i->swf.movieSize.ymax / 20.0); + a = action_PushFloat(a, i->swf->movieSize.ymax / 20.0); a = action_SetVariable(a); a = action_PushString(a, "width"); - a = action_PushFloat(a, (i->swf.movieSize.xmax - i->swf.movieSize.xmin) / 20.0); + a = action_PushFloat(a, (i->swf->movieSize.xmax - i->swf->movieSize.xmin) / 20.0); a = action_SetVariable(a); a = action_PushString(a, "height"); - a = action_PushFloat(a, (i->swf.movieSize.ymax - i->swf.movieSize.ymin) / 20.0); + a = action_PushFloat(a, (i->swf->movieSize.ymax - i->swf->movieSize.ymin) / 20.0); a = action_SetVariable(a); a = action_End(a); swf_ActionSet(tag, a); @@ -1482,7 +1466,7 @@ void swfoutput_finalize(gfxdevice_t*dev) endpage(dev); fontlist_t *tmp,*iterator = i->fontlist; while(iterator) { - TAG*mtag = i->swf.firstTag; + TAG*mtag = i->swf->firstTag; if(iterator->swffont) { mtag = swf_InsertTag(mtag, ST_DEFINEFONT2); if(!i->config_storeallcharacters) @@ -1504,35 +1488,16 @@ void swfoutput_finalize(gfxdevice_t*dev) } if(i->overflow) { - wipeSWF(&i->swf); + wipeSWF(i->swf); + } + if(i->config_enablezlib || i->config_flashversion>=6) { + i->swf->compressed = 1; } } -void gfxdevice_swf_getdimensions(gfxdevice_t*dev, int*x1, int*y1, int*x2, int*y2) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(x1) *x1 = i->swf.movieSize.xmin/20; - if(y1) *y1 = i->swf.movieSize.ymin/20; - if(x2) *x2 = i->swf.movieSize.xmax/20; - if(y2) *y2 = i->swf.movieSize.ymax/20; -} - -static void swfoutput_destroy(gfxdevice_t* dev); - -void* swf_finish(gfxdevice_t* dev) -{ - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - swfoutput_finalize(dev); - SWF* swf = swf_CopySWF(&i->swf); - swfoutput_destroy(dev); - return swf; -} - -int gfxdevice_swf_save(gfxdevice_t* dev, char*filename) +int swfresult_save(gfxresult_t*gfx, char*filename) { - swfoutput_internal*i = (swfoutput_internal*)dev->internal; - swfoutput_finalize(dev); - + SWF*swf = (SWF*)gfx->internal; int fi; if(filename) fi = open(filename, O_BINARY|O_CREAT|O_TRUNC|O_WRONLY, 0777); @@ -1540,28 +1505,66 @@ int gfxdevice_swf_save(gfxdevice_t* dev, char*filename) fi = 1; // stdout if(fi<=0) { - msg(" Could not create \"%s\". ", FIXNULL(filename)); - return 0; + msg(" Could not create \"%s\". ", FIXNULL(filename)); + return -1; } - if(i->config_enablezlib || i->config_flashversion>=6) { - if FAILED(swf_WriteSWC(fi,&i->swf)) - msg(" WriteSWC() failed.\n"); + if(swf->compressed) { + if FAILED(swf_WriteSWC(fi,swf)) + msg(" WriteSWC() failed.\n"); } else { - if FAILED(swf_WriteSWF(fi,&i->swf)) - msg(" WriteSWF() failed.\n"); + if FAILED(swf_WriteSWF(fi,swf)) + msg(" WriteSWF() failed.\n"); } if(filename) close(fi); - return 1; + return 0; +} +void* swfresult_get(gfxresult_t*gfx, char*name) +{ + SWF*swf = (SWF*)gfx->internal; + if(!strcmp(name, "swf")) { + return (void*)swf_CopySWF(swf); + } else if(!strcmp(name, "xmin")) { + return (void*)(swf->movieSize.xmin/20); + } else if(!strcmp(name, "ymin")) { + return (void*)(swf->movieSize.ymin/20); + } else if(!strcmp(name, "xmax")) { + return (void*)(swf->movieSize.xmax/20); + } else if(!strcmp(name, "ymax")) { + return (void*)(swf->movieSize.ymax/20); + } + return 0; +} +void swfresult_destroy(gfxresult_t*gfx) +{ + if(gfx->internal) { + swf_FreeTags((SWF*)gfx->internal); + free(gfx->internal); + gfx->internal = 0; + } + memset(gfx, 0, sizeof(gfxresult_t)); } -void* gfxdevice_swf_get(gfxdevice_t*dev) +static void swfoutput_destroy(gfxdevice_t* dev); + +gfxresult_t* swf_finish(gfxdevice_t* dev) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; + gfxresult_t*result; + swfoutput_finalize(dev); - return (void*)swf_CopySWF(&i->swf); + SWF* swf = i->swf;i->swf = 0; + swfoutput_destroy(dev); + + result = (gfxresult_t*)rfx_calloc(sizeof(gfxresult_t)); + result->internal = swf; + result->save = swfresult_save; + result->write = 0; + result->get = swfresult_get; + result->destroy = swfresult_destroy; + return result; } /* Perform cleaning up */ @@ -1582,7 +1585,7 @@ static void swfoutput_destroy(gfxdevice_t* dev) iterator = iterator->next; delete tmp; } - swf_FreeTags(&i->swf); + if(i->swf) {swf_FreeTags(i->swf);free(i->swf);i->swf = 0;} free(i);i=0; memset(dev, 0, sizeof(gfxdevice_t)); diff --git a/pdf2swf/swfoutput.h b/pdf2swf/swfoutput.h index 23f388a..4c19d1f 100644 --- a/pdf2swf/swfoutput.h +++ b/pdf2swf/swfoutput.h @@ -26,11 +26,7 @@ void gfxdevice_swf_init(gfxdevice_t*); -void* gfxdevice_swf_get(gfxdevice_t*); -int gfxdevice_swf_save(gfxdevice_t*, char*filename); - +void swfoutput_newpage(gfxdevice_t*, int x1, int y1, int x2, int y2); void swfoutput_pagefeed(gfxdevice_t*obj); -void swfoutput_newpage(gfxdevice_t*, int pageNum, int movex, int movey, int x1, int y1, int x2, int y2); -void gfxdevice_swf_getdimensions(gfxdevice_t*, int*x1, int*y1, int*x2, int*y2); #endif //__swfoutput_h__