+ swf_SetRect(i->tag,&r);
+ swf_SetShapeStyles(i->tag,i->shape);
+ swf_ShapeCountBits(i->shape,NULL,NULL);
+ swf_SetShapeBits(i->tag,i->shape);
+ swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,0,fsid,0);
+ i->swflastx = i->swflasty = 0;
+ moveto(obj, i->tag, p1);
+ lineto(obj, i->tag, p2);
+ lineto(obj, i->tag, p3);
+ lineto(obj, i->tag, p4);
+ lineto(obj, i->tag, p1);
+ swf_ShapeSetEnd(i->tag);
+
+ /* shape2 */
+ myshapeid2 = getNewID(obj);
+ i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE3);
+ swf_ShapeNew(&i->shape);
+ rgb.r = rgb.b = rgb.a = rgb.g = 255;
+ rgb.a = 40;
+ fsid = swf_ShapeAddSolidFillStyle(i->shape,&rgb);
+ swf_SetU16(i->tag, myshapeid2);
+ r.xmin = (int)(xmin*20);
+ r.ymin = (int)(ymin*20);
+ r.xmax = (int)(xmax*20);
+ r.ymax = (int)(ymax*20);
+ swf_SetRect(i->tag,&r);
+ swf_SetShapeStyles(i->tag,i->shape);
+ swf_ShapeCountBits(i->shape,NULL,NULL);
+ swf_SetShapeBits(i->tag,i->shape);
+ swf_ShapeSetAll(i->tag,i->shape,/*x*/0,/*y*/0,0,fsid,0);
+ i->swflastx = i->swflasty = 0;
+ moveto(obj, i->tag, p1);
+ lineto(obj, i->tag, p2);
+ lineto(obj, i->tag, p3);
+ lineto(obj, i->tag, p4);
+ lineto(obj, i->tag, p1);
+ swf_ShapeSetEnd(i->tag);
+
+ if(!mouseover)
+ {
+ i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON);
+ swf_SetU16(i->tag,buttonid); //id
+ swf_ButtonSetFlags(i->tag, 0); //menu=no
+ swf_ButtonSetRecord(i->tag,0x01,myshapeid,i->depth,0,0);
+ swf_ButtonSetRecord(i->tag,0x02,myshapeid2,i->depth,0,0);
+ swf_ButtonSetRecord(i->tag,0x04,myshapeid2,i->depth,0,0);
+ swf_ButtonSetRecord(i->tag,0x08,myshapeid,i->depth,0,0);
+ swf_SetU8(i->tag,0);
+ swf_ActionSet(i->tag,actions1);
+ swf_SetU8(i->tag,0);
+ }
+ else
+ {
+ i->tag = swf_InsertTag(i->tag,ST_DEFINEBUTTON2);
+ swf_SetU16(i->tag,buttonid); //id
+ swf_ButtonSetFlags(i->tag, 0); //menu=no
+ swf_ButtonSetRecord(i->tag,0x01,myshapeid,i->depth,0,0);
+ swf_ButtonSetRecord(i->tag,0x02,myshapeid2,i->depth,0,0);
+ swf_ButtonSetRecord(i->tag,0x04,myshapeid2,i->depth,0,0);
+ swf_ButtonSetRecord(i->tag,0x08,myshapeid,i->depth,0,0);
+ swf_SetU8(i->tag,0); // end of button records
+ swf_ButtonSetCondition(i->tag, BC_IDLE_OVERUP);
+ swf_ActionSet(i->tag,actions1);
+ if(actions2) {
+ swf_ButtonSetCondition(i->tag, BC_OVERUP_IDLE);
+ swf_ActionSet(i->tag,actions2);
+ swf_SetU8(i->tag,0);
+ swf_ButtonPostProcess(i->tag, 2);
+ } else {
+ swf_SetU8(i->tag,0);
+ swf_ButtonPostProcess(i->tag, 1);
+ }
+ }
+
+ i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2);
+
+ if(posx!=0 || posy!=0) {
+ SPOINT p;
+ p.x = (int)(posx*20);
+ p.y = (int)(posy*20);
+ p = swf_TurnPoint(p, &i->page_matrix);
+ MATRIX m;
+ m = i->page_matrix;
+ m.tx = p.x;
+ m.ty = p.y;
+ swf_ObjectPlace(i->tag, buttonid, getNewDepth(obj),&m,0,0);
+ } else {
+ swf_ObjectPlace(i->tag, buttonid, getNewDepth(obj),&i->page_matrix,0,0);
+ }
+}
+
+
+///////////
+/*
+for(t=0;t<picpos;t++)
+ {
+ if(pic_xids[t] == xid &&
+ pic_yids[t] == yid) {
+ width = pic_width[t];
+ height = pic_height[t];
+ found = t;break;
+ }
+ }
+ pic_ids[picpos] = swfoutput_drawimagelosslessN(&output, pic, pal, width, height, x1,y1,x2,y2,x3,y3,x4,y4, numpalette);
+ pic_xids[picpos] = xid;
+ pic_yids[picpos] = yid;
+ pic_width[picpos] = width;
+ pic_height[picpos] = height;
+ if(picpos<1024)
+ picpos++;
+ pic[width*y+x] = buf[0];
+ xid+=x*buf[0]+1;
+ yid+=y*buf[0]*3+1;
+
+ xid += pal[1].r*3 + pal[1].g*11 + pal[1].b*17;
+ yid += pal[1].r*7 + pal[1].g*5 + pal[1].b*23;
+
+ int xid = 0;
+ int yid = 0;
+ 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;
+ int t,found = -1;
+ for(t=0;t<picpos;t++)
+ {
+ if(pic_xids[t] == xid &&
+ pic_yids[t] == yid) {
+ found = t;break;
+ }
+ }
+ if(found<0) {
+*/
+///////////
+
+static void drawgfxline(struct swfoutput*obj, gfxline_t*line)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ gfxcoord_t lastx=0,lasty=0,px=0,py=0;
+ char lastwasmoveto;
+ while(1) {
+ if(!line)
+ break;
+ /* check whether the next segment is zero */
+ if(line->type == gfx_moveTo) {
+ msg("<trace> ======== moveTo %.2f %.2f", line->x, line->y);
+ moveto(obj, i->tag, line->x, line->y);
+ px = lastx = line->x;
+ py = lasty = line->y;
+ lastwasmoveto = 1;
+ } if(line->type == gfx_lineTo) {
+ msg("<trace> ======== lineTo %.2f %.2f", line->x, line->y);
+ lineto(obj, i->tag, line->x, line->y);
+ px = line->x;
+ py = line->y;
+ lastwasmoveto = 0;
+ } else if(line->type == gfx_splineTo) {
+ msg("<trace> ======== splineTo %.2f %.2f", line->x, line->y);
+ plotxy s,p;
+ s.x = line->sx;p.x = line->x;
+ s.y = line->sy;p.y = line->y;
+ splineto(obj, i->tag, s, p);
+ px = line->x;
+ py = line->y;
+ lastwasmoveto = 0;
+ }
+ line = line->next;
+ }
+}
+
+void swfoutput_drawgfxline(struct swfoutput*obj, gfxline_t*line, gfxcoord_t width, gfxcolor_t*col, gfx_capType cap_style, gfx_joinType joint_style, gfxcoord_t miterLimit)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ gfxdevice_t*dev = &i->device;
+ dev->stroke(dev, line, width, col, cap_style, joint_style, miterLimit);
+}
+void swfoutput_fillgfxline(struct swfoutput*obj, gfxline_t*line, gfxcolor_t*col)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ gfxdevice_t*dev = &i->device;
+ dev->fill(dev, line, col);
+}
+void swfoutput_startclip(struct swfoutput*obj, gfxline_t*line)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ gfxdevice_t*dev = &i->device;
+ dev->startclip(dev, line);
+}
+void swfoutput_endclip(struct swfoutput*obj)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ gfxdevice_t*dev = &i->device;
+ dev->endclip(dev);
+}
+void swfoutput_gfxaddfont(struct swfoutput*obj, char*fontid, gfxfont_t*font)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ gfxdevice_t*dev = &i->device;
+ dev->addfont(dev, fontid, font);
+}
+void swfoutput_gfxdrawchar(struct swfoutput*obj, char*fontid, int glyph, gfxcolor_t*c, gfxmatrix_t*m)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+ gfxdevice_t*dev = &i->device;
+ dev->drawchar(dev, fontid, glyph, c, m);
+}
+
+#define IMAGE_TYPE_JPEG 0
+#define IMAGE_TYPE_LOSSLESS 1
+
+static void swfoutput_drawimage(struct swfoutput*obj, RGBA* data, int sizex,int sizey,
+ double x1,double y1,
+ double x2,double y2,
+ double x3,double y3,
+ double x4,double y4, int type)
+{
+ swfoutput_internal*i = (swfoutput_internal*)obj->internal;
+
+ 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 */
+ i->device.setparameter(&i->device, "next_bitmap_is_jpeg", "1");
+
+ i->device.fillbitmap(&i->device, &p1, &img, &m, 0);
+}
+
+void swfoutput_drawimagejpeg(struct swfoutput*obj, RGBA*mem, int sizex,int sizey,
+ double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4)
+{
+ swfoutput_drawimage(obj,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_JPEG);
+}
+
+void swfoutput_drawimagelossless(struct swfoutput*obj, RGBA*mem, int sizex,int sizey,
+ double x1,double y1, double x2,double y2, double x3,double y3, double x4,double y4)
+{
+ swfoutput_drawimage(obj,mem,sizex,sizey,x1,y1,x2,y2,x3,y3,x4,y4, IMAGE_TYPE_LOSSLESS);
+}
+
+void swfoutput_setparameter(char*name, char*value)
+{
+ if(!strcmp(name, "jpegsubpixels")) {
+ config_jpegsubpixels = atof(value);
+ } else if(!strcmp(name, "ppmsubpixels")) {
+ config_ppmsubpixels = atof(value);
+ } else if(!strcmp(name, "drawonlyshapes")) {
+ config_drawonlyshapes = atoi(value);
+ } else if(!strcmp(name, "ignoredraworder")) {
+ config_ignoredraworder = atoi(value);
+ } else if(!strcmp(name, "filloverlap")) {
+ config_filloverlap = atoi(value);
+ } else if(!strcmp(name, "linksopennewwindow")) {
+ config_opennewwindow = atoi(value);
+ } else if(!strcmp(name, "opennewwindow")) {
+ config_opennewwindow = atoi(value);
+ } else if(!strcmp(name, "storeallcharacters")) {
+ config_storeallcharacters = atoi(value);
+ } else if(!strcmp(name, "enablezlib")) {
+ config_enablezlib = atoi(value);
+ } else if(!strcmp(name, "bboxvars")) {
+ config_bboxvars = atoi(value);
+ } else if(!strcmp(name, "insertstop")) {
+ config_insertstoptag = atoi(value);
+ } else if(!strcmp(name, "protected")) {
+ config_protect = atoi(value);
+ } else if(!strcmp(name, "flashversion")) {
+ config_flashversion = atoi(value);
+ } else if(!strcmp(name, "minlinewidth")) {
+ config_minlinewidth = atof(value);
+ } else if(!strcmp(name, "caplinewidth")) {
+ config_caplinewidth = atof(value);
+ } else if(!strcmp(name, "dumpfonts")) {
+ config_dumpfonts = atoi(value);
+ } else if(!strcmp(name, "jpegquality")) {
+ int val = atoi(value);
+ if(val<0) val=0;
+ if(val>100) val=100;
+ config_jpegquality = val;
+ } else if(!strcmp(name, "splinequality")) {
+ int v = atoi(value);
+ v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel
+ if(v<1) v = 1;
+ config_splinemaxerror = v;
+ } else if(!strcmp(name, "fontquality")) {
+ int v = atoi(value);
+ v = 500-(v*5); // 100% = 0.25 pixel, 0% = 25 pixel
+ if(v<1) v = 1;
+ config_fontsplinemaxerror = v;
+ } else {
+ fprintf(stderr, "unknown parameter: %s (=%s)\n", name, value);
+ }
+}
+
+// --------------------------------------------------------------------
+
+static CXFORM gfxcxform_to_cxform(gfxcxform_t* c)
+{
+ CXFORM cx;
+ swf_GetCXForm(0, &cx, 1);
+ if(!c)
+ return cx;
+ if(c->rg!=0 || c->rb!=0 || c->ra!=0 ||
+ c->gr!=0 || c->gb!=0 || c->ga!=0 ||
+ c->br!=0 || c->bg!=0 || c->ba!=0 ||
+ c->ar!=0 || c->ag!=0 || c->ab!=0)
+ msg("<warning> CXForm not SWF-compatible");
+
+ cx.a0 = (S16)(c->aa*256);
+ cx.r0 = (S16)(c->rr*256);
+ cx.g0 = (S16)(c->gg*256);
+ cx.b0 = (S16)(c->bb*256);
+ cx.a1 = c->t.a;
+ cx.r1 = c->t.r;
+ cx.g1 = c->t.g;
+ cx.b1 = c->t.b;
+ return cx;
+}
+
+ArtSVP* gfxstrokeToSVP(gfxline_t*line, gfxcoord_t width, gfx_capType cap_style, gfx_joinType joint_style, double miterLimit)
+{
+ ArtVpath *vec = NULL;
+ ArtSVP *svp = NULL;
+ int pos=0,len=0;
+ gfxline_t*l2;
+ double x=0,y=0;
+
+ l2 = line;
+ while(l2) {
+ if(l2->type == gfx_moveTo) {
+ pos ++;
+ } if(l2->type == gfx_lineTo) {
+ pos ++;
+ } if(l2->type == gfx_splineTo) {
+ int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))/3);
+ if(!parts) parts = 1;
+ pos += parts + 1;
+ }
+ x = l2->x;
+ y = l2->y;
+ l2 = l2->next;
+ }
+ pos++;
+ len = pos;
+
+ vec = art_new (ArtVpath, len);
+
+ pos = 0;
+ l2 = line;
+ while(l2) {
+ if(l2->type == gfx_moveTo) {
+ vec[pos].code = ART_MOVETO;
+ vec[pos].x = l2->x;
+ vec[pos].y = l2->y;
+ pos++;
+ assert(pos<=len);
+ } else if(l2->type == gfx_lineTo) {
+ vec[pos].code = ART_LINETO;
+ vec[pos].x = l2->x;
+ vec[pos].y = l2->y;
+ pos++;
+ assert(pos<=len);
+ } else if(l2->type == gfx_splineTo) {
+ int i;
+ int parts = (int)(sqrt(fabs(l2->x-2*l2->sx+x) + fabs(l2->y-2*l2->sy+y))/3);
+ if(!parts) parts = 1;
+ for(i=0;i<=parts;i++) {
+ double t = (double)i/(double)parts;
+ vec[pos].code = ART_LINETO;
+ vec[pos].x = l2->x*t*t + 2*l2->sx*t*(1-t) + x*(1-t)*(1-t);
+ vec[pos].y = l2->y*t*t + 2*l2->sy*t*(1-t) + y*(1-t)*(1-t);
+ pos++;
+ assert(pos<=len);
+ }
+ }
+ x = l2->x;
+ y = l2->y;
+ l2 = l2->next;
+ }
+ vec[pos].code = ART_END;
+
+ svp = art_svp_vpath_stroke (vec,
+ (joint_style==gfx_joinMiter)?ART_PATH_STROKE_JOIN_MITER:
+ ((joint_style==gfx_joinRound)?ART_PATH_STROKE_JOIN_ROUND:
+ ((joint_style==gfx_joinBevel)?ART_PATH_STROKE_JOIN_BEVEL:ART_PATH_STROKE_JOIN_BEVEL)),
+ (cap_style==gfx_capButt)?ART_PATH_STROKE_CAP_BUTT:
+ ((cap_style==gfx_capRound)?ART_PATH_STROKE_CAP_ROUND:
+ ((cap_style==gfx_capSquare)?ART_PATH_STROKE_CAP_SQUARE:ART_PATH_STROKE_CAP_SQUARE)),
+ width, //line_width
+ miterLimit, //miter_limit
+ 0.05 //flatness
+ );
+ free(vec);
+ return svp;
+}
+
+gfxline_t* SVPtogfxline(ArtSVP*svp)
+{
+ int size = 0;
+ int t;
+ int pos = 0;
+ for(t=0;t<svp->n_segs;t++) {
+ size += svp->segs[t].n_points + 1;
+ }
+ gfxline_t* lines = (gfxline_t*)rfx_alloc(sizeof(gfxline_t)*size);
+
+ for(t=0;t<svp->n_segs;t++) {
+ ArtSVPSeg* seg = &svp->segs[t];
+ int p;
+ for(p=0;p<seg->n_points;p++) {
+ lines[pos].type = p==0?gfx_moveTo:gfx_lineTo;
+ ArtPoint* point = &seg->points[p];
+ lines[pos].x = point->x;
+ lines[pos].y = point->y;
+ lines[pos].next = &lines[pos+1];
+ pos++;
+ }
+ }
+ if(pos) {
+ lines[pos-1].next = 0;
+ return lines;
+ } else {
+ return 0;
+ }
+}
+
+/* TODO */
+static int imageInCache(swfoutput*obj, void*data, int width, int height)
+{
+ return -1;
+}
+static void addImageToCache(swfoutput*obj, void*data, int width, int height)
+{
+}
+
+static int add_image(swfoutput_internal*i, gfximage_t*img, int targetwidth, int targetheight, int* newwidth, int* newheight)
+{
+ swfoutput*obj = i->obj;
+ RGBA*newpic = 0;
+ RGBA*mem = (RGBA*)img->data;
+
+ int sizex = img->width;
+ int sizey = img->height;
+ int is_jpeg = i->jpeg;
+ i->jpeg = 0;
+
+ int newsizex=sizex, newsizey=sizey;
+
+ /// {
+ if(is_jpeg && config_jpegsubpixels) {
+ newsizex = (int)(targetwidth*config_jpegsubpixels+0.5);
+ newsizey = (int)(targetheight*config_jpegsubpixels+0.5);
+ } else if(!is_jpeg && config_ppmsubpixels) {
+ newsizex = (int)(targetwidth*config_ppmsubpixels+0.5);
+ newsizey = (int)(targetheight*config_ppmsubpixels+0.5);
+ }
+ /// }
+
+ if(sizex<=0 || sizey<=0 || newsizex<=0 || newsizey<=0)
+ return -1;
+
+ /* TODO: cache images */
+ *newwidth = sizex;
+ *newheight = sizey;
+
+ if(newsizex<sizex || newsizey<sizey) {
+ msg("<verbose> Scaling %dx%d image to %dx%d", sizex, sizey, newsizex, newsizey);
+ newpic = swf_ImageScale(mem, sizex, sizey, newsizex, newsizey);
+ *newwidth = sizex = newsizex;
+ *newheight = sizey = newsizey;
+ mem = newpic;
+
+ }
+
+ int num_colors = swf_ImageGetNumberOfPaletteEntries(mem,sizex,sizey,0);
+ int has_alpha = swf_ImageHasAlpha(mem,sizex,sizey);
+
+ msg("<verbose> Drawing %dx%d %s%simage at size %dx%d (%dx%d), %s%d colors",
+ sizex, sizey,
+ has_alpha?(has_alpha==2?"semi-transparent ":"transparent "):"",
+ is_jpeg?"jpeg-":"",
+ newsizex, newsizey,
+ targetwidth, targetheight,
+ /*newsizex, newsizey,*/
+ num_colors>256?">":"", num_colors>256?256:num_colors);
+
+ /*RGBA* pal = (RGBA*)rfx_alloc(sizeof(RGBA)*num_colors);
+ swf_ImageGetNumberOfPaletteEntries(mem,sizex,sizey,pal);
+ int t;
+ for(t=0;t<num_colors;t++) {
+ printf("%02x%02x%02x%02x ",
+ pal[t].r, pal[t].g, pal[t].b, pal[t].a);
+ if((t&7)==7)
+ printf("\n");
+ }
+ printf("\n");*/
+
+ int bitid = -1;
+ int cacheid = imageInCache(obj, mem, sizex, sizey);
+
+ if(cacheid<=0) {
+ bitid = getNewID(obj);
+ i->tag = swf_AddImage(i->tag, bitid, mem, sizex, sizey, config_jpegquality);
+ addImageToCache(obj, mem, sizex, sizey);
+ } else {
+ bitid = cacheid;
+ }
+
+ if(newpic)
+ free(newpic);
+ return bitid;
+}
+
+static SRECT gfxline_getSWFbbox(gfxline_t*line)
+{
+ gfxbbox_t bbox = gfxline_getbbox(line);
+ SRECT r;
+ r.xmin = (int)(bbox.xmin*20);
+ r.ymin = (int)(bbox.ymin*20);
+ r.xmax = (int)(bbox.xmax*20);
+ r.ymax = (int)(bbox.ymax*20);
+ return r;
+}
+
+void swf_fillbitmap(gfxdevice_t*dev, gfxline_t*line, gfximage_t*img, gfxmatrix_t*matrix, gfxcxform_t*cxform)
+{
+ swfoutput_internal*i = (swfoutput_internal*)dev->internal;
+ swfoutput*obj = i->obj;
+
+ endshape(obj);
+ endtext(obj);
+
+ int targetx = (int)(sqrt(matrix->m00*matrix->m00 + matrix->m01*matrix->m01)*img->width);
+ int targety = (int)(sqrt(matrix->m10*matrix->m10 + matrix->m11*matrix->m11)*img->height);
+
+ int newwidth=0,newheight=0;
+ int bitid = add_image(i, img, targetx, targety, &newwidth, &newheight);
+ if(bitid<0)
+ return;
+ double fx = (double)img->width / (double)newwidth;
+ double fy = (double)img->height / (double)newheight;
+
+ MATRIX m;
+ float m00,m10,tx;
+ float m01,m11,ty;
+ m.sx = (int)(65536*20*matrix->m00*fx); m.r1 = (int)(65536*20*matrix->m10*fy);
+ m.r0 = (int)(65536*20*matrix->m01*fx); m.sy = (int)(65536*20*matrix->m11*fy);
+ m.tx = (int)(matrix->tx*20);
+ m.ty = (int)(matrix->ty*20);
+
+ /* shape */
+ int myshapeid = getNewID(obj);
+ i->tag = swf_InsertTag(i->tag,ST_DEFINESHAPE);
+ SHAPE*shape;
+ swf_ShapeNew(&shape);
+ int fsid = swf_ShapeAddBitmapFillStyle(shape,&m,bitid,1);
+ swf_SetU16(i->tag, myshapeid);
+ SRECT r = gfxline_getSWFbbox(line);
+ swf_SetRect(i->tag,&r);
+ swf_SetShapeStyles(i->tag,shape);
+ swf_ShapeCountBits(shape,NULL,NULL);
+ swf_SetShapeBits(i->tag,shape);
+ swf_ShapeSetAll(i->tag,shape,UNDEFINED_COORD,UNDEFINED_COORD,0,fsid,0);
+ i->swflastx = i->swflasty = UNDEFINED_COORD;
+ drawgfxline(obj, line);
+ swf_ShapeSetEnd(i->tag);
+ swf_ShapeFree(shape);
+
+ i->tag = swf_InsertTag(i->tag,ST_PLACEOBJECT2);
+ CXFORM cxform2 = gfxcxform_to_cxform(cxform);
+ swf_ObjectPlace(i->tag,myshapeid,getNewDepth(obj),&i->page_matrix,&cxform2,NULL);