diff options
Diffstat (limited to 'source/xps/xps-gradient.c')
-rw-r--r-- | source/xps/xps-gradient.c | 62 |
1 files changed, 30 insertions, 32 deletions
diff --git a/source/xps/xps-gradient.c b/source/xps/xps-gradient.c index 7916d088..73022790 100644 --- a/source/xps/xps-gradient.c +++ b/source/xps/xps-gradient.c @@ -210,7 +210,7 @@ xps_sample_gradient_stops(fz_context *ctx, xps_document *doc, fz_shade *shade, s */ static void -xps_draw_one_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, +xps_draw_one_radial_gradient(fz_context *ctx, xps_document *doc, fz_matrix ctm, struct stop *stops, int count, int extend, float x0, float y0, float r0, @@ -240,7 +240,7 @@ xps_draw_one_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix shade->u.l_or_r.coords[1][1] = y1; shade->u.l_or_r.coords[1][2] = r1; - fz_fill_shade(ctx, dev, shade, ctm, 1, fz_default_color_params(ctx)); + fz_fill_shade(ctx, dev, shade, &ctm, 1, fz_default_color_params(ctx)); fz_drop_shade(ctx, shade); } @@ -250,7 +250,7 @@ xps_draw_one_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix */ static void -xps_draw_one_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, +xps_draw_one_linear_gradient(fz_context *ctx, xps_document *doc, fz_matrix ctm, struct stop *stops, int count, int extend, float x0, float y0, float x1, float y1) @@ -279,7 +279,7 @@ xps_draw_one_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix shade->u.l_or_r.coords[1][1] = y1; shade->u.l_or_r.coords[1][2] = 0; - fz_fill_shade(ctx, dev, shade, ctm, doc->opacity[doc->opacity_top], fz_default_color_params(ctx)); + fz_fill_shade(ctx, dev, shade, &ctm, doc->opacity[doc->opacity_top], fz_default_color_params(ctx)); fz_drop_shade(ctx, shade); } @@ -293,7 +293,7 @@ xps_draw_one_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix */ static void -xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, +xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, fz_matrix ctm, fz_rect area, struct stop *stops, int count, fz_xml *root, int spread) { @@ -303,9 +303,7 @@ xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct float yrad = 1; float invscale; int i, ma = 1; - fz_matrix local_ctm = *ctm; fz_matrix inv; - fz_rect local_area = *area; char *center_att = fz_xml_att(root, "Center"); char *origin_att = fz_xml_att(root, "GradientOrigin"); @@ -332,7 +330,7 @@ xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct /* scale the ctm to make ellipses */ if (fz_abs(xrad) > FLT_EPSILON) { - fz_pre_scale(&local_ctm, 1, yrad/xrad); + ctm = fz_pre_scale(ctm, 1, yrad/xrad); } if (yrad != 0.0f) @@ -345,16 +343,17 @@ xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct r0 = 0; r1 = xrad; - fz_transform_rect(&local_area, fz_invert_matrix(&inv, &local_ctm)); - ma = fz_maxi(ma, ceilf(hypotf(local_area.x0 - x0, local_area.y0 - y0) / xrad)); - ma = fz_maxi(ma, ceilf(hypotf(local_area.x1 - x0, local_area.y0 - y0) / xrad)); - ma = fz_maxi(ma, ceilf(hypotf(local_area.x0 - x0, local_area.y1 - y0) / xrad)); - ma = fz_maxi(ma, ceilf(hypotf(local_area.x1 - x0, local_area.y1 - y0) / xrad)); + inv = fz_invert_matrix(ctm); + area = fz_transform_rect(area, inv); + ma = fz_maxi(ma, ceilf(hypotf(area.x0 - x0, area.y0 - y0) / xrad)); + ma = fz_maxi(ma, ceilf(hypotf(area.x1 - x0, area.y0 - y0) / xrad)); + ma = fz_maxi(ma, ceilf(hypotf(area.x0 - x0, area.y1 - y0) / xrad)); + ma = fz_maxi(ma, ceilf(hypotf(area.x1 - x0, area.y1 - y0) / xrad)); if (spread == SPREAD_REPEAT) { for (i = ma - 1; i >= 0; i--) - xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad); + xps_draw_one_radial_gradient(ctx, doc, ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad); } else if (spread == SPREAD_REFLECT) { @@ -362,13 +361,13 @@ xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct ma++; for (i = ma - 2; i >= 0; i -= 2) { - xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad); - xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 0, x0, y0, r0 + (i + 2) * xrad, x1, y1, r1 + i * xrad); + xps_draw_one_radial_gradient(ctx, doc, ctm, stops, count, 0, x0, y0, r0 + i * xrad, x1, y1, r1 + i * xrad); + xps_draw_one_radial_gradient(ctx, doc, ctm, stops, count, 0, x0, y0, r0 + (i + 2) * xrad, x1, y1, r1 + i * xrad); } } else { - xps_draw_one_radial_gradient(ctx, doc, &local_ctm, stops, count, 1, x0, y0, r0, x1, y1, r1); + xps_draw_one_radial_gradient(ctx, doc, ctm, stops, count, 1, x0, y0, r0, x1, y1, r1); } } @@ -378,7 +377,7 @@ xps_draw_radial_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct */ static void -xps_draw_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, +xps_draw_linear_gradient(fz_context *ctx, xps_document *doc, fz_matrix ctm, fz_rect area, struct stop *stops, int count, fz_xml *root, int spread) { @@ -387,7 +386,6 @@ xps_draw_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct float dx, dy, x, y, k; fz_point p1, p2; fz_matrix inv; - fz_rect local_area = *area; char *start_point_att = fz_xml_att(root, "StartPoint"); char *end_point_att = fz_xml_att(root, "EndPoint"); @@ -401,15 +399,16 @@ xps_draw_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct xps_parse_point(ctx, doc, end_point_att, &x1, &y1); p1.x = x0; p1.y = y0; p2.x = x1; p2.y = y1; - fz_transform_rect(&local_area, fz_invert_matrix(&inv, ctm)); + inv = fz_invert_matrix(ctm); + area = fz_transform_rect(area, inv); x = p2.x - p1.x; y = p2.y - p1.y; - k = ((local_area.x0 - p1.x) * x + (local_area.y0 - p1.y) * y) / (x * x + y * y); + k = ((area.x0 - p1.x) * x + (area.y0 - p1.y) * y) / (x * x + y * y); mi = floorf(k); ma = ceilf(k); - k = ((local_area.x1 - p1.x) * x + (local_area.y0 - p1.y) * y) / (x * x + y * y); + k = ((area.x1 - p1.x) * x + (area.y0 - p1.y) * y) / (x * x + y * y); mi = fz_mini(mi, floorf(k)); ma = fz_maxi(ma, ceilf(k)); - k = ((local_area.x0 - p1.x) * x + (local_area.y1 - p1.y) * y) / (x * x + y * y); + k = ((area.x0 - p1.x) * x + (area.y1 - p1.y) * y) / (x * x + y * y); mi = fz_mini(mi, floorf(k)); ma = fz_maxi(ma, ceilf(k)); - k = ((local_area.x1 - p1.x) * x + (local_area.y1 - p1.y) * y) / (x * x + y * y); + k = ((area.x1 - p1.x) * x + (area.y1 - p1.y) * y) / (x * x + y * y); mi = fz_mini(mi, floorf(k)); ma = fz_maxi(ma, ceilf(k)); dx = x1 - x0; dy = y1 - y0; @@ -440,9 +439,9 @@ xps_draw_linear_gradient(fz_context *ctx, xps_document *doc, const fz_matrix *ct */ static void -xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, +xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, fz_xml *root, - void (*draw)(fz_context *ctx, xps_document *, const fz_matrix*, const fz_rect *, struct stop *, int, fz_xml *, int)) + void (*draw)(fz_context *ctx, xps_document *, fz_matrix, fz_rect, struct stop *, int, fz_xml *, int)) { fz_xml *node; @@ -455,7 +454,6 @@ xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ct struct stop stop_list[MAX_STOPS]; int stop_count; - fz_matrix local_ctm; int spread_method; opacity_att = fz_xml_att(root, "Opacity"); @@ -487,7 +485,7 @@ xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ct spread_method = SPREAD_REPEAT; } - xps_parse_transform(ctx, doc, transform_att, transform_tag, &local_ctm, ctm); + ctm = xps_parse_transform(ctx, doc, transform_att, transform_tag, ctm); if (!stop_tag) { fz_warn(ctx, "missing gradient stops tag"); @@ -501,22 +499,22 @@ xps_parse_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ct return; } - xps_begin_opacity(ctx, doc, &local_ctm, area, base_uri, dict, opacity_att, NULL); + xps_begin_opacity(ctx, doc, ctm, area, base_uri, dict, opacity_att, NULL); - draw(ctx, doc, &local_ctm, area, stop_list, stop_count, root, spread_method); + draw(ctx, doc, ctm, area, stop_list, stop_count, root, spread_method); xps_end_opacity(ctx, doc, base_uri, dict, opacity_att, NULL); } void -xps_parse_linear_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, +xps_parse_linear_gradient_brush(fz_context *ctx, xps_document *doc, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, fz_xml *root) { xps_parse_gradient_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_draw_linear_gradient); } void -xps_parse_radial_gradient_brush(fz_context *ctx, xps_document *doc, const fz_matrix *ctm, const fz_rect *area, +xps_parse_radial_gradient_brush(fz_context *ctx, xps_document *doc, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, fz_xml *root) { xps_parse_gradient_brush(ctx, doc, ctm, area, base_uri, dict, root, xps_draw_radial_gradient); |