static void fz_process_mesh_type2(fz_context *ctx, fz_shade *shade, const fz_matrix *ctm, fz_mesh_processor *painter) { fz_point p0, p1, dir; fz_vertex v0, v1, v2, v3; fz_vertex e0, e1; float theta; float zero = 0; float one = 1; p0.x = shade->u.l_or_r.coords[0][0]; p0.y = shade->u.l_or_r.coords[0][1]; p1.x = shade->u.l_or_r.coords[1][0]; p1.y = shade->u.l_or_r.coords[1][1]; dir.x = p0.y - p1.y; dir.y = p1.x - p0.x; fz_transform_point(&p0, ctm); fz_transform_point(&p1, ctm); fz_transform_vector(&dir, ctm); theta = atan2f(dir.y, dir.x); v0.p = fz_point_on_circle(p0, HUGENUM, theta); v1.p = fz_point_on_circle(p1, HUGENUM, theta); v2.p = fz_point_on_circle(p0, -HUGENUM, theta); v3.p = fz_point_on_circle(p1, -HUGENUM, theta); fz_prepare_color(ctx, painter, &v0, &zero); fz_prepare_color(ctx, painter, &v1, &one); fz_prepare_color(ctx, painter, &v2, &zero); fz_prepare_color(ctx, painter, &v3, &one); paint_quad(ctx, painter, &v0, &v2, &v3, &v1); if (shade->u.l_or_r.extend[0]) { e0.p.x = v0.p.x - (p1.x - p0.x) * HUGENUM; e0.p.y = v0.p.y - (p1.y - p0.y) * HUGENUM; fz_prepare_color(ctx, painter, &e0, &zero); e1.p.x = v2.p.x - (p1.x - p0.x) * HUGENUM; e1.p.y = v2.p.y - (p1.y - p0.y) * HUGENUM; fz_prepare_color(ctx, painter, &e1, &zero); paint_quad(ctx, painter, &e0, &v0, &v2, &e1); } if (shade->u.l_or_r.extend[1]) { e0.p.x = v1.p.x + (p1.x - p0.x) * HUGENUM; e0.p.y = v1.p.y + (p1.y - p0.y) * HUGENUM; fz_prepare_color(ctx, painter, &e0, &one); e1.p.x = v3.p.x + (p1.x - p0.x) * HUGENUM; e1.p.y = v3.p.y + (p1.y - p0.y) * HUGENUM; fz_prepare_color(ctx, painter, &e1, &one); paint_quad(ctx, painter, &e0, &v1, &v3, &e1); } }
static void fz_paint_linear(fz_shade *shade, fz_matrix ctm, fz_pixmap *dest, fz_bbox bbox) { fz_point p0, p1; fz_point v0, v1, v2, v3; fz_point e0, e1; float theta; p0.x = shade->mesh[0]; p0.y = shade->mesh[1]; p0 = fz_transform_point(ctm, p0); p1.x = shade->mesh[3]; p1.y = shade->mesh[4]; p1 = fz_transform_point(ctm, p1); theta = atan2f(p1.y - p0.y, p1.x - p0.x); theta += (float)M_PI * 0.5f; v0 = fz_point_on_circle(p0, HUGENUM, theta); v1 = fz_point_on_circle(p1, HUGENUM, theta); v2 = fz_point_on_circle(p0, -HUGENUM, theta); v3 = fz_point_on_circle(p1, -HUGENUM, theta); fz_paint_quad(dest, v0, v1, v2, v3, 0, 255, 0, 255, 3, bbox); if (shade->extend[0]) { e0.x = v0.x - (p1.x - p0.x) * HUGENUM; e0.y = v0.y - (p1.y - p0.y) * HUGENUM; e1.x = v2.x - (p1.x - p0.x) * HUGENUM; e1.y = v2.y - (p1.y - p0.y) * HUGENUM; fz_paint_quad(dest, e0, e1, v0, v2, 0, 0, 0, 0, 3, bbox); } if (shade->extend[1]) { e0.x = v1.x + (p1.x - p0.x) * HUGENUM; e0.y = v1.y + (p1.y - p0.y) * HUGENUM; e1.x = v3.x + (p1.x - p0.x) * HUGENUM; e1.y = v3.y + (p1.y - p0.y) * HUGENUM; fz_paint_quad(dest, e0, e1, v1, v3, 255, 255, 255, 255, 3, bbox); } }
static void fz_paint_annulus(fz_context *ctx, const fz_matrix *ctm, fz_point p0, float r0, float c0, fz_point p1, float r1, float c1, int count, fz_mesh_processor *painter) { fz_vertex t0, t1, t2, t3, b0, b1, b2, b3; float theta, step, a, b; int i; theta = atan2f(p1.y - p0.y, p1.x - p0.x); step = (float)M_PI / count; a = 0; for (i = 1; i <= count; i++) { b = i * step; t0.p = fz_point_on_circle(p0, r0, theta + a); t1.p = fz_point_on_circle(p0, r0, theta + b); t2.p = fz_point_on_circle(p1, r1, theta + a); t3.p = fz_point_on_circle(p1, r1, theta + b); b0.p = fz_point_on_circle(p0, r0, theta - a); b1.p = fz_point_on_circle(p0, r0, theta - b); b2.p = fz_point_on_circle(p1, r1, theta - a); b3.p = fz_point_on_circle(p1, r1, theta - b); fz_transform_point(&t0.p, ctm); fz_transform_point(&t1.p, ctm); fz_transform_point(&t2.p, ctm); fz_transform_point(&t3.p, ctm); fz_transform_point(&b0.p, ctm); fz_transform_point(&b1.p, ctm); fz_transform_point(&b2.p, ctm); fz_transform_point(&b3.p, ctm); fz_prepare_color(ctx, painter, &t0, &c0); fz_prepare_color(ctx, painter, &t1, &c0); fz_prepare_color(ctx, painter, &t2, &c1); fz_prepare_color(ctx, painter, &t3, &c1); fz_prepare_color(ctx, painter, &b0, &c0); fz_prepare_color(ctx, painter, &b1, &c0); fz_prepare_color(ctx, painter, &b2, &c1); fz_prepare_color(ctx, painter, &b3, &c1); paint_quad(ctx, painter, &t0, &t2, &t3, &t1); paint_quad(ctx, painter, &b0, &b2, &b3, &b1); a = b; } }
static void fz_paint_annulus(const fz_matrix *ctm, fz_point p0, float r0, float c0, fz_point p1, float r1, float c1, fz_mesh_processor *painter) { fz_vertex t0, t1, t2, t3, b0, b1, b2, b3; float theta, step; int i; theta = atan2f(p1.y - p0.y, p1.x - p0.x); step = (float)M_PI * 2 / RADSEGS; for (i = 0; i < RADSEGS / 2; i++) { t0.p = fz_point_on_circle(p0, r0, theta + i * step); t1.p = fz_point_on_circle(p0, r0, theta + i * step + step); t2.p = fz_point_on_circle(p1, r1, theta + i * step); t3.p = fz_point_on_circle(p1, r1, theta + i * step + step); b0.p = fz_point_on_circle(p0, r0, theta - i * step); b1.p = fz_point_on_circle(p0, r0, theta - i * step - step); b2.p = fz_point_on_circle(p1, r1, theta - i * step); b3.p = fz_point_on_circle(p1, r1, theta - i * step - step); fz_transform_point(&t0.p, ctm); fz_transform_point(&t1.p, ctm); fz_transform_point(&t2.p, ctm); fz_transform_point(&t3.p, ctm); fz_transform_point(&b0.p, ctm); fz_transform_point(&b1.p, ctm); fz_transform_point(&b2.p, ctm); fz_transform_point(&b3.p, ctm); t0.c[0] = c0; t1.c[0] = c0; t2.c[0] = c1; t3.c[0] = c1; b0.c[0] = c0; b1.c[0] = c0; b2.c[0] = c1; b3.c[0] = c1; paint_quad(painter, &t0, &t2, &t3, &t1); paint_quad(painter, &b0, &b2, &b3, &b1); } }
static void fz_paint_annulus(fz_matrix ctm, fz_point p0, float r0, float c0, fz_point p1, float r1, float c1, fz_pixmap *dest, fz_bbox bbox) { fz_point t0, t1, t2, t3, b0, b1, b2, b3; float theta, step; int i; theta = atan2f(p1.y - p0.y, p1.x - p0.x); step = (float)M_PI * 2 / RADSEGS; for (i = 0; i < RADSEGS / 2; i++) { t0 = fz_point_on_circle(p0, r0, theta + i * step); t1 = fz_point_on_circle(p0, r0, theta + i * step + step); t2 = fz_point_on_circle(p1, r1, theta + i * step); t3 = fz_point_on_circle(p1, r1, theta + i * step + step); b0 = fz_point_on_circle(p0, r0, theta - i * step); b1 = fz_point_on_circle(p0, r0, theta - i * step - step); b2 = fz_point_on_circle(p1, r1, theta - i * step); b3 = fz_point_on_circle(p1, r1, theta - i * step - step); t0 = fz_transform_point(ctm, t0); t1 = fz_transform_point(ctm, t1); t2 = fz_transform_point(ctm, t2); t3 = fz_transform_point(ctm, t3); b0 = fz_transform_point(ctm, b0); b1 = fz_transform_point(ctm, b1); b2 = fz_transform_point(ctm, b2); b3 = fz_transform_point(ctm, b3); fz_paint_quad(dest, t0, t1, t2, t3, c0, c0, c1, c1, 3, bbox); fz_paint_quad(dest, b0, b1, b2, b3, c0, c0, c1, c1, 3, bbox); } }