diff options
author | Armin Le Grand <alg@apache.org> | 2012-05-04 14:16:22 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-03-13 11:22:20 +0000 |
commit | eceecd4a3806f64c2e8fb0a3bcdcc43e1384779f (patch) | |
tree | e8c81552d7e3a1374a903cf5ca522a6eb77853e3 /svgio | |
parent | cc22c25de9be13596960b8af6c6f40fc2e3fd27d (diff) |
Related: #i119125# corrected gradient rendering
and added stuff to add Title and Description to primitives for later usage
Conflicts:
drawinglayer/Library_drawinglayer.mk
drawinglayer/inc/drawinglayer/primitive2d/svggradientprimitive2d.hxx
svgio/Package_inc.mk
svx/source/sdr/contact/viewcontactofsdrobj.cxx
Change-Id: I301c9f5f4ae0efc02d937cd3f56018e27c94a630
Diffstat (limited to 'svgio')
-rw-r--r-- | svgio/Library_svgio.mk | 1 | ||||
-rw-r--r-- | svgio/inc/svgio/svgreader/svgstyleattributes.hxx | 10 | ||||
-rw-r--r-- | svgio/inc/svgio/svgreader/svgtitledescnode.hxx | 55 | ||||
-rw-r--r-- | svgio/inc/svgio/svgreader/svgtoken.hxx | 4 | ||||
-rw-r--r-- | svgio/source/svgreader/svgdocumenthandler.cxx | 138 | ||||
-rw-r--r-- | svgio/source/svgreader/svgnode.cxx | 35 | ||||
-rw-r--r-- | svgio/source/svgreader/svgstyleattributes.cxx | 12 | ||||
-rw-r--r-- | svgio/source/svgreader/svgtitledescnode.cxx | 48 | ||||
-rw-r--r-- | svgio/source/svgreader/svgtoken.cxx | 14 |
9 files changed, 265 insertions, 52 deletions
diff --git a/svgio/Library_svgio.mk b/svgio/Library_svgio.mk index 21312d6f76eb..cff8a0fb8307 100644 --- a/svgio/Library_svgio.mk +++ b/svgio/Library_svgio.mk @@ -66,6 +66,7 @@ $(eval $(call gb_Library_add_exception_objects,svgio,\ svgio/source/svgreader/svgsvgnode \ svgio/source/svgreader/svgsymbolnode \ svgio/source/svgreader/svgtextnode \ + svgio/source/svgreader/svgtitledescnode \ svgio/source/svgreader/svgtoken \ svgio/source/svgreader/svgtrefnode \ svgio/source/svgreader/svgtools \ diff --git a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx index ee1edf5ad67f..81682ab1c243 100644 --- a/svgio/inc/svgio/svgreader/svgstyleattributes.hxx +++ b/svgio/inc/svgio/svgreader/svgstyleattributes.hxx @@ -169,6 +169,8 @@ namespace svgio TextAnchor maTextAnchor; SvgPaint maColor; SvgNumber maOpacity; + rtl::OUString maTitle; + rtl::OUString maDesc; /// link to content. If set, the node can be fetched on demand rtl::OUString maClipPathXLink; @@ -373,6 +375,14 @@ namespace svgio const SvgNumber getOpacity() const { return maOpacity; } void setOpacity(const SvgNumber& rOpacity = SvgNumber()) { maOpacity = rOpacity; } + // Title content + const rtl::OUString& getTitle() const { return maTitle; } + void setTitle(const rtl::OUString& rNew) { maTitle = rNew; } + + // Desc content + const rtl::OUString& getDesc() const { return maDesc; } + void setDesc(const rtl::OUString& rNew) { maDesc = rNew; } + // ClipPathXLink content const rtl::OUString getClipPathXLink() const { return maClipPathXLink; } void setClipPathXLink(const rtl::OUString& rNew) { maClipPathXLink = rNew; } diff --git a/svgio/inc/svgio/svgreader/svgtitledescnode.hxx b/svgio/inc/svgio/svgreader/svgtitledescnode.hxx new file mode 100644 index 000000000000..d84b06dab1b5 --- /dev/null +++ b/svgio/inc/svgio/svgreader/svgtitledescnode.hxx @@ -0,0 +1,55 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ +#ifndef INCLUDED_SVGIO_SVGREADER_SVGTITLEDESCNODE_HXX +#define INCLUDED_SVGIO_SVGREADER_SVGTITLEDESCNODE_HXX + +#include <svgio/svgreader/svgnode.hxx> + +////////////////////////////////////////////////////////////////////////////// + +namespace svgio +{ + namespace svgreader + { + class SvgTitleDescNode : public SvgNode + { + private: + /// contained chars + rtl::OUString maText; + + public: + SvgTitleDescNode( + SVGToken aType, + SvgDocument& rDocument, + SvgNode* pParent); + virtual ~SvgTitleDescNode(); + + /// add new chars + void concatenate(const rtl::OUString& rChars); + + /// x content, set if found in current context + const rtl::OUString& getText() const { return maText; } + }; + } // end of namespace svgreader +} // end of namespace svgio + +////////////////////////////////////////////////////////////////////////////// + +#endif //INCLUDED_SVGIO_SVGREADER_SVGTITLEDESCNODE_HXX + +// eof diff --git a/svgio/inc/svgio/svgreader/svgtoken.hxx b/svgio/inc/svgio/svgreader/svgtoken.hxx index 0519d9c14680..e1218620a85d 100644 --- a/svgio/inc/svgio/svgreader/svgtoken.hxx +++ b/svgio/inc/svgio/svgreader/svgtoken.hxx @@ -103,6 +103,8 @@ namespace svgio SVGTokenPatternContentUnits, SVGTokenPatternTransform, SVGTokenOpacity, + SVGTokenTitle, + SVGTokenDesc, // AspectRatio and params SVGTokenPreserveAspectRatio, @@ -181,6 +183,8 @@ namespace svgio SVGToken StrToSVGToken(const rtl::OUString& rStr); + const rtl::OUString& getStrTitle(); + const rtl::OUString& getStrDesc(); } // end of namespace svgreader } // end of namespace svgio diff --git a/svgio/source/svgreader/svgdocumenthandler.cxx b/svgio/source/svgreader/svgdocumenthandler.cxx index 9cad386043fb..29c40b30cd30 100644 --- a/svgio/source/svgreader/svgdocumenthandler.cxx +++ b/svgio/source/svgreader/svgdocumenthandler.cxx @@ -43,6 +43,7 @@ #include <svgio/svgreader/svgmasknode.hxx> #include <svgio/svgreader/svgmarkernode.hxx> #include <svgio/svgreader/svgpatternnode.hxx> +#include <svgio/svgreader/svgtitledescnode.hxx> ////////////////////////////////////////////////////////////////////////////// @@ -246,6 +247,15 @@ namespace svgio break; } + /// title and description + case SVGTokenTitle: + case SVGTokenDesc: + { + /// new node for Title and/or Desc + mpTarget = new SvgTitleDescNode(aSVGToken, maDocument, mpTarget); + break; + } + /// gradients case SVGTokenLinearGradient: case SVGTokenRadialGradient: @@ -360,6 +370,7 @@ namespace svgio const SVGToken aSVGToken(StrToSVGToken(aName)); SvgNode* pWhitespaceCheck(SVGTokenText == aSVGToken ? mpTarget : 0); SvgStyleNode* pCssStyle(SVGTokenStyle == aSVGToken ? static_cast< SvgStyleNode* >(mpTarget) : 0); + SvgTitleDescNode* pSvgTitleDescNode(SVGTokenTitle == aSVGToken || SVGTokenDesc == aSVGToken ? static_cast< SvgTitleDescNode* >(mpTarget) : 0); switch(aSVGToken) { @@ -382,6 +393,10 @@ namespace svgio case SVGTokenRect: case SVGTokenImage: + /// title and description + case SVGTokenTitle: + case SVGTokenDesc: + /// gradients case SVGTokenLinearGradient: case SVGTokenRadialGradient: @@ -432,6 +447,23 @@ namespace svgio } } + if(pSvgTitleDescNode && mpTarget) + { + const rtl::OUString aText(pSvgTitleDescNode->getText()); + + if(aText.getLength()) + { + if(SVGTokenTitle == aSVGToken) + { + mpTarget->parseAttribute(getStrTitle(), aSVGToken, aText); + } + else // if(SVGTokenDesc == aSVGToken) + { + mpTarget->parseAttribute(getStrDesc(), aSVGToken, aText); + } + } + } + if(pCssStyle && pCssStyle->isTextCss()) { // css style parsing @@ -457,72 +489,74 @@ namespace svgio void SvgDocHdl::characters( const ::rtl::OUString& aChars ) throw (xml::sax::SAXException, uno::RuntimeException) { - if(mpTarget) - { - const sal_uInt32 nLength(aChars.getLength()); + const sal_uInt32 nLength(aChars.getLength()); - if(nLength && - (SVGTokenText == mpTarget->getType() || - SVGTokenTspan == mpTarget->getType() || - SVGTokenTextPath == mpTarget->getType() || - SVGTokenStyle == mpTarget->getType())) + if(mpTarget && nLength) + { + switch(mpTarget->getType()) { - switch(mpTarget->getType()) + case SVGTokenText: + case SVGTokenTspan: + case SVGTokenTextPath: { - case SVGTokenText: - case SVGTokenTspan: - case SVGTokenTextPath: - { - const SvgNodeVector& rChilds = mpTarget->getChildren(); - SvgCharacterNode* pTarget = 0; + const SvgNodeVector& rChilds = mpTarget->getChildren(); + SvgCharacterNode* pTarget = 0; - if(rChilds.size()) - { - pTarget = dynamic_cast< SvgCharacterNode* >(rChilds[rChilds.size() - 1]); - } + if(rChilds.size()) + { + pTarget = dynamic_cast< SvgCharacterNode* >(rChilds[rChilds.size() - 1]); + } - if(pTarget) - { - // concatenate to current character span - pTarget->concatenate(aChars); - } - else - { - // add character span as simplified tspan (no arguments) - // as direct child of SvgTextNode/SvgTspanNode/SvgTextPathNode - new SvgCharacterNode(maDocument, mpTarget, aChars); - } - break; + if(pTarget) + { + // concatenate to current character span + pTarget->concatenate(aChars); } - case SVGTokenStyle: + else { - SvgStyleNode& rSvgStyleNode = static_cast< SvgStyleNode& >(*mpTarget); + // add character span as simplified tspan (no arguments) + // as direct child of SvgTextNode/SvgTspanNode/SvgTextPathNode + new SvgCharacterNode(maDocument, mpTarget, aChars); + } + break; + } + case SVGTokenStyle: + { + SvgStyleNode& rSvgStyleNode = static_cast< SvgStyleNode& >(*mpTarget); - if(rSvgStyleNode.isTextCss()) + if(rSvgStyleNode.isTextCss()) + { + // collect characters for css style + if(maCssContents.size()) { - // collect characters for css style - if(maCssContents.size()) - { - const ::rtl::OUString aTrimmedChars(aChars.trim()); + const ::rtl::OUString aTrimmedChars(aChars.trim()); - if(aTrimmedChars.getLength()) - { - std::vector< rtl::OUString >::iterator aString(maCssContents.end() - 1); - (*aString) += aTrimmedChars; - } - } - else + if(aTrimmedChars.getLength()) { - OSL_ENSURE(false, "Closing CssStyle, but no collector string on stack (!)"); + std::vector< rtl::OUString >::iterator aString(maCssContents.end() - 1); + (*aString) += aTrimmedChars; } } - break; - } - default: - { - // characters not used by a known node - break; + else + { + OSL_ENSURE(false, "Closing CssStyle, but no collector string on stack (!)"); + } } + break; + } + case SVGTokenTitle: + case SVGTokenDesc: + { + SvgTitleDescNode& rSvgTitleDescNode = static_cast< SvgTitleDescNode& >(*mpTarget); + + // add text directly to SvgTitleDescNode + rSvgTitleDescNode.concatenate(aChars); + break; + } + default: + { + // characters not used by a known node + break; } } } diff --git a/svgio/source/svgreader/svgnode.cxx b/svgio/source/svgreader/svgnode.cxx index e453c08a3ebb..acab42aeadee 100644 --- a/svgio/source/svgreader/svgnode.cxx +++ b/svgio/source/svgreader/svgnode.cxx @@ -21,6 +21,7 @@ #include <svgio/svgreader/svgdocument.hxx> #include <svgio/svgreader/svgnode.hxx> #include <svgio/svgreader/svgstyleattributes.hxx> +#include <drawinglayer/primitive2d/objectinfoprimitive2d.hxx> ////////////////////////////////////////////////////////////////////////////// @@ -183,6 +184,40 @@ namespace svgio OSL_ENSURE(false, "Null-Pointer in child node list (!)"); } } + + if(rTarget.hasElements()) + { + const SvgStyleAttributes* pStyles = getSvgStyleAttributes(); + + if(pStyles) + { + // check if we have Title or Desc + const rtl::OUString& rTitle = pStyles->getTitle(); + const rtl::OUString& rDesc = pStyles->getDesc(); + + if(rTitle.getLength() || rDesc.getLength()) + { + // default object name is empty + rtl::OUString aObjectName; + + // use path as object name when outmost element + if(SVGTokenSvg == getType()) + { + aObjectName = getDocument().getAbsolutePath(); + } + + // pack in ObjectInfoPrimitive2D group + const drawinglayer::primitive2d::Primitive2DReference xRef( + new drawinglayer::primitive2d::ObjectInfoPrimitive2D( + rTarget, + aObjectName, + rTitle, + rDesc)); + + rTarget = drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1); + } + } + } } } diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx index f015523671ba..f5370729d56e 100644 --- a/svgio/source/svgreader/svgstyleattributes.cxx +++ b/svgio/source/svgreader/svgstyleattributes.cxx @@ -1186,6 +1186,8 @@ namespace svgio maTextAnchor(TextAnchor_notset), maColor(), maOpacity(1.0), + maTitle(), + maDesc(), maClipPathXLink(), maMaskXLink(), maMarkerStartXLink(), @@ -1755,6 +1757,16 @@ namespace svgio } break; } + case SVGTokenTitle: + { + setTitle(aContent); + break; + } + case SVGTokenDesc: + { + setDesc(aContent); + break; + } case SVGTokenClipPathProperty: { readLocalUrl(aContent, maClipPathXLink); diff --git a/svgio/source/svgreader/svgtitledescnode.cxx b/svgio/source/svgreader/svgtitledescnode.cxx new file mode 100644 index 000000000000..2a5b546980ac --- /dev/null +++ b/svgio/source/svgreader/svgtitledescnode.cxx @@ -0,0 +1,48 @@ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include <svgio/svgreader/svgtitledescnode.hxx> + +////////////////////////////////////////////////////////////////////////////// + +namespace svgio +{ + namespace svgreader + { + SvgTitleDescNode::SvgTitleDescNode( + SVGToken aType, + SvgDocument& rDocument, + SvgNode* pParent) + : SvgNode(aType, rDocument, pParent), + maText() + { + } + + SvgTitleDescNode::~SvgTitleDescNode() + { + } + + void SvgTitleDescNode::concatenate(const rtl::OUString& rChars) + { + maText += rChars; + } + } // end of namespace svgreader +} // end of namespace svgio + +////////////////////////////////////////////////////////////////////////////// +// eof diff --git a/svgio/source/svgreader/svgtoken.cxx b/svgio/source/svgreader/svgtoken.cxx index 05e6441de202..44b20d49f2d6 100644 --- a/svgio/source/svgreader/svgtoken.cxx +++ b/svgio/source/svgreader/svgtoken.cxx @@ -92,6 +92,8 @@ namespace svgio static rtl::OUString aSVGStrPatternContentUnits(rtl::OUString::createFromAscii("patternContentUnits")); static rtl::OUString aSVGStrPatternTransform(rtl::OUString::createFromAscii("patternTransform")); static rtl::OUString aSVGStrOpacity(rtl::OUString::createFromAscii("opacity")); + static rtl::OUString aSVGStrTitle(rtl::OUString::createFromAscii("title")); + static rtl::OUString aSVGStrDesc(rtl::OUString::createFromAscii("desc")); static rtl::OUString aSVGStrPreserveAspectRatio(rtl::OUString::createFromAscii("preserveAspectRatio")); static rtl::OUString aSVGStrDefer(rtl::OUString::createFromAscii("defer")); @@ -231,6 +233,8 @@ namespace svgio aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPatternContentUnits, SVGTokenPatternContentUnits)); aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPatternTransform, SVGTokenPatternTransform)); aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrOpacity, SVGTokenOpacity)); + aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrTitle, SVGTokenTitle)); + aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrDesc, SVGTokenDesc)); aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPreserveAspectRatio, SVGTokenPreserveAspectRatio)); aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrDefer, SVGTokenDefer)); @@ -309,6 +313,16 @@ namespace svgio return aResult->second; } } + + const rtl::OUString& getStrTitle() + { + return aSVGStrTitle; + } + + const rtl::OUString& getStrDesc() + { + return aSVGStrDesc; + } } // end of namespace svgreader } // end of namespace svgio |