From: kramm Date: Sun, 6 Apr 2008 16:49:42 +0000 (+0000) Subject: added simpleviewer option X-Git-Tag: buttons-working~266 X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=commitdiff_plain;h=7bf948531c2ee33d6dbadeca057c1dcbab500972 added simpleviewer option --- diff --git a/lib/devices/swf.c b/lib/devices/swf.c index 087433b..40febb1 100644 --- a/lib/devices/swf.c +++ b/lib/devices/swf.c @@ -76,6 +76,7 @@ typedef struct _swfoutput_internal double config_dumpfonts; double config_ppmsubpixels; double config_jpegsubpixels; + int config_simpleviewer; int config_opennewwindow; int config_ignoredraworder; int config_drawonlyshapes; @@ -279,7 +280,7 @@ static U16 getNewID(gfxdevice_t* dev) static U16 getNewDepth(gfxdevice_t* dev) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; - if(i->depth == 65535) { + if(i->depth == 65520) { if(!id_error) { msg(" Depth Table overflow"); msg(" This file is too complex to render- SWF only supports 65536 shapes at once"); @@ -866,11 +867,98 @@ static void endpage(gfxdevice_t*dev) i->pagefinished = 1; } +static void addViewer(gfxdevice_t* dev) +{ + swfoutput_internal*i = (swfoutput_internal*)dev->internal; + + SHAPE*s; + RGBA button_colors[3]= {{0xbf,0x00,0x00,0x80},{0xbf,0x20,0x20,0xc0}, {0xbf,0xc0,0xc0,0xff}}; + int ids[6]; + int button_sizex = 20; + int button_sizey = 20; + int t; + RGBA black = {255,0,0,0}; + for(t=0;t<6;t++) { + i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3); + swf_ShapeNew(&s); + int ls1 = swf_ShapeAddLineStyle(s,40,&black); + int fs1 = swf_ShapeAddSolidFillStyle(s,&button_colors[t/2]); + int shapeid = ids[t] = getNewID(dev); + swf_SetU16(i->tag,shapeid); + SRECT r; + r.xmin = -20*button_sizex; + r.xmax = 20*button_sizex; + r.ymin = 0; + r.ymax = 40*button_sizey; + swf_SetRect(i->tag,&r); // set shape bounds + swf_SetShapeHeader(i->tag,s); // write all styles to tag + swf_ShapeSetAll(i->tag,s,0*button_sizex,0,ls1,fs1,0); + swf_ShapeSetLine(i->tag,s,(1-(t&1)*2)*20*button_sizex,20*button_sizey); + swf_ShapeSetLine(i->tag,s,-(1-(t&1)*2)*20*button_sizex,20*button_sizey); + swf_ShapeSetLine(i->tag,s,0,-40*button_sizey); + swf_ShapeSetEnd(i->tag); // finish drawing + swf_ShapeFree(s); // clean shape structure (which isn't needed anymore after writing the tag) + } + ActionTAG*a1=0,*a2=0,*a3=0; + a1 = action_NextFrame(a1); + a1 = action_Stop(a1); + a1 = action_End(a1); + + a2 = action_PreviousFrame(a2); + a2 = action_Stop(a2); + a2 = action_End(a2); + + a3 = action_Stop(a3); + a3 = action_End(a3); + + i->tag = swf_InsertTag(i->tag, ST_DOACTION); + swf_ActionSet(i->tag,a3); + + i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); + int buttonid1 = getNewID(dev); + swf_SetU16(i->tag, buttonid1); + swf_ButtonSetRecord(i->tag,BS_UP|BS_HIT,ids[0],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_OVER,ids[2],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_DOWN,ids[4],1,NULL,NULL); + swf_SetU8(i->tag,0); // end of button records + swf_ActionSet(i->tag,a1); + + i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON); + int buttonid2 = getNewID(dev); + swf_SetU16(i->tag, buttonid2); + swf_ButtonSetRecord(i->tag,BS_UP|BS_HIT,ids[1],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_OVER,ids[3],1,NULL,NULL); + swf_ButtonSetRecord(i->tag,BS_DOWN,ids[5],1,NULL,NULL); + swf_SetU8(i->tag,0); // end of button records + swf_ActionSet(i->tag,a2); + + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + MATRIX m; + swf_GetMatrix(0, &m); + m.tx = button_sizex*20+200; + swf_ObjectPlace(i->tag, buttonid2, 65534,&m,0,0); + i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2); + m.tx = button_sizex*20+200+200; + swf_ObjectPlace(i->tag, buttonid1, 65535,&m,0,0); +} + + void swf_startframe(gfxdevice_t*dev, int width, int height) { swfoutput_internal*i = (swfoutput_internal*)dev->internal; + if(i->firstpage) { + if(i->config_protect) { + i->tag = swf_InsertTag(i->tag, ST_PROTECT); + i->config_protect = 0; + } + if(i->config_simpleviewer) { + addViewer(dev); + } + } + if(!i->firstpage && !i->pagefinished) endpage(dev); + msg(" Starting new SWF page of size %dx%d", width, height); swf_GetMatrix(0, &i->page_matrix); @@ -962,7 +1050,7 @@ void gfxdevice_swf_init(gfxdevice_t* dev) dev->name = "swf"; - dev->internal = init_internal_struct(); + dev->internal = init_internal_struct(); // set config to default values dev->startpage = swf_startframe; dev->endpage = swf_endframe; @@ -982,15 +1070,13 @@ void gfxdevice_swf_init(gfxdevice_t* dev) swfoutput_internal*i = (swfoutput_internal*)dev->internal; i->dev = dev; - RGBA rgb; - msg(" initializing swf output\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 = i->config_framerate*0x100; + i->swf->fileVersion = 0; + i->swf->frameRate = 0x80; i->swf->movieSize.xmin = 0; i->swf->movieSize.ymin = 0; i->swf->movieSize.xmax = 0; @@ -998,14 +1084,12 @@ void gfxdevice_swf_init(gfxdevice_t* dev) i->swf->firstTag = swf_InsertTag(NULL,ST_SETBACKGROUNDCOLOR); i->tag = i->swf->firstTag; + RGBA rgb; rgb.a = rgb.r = rgb.g = rgb.b = 0xff; rgb.r = 0; swf_SetRGB(i->tag,&rgb); i->startdepth = i->depth = 0; - - if(i->config_protect) - i->tag = swf_InsertTag(i->tag, ST_PROTECT); } static void startshape(gfxdevice_t*dev) @@ -1100,7 +1184,7 @@ void cancelshape(gfxdevice_t*dev) i->shapeid = -1; i->bboxrectpos = -1; -// i->currentswfid--; // this was an *exceptionally* bad idea +// i->currentswfid--; // doesn't work, for some reason } void fixAreas(gfxdevice_t*dev) @@ -1233,6 +1317,9 @@ void swfoutput_finalize(gfxdevice_t*dev) if(i->tag && i->tag->id == ST_END) return; //already done + i->swf->fileVersion = i->config_flashversion; + i->swf->frameRate = i->config_framerate*0x100; + if(i->config_bboxvars) { TAG* tag = swf_InsertTag(i->swf->firstTag, ST_DOACTION); ActionTAG*a = 0; @@ -1281,6 +1368,7 @@ void swfoutput_finalize(gfxdevice_t*dev) iterator = iterator->next; } + i->tag = swf_InsertTag(i->tag,ST_END); TAG* tag = i->tag->prev; @@ -1853,6 +1941,8 @@ int swf_setparameter(gfxdevice_t*dev, const char*name, const char*value) i->config_dumpfonts = atoi(value); } else if(!strcmp(name, "animate")) { i->config_animate = atoi(value); + } else if(!strcmp(name, "simpleviewer")) { + i->config_simpleviewer = atoi(value); } else if(!strcmp(name, "next_bitmap_is_jpeg")) { i->jpeg = 1; } else if(!strcmp(name, "jpegquality")) {