Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 29 Sep 2007 07:22:30 GMT
From:      bf <bf2006a@yahoo.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   misc/116731: [PATCH]graphics/potrace: improve xfig backend
Message-ID:  <200709290722.l8T7MUEQ062767@www.freebsd.org>
Resent-Message-ID: <200709290730.l8T7U07d063791@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         116731
>Category:       misc
>Synopsis:       [PATCH]graphics/potrace: improve xfig backend
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sat Sep 29 07:30:00 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     bf
>Release:        6.2-stable i386
>Organization:
-
>Environment:
>Description:
add upstream patch to improve xfig backend:

"May 22, 2007: Updated XFig backend. The following patch to Potrace 1.8 improves the XFig output by adding a depth setting to the spline components. This prevents them from floating to the background when editing. Thanks to Rafael Laboissiere for suggesting this."




diff -ruN potrace.orig/files/patch-backend_xfig.c potrace/files/patch-backend_xfig.c
--- potrace.orig/files/patch-backend_xfig.c	Wed Dec 31 19:00:00 1969
+++ potrace/files/patch-backend_xfig.c	Sat Sep 29 03:00:41 2007
@@ -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 */
+ 

>How-To-Repeat:

>Fix:


>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200709290722.l8T7MUEQ062767>