? diff Index: cairo-svg-surface.c =================================================================== RCS file: /cvs/cairo/cairo/src/cairo-svg-surface.c,v retrieving revision 1.8 diff -u -p -u -r1.8 cairo-svg-surface.c --- cairo-svg-surface.c 5 Jan 2006 23:00:37 -0000 1.8 +++ cairo-svg-surface.c 7 Jan 2006 19:56:57 -0000 @@ -67,6 +67,7 @@ struct cairo_svg_document { xmlDocPtr xml_doc; xmlNodePtr xml_node_defs; xmlNodePtr xml_node_main; + xmlNodePtr xml_node_pageset; unsigned int surface_id; unsigned int linear_pattern_id; @@ -1085,6 +1086,41 @@ _cairo_svg_surface_composite_trapezoids return CAIRO_STATUS_SUCCESS; } +static cairo_status_t +_cairo_svg_document_add_page (cairo_svg_document_t *document, + cairo_svg_surface_t *surface) +{ + assert (!document->finished); + + xmlAddChild (document->xml_node_pageset, document->xml_node_main); + document->xml_node_main = xmlNewNode (NULL, CC2XML ("page")); + + return CAIRO_STATUS_SUCCESS; +} + +static cairo_int_status_t +_cairo_svg_surface_copy_page (void *abstract_surface) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_svg_document_t *document = surface->document; + + return _cairo_svg_document_add_page (document, surface); +} + +static cairo_int_status_t +_cairo_svg_surface_show_page (void *abstract_surface) +{ + cairo_svg_surface_t *surface = abstract_surface; + cairo_svg_document_t *document = surface->document; + cairo_int_status_t status; + + status = _cairo_svg_document_add_page (document, surface); + if (status) + return status; + + return CAIRO_STATUS_SUCCESS; +} + static cairo_int_status_t _cairo_svg_surface_get_extents (void *abstract_surface, cairo_rectangle_t *rectangle) @@ -1362,8 +1398,8 @@ static const cairo_surface_backend_t cai _cairo_svg_surface_composite, _cairo_svg_surface_fill_rectangles, _cairo_svg_surface_composite_trapezoids, - NULL, /* copy_page */ - NULL, /* show_page */ + _cairo_svg_surface_copy_page, + _cairo_svg_surface_show_page, NULL, /* set_clip_region */ _cairo_svg_surface_intersect_clip_path, _cairo_svg_surface_get_extents, @@ -1416,8 +1452,10 @@ _cairo_svg_document_create (cairo_output xmlDocSetRootElement (doc, node); document->xml_doc = doc; - document->xml_node_main = node; + document->xml_node_defs = xmlNewChild (node, NULL, CC2XML ("defs"), NULL); + document->xml_node_pageset = xmlNewChild (node, NULL, CC2XML ("pageSet"), NULL); + document->xml_node_main = xmlNewNode (NULL, CC2XML ("page")); _cairo_dtostr (buffer, sizeof buffer, width); xmlSetProp (node, CC2XML ("width"), CC2XML (buffer)); @@ -1425,7 +1463,8 @@ _cairo_svg_document_create (cairo_output xmlSetProp (node, CC2XML ("height"), CC2XML (buffer)); xmlSetProp (node, CC2XML ("xmlns"), CC2XML ("http://www.w3.org/2000/svg")); xmlSetProp (node, CC2XML ("xmlns:xlink"), CC2XML ("http://www.w3.org/1999/xlink")); - xmlSetProp (node, CC2XML ("version"), CC2XML ("1.1")); + xmlSetProp (node, CC2XML ("version"), CC2XML ("1.2")); + xmlSetProp (node, CC2XML ("streamable"), CC2XML ("true")); return document; } @@ -1465,6 +1504,8 @@ _cairo_svg_document_finish (cairo_svg_do xmlFree(xml_buffer); xmlFreeDoc (document->xml_doc); + xmlFreeNode (document->xml_node_main); + status = _cairo_output_stream_get_status (output); _cairo_output_stream_destroy (output);