summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDom Lachowicz <doml@src.gnome.org>2004-06-19 03:22:24 +0000
committerDom Lachowicz <doml@src.gnome.org>2004-06-19 03:22:24 +0000
commitec441166ac78bc93d9c768396c58ab7010204bdc (patch)
tree1888f0c3d5ccc9a70e9f164a8bcbd5c562ae8536
parenta9b49cb20a5be4f0b1c2228a23c91cd74939364a (diff)
downloadlibrsvg-ec441166ac78bc93d9c768396c58ab7010204bdc.tar.gz
beginnings of <switch> support
-rw-r--r--ChangeLog6
-rw-r--r--rsvg-cond.c25
-rw-r--r--rsvg-private.h5
-rw-r--r--rsvg-shapes.c4
-rw-r--r--rsvg-styles.c98
-rw-r--r--rsvg-styles.h3
-rw-r--r--rsvg.c8
7 files changed, 94 insertions, 55 deletions
diff --git a/ChangeLog b/ChangeLog
index da61aa25..b142860a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-06-18 Dom Lachowicz <cinamod@hotmail.com>
+
+ * rsvg.c: Beginnings of <switch> support
+ * rsvg-cond.c, rsvg-private.h, rsvg-shapes.c, rsvg-styles.c,
+ rsvg-styles.h: Ditto
+
2004-06-17 Dom Lachowicz <cinamod@hotmail.com>
* rsvg-css.c (rsvg_css_parse_list): Fix memory leak
diff --git a/rsvg-cond.c b/rsvg-cond.c
index fd6e7aaa..888840e1 100644
--- a/rsvg-cond.c
+++ b/rsvg-cond.c
@@ -33,8 +33,6 @@
#include <stdlib.h>
#include <locale.h>
-gboolean rsvg_eval_switch_attributes (RsvgPropertyBag *atts);
-
static const char * implemented_features [] =
{
"http://www.w3.org/TRr/SVG11/feature#BasicText",
@@ -126,12 +124,11 @@ rsvg_cond_parse_required_extensions (const char * value)
return permitted;
}
+/* http://www.w3.org/TR/SVG/struct.html#SystemLanguageAttribute */
static gboolean
rsvg_locale_compare (const char * a, const char * b)
{
- const char * hyphen;
-
- /* http://www.w3.org/TR/SVG/struct.html#SystemLanguageAttribute */
+ const char * hyphen;
/* check for an exact-ish match first */
if(!g_ascii_strncasecmp (a, b, strlen(b)))
@@ -193,23 +190,33 @@ rsvg_cond_parse_system_language (const char * value)
/* returns TRUE if this element should be processed according to <switch> semantics
http://www.w3.org/TR/SVG/struct.html#SwitchElement */
gboolean
-rsvg_eval_switch_attributes (RsvgPropertyBag *atts)
+rsvg_eval_switch_attributes (RsvgPropertyBag *atts, gboolean * p_has_cond)
{
gboolean permitted = TRUE;
+ gboolean has_cond = FALSE;
if (atts && rsvg_property_bag_size (atts))
{
const char * value;
- if ((value = rsvg_property_bag_lookup (atts, "requiredFeatures")))
+ if ((value = rsvg_property_bag_lookup (atts, "requiredFeatures"))) {
permitted = rsvg_cond_parse_required_features (value);
+ has_cond = TRUE;
+ }
- if (permitted && (value = rsvg_property_bag_lookup (atts, "requiredExtensions")))
+ if (permitted && (value = rsvg_property_bag_lookup (atts, "requiredExtensions"))) {
permitted = rsvg_cond_parse_required_extensions (value);
+ has_cond = TRUE;
+ }
- if (permitted && (value = rsvg_property_bag_lookup (atts, "systemLanguage")))
+ if (permitted && (value = rsvg_property_bag_lookup (atts, "systemLanguage"))) {
permitted = rsvg_cond_parse_system_language (value);
+ has_cond = TRUE;
+ }
}
+ if (p_has_cond)
+ *p_has_cond = has_cond;
+
return permitted;
}
diff --git a/rsvg-private.h b/rsvg-private.h
index 524b1991..3109a5b3 100644
--- a/rsvg-private.h
+++ b/rsvg-private.h
@@ -69,6 +69,8 @@ struct RsvgHandle {
guint nest_level;
void *current_defs_group;
+ guint in_switch;
+
GHashTable *css_props;
/* not a handler stack. each nested handler keeps
@@ -173,6 +175,9 @@ rsvg_handle_get_base_uri (RsvgHandle *handle);
void rsvg_handle_set_base_uri (RsvgHandle *handle,
const char *base_uri);
+gboolean
+rsvg_eval_switch_attributes (RsvgPropertyBag *atts, gboolean * p_has_cond);
+
G_END_DECLS
#endif
diff --git a/rsvg-shapes.c b/rsvg-shapes.c
index 22e0fc6c..3b2db699 100644
--- a/rsvg-shapes.c
+++ b/rsvg-shapes.c
@@ -231,7 +231,7 @@ rsvg_render_bpath (RsvgHandle *ctx, const ArtBpath *bpath)
/* todo: handle visibility stuff earlier for performance benefits
* handles all path based shapes. will handle text and images separately
*/
- if (!state->visible)
+ if (!state->visible || !state->cond_true)
return;
affine_bpath = art_bpath_affine_transform (bpath,
@@ -1679,7 +1679,7 @@ rsvg_start_image (RsvgHandle *ctx, RsvgPropertyBag *atts)
return;
/* figure out if image is visible or not */
- if (!state->visible)
+ if (!state->visible || !state->cond_true)
return;
w *= state->affine[0];
diff --git a/rsvg-styles.c b/rsvg-styles.c
index fb517fc9..57e8682f 100644
--- a/rsvg-styles.c
+++ b/rsvg-styles.c
@@ -38,8 +38,6 @@
#define RSVG_DEFAULT_FONT "Times New Roman"
-#define ENABLE_ADOBE_EXTENSIONS 1
-
static guint32
rsvg_state_current_color (RsvgState * cur_state, RsvgState * parent_state)
{
@@ -92,6 +90,7 @@ rsvg_state_init (RsvgState *state)
state->unicode_bidi = UNICODE_BIDI_NORMAL;
state->text_anchor = TEXT_ANCHOR_START;
state->visible = TRUE;
+ state->cond_true = TRUE;
state->filter = NULL;
state->startMarker = NULL;
state->middleMarker = NULL;
@@ -109,6 +108,7 @@ rsvg_state_init (RsvgState *state)
state->has_join = FALSE;
state->has_dash = FALSE;
state->has_visible = FALSE;
+ state->has_cond = FALSE;
state->has_stop_color = FALSE;
state->has_stop_opacity = FALSE;
state->has_font_size = FALSE;
@@ -186,6 +186,8 @@ rsvg_state_reinherit (RsvgState *dst, const RsvgState *src)
dst->stop_opacity = src->stop_opacity;
if (!dst->has_visible)
dst->visible = src->visible;
+ if (!dst->has_cond)
+ dst->cond_true = src->cond_true;
if (!dst->has_font_size)
dst->font_size = src->font_size;
if (!dst->has_font_style)
@@ -266,8 +268,8 @@ rsvg_state_dominate (RsvgState *dst, const RsvgState *src)
dst->stop_color = src->stop_color;
if (!dst->has_stop_opacity || src->has_stop_opacity)
dst->stop_opacity = src->stop_opacity;
- if (!dst->has_visible || src->has_visible)
- dst->visible = src->visible;
+ if (!dst->has_cond || src->has_cond)
+ dst->cond_true = src->cond_true;
if (!dst->has_font_size || src->has_font_size)
dst->font_size = src->font_size;
if (!dst->has_font_style || src->has_font_style)
@@ -362,7 +364,6 @@ rsvg_parse_style_arg (RsvgHandle *ctx, RsvgState *state, const char *str)
}
else if (rsvg_css_param_match (str, "filter"))
state->filter = rsvg_filter_parse(ctx->defs, str + arg_off);
-#if ENABLE_ADOBE_EXTENSIONS
else if (rsvg_css_param_match (str, "a:adobe-blending-mode"))
{
if (!strcmp (str + arg_off, "normal"))
@@ -392,7 +393,6 @@ rsvg_parse_style_arg (RsvgHandle *ctx, RsvgState *state, const char *str)
else
state->adobe_blend = 0;
}
-#endif
else if (rsvg_css_param_match (str, "mask"))
state->mask = rsvg_mask_parse(ctx->defs, str + arg_off);
else if (rsvg_css_param_match (str, "enable-background"))
@@ -741,44 +741,54 @@ void
rsvg_parse_style_pairs (RsvgHandle *ctx, RsvgState *state,
RsvgPropertyBag *atts)
{
-#if ENABLE_ADOBE_EXTENSIONS
- rsvg_lookup_parse_style_pair (ctx, state, "a:adobe-blending-mode", atts);
-#endif
- rsvg_lookup_parse_style_pair (ctx, state, "color", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "direction", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "display", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "enable-background", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "fill", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "fill-opacity", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "fill-rule", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "filter", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "font-family", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "font-size", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "font-stretch", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "font-style", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "font-variant", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "font-weight", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "marker-end", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "mask", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "marker-mid", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "marker-start", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "opacity", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stop-color", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stop-opacity", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke-dasharray", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke-dashoffset", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke-linecap", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke-linejoin", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke-miterlimit", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke-opacity", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "stroke-width", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "text-anchor", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "text-decoration", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "unicode-bidi", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "visibility", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "writing-mode", atts);
- rsvg_lookup_parse_style_pair (ctx, state, "xml:lang", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "a:adobe-blending-mode", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "color", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "direction", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "display", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "enable-background", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "fill", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "fill-opacity", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "fill-rule", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "filter", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "font-family", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "font-size", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "font-stretch", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "font-style", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "font-variant", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "font-weight", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "marker-end", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "mask", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "marker-mid", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "marker-start", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "opacity", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stop-color", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stop-opacity", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke-dasharray", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke-dashoffset", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke-linecap", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke-linejoin", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke-miterlimit", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke-opacity", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "stroke-width", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "text-anchor", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "text-decoration", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "unicode-bidi", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "visibility", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "writing-mode", atts);
+ rsvg_lookup_parse_style_pair (ctx, state, "xml:lang", atts);
+
+ {
+ /* TODO: this conditional behavior isn't quite correct, and i'm not sure it should reside here */
+ gboolean cond_true, has_cond;
+
+ cond_true = rsvg_eval_switch_attributes (atts, &has_cond);
+
+ if (has_cond) {
+ state->cond_true = cond_true;
+ state->has_cond = TRUE;
+ }
+ }
}
/* Split a CSS2 style into individual style arguments, setting attributes
diff --git a/rsvg-styles.h b/rsvg-styles.h
index 2da9ec51..720f0837 100644
--- a/rsvg-styles.h
+++ b/rsvg-styles.h
@@ -127,6 +127,9 @@ struct _RsvgState {
gboolean visible;
gboolean has_visible;
+ gboolean has_cond;
+ gboolean cond_true;
+
ArtVpathDash dash;
gboolean has_dash;
diff --git a/rsvg.c b/rsvg.c
index cacdeac1..b9476f55 100644
--- a/rsvg.c
+++ b/rsvg.c
@@ -1226,6 +1226,10 @@ rsvg_start_element (void *data, const xmlChar *name,
ctx->in_defs++;
rsvg_start_marker (ctx, bag);
}
+ else if (!strcmp ((char *)name, "switch"))
+ {
+ ctx->in_switch++;
+ }
/* see conicalGradient discussion above */
else if (!strcmp ((char *)name, "linearGradient"))
rsvg_start_linear_gradient (ctx, bag);
@@ -1283,6 +1287,10 @@ rsvg_end_element (void *data, const xmlChar *name)
rsvg_pop_def_group(ctx);
ctx->in_defs--;
}
+ else if (!strcmp ((char *)name, "switch"))
+ {
+ ctx->in_switch--;
+ }
else if (!strcmp ((char *)name, "pattern")) {
ctx->in_defs--;
rsvg_pop_def_group(ctx);