summaryrefslogtreecommitdiffstats
path: root/src/extension/internal/pdfinput/svg-builder.cpp
diff options
context:
space:
mode:
authormiklosh <miklosh@users.sourceforge.net>2007-08-13 16:48:30 +0000
committermiklosh <miklosh@users.sourceforge.net>2007-08-13 16:48:30 +0000
commit7945aef608c6235c0f91cfe69c54aeaa90ce4fbd (patch)
treeaef47cb12c12cca6eb7235cdb8d65026b78d12d6 /src/extension/internal/pdfinput/svg-builder.cpp
parentFilter effects dialog: (diff)
downloadinkscape-7945aef608c6235c0f91cfe69c54aeaa90ce4fbd.tar.gz
inkscape-7945aef608c6235c0f91cfe69c54aeaa90ce4fbd.zip
Added a clip path stack for PdfParser and a node stack for SvgBuilder needed for mask support later
(bzr r3458)
Diffstat (limited to 'src/extension/internal/pdfinput/svg-builder.cpp')
-rw-r--r--src/extension/internal/pdfinput/svg-builder.cpp52
1 files changed, 37 insertions, 15 deletions
diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp
index 7a63ba415..b4aaefd23 100644
--- a/src/extension/internal/pdfinput/svg-builder.cpp
+++ b/src/extension/internal/pdfinput/svg-builder.cpp
@@ -60,15 +60,6 @@ namespace Internal {
*
*/
-SvgBuilder::SvgBuilder() {
- _in_text_object = false;
- _need_font_update = true;
- _invalidated_style = true;
- _font_style = NULL;
- _current_font = NULL;
- _current_state = NULL;
-}
-
SvgBuilder::SvgBuilder(SPDocument *document, gchar *docname, XRef *xref) {
_is_top_level = true;
_doc = document;
@@ -77,7 +68,7 @@ SvgBuilder::SvgBuilder(SPDocument *document, gchar *docname, XRef *xref) {
_xml_doc = sp_document_repr_doc(_doc);
_container = _root = _doc->rroot;
_root->setAttribute("xml:space", "preserve");
- SvgBuilder();
+ _init();
}
SvgBuilder::SvgBuilder(SvgBuilder *parent, Inkscape::XML::Node *root) {
@@ -87,12 +78,23 @@ SvgBuilder::SvgBuilder(SvgBuilder *parent, Inkscape::XML::Node *root) {
_xref = parent->_xref;
_xml_doc = parent->_xml_doc;
_container = this->_root = root;
- SvgBuilder();
+ _init();
}
SvgBuilder::~SvgBuilder() {
}
+void SvgBuilder::_init() {
+ _in_text_object = false;
+ _need_font_update = true;
+ _invalidated_style = true;
+ _font_style = NULL;
+ _current_font = NULL;
+ _current_state = NULL;
+
+ _node_stack.push_back(_container);
+}
+
void SvgBuilder::setDocumentSize(double width, double height) {
sp_repr_set_svg_double(_root, "width", width);
sp_repr_set_svg_double(_root, "height", height);
@@ -122,10 +124,30 @@ void SvgBuilder::restoreState() {
_group_depth.pop_back();
}
-Inkscape::XML::Node *SvgBuilder::pushGroup() {
- Inkscape::XML::Node *node = _xml_doc->createElement("svg:g");
- _container->appendChild(node);
+Inkscape::XML::Node *SvgBuilder::pushNode(const char *name) {
+ Inkscape::XML::Node *node = _xml_doc->createElement(name);
+ _node_stack.push_back(node);
_container = node;
+ return node;
+}
+
+Inkscape::XML::Node *SvgBuilder::popNode() {
+ Inkscape::XML::Node *node = NULL;
+ if ( _node_stack.size() > 1 ) {
+ node = _node_stack.back();
+ _node_stack.pop_back();
+ _container = _node_stack.back(); // Re-set container
+ } else {
+ TRACE(("popNode() called when stack is empty\n"));
+ node = _root;
+ }
+ return node;
+}
+
+Inkscape::XML::Node *SvgBuilder::pushGroup() {
+ Inkscape::XML::Node *saved_container = _container;
+ Inkscape::XML::Node *node = pushNode("svg:g");
+ saved_container->appendChild(node);
Inkscape::GC::release(node);
_group_depth.back()++;
// Set as a layer if this is a top-level group
@@ -145,7 +167,7 @@ Inkscape::XML::Node *SvgBuilder::pushGroup() {
Inkscape::XML::Node *SvgBuilder::popGroup() {
if (_container != _root) { // Pop if the current container isn't root
- _container = _container->parent();
+ popNode();
_group_depth[_group_depth.size()-1] = --_group_depth.back();
}