summaryrefslogtreecommitdiff
path: root/source/xps/xps-gradient.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/xps/xps-gradient.c')
-rw-r--r--source/xps/xps-gradient.c62
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);