diff options
author | Emmanuel Pacaud <emmanuel.pacaud@free.fr> | 2006-04-16 15:42:49 +0200 |
---|---|---|
committer | Emmanuel Pacaud <emmanuel.pacaud@free.fr> | 2006-04-16 15:42:49 +0200 |
commit | 714bb88832f0e6324cd4737aaa37a4ba39f8d14e (patch) | |
tree | 3900a8ae92efdc09840c6ad0ad7b44a677532590 /src | |
parent | d0356a87f7b274a0721c2644c4a62a8424923eb9 (diff) |
SVG: Add support for CAIRO_CONTENT_COLOR in create_similar.
Also add support for testing this feature in test/cairo-test.c
And a bunch of unwanted commit of sgml files.
Diffstat (limited to 'src')
-rw-r--r-- | src/cairo-svg-surface.c | 69 |
1 files changed, 54 insertions, 15 deletions
diff --git a/src/cairo-svg-surface.c b/src/cairo-svg-surface.c index accbe0043..eb01214ae 100644 --- a/src/cairo-svg-surface.c +++ b/src/cairo-svg-surface.c @@ -80,6 +80,8 @@ struct cairo_svg_document { struct cairo_svg_surface { cairo_surface_t base; + cairo_content_t content; + unsigned int id; double width; @@ -112,8 +114,9 @@ _cairo_svg_document_reference (cairo_svg_document_t *document); static cairo_surface_t * _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, - double width, - double height); + cairo_content_t content, + double width, + double height); static const cairo_surface_backend_t cairo_svg_surface_backend; @@ -129,7 +132,8 @@ _cairo_svg_surface_create_for_stream_internal (cairo_output_stream_t *stream, if (document == NULL) return NULL; - surface = _cairo_svg_surface_create_for_document (document, width, height); + surface = _cairo_svg_surface_create_for_document (document, CAIRO_CONTENT_COLOR_ALPHA, + width, height); document->owner = surface; _cairo_svg_document_destroy (document); @@ -234,11 +238,12 @@ cairo_svg_surface_set_dpi (cairo_surface_t *surface, static cairo_surface_t * _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, - double width, - double height) + cairo_content_t content, + double width, + double height) { cairo_svg_surface_t *surface; - xmlNodePtr clip, clip_rect; + xmlNodePtr clip, rect; int clip_id; char buffer[CAIRO_SVG_DTOSTR_BUFFER_LEN]; @@ -262,11 +267,11 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, clip = xmlNewChild (document->xml_node_defs, NULL, CC2XML ("clipPath"), NULL); snprintf (buffer, sizeof buffer, "clip%d", clip_id); xmlSetProp (clip, CC2XML ("id"), C2XML (buffer)); - clip_rect = xmlNewChild (clip, NULL, CC2XML ("rect"), NULL); + rect = xmlNewChild (clip, NULL, CC2XML ("rect"), NULL); _cairo_dtostr (buffer, sizeof buffer, width); - xmlSetProp (clip_rect, CC2XML ("width"), C2XML (buffer)); + xmlSetProp (rect, CC2XML ("width"), C2XML (buffer)); _cairo_dtostr (buffer, sizeof buffer, height); - xmlSetProp (clip_rect, CC2XML ("height"), C2XML (buffer)); + xmlSetProp (rect, CC2XML ("height"), C2XML (buffer)); surface->xml_node = xmlNewNode (NULL, CC2XML ("g")); surface->xml_root_node = surface->xml_node; @@ -276,9 +281,19 @@ _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, snprintf (buffer, sizeof buffer, "url(#clip%d)", clip_id); xmlSetProp (surface->xml_node, CC2XML ("clip-path"), C2XML (buffer)); + if (content == CAIRO_CONTENT_COLOR) { + rect = xmlNewChild (surface->xml_node, NULL, CC2XML ("rect"), NULL); + _cairo_dtostr (buffer, sizeof buffer, width); + xmlSetProp (rect, CC2XML ("width"), C2XML (buffer)); + _cairo_dtostr (buffer, sizeof buffer, height); + xmlSetProp (rect, CC2XML ("height"), C2XML (buffer)); + xmlSetProp (rect, CC2XML ("style"), CC2XML ("opacity:1; stroke:none; fill:rgb(0,0,0);")); + } + surface->modified = TRUE; surface->previous_id = surface->id; - + surface->content = content; + return &surface->base; } @@ -290,8 +305,12 @@ _cairo_svg_surface_create_similar (void *abstract_src, { cairo_svg_surface_t *template = abstract_src; + if (content != CAIRO_CONTENT_COLOR_ALPHA && + content != CAIRO_CONTENT_COLOR) + return (cairo_surface_t *) &_cairo_surface_nil; + return _cairo_svg_surface_create_for_document (template->document, - width, height); + content, width, height); } static cairo_status_t @@ -524,7 +543,8 @@ emit_composite_svg_pattern (xmlNodePtr node, xmlAddChild (document->xml_node_defs, xmlCopyNode (surface->xml_root_node, 1)); child = xmlNewChild (node, NULL, CC2XML("use"), NULL); - snprintf (buffer, sizeof buffer, "#surface%d", surface->previous_id); + snprintf (buffer, sizeof buffer, "#surface%d", + surface->modified ? surface->id : surface->previous_id); xmlSetProp (child, CC2XML ("xlink:href"), C2XML (buffer)); if (!is_pattern) { @@ -1061,9 +1081,28 @@ _cairo_svg_surface_paint (void *abstract_surface, if (surface->clip_level == 0 && (op == CAIRO_OPERATOR_CLEAR || op == CAIRO_OPERATOR_SOURCE)) { - xmlFreeNode (surface->xml_root_node->children); - if (op == CAIRO_OPERATOR_CLEAR) - return CAIRO_STATUS_SUCCESS; + xmlNodePtr child = surface->xml_root_node->children; + + while (child != NULL) { + xmlUnlinkNode (child); + xmlFreeNode (child); + child = surface->xml_root_node->children; + } + + if (op == CAIRO_OPERATOR_CLEAR) { + if (surface->content == CAIRO_CONTENT_COLOR) { + xmlNodePtr rect; + char buffer[CAIRO_SVG_DTOSTR_BUFFER_LEN]; + + rect = xmlNewChild (surface->xml_node, NULL, CC2XML ("rect"), NULL); + _cairo_dtostr (buffer, sizeof buffer, surface->width); + xmlSetProp (rect, CC2XML ("width"), C2XML (buffer)); + _cairo_dtostr (buffer, sizeof buffer, surface->height); + xmlSetProp (rect, CC2XML ("height"), C2XML (buffer)); + xmlSetProp (rect, CC2XML ("style"), CC2XML ("opacity:1; stroke:none; fill:rgb(0,0,0);")); + } + return CAIRO_STATUS_SUCCESS; + } } emit_paint (surface->xml_node, surface, op, source); |