summaryrefslogtreecommitdiff
path: root/twin_convolve.c
diff options
context:
space:
mode:
Diffstat (limited to 'twin_convolve.c')
-rw-r--r--twin_convolve.c101
1 files changed, 21 insertions, 80 deletions
diff --git a/twin_convolve.c b/twin_convolve.c
index 54b3c0f..6451171 100644
--- a/twin_convolve.c
+++ b/twin_convolve.c
@@ -58,31 +58,6 @@ _twin_path_leftpoint (twin_path_t *path,
return best;
}
-/*
- * step along a path avoiding coincident points. These
- * occur in closed paths where the first and final points are
- * always the same
- */
-
-static int
-_twin_path_step (twin_point_t *points,
- int npoints,
- int p,
- int inc)
-{
- int n = p;
-
- for (;;)
- {
- n += inc;
- if (n < 0) n += npoints;
- else if (n >= npoints) n -= npoints;
- if (points[n].x != points[p].x || points[n].y != points[p].y)
- break;
- }
- return n;
-}
-
static int
_around_order (twin_point_t *a1,
twin_point_t *a2,
@@ -134,26 +109,21 @@ _twin_subpath_convolve (twin_path_t *path,
int ns = stroke->npoints;
int np = pen->npoints;
twin_point_t *sp0 = &sp[0];
- twin_point_t *sp1 = &sp[_twin_path_step(sp,ns,0,1)];
+ twin_point_t *sp1 = &sp[1];
int start = _twin_path_leftpoint (pen, sp0, sp1);
twin_point_t *spn1 = &sp[ns-1];
- twin_point_t *spn2 = &sp[_twin_path_step(sp,ns,ns-1,-1)];
+ twin_point_t *spn2 = &sp[ns-2];
int ret = _twin_path_leftpoint (pen, spn1, spn2);
int p;
int s;
int starget;
int ptarget;
int inc;
- twin_bool_t closed = TWIN_FALSE;
- if (sp[0].x == sp[ns - 1].x && sp[0].y == sp[ns - 1].y)
- closed = TWIN_TRUE;
-
- DBGOUT ("convolve: closed(%s)\n", closed ? "true" : "false");
- DBGOUT ("stroke:\n");
+ DBGOUT ("convolve stroke:\n");
for (s = 0; s < ns; s++)
DBGOUT ("\ts%02d: %9.4f, %9.4f\n", s, F(sp[s].x), F(sp[s].y));
- DBGOUT ("pen:\n");
+ DBGOUT ("convolve pen:\n");
for (p = 0; p < np; p++)
DBGOUT ("\tp%02d: %9.4f, %9.4f\n", p, F(pp[p].x), F(pp[p].y));
@@ -168,16 +138,8 @@ _twin_subpath_convolve (twin_path_t *path,
/* step along the path first */
inc = 1;
- if (closed)
- {
- starget = ns-1;
- ptarget = start;
- }
- else
- {
- starget = ns-1;
- ptarget = ret;
- }
+ starget = ns-1;
+ ptarget = ret;
for (;;)
{
/*
@@ -185,10 +147,9 @@ _twin_subpath_convolve (twin_path_t *path,
*/
do
{
- int sn = _twin_path_step(sp,ns,s,inc);
+ int sn = s + inc;
int pn = (p == np - 1) ? 0 : p + 1;
int pm = (p == 0) ? np - 1 : p - 1;
- int o;
/*
* step along pen (forwards or backwards) or stroke as appropriate
@@ -198,14 +159,12 @@ _twin_subpath_convolve (twin_path_t *path,
_angle (&sp[s], &sp[sn]),
_angle (&pp[p], &pp[pn]),
_angle (&pp[pm], &pp[p]));
- o = _around_order (&sp[s],&sp[sn],&pp[p],&pp[pn]);
- if (o > 0 || (o == 0 && (closed && s == starget)))
+ if (_around_order (&sp[s],&sp[sn],&pp[p],&pp[pn]) > 0)
{
DBGOUT ("+pen: ");
p = pn;
}
- else if ((s == starget && closed)
- || _around_order (&sp[s],&sp[sn],&pp[pm],&pp[p]) < 0)
+ else if (_around_order (&sp[s],&sp[sn],&pp[pm],&pp[p]) < 0)
{
DBGOUT ("-pen: ");
p = pm;
@@ -220,29 +179,22 @@ _twin_subpath_convolve (twin_path_t *path,
p, F(pp[p].x), F(pp[p].y),
F(sp[s].x + pp[p].x), F(sp[s].y + pp[p].y));
twin_path_draw (path, sp[s].x + pp[p].x, sp[s].y + pp[p].y);
- } while (s != starget || (closed && p != ptarget));
+ } while (s != starget);
/*
* Finish this edge
*/
- if (closed)
+ /* draw a cap */
+ while (p != ptarget)
{
- twin_path_close (path);
- }
- else
- {
- /* draw a cap */
- while (p != ptarget)
- {
- if (++p == np) p = 0;
- DBGOUT("cap: ");
- DBGOUT ("s%02d (%9.4f, %9.4f), p%02d (%9.4f, %9.4f): %9.4f, %9.4f\n",
- s, F(sp[s].x), F(sp[s].y),
- p, F(pp[p].x), F(pp[p].y),
- F(sp[s].x + pp[p].x), F(sp[s].y + pp[p].y));
- twin_path_draw (path, sp[s].x + pp[p].x, sp[s].y + pp[p].y);
- }
+ if (++p == np) p = 0;
+ DBGOUT("cap: ");
+ DBGOUT ("s%02d (%9.4f, %9.4f), p%02d (%9.4f, %9.4f): %9.4f, %9.4f\n",
+ s, F(sp[s].x), F(sp[s].y),
+ p, F(pp[p].x), F(pp[p].y),
+ F(sp[s].x + pp[p].x), F(sp[s].y + pp[p].y));
+ twin_path_draw (path, sp[s].x + pp[p].x, sp[s].y + pp[p].y);
}
if (inc == -1)
@@ -250,19 +202,8 @@ _twin_subpath_convolve (twin_path_t *path,
/* reach the end of the path? Go back the other way now */
inc = -1;
-
- if (closed)
- {
- p = ret;
- ptarget = ret;
- starget = 0;
- twin_path_move (path, sp[s].x + pp[p].x, sp[s].y + pp[p].y);
- }
- else
- {
- ptarget = start;
- starget = 0;
- }
+ ptarget = start;
+ starget = 0;
}
}