summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Owens <doctormo@gmail.com>2018-11-14 10:49:57 +0000
committerMartin Owens <doctormo@gmail.com>2018-11-14 10:49:57 +0000
commitd5b02f3b6e00a373d1e49c49cf07112b1da54e34 (patch)
tree20d3f5dc0265eb59b9cd0aa9a51d457266db11ed
parentChange preference to allow backward compatibility (diff)
downloadinkscape-d5b02f3b6e00a373d1e49c49cf07112b1da54e34.tar.gz
inkscape-d5b02f3b6e00a373d1e49c49cf07112b1da54e34.zip
Move getStyles to styles and clean up on destruction.
-rw-r--r--src/object/sp-style-elem.cpp34
-rw-r--r--src/object/sp-style-elem.h5
-rw-r--r--testfiles/src/style-elem-test.cpp8
3 files changed, 22 insertions, 25 deletions
diff --git a/src/object/sp-style-elem.cpp b/src/object/sp-style-elem.cpp
index de2041764..e0080e334 100644
--- a/src/object/sp-style-elem.cpp
+++ b/src/object/sp-style-elem.cpp
@@ -450,23 +450,6 @@ void update_style_recursively( SPObject *object ) {
}
}
-/*
- * Returns each statement as an SPStyle
- */
-std::vector<SPStyle *> SPStyleElem::getStyles() {
- std::vector<SPStyle *> ret;
- gint count = cr_stylesheet_nr_rules(style_sheet);
-
- for (gint x = 0; x < count; x++) {
- SPStyle *item = new SPStyle(nullptr, nullptr);
- CRStatement *statement = cr_stylesheet_statement_get_from_list(style_sheet, x);
- item->mergeStatement(statement);
- ret.push_back(item);
- }
-
- return ret;
-}
-
void SPStyleElem::read_content() {
// First, create the style-sheet object and track it in this
@@ -505,6 +488,16 @@ void SPStyleElem::read_content() {
cr_parser_destroy(parser);
delete parse_tmp;
+ //Record each css statement as an SPStyle
+ gint count = cr_stylesheet_nr_rules(style_sheet);
+
+ for (gint x = 0; x < count; x++) {
+ SPStyle *item = new SPStyle(nullptr, nullptr);
+ CRStatement *statement = cr_stylesheet_statement_get_from_list(style_sheet, x);
+ item->mergeStatement(statement);
+ styles.push_back(item);
+ }
+
// If style sheet has changed, we need to cascade the entire object tree, top down
// Get root, read style, loop through children
update_style_recursively( (SPObject *)document->getRoot() );
@@ -542,6 +535,13 @@ void SPStyleElem::build(SPDocument *document, Inkscape::XML::Node *repr) {
SPObject::build(document, repr);
}
+void SPStyleElem::release() {
+ while(!styles.empty()) {
+ auto style = styles.back();
+ sp_style_unref(style);
+ styles.pop_back();
+ }
+}
/*
diff --git a/src/object/sp-style-elem.h b/src/object/sp-style-elem.h
index 76089172e..49d6e33ce 100644
--- a/src/object/sp-style-elem.h
+++ b/src/object/sp-style-elem.h
@@ -23,13 +23,14 @@ public:
Media media;
bool is_css;
+ std::vector<SPStyle *> styles;
void build(SPDocument* doc, Inkscape::XML::Node* repr) override;
void set(SPAttributeEnum key, char const* value) override;
void read_content() override;
- Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags) override;
+ void release() override;
- std::vector<SPStyle *> getStyles();
+ Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags) override;
};
diff --git a/testfiles/src/style-elem-test.cpp b/testfiles/src/style-elem-test.cpp
index 443c547ac..1d2ceed2a 100644
--- a/testfiles/src/style-elem-test.cpp
+++ b/testfiles/src/style-elem-test.cpp
@@ -60,18 +60,14 @@ TEST_F(ObjectTest, StyleElems) {
SPStyleElem *one = dynamic_cast<SPStyleElem *>(doc->getObjectById("style01"));
ASSERT_TRUE(one != nullptr);
- std::vector<SPStyle *> styles = one->getStyles();
-
- for(auto style: styles) {
+ for(auto style: one->styles) {
EXPECT_EQ(style->fill.get_value(), Glib::ustring("#ff0000"));
}
SPStyleElem *two = dynamic_cast<SPStyleElem *>(doc->getObjectById("style02"));
ASSERT_TRUE(one != nullptr);
- std::vector<SPStyle *> styles_two = two->getStyles();
-
- for(auto style: styles_two) {
+ for(auto style: two->styles) {
EXPECT_EQ(style->fill.get_value(), Glib::ustring("#008000"));
}
}