summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2012-05-04 14:16:22 +0000
committerCaolán McNamara <caolanm@redhat.com>2013-03-13 11:22:20 +0000
commiteceecd4a3806f64c2e8fb0a3bcdcc43e1384779f (patch)
treee8c81552d7e3a1374a903cf5ca522a6eb77853e3 /svgio
parentcc22c25de9be13596960b8af6c6f40fc2e3fd27d (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.mk1
-rw-r--r--svgio/inc/svgio/svgreader/svgstyleattributes.hxx10
-rw-r--r--svgio/inc/svgio/svgreader/svgtitledescnode.hxx55
-rw-r--r--svgio/inc/svgio/svgreader/svgtoken.hxx4
-rw-r--r--svgio/source/svgreader/svgdocumenthandler.cxx138
-rw-r--r--svgio/source/svgreader/svgnode.cxx35
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx12
-rw-r--r--svgio/source/svgreader/svgtitledescnode.cxx48
-rw-r--r--svgio/source/svgreader/svgtoken.cxx14
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