summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--draw/draw_path.c46
1 files changed, 28 insertions, 18 deletions
diff --git a/draw/draw_path.c b/draw/draw_path.c
index 2ef8cf3a..458ce349 100644
--- a/draw/draw_path.c
+++ b/draw/draw_path.c
@@ -135,6 +135,7 @@ struct sctx
fz_point seg[2];
int sn, bn;
int dot;
+ int from_bezier;
float *dash_list;
float dash_phase;
@@ -212,7 +213,7 @@ fz_add_line_stroke(struct sctx *s, fz_point a, fz_point b)
}
static void
-fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c)
+fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c, int join_under)
{
float miterlimit = s->miterlimit;
float linewidth = s->linewidth;
@@ -265,6 +266,16 @@ fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c)
if (cross * cross < FLT_EPSILON && dx0 * dx1 + dy0 * dy1 >= 0)
linejoin = FZ_LINEJOIN_BEVEL;
+ if (join_under)
+ {
+ fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
+ }
+ else
+ {
+ fz_add_line(s, b.x + dlx1, b.y + dly1, b.x, b.y);
+ fz_add_line(s, b.x, b.y, b.x + dlx0, b.y + dly0);
+ }
+
/* XPS miter joins are clipped at miterlength, rather than simply
* being converted to bevelled joins. */
if (linejoin == FZ_LINEJOIN_MITER_XPS)
@@ -285,7 +296,6 @@ fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c)
t1x = b.x - dmx + k * (dmx - dlx1);
t1y = b.y - dmy + k * (dmy - dly1);
- fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
fz_add_line(s, b.x - dlx0, b.y - dly0, t0x, t0y);
fz_add_line(s, t0x, t0y, t1x, t1y);
fz_add_line(s, t1x, t1y, b.x - dlx1, b.y - dly1);
@@ -301,7 +311,6 @@ fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c)
dmx *= scale;
dmy *= scale;
- fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dmx, b.y - dmy);
fz_add_line(s, b.x - dmx, b.y - dmy, b.x - dlx1, b.y - dly1);
}
@@ -309,12 +318,10 @@ fz_add_line_join(struct sctx *s, fz_point a, fz_point b, fz_point c)
if (linejoin == FZ_LINEJOIN_BEVEL)
{
fz_add_line(s, b.x - dlx0, b.y - dly0, b.x - dlx1, b.y - dly1);
- fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
}
if (linejoin == FZ_LINEJOIN_ROUND)
{
- fz_add_line(s, b.x + dlx1, b.y + dly1, b.x + dlx0, b.y + dly0);
fz_add_arc(s, b.x, b.y, -dlx0, -dly0, -dlx1, -dly1);
}
}
@@ -421,10 +428,11 @@ fz_stroke_moveto(struct sctx *s, fz_point cur)
s->sn = 1;
s->bn = 1;
s->dot = 0;
+ s->from_bezier = 0;
}
static void
-fz_stroke_lineto(struct sctx *s, fz_point cur)
+fz_stroke_lineto(struct sctx *s, fz_point cur, int from_bezier)
{
float dx = cur.x - s->seg[s->sn-1].x;
float dy = cur.y - s->seg[s->sn-1].y;
@@ -440,10 +448,11 @@ fz_stroke_lineto(struct sctx *s, fz_point cur)
if (s->sn == 2)
{
- fz_add_line_join(s, s->seg[0], s->seg[1], cur);
+ fz_add_line_join(s, s->seg[0], s->seg[1], cur, s->from_bezier & from_bezier);
s->seg[0] = s->seg[1];
s->seg[1] = cur;
}
+ s->from_bezier = from_bezier;
if (s->sn == 1)
s->seg[s->sn++] = cur;
@@ -456,11 +465,11 @@ fz_stroke_closepath(struct sctx *s)
{
if (s->sn == 2)
{
- fz_stroke_lineto(s, s->beg[0]);
+ fz_stroke_lineto(s, s->beg[0], 0);
if (s->seg[1].x == s->beg[0].x && s->seg[1].y == s->beg[0].y)
- fz_add_line_join(s, s->seg[0], s->beg[0], s->beg[1]);
+ fz_add_line_join(s, s->seg[0], s->beg[0], s->beg[1], 0);
else
- fz_add_line_join(s, s->seg[1], s->beg[0], s->beg[1]);
+ fz_add_line_join(s, s->seg[1], s->beg[0], s->beg[1], 0);
}
else if (s->dot)
{
@@ -471,6 +480,7 @@ fz_stroke_closepath(struct sctx *s)
s->bn = 1;
s->sn = 1;
s->dot = 0;
+ s->from_bezier = 0;
}
static void
@@ -498,7 +508,7 @@ fz_stroke_bezier(struct sctx *s,
fz_point p;
p.x = xd;
p.y = yd;
- fz_stroke_lineto(s, p);
+ fz_stroke_lineto(s, p, 1);
return;
}
@@ -579,7 +589,7 @@ fz_flatten_stroke_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_m
case FZ_LINETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
- fz_stroke_lineto(&s, p1);
+ fz_stroke_lineto(&s, p1, 0);
p0 = p1;
break;
@@ -630,7 +640,7 @@ fz_dash_moveto(struct sctx *s, fz_point a, fz_linecap start_cap, fz_linecap end_
}
static void
-fz_dash_lineto(struct sctx *s, fz_point b, int dash_cap)
+fz_dash_lineto(struct sctx *s, fz_point b, int dash_cap, int from_bezier)
{
float dx, dy;
float total, used, ratio;
@@ -652,7 +662,7 @@ fz_dash_lineto(struct sctx *s, fz_point b, int dash_cap)
if (s->toggle)
{
- fz_stroke_lineto(s, m);
+ fz_stroke_lineto(s, m, from_bezier);
}
else
{
@@ -674,7 +684,7 @@ fz_dash_lineto(struct sctx *s, fz_point b, int dash_cap)
if (s->toggle)
{
- fz_stroke_lineto(s, b);
+ fz_stroke_lineto(s, b, from_bezier);
}
}
@@ -704,7 +714,7 @@ fz_dash_bezier(struct sctx *s,
fz_point p;
p.x = xd;
p.y = yd;
- fz_dash_lineto(s, p, dash_cap);
+ fz_dash_lineto(s, p, dash_cap, 1);
return;
}
@@ -794,7 +804,7 @@ fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_mat
case FZ_LINETO:
p1.x = path->items[i++].v;
p1.y = path->items[i++].v;
- fz_dash_lineto(&s, p1, stroke->dash_cap);
+ fz_dash_lineto(&s, p1, stroke->dash_cap, 0);
p0 = p1;
break;
@@ -810,7 +820,7 @@ fz_flatten_dash_path(fz_gel *gel, fz_path *path, fz_stroke_state *stroke, fz_mat
break;
case FZ_CLOSE_PATH:
- fz_dash_lineto(&s, beg, stroke->dash_cap);
+ fz_dash_lineto(&s, beg, stroke->dash_cap, 0);
p0 = p1 = beg;
break;
}