diff options
Diffstat (limited to 'graphics/potrace/potrace-1.8-xfig.patch')
-rw-r--r-- | graphics/potrace/potrace-1.8-xfig.patch | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/graphics/potrace/potrace-1.8-xfig.patch b/graphics/potrace/potrace-1.8-xfig.patch new file mode 100644 index 0000000000..8c5bf4a866 --- /dev/null +++ b/graphics/potrace/potrace-1.8-xfig.patch @@ -0,0 +1,114 @@ +Index: ChangeLog +=================================================================== +--- ChangeLog (revision 153) ++++ ChangeLog (revision 154) +@@ -1,5 +1,9 @@ + ChangeLog + ++ (2007/05/22) PS1 - xfig backend: added depth to opaque components ++ to avoid them floating to the background. Suggested by Rafael ++ Laboissiere. ++ + v1.8 2007/04/09 + (2007/04/08) PS1 - portability: use 'test' instead of '[' in shell + scripts. +Index: src/backend_xfig.c +=================================================================== +--- src/backend_xfig.c (revision 153) ++++ src/backend_xfig.c (revision 154) +@@ -124,13 +124,13 @@ + return n; + } + +-/* do one path. First should be 1 on the very first path, else 0. */ +-static int xfig_path(FILE *fout, potrace_curve_t *curve, trans_t t, int sign) { ++/* do one path. */ ++static void xfig_path(FILE *fout, potrace_curve_t *curve, trans_t t, int sign, int depth) { + int i; + dpoint_t *c; + int m = curve->n; + +- fprintf(fout, "3 1 0 0 0 %d 50 0 20 0.000 0 0 0 %d\n", sign=='+' ? 32 : 33, npoints(curve, m)); ++ fprintf(fout, "3 1 0 0 0 %d %d 0 20 0.000 0 0 0 %d\n", sign=='+' ? 32 : 33, depth, npoints(curve, m)); + + for (i=0; i<m; i++) { + c = curve->c[i]; +@@ -154,15 +154,43 @@ + break; + } + } +- return 0; + } + ++/* render a whole tree */ ++static void xfig_write_paths(FILE *fout, potrace_path_t *plist, trans_t t, int depth) { ++ potrace_path_t *p, *q; ++ ++ for (p=plist; p; p=p->sibling) { ++ xfig_path(fout, &p->curve, t, p->sign, depth); ++ for (q=p->childlist; q; q=q->sibling) { ++ xfig_path(fout, &q->curve, t, q->sign, depth >= 1 ? depth-1 : 0); ++ } ++ for (q=p->childlist; q; q=q->sibling) { ++ xfig_write_paths(fout, q->childlist, t, depth >= 2 ? depth-2 : 0); ++ } ++ } ++} ++ ++/* calculate the depth of a tree. Call with d=0. */ ++static int xfig_get_depth(potrace_path_t *plist) { ++ potrace_path_t *p; ++ int max =0; ++ int d; ++ ++ for (p=plist; p; p=p->sibling) { ++ d = xfig_get_depth(p->childlist); ++ if (d > max) { ++ max = d; ++ } ++ } ++ return max + 1; ++} ++ + /* ---------------------------------------------------------------------- */ + /* Backend. */ + + /* public interface for XFIG */ + int page_xfig(FILE *fout, potrace_path_t *plist, imginfo_t *imginfo) { +- potrace_path_t *p; + trans_t t; + double si, co; + double origx = imginfo->trans.orig[0] + imginfo->lmar; +@@ -174,6 +202,7 @@ + pageformat_t *f; + int i; + int x0, y0, x1, y1; /* in xfig's coordinates */ ++ int depth; + + si = sin(info.angle/180*M_PI); + co = cos(info.angle/180*M_PI); +@@ -220,11 +249,21 @@ + fprintf(fout, "0 33 #%06x\n", info.fillcolor); + fprintf(fout, "6 %d %d %d %d\n", x0-75, y1-35, x1+75, y0+35); /* bounding box */ + ++ /* determine depth of the tree */ ++ depth = xfig_get_depth(plist); ++ ++ /* figure out appropriate xfig starting depth. Note: xfig only has 1000 depths available */ ++ if (depth <= 40) { ++ depth = 50; ++ } else if (depth < 990) { ++ depth += 10; ++ } else { ++ depth = 999; ++ } ++ + /* write paths. Note: can never use "opticurve" with this backend - + it just does not approximate Bezier curves closely enough. */ +- list_forall (p, plist) { +- xfig_path(fout, &p->curve, t, p->sign); +- } ++ xfig_write_paths(fout, plist, t, depth); + + fprintf(fout, "-6\n"); /* end bounding box */ + |