summaryrefslogtreecommitdiff
path: root/src/svgtiny_internal.h
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2016-10-26 15:21:51 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2016-10-26 15:21:51 +0100
commit1e71d0472529b96ac35e2e4425b66e29146a01c1 (patch)
tree5d5d64348259129d3e969f4efe2431870c0afd6b /src/svgtiny_internal.h
parent0f0342a4416a5b3bb03fe80d428d73a431f03a76 (diff)
downloadlibsvgtiny-1e71d0472529b96ac35e2e4425b66e29146a01c1.tar.gz
libsvgtiny-1e71d0472529b96ac35e2e4425b66e29146a01c1.tar.bz2
Parse: Make the parse state have two sets of gradient details.
One for fills and another for strokes. This stops an SVG such as <svg viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg"> <defs> <linearGradient id="foo"> <stop stop-color="#69f" offset="0"/> <stop stop-color="#468" offset="1"/> </linearGradient> </defs> <path fill="url(#foo)" stroke='url(#bar)' d='M10 10 H 90 V 90 H 10 Z' /> </svg> from getting its fill gradient details trampled when we reset the gradient for the the missing bar gadient definition. Note, we only handle linearGradient on the fill anyway.
Diffstat (limited to 'src/svgtiny_internal.h')
-rw-r--r--src/svgtiny_internal.h24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/svgtiny_internal.h b/src/svgtiny_internal.h
index 542a0d0..158d230 100644
--- a/src/svgtiny_internal.h
+++ b/src/svgtiny_internal.h
@@ -24,6 +24,16 @@ struct svgtiny_gradient_stop {
#define svgtiny_MAX_STOPS 10
#define svgtiny_LINEAR_GRADIENT 0x2000000
+struct svgtiny_parse_state_gradient {
+ unsigned int linear_gradient_stop_count;
+ dom_string *gradient_x1, *gradient_y1, *gradient_x2, *gradient_y2;
+ struct svgtiny_gradient_stop gradient_stop[svgtiny_MAX_STOPS];
+ bool gradient_user_space_on_use;
+ struct {
+ float a, b, c, d, e, f;
+ } gradient_transform;
+};
+
struct svgtiny_parse_state {
struct svgtiny_diagram *diagram;
dom_document *document;
@@ -44,13 +54,8 @@ struct svgtiny_parse_state {
int stroke_width;
/* gradients */
- unsigned int linear_gradient_stop_count;
- dom_string *gradient_x1, *gradient_y1, *gradient_x2, *gradient_y2;
- struct svgtiny_gradient_stop gradient_stop[svgtiny_MAX_STOPS];
- bool gradient_user_space_on_use;
- struct {
- float a, b, c, d, e, f;
- } gradient_transform;
+ struct svgtiny_parse_state_gradient fill_grad;
+ struct svgtiny_parse_state_gradient stroke_grad;
/* Interned strings */
#define SVGTINY_STRING_ACTION2(n,nn) dom_string *interned_##n;
@@ -65,6 +70,7 @@ struct svgtiny_list;
float svgtiny_parse_length(dom_string *s, int viewport_size,
const struct svgtiny_parse_state state);
void svgtiny_parse_color(dom_string *s, svgtiny_colour *c,
+ struct svgtiny_parse_state_gradient *grad,
struct svgtiny_parse_state *state);
void svgtiny_parse_transform(char *s, float *ma, float *mb,
float *mc, float *md, float *me, float *mf);
@@ -80,7 +86,9 @@ char *svgtiny_strndup(const char *s, size_t n);
#endif
/* svgtiny_gradient.c */
-void svgtiny_find_gradient(const char *id, struct svgtiny_parse_state *state);
+void svgtiny_find_gradient(const char *id,
+ struct svgtiny_parse_state_gradient *grad,
+ struct svgtiny_parse_state *state);
svgtiny_code svgtiny_add_path_linear_gradient(float *p, unsigned int n,
struct svgtiny_parse_state *state);