static void fz_stroke_closepath(struct sctx *s) { if (s->sn == 2) { /* SumatraPDF: prevent rendering artifacts from line joins */ float dx = s->beg[0].x - s->seg[1].x, dy = s->beg[0].y - s->seg[1].y; 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], 0); else if (dx * dx + dy * dy < FLT_EPSILON) fz_stroke_flush(s, FZ_LINECAP_BUTT, FZ_LINECAP_BUTT); else fz_add_line_join(s, s->seg[1], s->beg[0], s->beg[1], 0); } else if (s->dot) { fz_add_line_dot(s, s->beg[0]); } s->seg[0] = s->beg[0]; s->bn = 1; s->sn = 1; s->dot = 0; s->from_bezier = 0; }
static void 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; if (dx * dx + dy * dy < FLT_EPSILON) { if (s->cap == FZ_LINECAP_ROUND || s->dash_list) s->dot = 1; return; } fz_add_line_stroke(s, s->seg[s->sn-1], cur); if (s->sn == 2) { 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; if (s->bn == 1) s->beg[s->bn++] = cur; }
static void fz_stroke_lineto(struct sctx *s, fz_point cur) { float dx = cur.x - s->seg[s->sn-1].x; float dy = cur.y - s->seg[s->sn-1].y; if (dx * dx + dy * dy < FLT_EPSILON) { s->dot = 1; return; } fz_add_line_stroke(s, s->seg[s->sn-1], cur); if (s->sn == 2) { fz_add_line_join(s, s->seg[0], s->seg[1], cur); s->seg[0] = s->seg[1]; s->seg[1] = cur; } if (s->sn == 1) s->seg[s->sn++] = cur; if (s->bn == 1) s->beg[s->bn++] = cur; }
static void fz_stroke_closepath(struct sctx *s) { if (s->sn == 2) { fz_stroke_lineto(s, s->beg[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]); else fz_add_line_join(s, s->seg[1], s->beg[0], s->beg[1]); } else if (s->dot) { fz_add_line_dot(s, s->beg[0]); } s->seg[0] = s->beg[0]; s->bn = 1; s->sn = 1; s->dot = 0; }