static void write_paths_transparent(FILE *fout, potrace_path_t *tree) { potrace_path_t *p, *q; int c; for (p=tree; p; p=p->sibling) { if (info.group) { fprintf(fout, "<g>\n"); } c = fprintf(fout, "<path d=\""); column = c; newline = 1; lastop = 0; if (info.debug == 1) { svg_jaggy_path(fout, p->priv->pt, p->priv->len, 1); } else { svg_path(fout, &p->curve, 1); } for (q=p->childlist; q; q=q->sibling) { if (info.debug == 1) { svg_jaggy_path(fout, q->priv->pt, q->priv->len, 0); } else { svg_path(fout, &q->curve, 0); } } fprintf(fout, "\"/>\n"); for (q=p->childlist; q; q=q->sibling) { write_paths_transparent(fout, q->childlist); } if (info.group) { fprintf(fout, "</g>\n"); } } }
/* public interface for SVG */ int page_svg(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { double bboxx = imginfo->trans.bb[0]+imginfo->lmar+imginfo->rmar; double bboxy = imginfo->trans.bb[1]+imginfo->tmar+imginfo->bmar; double origx = imginfo->trans.orig[0] + imginfo->lmar; double origy = bboxy - imginfo->trans.orig[1] - imginfo->bmar; double scalex = imginfo->trans.scalex / info.unit; double scaley = -imginfo->trans.scaley / info.unit; /* header */ fprintf(fout, "<?xml version=\"1.0\" standalone=\"no\"?>\n"); fprintf(fout, "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\"\n"); fprintf(fout, " \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"); /* set bounding box and namespace */ fprintf(fout, "<svg version=\"1.0\" xmlns=\"http://www.w3.org/2000/svg\"\n"); fprintf(fout, " width=\"%fpt\" height=\"%fpt\" viewBox=\"0 0 %f %f\"\n", bboxx, bboxy, bboxx, bboxy); fprintf(fout, " style=\"background-color:black;\"\n"); fprintf(fout, " preserveAspectRatio=\"xMidYMid meet\">\n"); /* metadata: creator */ fprintf(fout, "<metadata>\n"); fprintf(fout, "Created by \"POTRACE\" \"VERSION\", written by Peter Selinger 2001-2013\n"); fprintf(fout, "</metadata>\n"); /* use a "group" tag to establish coordinate system and style */ fprintf(fout, "<g transform=\""); if (origx != 0 || origy != 0) { fprintf(fout, "translate(%f,%f) ", origx, origy); } if (info.angle != 0) { fprintf(fout, "rotate(%.2f) ", -info.angle); } fprintf(fout, "scale(%f,%f)", scalex, scaley); fprintf(fout, "\"\n"); fprintf(fout, "fill=\"#%06x\" stroke=\"none\">\n", info.color); if (info.opaque) { write_paths_opaque(fout, plist); } else { write_paths_transparent(fout, plist); } /* write footer */ fprintf(fout, "</g>\n"); fprintf(fout, "</svg>\n"); fflush(fout); return 0; }