Kaydet (Commit) f75ca1fd authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Xisco Fauli

Fix #120334# Added support for multiple CSS styles per graphic primitive

(cherry picked from commit 37446076)

Conflicts:
	svgio/inc/svgio/svgreader/svgstyleattributes.hxx
	svgio/source/svgreader/svgcirclenode.cxx
	svgio/source/svgreader/svgellipsenode.cxx
	svgio/source/svgreader/svggnode.cxx
	svgio/source/svgreader/svgimagenode.cxx
	svgio/source/svgreader/svglinenode.cxx
	svgio/source/svgreader/svgmarkernode.cxx
	svgio/source/svgreader/svgpathnode.cxx
	svgio/source/svgreader/svgpatternnode.cxx
	svgio/source/svgreader/svgpolynode.cxx
	svgio/source/svgreader/svgrectnode.cxx
	svgio/source/svgreader/svgstyleattributes.cxx
	svgio/source/svgreader/svgtextnode.cxx
	svgio/source/svgreader/svgusenode.cxx

Change-Id: Id554528932eea590d645cb5e5a1ea8cf7f1d0aac
üst 1591194a
...@@ -47,6 +47,7 @@ namespace svgio ...@@ -47,6 +47,7 @@ namespace svgio
namespace svgreader namespace svgreader
{ {
typedef ::std::vector< SvgNode* > SvgNodeVector; typedef ::std::vector< SvgNode* > SvgNodeVector;
typedef ::std::vector< const SvgStyleAttributes* > SvgStyleAttributeVector;
enum XmlSpace enum XmlSpace
{ {
...@@ -76,6 +77,13 @@ namespace svgio ...@@ -76,6 +77,13 @@ namespace svgio
/// XmlSpace value /// XmlSpace value
XmlSpace maXmlSpace; XmlSpace maXmlSpace;
/// CSS styles
SvgStyleAttributeVector maCssStyleVector;
protected:
/// helper to evtl. link to css style
const SvgStyleAttributes* checkForCssStyle(const rtl::OUString& rClassStr, const SvgStyleAttributes& rOriginal) const;
public: public:
SvgNode( SvgNode(
SVGToken aType, SVGToken aType,
......
...@@ -136,12 +136,18 @@ namespace svgio ...@@ -136,12 +136,18 @@ namespace svgio
TextAnchor_end TextAnchor_end
}; };
enum FillRule
{
FillRule_notset,
FillRule_nonzero,
FillRule_evenodd
};
class SvgStyleAttributes class SvgStyleAttributes
{ {
private: private:
SvgNode& mrOwner; SvgNode& mrOwner;
const SvgStyleAttributes* mpCssStyleParent; const SvgStyleAttributes* mpCssStyleParent;
SvgPaint maFill; SvgPaint maFill;
SvgPaint maStroke; SvgPaint maStroke;
SvgPaint maStopColor; SvgPaint maStopColor;
...@@ -184,18 +190,19 @@ namespace svgio ...@@ -184,18 +190,19 @@ namespace svgio
OUString maMarkerEndXLink; OUString maMarkerEndXLink;
const SvgMarkerNode* mpMarkerEndXLink; const SvgMarkerNode* mpMarkerEndXLink;
/// fill rule
FillRule maFillRule;
// ClipRule setting (only valid wne mbIsClipPathContent == true, default is FillRule_nonzero)
FillRule maClipRule;
/// bitfield /// bitfield
bool maFillRule : 1; // true: NonZero, false: EvenOdd
bool maFillRuleSet : 1;
// defines if this attributes are part of a ClipPath. If yes, // defines if this attributes are part of a ClipPath. If yes,
// rough geometry will be created on decomposition by patching // rough geometry will be created on decomposition by patching
// vaules for fill, stroke, strokeWidth and others // vaules for fill, stroke, strokeWidth and others
bool mbIsClipPathContent : 1; bool mbIsClipPathContent : 1;
// ClipRule setting (only valid wne mbIsClipPathContent == true)
bool mbClipRule : 1; // true == nonzero(default), false == evenodd
/// internal helpers /// internal helpers
void add_fillGradient( void add_fillGradient(
const basegfx::B2DPolyPolygon& rPath, const basegfx::B2DPolyPolygon& rPath,
...@@ -253,8 +260,9 @@ namespace svgio ...@@ -253,8 +260,9 @@ namespace svgio
const drawinglayer::primitive2d::Primitive2DSequence& rSource, const drawinglayer::primitive2d::Primitive2DSequence& rSource,
const basegfx::B2DHomMatrix* pTransform) const; const basegfx::B2DHomMatrix* pTransform) const;
/// helper to evtl. link to css style /// helper to set mpCssStyleParent temporarily for CSS style hierarchies
void checkForCssStyle(const OUString& rClassStr) const; void setCssStyleParent(const SvgStyleAttributes* pNew) { mpCssStyleParent = pNew; }
const SvgStyleAttributes* getCssStyleParent() const { return mpCssStyleParent; }
/// scan helpers /// scan helpers
void readStyle(const OUString& rCandidate); void readStyle(const OUString& rCandidate);
...@@ -304,7 +312,8 @@ namespace svgio ...@@ -304,7 +312,8 @@ namespace svgio
void setFillOpacity(const SvgNumber& rFillOpacity = SvgNumber()) { maFillOpacity = rFillOpacity; } void setFillOpacity(const SvgNumber& rFillOpacity = SvgNumber()) { maFillOpacity = rFillOpacity; }
/// fill rule content /// fill rule content
bool getFillRule() const; const FillRule getFillRule() const;
void setFillRule(const FillRule aFillRule = FillRule_notset) { maFillRule = aFillRule; }
/// fill StrokeDasharray content /// fill StrokeDasharray content
const SvgNumberVector& getStrokeDasharray() const; const SvgNumberVector& getStrokeDasharray() const;
......
...@@ -47,9 +47,7 @@ namespace svgio ...@@ -47,9 +47,7 @@ namespace svgio
const SvgStyleAttributes* SvgCircleNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgCircleNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("circle")); static OUString aClassStr(OUString::createFromAscii("circle"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgCircleNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgCircleNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -47,10 +47,8 @@ namespace svgio ...@@ -47,10 +47,8 @@ namespace svgio
const SvgStyleAttributes* SvgEllipseNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgEllipseNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("ellipse")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("ellipse"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgEllipseNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgEllipseNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -45,10 +45,8 @@ namespace svgio ...@@ -45,10 +45,8 @@ namespace svgio
const SvgStyleAttributes* SvgGNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgGNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("g")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("g"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgGNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgGNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -64,10 +64,8 @@ namespace svgio ...@@ -64,10 +64,8 @@ namespace svgio
const SvgStyleAttributes* SvgImageNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgImageNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("image")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("image"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgImageNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgImageNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -47,10 +47,8 @@ namespace svgio ...@@ -47,10 +47,8 @@ namespace svgio
const SvgStyleAttributes* SvgLineNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgLineNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("line")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("line"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgLineNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgLineNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -50,10 +50,8 @@ namespace svgio ...@@ -50,10 +50,8 @@ namespace svgio
const SvgStyleAttributes* SvgMarkerNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgMarkerNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("marker")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("marker"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgMarkerNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgMarkerNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -35,6 +35,96 @@ namespace svgio ...@@ -35,6 +35,96 @@ namespace svgio
return 0; return 0;
} }
const SvgStyleAttributes* SvgNode::checkForCssStyle(const rtl::OUString& rClassStr, const SvgStyleAttributes& rOriginal) const
{
const SvgDocument& rDocument = getDocument();
if(rDocument.hasSvgStyleAttributesById())
{
if(getClass())
{
// find all referenced CSS styles, a list of entries is allowed
const rtl::OUString* pClassList = getClass();
const sal_Int32 nLen(pClassList->getLength());
sal_Int32 nPos(0);
const SvgStyleAttributes* pNew = 0;
skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
while(nPos < nLen)
{
rtl::OUStringBuffer aTokenValue;
copyToLimiter(*pClassList, sal_Unicode(' '), nPos, aTokenValue, nLen);
skip_char(*pClassList, sal_Unicode(' '), nPos, nLen);
rtl::OUString aId(rtl::OUString::createFromAscii("."));
const rtl::OUString aOUTokenValue(aTokenValue.makeStringAndClear());
// look for CSS style common to token
aId = aId + aOUTokenValue;
pNew = rDocument.findSvgStyleAttributesById(aId);
if(!pNew && rClassStr.getLength())
{
// look for CSS style common to class.token
aId = rClassStr + aId;
pNew = rDocument.findSvgStyleAttributesById(aId);
}
if(pNew)
{
const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
}
}
}
if(maCssStyleVector.empty() && getId())
{
// if none found, search for CSS style equal to Id
const SvgStyleAttributes* pNew = rDocument.findSvgStyleAttributesById(*getId());
if(pNew)
{
const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
}
}
if(maCssStyleVector.empty() && rClassStr.getLength())
{
// if none found, search for CSS style equal to class type
const SvgStyleAttributes* pNew = rDocument.findSvgStyleAttributesById(rClassStr);
if(pNew)
{
const_cast< SvgNode* >(this)->maCssStyleVector.push_back(pNew);
}
}
}
if(maCssStyleVector.empty())
{
return &rOriginal;
}
else
{
// set CssStyleParent at maCssStyleVector members to hang them in front of
// the existing style
SvgStyleAttributes* pCurrent = const_cast< SvgStyleAttributes* >(&rOriginal);
for(sal_uInt32 a(0); a < maCssStyleVector.size(); a++)
{
SvgStyleAttributes* pCandidate = const_cast< SvgStyleAttributes* >(maCssStyleVector[maCssStyleVector.size() - a - 1]);
pCandidate->setCssStyleParent(pCurrent);
pCurrent = pCandidate;
}
return pCurrent;
}
}
SvgNode::SvgNode( SvgNode::SvgNode(
SVGToken aType, SVGToken aType,
SvgDocument& rDocument, SvgDocument& rDocument,
...@@ -46,7 +136,8 @@ namespace svgio ...@@ -46,7 +136,8 @@ namespace svgio
maChildren(), maChildren(),
mpId(0), mpId(0),
mpClass(0), mpClass(0),
maXmlSpace(XmlSpace_notset) maXmlSpace(XmlSpace_notset),
maCssStyleVector()
{ {
OSL_ENSURE(SVGTokenUnknown != maType, "SvgNode with unknown type created (!)"); OSL_ENSURE(SVGTokenUnknown != maType, "SvgNode with unknown type created (!)");
......
...@@ -45,10 +45,8 @@ namespace svgio ...@@ -45,10 +45,8 @@ namespace svgio
const SvgStyleAttributes* SvgPathNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgPathNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("path")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("path"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgPathNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgPathNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -64,10 +64,8 @@ namespace svgio ...@@ -64,10 +64,8 @@ namespace svgio
const SvgStyleAttributes* SvgPatternNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgPatternNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("pattern")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("pattern"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgPatternNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgPatternNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -47,11 +47,9 @@ namespace svgio ...@@ -47,11 +47,9 @@ namespace svgio
const SvgStyleAttributes* SvgPolyNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgPolyNode::getSvgStyleAttributes() const
{ {
static OUString aClassStrA(OUString::createFromAscii("polygon")); static rtl::OUString aClassStrA(rtl::OUString::createFromAscii("polygon"));
static OUString aClassStrB(OUString::createFromAscii("polyline")); static rtl::OUString aClassStrB(rtl::OUString::createFromAscii("polyline"));
maSvgStyleAttributes.checkForCssStyle(mbIsPolyline? aClassStrB : aClassStrA); return checkForCssStyle(mbIsPolyline? aClassStrB : aClassStrA, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgPolyNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgPolyNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -49,10 +49,8 @@ namespace svgio ...@@ -49,10 +49,8 @@ namespace svgio
const SvgStyleAttributes* SvgRectNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgRectNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("rect")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("rect"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgRectNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgRectNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -203,53 +203,11 @@ namespace svgio ...@@ -203,53 +203,11 @@ namespace svgio
} }
} }
void SvgStyleAttributes::checkForCssStyle(const OUString& rClassStr) const
{
if(!mpCssStyleParent)
{
const SvgDocument& rDocument = mrOwner.getDocument();
const SvgStyleAttributes* pNew = 0;
if(rDocument.hasSvgStyleAttributesById())
{
if(mrOwner.getClass())
{
OUString aId(OUString::createFromAscii("."));
aId = aId + *mrOwner.getClass();
pNew = rDocument.findSvgStyleAttributesById(aId);
if(!pNew && rClassStr.getLength())
{
aId = rClassStr + aId;
pNew = rDocument.findSvgStyleAttributesById(aId);
}
}
if(!pNew && mrOwner.getId())
{
pNew = rDocument.findSvgStyleAttributesById(*mrOwner.getId());
}
if(!pNew && rClassStr.getLength())
{
pNew = rDocument.findSvgStyleAttributesById(rClassStr);
}
if(pNew)
{
// found css style, set as parent
const_cast< SvgStyleAttributes* >(this)->mpCssStyleParent = pNew;
}
}
}
}
const SvgStyleAttributes* SvgStyleAttributes::getParentStyle() const const SvgStyleAttributes* SvgStyleAttributes::getParentStyle() const
{ {
if(mpCssStyleParent) if(getCssStyleParent())
{ {
return mpCssStyleParent; return getCssStyleParent();
} }
if(mrOwner.getParent()) if(mrOwner.getParent())
...@@ -1061,8 +1019,8 @@ namespace svgio ...@@ -1061,8 +1019,8 @@ namespace svgio
{ {
basegfx::B2DPolyPolygon aPath(rPath); basegfx::B2DPolyPolygon aPath(rPath);
const bool bNeedToCheckClipRule(SVGTokenPath == mrOwner.getType() || SVGTokenPolygon == mrOwner.getType()); const bool bNeedToCheckClipRule(SVGTokenPath == mrOwner.getType() || SVGTokenPolygon == mrOwner.getType());
const bool bClipPathIsNonzero(!bIsLine && bNeedToCheckClipRule && mbIsClipPathContent && mbClipRule); const bool bClipPathIsNonzero(!bIsLine && bNeedToCheckClipRule && mbIsClipPathContent && FillRule_nonzero == maClipRule);
const bool bFillRuleIsNonzero(!bIsLine && bNeedToCheckClipRule && !mbIsClipPathContent && getFillRule()); const bool bFillRuleIsNonzero(!bIsLine && bNeedToCheckClipRule && !mbIsClipPathContent && FillRule_nonzero == getFillRule());
if(bClipPathIsNonzero || bFillRuleIsNonzero) if(bClipPathIsNonzero || bFillRuleIsNonzero)
{ {
...@@ -1196,10 +1154,9 @@ namespace svgio ...@@ -1196,10 +1154,9 @@ namespace svgio
mpMarkerMidXLink(0), mpMarkerMidXLink(0),
maMarkerEndXLink(), maMarkerEndXLink(),
mpMarkerEndXLink(0), mpMarkerEndXLink(0),
maFillRule(true), maFillRule(FillRule_notset),
maFillRuleSet(false), maClipRule(FillRule_nonzero),
mbIsClipPathContent(SVGTokenClipPathNode == mrOwner.getType()), mbIsClipPathContent(SVGTokenClipPathNode == mrOwner.getType())
mbClipRule(true)
{ {
if(!mbIsClipPathContent) if(!mbIsClipPathContent)
{ {
...@@ -1266,13 +1223,11 @@ namespace svgio ...@@ -1266,13 +1223,11 @@ namespace svgio
{ {
if(aContent.match(commonStrings::aStrNonzero)) if(aContent.match(commonStrings::aStrNonzero))
{ {
maFillRule = true; maFillRule = FillRule_nonzero;
maFillRuleSet = true;
} }
else if(aContent.match(commonStrings::aStrEvenOdd)) else if(aContent.match(commonStrings::aStrEvenOdd))
{ {
maFillRule = false; maFillRule = FillRule_evenodd;
maFillRuleSet = true;
} }
} }
break; break;
...@@ -1783,11 +1738,11 @@ namespace svgio ...@@ -1783,11 +1738,11 @@ namespace svgio
{ {
if(aContent.match(commonStrings::aStrNonzero)) if(aContent.match(commonStrings::aStrNonzero))
{ {
mbClipRule = true; maClipRule = FillRule_nonzero;
} }
else if(aContent.match(commonStrings::aStrEvenOdd)) else if(aContent.match(commonStrings::aStrEvenOdd))
{ {
mbClipRule = false; maClipRule = FillRule_evenodd;
} }
} }
break; break;
...@@ -2041,9 +1996,9 @@ namespace svgio ...@@ -2041,9 +1996,9 @@ namespace svgio
return SvgNumber(1.0); return SvgNumber(1.0);
} }
bool SvgStyleAttributes::getFillRule() const const FillRule SvgStyleAttributes::getFillRule() const
{ {
if(maFillRuleSet) if(FillRule_notset != maFillRule)
{ {
return maFillRule; return maFillRule;
} }
...@@ -2056,7 +2011,7 @@ namespace svgio ...@@ -2056,7 +2011,7 @@ namespace svgio
} }
// default is NonZero // default is NonZero
return true; return FillRule_nonzero;
} }
const SvgNumberVector& SvgStyleAttributes::getStrokeDasharray() const const SvgNumberVector& SvgStyleAttributes::getStrokeDasharray() const
......
...@@ -49,10 +49,8 @@ namespace svgio ...@@ -49,10 +49,8 @@ namespace svgio
const SvgStyleAttributes* SvgTextNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgTextNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("text")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("text"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgTextNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgTextNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
...@@ -48,10 +48,8 @@ namespace svgio ...@@ -48,10 +48,8 @@ namespace svgio
const SvgStyleAttributes* SvgUseNode::getSvgStyleAttributes() const const SvgStyleAttributes* SvgUseNode::getSvgStyleAttributes() const
{ {
static OUString aClassStr(OUString::createFromAscii("use")); static rtl::OUString aClassStr(rtl::OUString::createFromAscii("use"));
maSvgStyleAttributes.checkForCssStyle(aClassStr); return checkForCssStyle(aClassStr, maSvgStyleAttributes);
return &maSvgStyleAttributes;
} }
void SvgUseNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) void SvgUseNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment