[lasem] Revert "svg_view: reduce the number of informations stored on _start_pattern."
- From: Emmanuel Pacaud <emmanuel src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [lasem] Revert "svg_view: reduce the number of informations stored on _start_pattern."
- Date: Sat, 28 Aug 2010 07:57:09 +0000 (UTC)
commit 795127ef36879e2a8b00e43d7bacbb9c44ae96fd
Author: Emmanuel Pacaud <emmanuel gnome org>
Date: Fri Aug 27 23:45:58 2010 +0200
Revert "svg_view: reduce the number of informations stored on _start_pattern."
This reverts commit c7070406629914634f6d8768e87b57ecc3fa303f.
src/lsmsvgmaskelement.c | 2 +-
src/lsmsvgpatternelement.c | 1 +
src/lsmsvgview.c | 84 +++++++++++++++++++++++++-------------------
src/lsmsvgview.h | 1 +
4 files changed, 51 insertions(+), 37 deletions(-)
---
diff --git a/src/lsmsvgmaskelement.c b/src/lsmsvgmaskelement.c
index 1213bff..6b50de9 100644
--- a/src/lsmsvgmaskelement.c
+++ b/src/lsmsvgmaskelement.c
@@ -94,7 +94,7 @@ lsm_svg_mask_element_render (LsmSvgElement *self, LsmSvgView *view)
if (!lsm_svg_view_create_surface_pattern (view, &viewport,
mask->units.value,
- NULL,
+ mask->content_units.value, NULL,
LSM_SVG_VIEW_SURFACE_TYPE_IMAGE)) {
lsm_debug ("render", "[LsmSvgMaskElement::render] Intermediate surface creation failed");
lsm_svg_view_pop_style (view);
diff --git a/src/lsmsvgpatternelement.c b/src/lsmsvgpatternelement.c
index 8fdf819..de4eab4 100644
--- a/src/lsmsvgpatternelement.c
+++ b/src/lsmsvgpatternelement.c
@@ -210,6 +210,7 @@ lsm_svg_pattern_element_render (LsmSvgElement *self, LsmSvgView *view)
if (!lsm_svg_view_create_surface_pattern (view, &image_box,
pattern->units.value,
+ pattern->content_units.value,
&pattern->transform.matrix,
LSM_SVG_VIEW_SURFACE_TYPE_AUTO)) {
lsm_debug ("render", "[LsmSvgPatternElement::render] Intermediate surface creation failed");
diff --git a/src/lsmsvgview.c b/src/lsmsvgview.c
index 3e35c7d..a17655a 100644
--- a/src/lsmsvgview.c
+++ b/src/lsmsvgview.c
@@ -62,6 +62,10 @@ struct _LsmSvgViewPatternData {
LsmBox extents;
+ LsmSvgPatternUnits units;
+ LsmSvgPatternUnits content_units;
+ LsmSvgSpreadMethod spread_method;
+
double opacity;
};
@@ -92,6 +96,9 @@ _start_pattern (LsmSvgView *view, const LsmBox *extents, double opacity)
view->pattern_data = g_new (LsmSvgViewPatternData, 1);
view->pattern_data->old_cairo = view->dom_view.cairo;
view->pattern_data->pattern = NULL;
+ view->pattern_data->content_units = LSM_SVG_PATTERN_UNITS_USER_SPACE_ON_USE;
+ view->pattern_data->units = LSM_SVG_PATTERN_UNITS_USER_SPACE_ON_USE;
+ view->pattern_data->spread_method = LSM_SVG_SPREAD_METHOD_REPEAT;
view->pattern_data->extents = *extents;
view->pattern_data->opacity = opacity;
@@ -202,6 +209,9 @@ lsm_svg_view_set_gradient_properties (LsmSvgView *view,
g_return_if_fail (LSM_IS_SVG_VIEW (view));
g_return_if_fail (view->pattern_data != NULL);
+ view->pattern_data->units = units;
+ view->pattern_data->spread_method = method;
+
if (matrix != NULL) {
cairo_matrix_init (&view->pattern_data->matrix,
matrix->a, matrix->b,
@@ -210,45 +220,13 @@ lsm_svg_view_set_gradient_properties (LsmSvgView *view,
cairo_matrix_invert (&view->pattern_data->matrix);
} else
cairo_matrix_init_identity (&view->pattern_data->matrix);
-
- if (units == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX &&
- view->pattern_data->extents.width > 0.0 &&
- view->pattern_data->extents.height > 0.0) {
- cairo_matrix_t matrix;
-
- if (view->pattern_data->extents.width <= 0.0 ||
- view->pattern_data->extents.height <= 0.0) {
- return;
- }
-
- matrix = view->pattern_data->matrix;
-
- cairo_matrix_scale (&matrix,
- 1.0 / view->pattern_data->extents.width,
- 1.0 / view->pattern_data->extents.height);
- cairo_matrix_translate (&matrix,
- -view->pattern_data->extents.x,
- -view->pattern_data->extents.y);
-
- cairo_pattern_set_matrix (view->pattern_data->pattern, &matrix);
- }
-
- switch (method) {
- case LSM_SVG_SPREAD_METHOD_REFLECT:
- cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REFLECT);
- break;
- case LSM_SVG_SPREAD_METHOD_REPEAT:
- cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REPEAT);
- break;
- default:
- cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_PAD);
- }
}
gboolean
lsm_svg_view_create_surface_pattern (LsmSvgView *view,
const LsmBox *viewport,
LsmSvgPatternUnits units,
+ LsmSvgPatternUnits content_units,
const LsmSvgMatrix *matrix,
LsmSvgViewSurfaceType surface_type)
{
@@ -318,6 +296,9 @@ lsm_svg_view_create_surface_pattern (LsmSvgView *view,
_set_pattern (view, pattern);
+ view->pattern_data->units = units;
+ view->pattern_data->content_units = content_units;
+
if (matrix != NULL) {
cairo_matrix_init (&view->pattern_data->matrix,
matrix->a, matrix->b,
@@ -330,9 +311,6 @@ lsm_svg_view_create_surface_pattern (LsmSvgView *view,
cairo_matrix_scale (&view->pattern_data->matrix, 1.0 / x_scale, 1.0 / y_scale);
}
- cairo_pattern_set_matrix (view->pattern_data->pattern, &view->pattern_data->matrix);
- cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REPEAT);
-
return TRUE;
}
@@ -814,6 +792,40 @@ _paint_url (LsmSvgView *view,
}
#endif
+ if ((LSM_IS_SVG_RADIAL_GRADIENT_ELEMENT (element) || LSM_IS_SVG_LINEAR_GRADIENT_ELEMENT (element)) &&
+ view->pattern_data->units == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX) {
+ cairo_matrix_t matrix;
+
+ if (view->pattern_data->extents.width <= 0.0 ||
+ view->pattern_data->extents.height <= 0.0) {
+ _end_pattern (view);
+ return;
+ }
+
+ matrix = view->pattern_data->matrix;
+
+ cairo_matrix_scale (&matrix,
+ 1.0 / view->pattern_data->extents.width,
+ 1.0 / view->pattern_data->extents.height);
+ cairo_matrix_translate (&matrix,
+ -view->pattern_data->extents.x,
+ -view->pattern_data->extents.y);
+
+ cairo_pattern_set_matrix (view->pattern_data->pattern, &matrix);
+ } else
+ cairo_pattern_set_matrix (view->pattern_data->pattern, &view->pattern_data->matrix);
+
+ switch (view->pattern_data->spread_method) {
+ case LSM_SVG_SPREAD_METHOD_REFLECT:
+ cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REFLECT);
+ break;
+ case LSM_SVG_SPREAD_METHOD_REPEAT:
+ cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_REPEAT);
+ break;
+ default:
+ cairo_pattern_set_extend (view->pattern_data->pattern, CAIRO_EXTEND_PAD);
+ }
+
cairo_set_source (cairo, view->pattern_data->pattern);
} else
cairo_set_source_rgb (cairo, 0.0, 0.0, 0.0);
diff --git a/src/lsmsvgview.h b/src/lsmsvgview.h
index f5be44a..62227c4 100644
--- a/src/lsmsvgview.h
+++ b/src/lsmsvgview.h
@@ -103,6 +103,7 @@ void lsm_svg_view_set_gradient_properties (LsmSvgView *view,
gboolean lsm_svg_view_create_surface_pattern (LsmSvgView *view, const LsmBox *viewport,
LsmSvgPatternUnits units,
+ LsmSvgPatternUnits content_units,
const LsmSvgMatrix *matrix,
LsmSvgViewSurfaceType surface_type) G_GNUC_WARN_UNUSED_RESULT;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]