diff --git a/src/document.cpp b/src/document.cpp index 9e6fd7efbf0d245a2a63983bc2339cf79da08976..226a5a332447614c43f1a6630abcf2d8e05d5c16 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -1051,6 +1051,8 @@ SPObject *SPDocument::getObjectById(Glib::ustring const &id) const std::map::const_iterator rv = iddef.find(id); if (rv != iddef.end()) { return (rv->second); + } else if (_parent_document) { + return _parent_document->getObjectById(id); } else { return nullptr; } @@ -1210,6 +1212,23 @@ std::vector SPDocument::getLanguages() const g_free(rdf_language_stripped); } + // add languages from parent document + if (_parent_document) { + auto parent_languages = _parent_document->getLanguages(); + + // return parent languages directly if we aren't contributing any + if (document_languages.empty()) { + return parent_languages; + } + + // otherwise append parent's languages to what we already have + std::move(parent_languages.begin(), parent_languages.end(), + std::back_insert_iterator(document_languages)); + + // don't add languages from locale; parent already did that + return document_languages; + } + // get language from system locale (will also match the interface language preference as we set LANG accordingly) // TODO: This includes locales with encodings like "de_DE.UTF-8" - is this useful or should we skip these? // TODO: This includes the default "C" locale - is this useful or should we skip it? diff --git a/src/document.h b/src/document.h index c2c59aedb96ae2a1059f5bd63c21cdccc154bfe8..a04c19d1ec7f440926a4fce84fee08ea40fe73dd 100644 --- a/src/document.h +++ b/src/document.h @@ -194,6 +194,9 @@ public: std::vector getLanguages() const; + SPDocument *getParent() { return _parent_document; } + SPDocument const *getParent() const { return _parent_document; } + // Styling CRCascade *getStyleCascade() { return style_cascade; } diff --git a/src/object/sp-use.cpp b/src/object/sp-use.cpp index d29060ef94b2ed15d32a94f8c3220b80e99ed250..d7ac8146b5565505302551a6409a5e144936f9e3 100644 --- a/src/object/sp-use.cpp +++ b/src/object/sp-use.cpp @@ -524,7 +524,7 @@ void SPUse::href_changed() { this->attach(this->child, this->lastChild()); sp_object_unref(this->child, this); - this->child->invoke_build(this->document, childrepr, TRUE); + this->child->invoke_build(refobj->document, childrepr, TRUE); for (SPItemView *v = this->display; v != nullptr; v = v->next) { Inkscape::DrawingItem *ai = this->child->invoke_show(v->arenaitem->drawing(), v->key, v->flags); diff --git a/src/style.cpp b/src/style.cpp index a96c89466b1fc0d830c6e2101a433ebbe7575c16..8b17b329b1e76427221ce97de227ed72bc7c66a1 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -996,9 +996,16 @@ SPStyle::_mergeObjectStylesheet( SPObject const *const object ) { // std::cout << "SPStyle::_mergeObjectStylesheet: " << (object->getId()?object->getId():"null") << std::endl; - static CRSelEng *sel_eng = nullptr; - if (!sel_eng) { - sel_eng = sp_repr_sel_eng(); + _mergeObjectStylesheet(object, object->document); +} + +void +SPStyle::_mergeObjectStylesheet( SPObject const *const object, SPDocument *const document ) { + + static CRSelEng *sel_eng = sp_repr_sel_eng(); + + if (auto *const parent = document->getParent()) { + _mergeObjectStylesheet(object, parent); } CRPropList *props = nullptr; @@ -1006,7 +1013,7 @@ SPStyle::_mergeObjectStylesheet( SPObject const *const object ) { //XML Tree being directly used here while it shouldn't be. CRStatus status = cr_sel_eng_get_matched_properties_from_cascade(sel_eng, - object->document->getStyleCascade(), + document->getStyleCascade(), object->getRepr(), &props); g_return_if_fail(status == CR_OK); diff --git a/src/style.h b/src/style.h index 121fc39e646be3a8711067ce140a9a99fd34992a..6a98bbc9e6ae28f5ea9adbe02f94217f8258aa04 100644 --- a/src/style.h +++ b/src/style.h @@ -81,6 +81,7 @@ private: void _mergeDecl( CRDeclaration const *const decl, SPStyleSrc const &source ); void _mergeProps( CRPropList *const props ); void _mergeObjectStylesheet( SPObject const *const object ); + void _mergeObjectStylesheet( SPObject const *const object, SPDocument *const document ); private: int _refcount; diff --git a/testfiles/rendering_tests/CMakeLists.txt b/testfiles/rendering_tests/CMakeLists.txt index 23a46ac7bf531fdf35f3d25ca6e2e4d7087ebd99..b9c6f4dd5d09c548a5995ae9a2a9eeaeb7a5447c 100644 --- a/testfiles/rendering_tests/CMakeLists.txt +++ b/testfiles/rendering_tests/CMakeLists.txt @@ -13,6 +13,7 @@ set(RENDERING_TESTS # -- Generic tests -- test-empty test-dont-crash + test-use # -- Selector tests -- selector-important-002 diff --git a/testfiles/rendering_tests/expected_rendering/test-use-large.png b/testfiles/rendering_tests/expected_rendering/test-use-large.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f4597a33b560023dd691a2f6396fe0ef928dd8 Binary files /dev/null and b/testfiles/rendering_tests/expected_rendering/test-use-large.png differ diff --git a/testfiles/rendering_tests/expected_rendering/test-use.png b/testfiles/rendering_tests/expected_rendering/test-use.png new file mode 100644 index 0000000000000000000000000000000000000000..a99513677cd3d11477b6f3628aa6fe9b41bf5850 Binary files /dev/null and b/testfiles/rendering_tests/expected_rendering/test-use.png differ diff --git a/testfiles/rendering_tests/test-use-ref.svg b/testfiles/rendering_tests/test-use-ref.svg new file mode 100644 index 0000000000000000000000000000000000000000..0e6edf33101f532d929d31c5662e0df2936dc29f --- /dev/null +++ b/testfiles/rendering_tests/test-use-ref.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testfiles/rendering_tests/test-use.svg b/testfiles/rendering_tests/test-use.svg new file mode 100644 index 0000000000000000000000000000000000000000..7e8a8acdd0972269d3c4923c2042e8def43f79db --- /dev/null +++ b/testfiles/rendering_tests/test-use.svg @@ -0,0 +1,18 @@ + + + + +