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 28 Jan 2006 20:21:16 -0000 @@ -1448,23 +1448,38 @@ _cairo_svg_document_destroy (cairo_svg_d free (document); } +static int +_cairo_svg_document_write (void *context, + const char * buffer, + int len) +{ + if (_cairo_output_stream_write ((cairo_output_stream_t *)context, + (const void *)buffer, + (size_t)len)) + return len; + return 0; +} + static cairo_status_t _cairo_svg_document_finish (cairo_svg_document_t *document) { cairo_status_t status; cairo_output_stream_t *output = document->output_stream; - xmlChar *xml_buffer; - int xml_buffer_size; + xmlOutputBufferPtr xml_buffer; if (document->finished) return CAIRO_STATUS_SUCCESS; - /* FIXME: Dumping xml tree in memory is silly. */ - xmlDocDumpFormatMemoryEnc (document->xml_doc, &xml_buffer, &xml_buffer_size, "UTF-8", 1); - _cairo_output_stream_write (document->output_stream, xml_buffer, xml_buffer_size); - xmlFree(xml_buffer); + xml_buffer = xmlOutputBufferCreateIO((xmlOutputWriteCallback)_cairo_svg_document_write, + (xmlOutputCloseCallback)NULL, + (void *) document->output_stream, + NULL); + xmlSaveFormatFileTo(xml_buffer, document->xml_doc, "UTF-8", 1); + xmlFreeDoc (document->xml_doc); + xmlFreeNode (document->xml_node_main); + status = _cairo_output_stream_get_status (output); _cairo_output_stream_destroy (output);