[lasem] svg_radial_element: keep track of defined fx and fy when inheriting from refere, nced gradient.



commit 2004aca3850ea9d0f0cddf223a0fc0a9223f8e9f
Author: Emmanuel Pacaud <emmanuel gnome org>
Date:   Fri Aug 13 11:23:28 2010 +0200

    svg_radial_element: keep track of defined fx and fy when inheriting from refere,nced gradient.

 src/lsmsvgradialgradientelement.c |   31 +++++++++++++++++++++++--------
 1 files changed, 23 insertions(+), 8 deletions(-)
---
diff --git a/src/lsmsvgradialgradientelement.c b/src/lsmsvgradialgradientelement.c
index 23218a9..bc23c1e 100644
--- a/src/lsmsvgradialgradientelement.c
+++ b/src/lsmsvgradialgradientelement.c
@@ -36,6 +36,8 @@ typedef struct {
 	LsmSvgMatrix transform;
 	LsmSvgPatternUnits units;
 	LsmSvgSpreadMethod spread_method;
+	gboolean is_fx_defined;
+	gboolean is_fy_defined;
 } LsmSvgRadialGradientElementAttributes;
 
 static const LsmSvgRadialGradientElementAttributes default_attributes = {
@@ -46,7 +48,9 @@ static const LsmSvgRadialGradientElementAttributes default_attributes = {
 	.fy = {.value_unit =  0.0, .type = LSM_SVG_LENGTH_TYPE_ERROR},
 	.transform = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0, LSM_SVG_MATRIX_FLAGS_IDENTITY},
 	.units = LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX,
-	.spread_method = LSM_SVG_SPREAD_METHOD_PAD
+	.spread_method = LSM_SVG_SPREAD_METHOD_PAD,
+	.is_fx_defined = FALSE,
+	.is_fy_defined = FALSE
 };
 
 static GObjectClass *parent_class;
@@ -102,10 +106,14 @@ lsm_svg_radial_gradient_element_inherit_referenced (LsmDomDocument *owner,
 		attributes->cy = gradient->cy.length;
 	if (lsm_attribute_is_defined (&gradient->r.base))
 		attributes->r = gradient->r.length;
-	if (lsm_attribute_is_defined (&gradient->fx.base))
+	if (lsm_attribute_is_defined (&gradient->fx.base)) {
 		attributes->fx = gradient->fx.length;
-	if (lsm_attribute_is_defined (&gradient->fy.base))
+		attributes->is_fx_defined = TRUE;
+	}
+	if (lsm_attribute_is_defined (&gradient->fy.base)) {
 		attributes->fy = gradient->fy.length;
+		attributes->is_fy_defined = TRUE;
+	}
 	if (lsm_attribute_is_defined (&gradient->transform.base))
 		attributes->transform = gradient->transform.matrix;
 	if (lsm_attribute_is_defined (&gradient->units.base))
@@ -124,6 +132,8 @@ lsm_svg_radial_gradient_element_render (LsmSvgElement *self, LsmSvgView *view)
 	gboolean is_object_bounding_box;
 	double cx, cy, fx, fy, r;
 	double gradient_radius;
+	gboolean is_fx_defined;
+	gboolean is_fy_defined;
 
 	if (!gradient->enable_rendering)
 		return;
@@ -147,16 +157,21 @@ lsm_svg_radial_gradient_element_render (LsmSvgElement *self, LsmSvgView *view)
 		gradient->transform.matrix = attributes.transform;
 		gradient->units.value = attributes.units;
 		gradient->spread_method.value = attributes.spread_method;
-	} else
+
+		is_fx_defined = attributes.is_fx_defined;
+		is_fy_defined = attributes.is_fy_defined;
+	} else {
 		referenced_gradient = gradient;
 
+		is_fx_defined = lsm_attribute_is_defined (&gradient->fx.base);
+		is_fy_defined = lsm_attribute_is_defined (&gradient->fy.base);
+	}
+
 	if (referenced_gradient == NULL)
 		return;
 
 	is_object_bounding_box = (gradient->units.value == LSM_SVG_PATTERN_UNITS_OBJECT_BOUNDING_BOX);
 
-	g_message ("is_object_bounding_box = %s", is_object_bounding_box ? "TRUE" : "FALSE");
-
 	if (is_object_bounding_box) {
 		LsmBox viewbox = {.x = 0.0, .y = .0, .width = 1.0, .height = 1.0};
 
@@ -167,12 +182,12 @@ lsm_svg_radial_gradient_element_render (LsmSvgElement *self, LsmSvgView *view)
 	cy = lsm_svg_view_normalize_length (view, &gradient->cy.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
 	r  = lsm_svg_view_normalize_length (view, &gradient->r.length,  LSM_SVG_LENGTH_DIRECTION_DIAGONAL);
 
-	if (lsm_attribute_is_defined (&gradient->fx.base))
+	if (is_fx_defined)
 		fx = lsm_svg_view_normalize_length (view, &gradient->fx.length, LSM_SVG_LENGTH_DIRECTION_HORIZONTAL);
 	else
 		fx = cx;
 
-	if (lsm_attribute_is_defined (&gradient->fy.base))
+	if (is_fy_defined)
 		fy = lsm_svg_view_normalize_length (view, &gradient->fy.length, LSM_SVG_LENGTH_DIRECTION_VERTICAL);
 	else
 		fy = cy;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]