static void pdf_write_strike_out_appearance(fz_context *ctx, pdf_annot *annot, fz_buffer *buf, fz_rect *rect) { fz_point quad[4], a, b; float h; pdf_obj *qp; int i, n; pdf_write_stroke_color_appearance(ctx, annot, buf); qp = pdf_dict_get(ctx, annot->obj, PDF_NAME(QuadPoints)); n = pdf_array_len(ctx, qp); if (n > 0) { *rect = fz_empty_rect; for (i = 0; i < n; i += 8) { /* Acrobat draws the line at 3/7 of the box width from the bottom * of the box and 1/16 thick of the box width. */ h = extract_quad(ctx, quad, qp, i); a = lerp_point(quad[LL], quad[UL], 3/7.0f); b = lerp_point(quad[LR], quad[UR], 3/7.0f); fz_append_printf(ctx, buf, "%g w\n", h/16); fz_append_printf(ctx, buf, "%g %g m\n", a.x, a.y); fz_append_printf(ctx, buf, "%g %g l\n", b.x, b.y); fz_append_printf(ctx, buf, "S\n"); union_quad(rect, quad, h/16); } } }
static void pdf_write_squiggly_appearance(fz_context *ctx, pdf_annot *annot, fz_buffer *buf, fz_rect *rect) { fz_point quad[4], a, b, c, v; float h, x, w; pdf_obj *qp; int i, n; *rect = fz_empty_rect; pdf_write_stroke_color_appearance(ctx, annot, buf); qp = pdf_dict_get(ctx, annot->obj, PDF_NAME(QuadPoints)); n = pdf_array_len(ctx, qp); if (n > 0) { for (i = 0; i < n; i += 8) { int up = 1; h = extract_quad(ctx, quad, qp, i); v = fz_make_point(quad[LR].x - quad[LL].x, quad[LR].y - quad[LL].y); w = sqrtf(v.x * v.x + v.y * v.y); x = 0; fz_append_printf(ctx, buf, "%g w\n", h/16); fz_append_printf(ctx, buf, "%g %g m\n", quad[LL].x, quad[LL].y); while (x < w) { x += h/7; a = lerp_point(quad[LL], quad[LR], x/w); if (up) { b = lerp_point(quad[UL], quad[UR], x/w); c = lerp_point(a, b, 1/7.0f); fz_append_printf(ctx, buf, "%g %g l\n", c.x, c.y); } else fz_append_printf(ctx, buf, "%g %g l\n", a.x, a.y); up = !up; } fz_append_printf(ctx, buf, "S\n"); union_quad(rect, quad, h/16); } } }
void ValueTraits<ShapeValue>::Lerp(const ShapeValue& v0, const ShapeValue& v1, float t, ShapeValue* result) { SkASSERT(v0.fVertices.size() == v1.fVertices.size()); SkASSERT(v0.fClosed == v1.fClosed); result->fClosed = v0.fClosed; result->fVolatile = true; // interpolated values are volatile const auto t2f = Sk2f(t); result->fVertices.resize(v0.fVertices.size()); for (size_t i = 0; i < v0.fVertices.size(); ++i) { result->fVertices[i] = BezierVertex({ lerp_point(v0.fVertices[i].fInPoint , v1.fVertices[i].fInPoint , t2f), lerp_point(v0.fVertices[i].fOutPoint, v1.fVertices[i].fOutPoint, t2f), lerp_point(v0.fVertices[i].fVertex , v1.fVertices[i].fVertex , t2f) }); } }