You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2011/12/09 13:07:03 UTC
svn commit: r1212349 - in /incubator/ooo/branches/alg/svgreplacement/main:
basegfx/inc/basegfx/color/ basegfx/source/color/ svgio/
svgio/inc/svgio/svgreader/ svgio/source/svgreader/
Author: alg
Date: Fri Dec 9 12:07:02 2011
New Revision: 1212349
URL: http://svn.apache.org/viewvc?rev=1212349&view=rev
Log:
svg: Added clipPath and mask property support
Modified:
incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolor.hxx
incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolormodifier.hxx
incubator/ooo/branches/alg/svgreplacement/main/basegfx/source/color/bcolormodifier.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk
incubator/ooo/branches/alg/svgreplacement/main/svgio/Package_inc.mk
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svggradientnode.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtextpathnode.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtrefnode.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgusenode.hxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgdocumenthandler.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggradientnode.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgnode.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextpathnode.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtrefnode.cxx
incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx
Modified: incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolor.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolor.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolor.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolor.hxx Fri Dec 9 12:07:02 2011
@@ -151,9 +151,9 @@ namespace basegfx
// luminance
double luminance() const
{
- const double fRedWeight(77.0 / 256.0);
- const double fGreenWeight(151.0 / 256.0);
- const double fBlueWeight(28.0 / 256.0);
+ const double fRedWeight(77.0 / 256.0); // 0.30
+ const double fGreenWeight(151.0 / 256.0); // 0.59
+ const double fBlueWeight(28.0 / 256.0); // 0.11
return (mfX * fRedWeight + mfY * fGreenWeight + mfZ * fBlueWeight);
}
Modified: incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolormodifier.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolormodifier.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolormodifier.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/basegfx/inc/basegfx/color/bcolormodifier.hxx Fri Dec 9 12:07:02 2011
@@ -35,10 +35,12 @@ namespace basegfx
*/
enum BColorModifyMode
{
- BCOLORMODIFYMODE_REPLACE, // replace all color with local color
- BCOLORMODIFYMODE_INTERPOLATE, // interpolate color between given and local with local value
- BCOLORMODIFYMODE_GRAY, // convert color to gray
- BCOLORMODIFYMODE_BLACKANDWHITE // convert color to B&W, local value is treshhold
+ BCOLORMODIFYMODE_REPLACE, // replace all color with local color
+ BCOLORMODIFYMODE_INTERPOLATE, // interpolate color between given and local with local value
+ BCOLORMODIFYMODE_GRAY, // convert color to gray
+ BCOLORMODIFYMODE_BLACKANDWHITE, // convert color to B&W, local value is treshhold
+ BCOLORMODIFYMODE_INVERT, // invert color
+ BCOLORMODIFYMODE_LUMINANCE_TO_ALPHA // convert color to alpha value (used for Svg Mask)
};
/** Class to hold a color, value and mode for a color modification. Color modification is
Modified: incubator/ooo/branches/alg/svgreplacement/main/basegfx/source/color/bcolormodifier.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/basegfx/source/color/bcolormodifier.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/basegfx/source/color/bcolormodifier.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/basegfx/source/color/bcolormodifier.cxx Fri Dec 9 12:07:02 2011
@@ -56,6 +56,15 @@ namespace basegfx
return ::basegfx::BColor(1.0, 1.0, 1.0);
}
}
+ case BCOLORMODIFYMODE_INVERT :
+ {
+ return ::basegfx::BColor(1.0 - aSourceColor.getRed(), 1.0 - aSourceColor.getGreen(), 1.0 - aSourceColor.getBlue());
+ }
+ case BCOLORMODIFYMODE_LUMINANCE_TO_ALPHA:
+ {
+ const double fAlpha(1.0 - ((aSourceColor.getRed() * 0.2125) + (aSourceColor.getGreen() * 0.7154) + (aSourceColor.getBlue() * 0.0721)));
+ return ::basegfx::BColor(fAlpha, fAlpha, fAlpha);
+ }
default : // BCOLORMODIFYMODE_REPLACE
{
return maBColor;
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/Library_svgio.mk Fri Dec 9 12:07:02 2011
@@ -58,6 +58,7 @@ $(eval $(call gb_Library_add_linked_libs
$(eval $(call gb_Library_add_exception_objects,svgio,\
svgio/source/svgreader/svgcharacternode \
svgio/source/svgreader/svgcirclenode \
+ svgio/source/svgreader/svgclippathnode \
svgio/source/svgreader/svgdocument \
svgio/source/svgreader/svgdocumenthandler \
svgio/source/svgreader/svgellipsenode \
@@ -66,6 +67,7 @@ $(eval $(call gb_Library_add_exception_o
svgio/source/svgreader/svggradientstopnode \
svgio/source/svgreader/svgimagenode \
svgio/source/svgreader/svglinenode \
+ svgio/source/svgreader/svgmasknode \
svgio/source/svgreader/svgnode \
svgio/source/svgreader/svgpaint \
svgio/source/svgreader/svgpathnode \
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/Package_inc.mk
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/Package_inc.mk?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/Package_inc.mk (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/Package_inc.mk Fri Dec 9 12:07:02 2011
@@ -23,6 +23,7 @@ $(eval $(call gb_Package_Package,svgio_i
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgiodllapi.h,svgio/svgiodllapi.h))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgcharacternode.hxx,svgio/svgreader/svgcharacternode.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgcirclenode.hxx,svgio/svgreader/svgcirclenode.hxx))
+$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgclippathnode.hxx,svgio/svgreader/svgclippathnode.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgdocument.hxx,svgio/svgreader/svgdocument.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgdocumenthandler.hxx,svgio/svgreader/svgdocumenthandler.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgellipsenode.hxx,svgio/svgreader/svgellipsenode.hxx))
@@ -32,6 +33,7 @@ $(eval $(call gb_Package_add_file,svgio_
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgimagenode.hxx,svgio/svgreader/svgimagenode.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svglinenode.hxx,svgio/svgreader/svglinenode.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgnode.hxx,svgio/svgreader/svgnode.hxx))
+$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgmasknode.hxx,svgio/svgreader/svgmasknode.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgpaint.hxx,svgio/svgreader/svgpaint.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgpathnode.hxx,svgio/svgreader/svgpathnode.hxx))
$(eval $(call gb_Package_add_file,svgio_inc,inc/svgio/svgreader/svgpolynode.hxx,svgio/svgreader/svgpolynode.hxx))
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svggradientnode.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svggradientnode.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svggradientnode.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svggradientnode.hxx Fri Dec 9 12:07:02 2011
@@ -33,12 +33,6 @@ namespace svgio
{
namespace svgreader
{
- enum gradientUnits
- {
- userSpaceOnUse,
- objectBoundingBox
- };
-
class SvgGradientNode : public SvgNode
{
private:
@@ -59,12 +53,13 @@ namespace svgio
SvgNumber maFy;
/// variable scan values, dependent of given XAttributeList
- gradientUnits maGradientUnits;
+ SvgUnits maGradientUnits;
drawinglayer::primitive2d::SpreadMethod maSpreadMethod;
basegfx::B2DHomMatrix* mpaGradientTransform;
/// link to another gradient used as style. If maXLink
- /// is set, the node can be fetched on demand
+ /// is set, the node can be fetched on demand by using
+ // tryToFindLink (buffered)
rtl::OUString maXLink;
const SvgGradientNode* mpXLink;
@@ -121,8 +116,8 @@ namespace svgio
void setFy(const SvgNumber& rFy = SvgNumber()) { maFy = rFy; }
/// gradientUnits content
- gradientUnits getGradientUnits() const { return maGradientUnits; }
- void setGradientUnits(const gradientUnits aGradientUnits) { maGradientUnits = aGradientUnits; }
+ SvgUnits getGradientUnits() const { return maGradientUnits; }
+ void setGradientUnits(const SvgUnits aGradientUnits) { maGradientUnits = aGradientUnits; }
/// SpreadMethod content
drawinglayer::primitive2d::SpreadMethod getSpreadMethod() const { return maSpreadMethod; }
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx Fri Dec 9 12:07:02 2011
@@ -166,10 +166,19 @@ namespace svgio
TextAnchor maTextAnchor;
SvgPaint maColor;
+ /// link to content. If maXLink is set, the node can be fetched on demand
+ rtl::OUString maClipPathXLink;
+ rtl::OUString maMaskXLink;
+
/// bitfield
bool maFillRule : 1; // true: NonZero, false: EvenOdd
bool maFillRuleSet : 1;
+ // defines if this attributes are part of a ClipPath. If yes,
+ // rough geometry will be created on decomposition by patching
+ // vaules for fill, stroke, strokeWidth and others
+ bool mbIsClipPathContent : 1;
+
/// internal helpers
void add_fillGradient(
const basegfx::B2DPolyPolygon& rPath,
@@ -201,6 +210,9 @@ namespace svgio
/// helper to evtl. link to css style
void checkForCssStyle(const rtl::OUString& rClassStr) const;
+ /// helper to postprocess created primitives
+ void decomposePostProcess(drawinglayer::primitive2d::Primitive2DVector& rTarget) const;
+
/// scan helpers
void readStyle(const rtl::OUString& rCandidate);
const SvgStyleAttributes* getParentStyle() const;
@@ -309,6 +321,14 @@ namespace svgio
const basegfx::BColor* getColor() const;
void setColor(const SvgPaint& rColor) { maColor = rColor; }
+ // ClipPathXLink content
+ const rtl::OUString getClipPathXLink() const { return maClipPathXLink; }
+ void setClipPathXLink(const rtl::OUString& rNew) { maClipPathXLink = rNew; }
+
+ // MaskXLink content
+ const rtl::OUString getMaskXLink() const { return maMaskXLink; }
+ void setMaskXLink(const rtl::OUString& rNew) { maMaskXLink = rNew; }
+
};
} // end of namespace svgreader
} // end of namespace svgio
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtextpathnode.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtextpathnode.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtextpathnode.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtextpathnode.hxx Fri Dec 9 12:07:02 2011
@@ -42,7 +42,6 @@ namespace svgio
/// link to path content. If maXLink
/// is set, the node can be fetched on demand
rtl::OUString maXLink;
- const SvgPathNode* mpXLink;
/// variable scan values, dependent of given XAttributeList
SvgNumber maStartOffset;
@@ -51,9 +50,6 @@ namespace svgio
bool mbMethod : 1; // true = align, false = stretch
bool mbSpacing : 1; // true = auto, false = exact
- /// link on demand
- void tryToFindLink();
-
public:
SvgTextPathNode(
SvgDocument& rDocument,
@@ -79,9 +75,6 @@ namespace svgio
/// Spacing content
bool getSpacing() const { return mbSpacing; }
void setSpacing(bool bNew) { mbSpacing = bNew; }
-
- /// access to referenced SvgPathNode
- const SvgPathNode* getReferencedSvgPathNode() const;
};
} // end of namespace svgreader
} // end of namespace svgio
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx Fri Dec 9 12:07:02 2011
@@ -84,6 +84,12 @@ namespace svgio
SVGTokenTextAnchor,
SVGTokenXmlSpace,
SVGTokenColor,
+ SVGTokenClipPathNode,
+ SVGTokenClipPathProperty,
+ SVGTokenMask,
+ SVGTokenClipPathUnits,
+ SVGTokenMaskUnits,
+ SVGTokenMaskContentUnits,
// AspectRatio and params
SVGTokenPreserveAspectRatio,
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtools.hxx Fri Dec 9 12:07:02 2011
@@ -40,6 +40,19 @@ namespace svgio
void myAssert(const rtl::OUString& rMessage);
#endif
+ // common non-token strings
+ struct commonStrings
+ {
+ static const rtl::OUString aStrUserSpaceOnUse;
+ static const rtl::OUString aStrObjectBoundingBox;
+ };
+
+ enum SvgUnits
+ {
+ userSpaceOnUse,
+ objectBoundingBox
+ };
+
enum NumberType
{
xcoordinate,
@@ -185,6 +198,7 @@ namespace svgio
basegfx::B2DRange readViewBox(const rtl::OUString& rCandidate, InfoProvider& rInfoProvider);
basegfx::B2DHomMatrix readTransform(const rtl::OUString& rCandidate, InfoProvider& rInfoProvider);
bool readSingleNumber(const rtl::OUString& rCandidate, SvgNumber& aNum);
+ bool readLocalUrl(const rtl::OUString& rCandidate, rtl::OUString& rURL);
bool readSvgPaint(const rtl::OUString& rCandidate, SvgPaint& rSvgPaint, rtl::OUString& rURL);
bool readSvgNumberVector(const rtl::OUString& rCandidate, SvgNumberVector& rSvgNumberVector);
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtrefnode.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtrefnode.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtrefnode.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtrefnode.hxx Fri Dec 9 12:07:02 2011
@@ -42,10 +42,6 @@ namespace svgio
/// link to text content. If maXLink
/// is set, the node can be fetched on demand
rtl::OUString maXLink;
- const SvgTextNode* mpXLink;
-
- /// link on demand
- void tryToFindLink();
public:
SvgTrefNode(
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgusenode.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgusenode.hxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgusenode.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgusenode.hxx Fri Dec 9 12:07:02 2011
@@ -46,12 +46,8 @@ namespace svgio
SvgNumber maHeight;
/// link to content. If maXLink is set, the node can be fetched
- // on demand by using tryToFindLink in accessors
+ // on demand
rtl::OUString maXLink;
- const SvgNode* mpXLink;
-
- /// link on demand
- void tryToFindLink();
public:
SvgUseNode(
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgdocumenthandler.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgdocumenthandler.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgdocumenthandler.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgdocumenthandler.cxx Fri Dec 9 12:07:02 2011
@@ -45,6 +45,8 @@
#include <svgio/svgreader/svgtextpathnode.hxx>
#include <svgio/svgreader/svgstylenode.hxx>
#include <svgio/svgreader/svgimagenode.hxx>
+#include <svgio/svgreader/svgclippathnode.hxx>
+#include <svgio/svgreader/svgmasknode.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -295,6 +297,23 @@ namespace svgio
break;
}
+ /// structural elements clip-path and mask. Content gets scanned, but
+ /// will not be decomposed (see SvgNode::decomposeSvgNode and bReferenced)
+ case SVGTokenClipPathNode:
+ {
+ /// new node for ClipPath
+ mpTarget = new SvgClipPathNode(maDocument, mpTarget);
+ mpTarget->parseAttributes(xAttribs);
+ break;
+ }
+ case SVGTokenMask:
+ {
+ /// new node for Mask
+ mpTarget = new SvgMaskNode(maDocument, mpTarget);
+ mpTarget->parseAttributes(xAttribs);
+ break;
+ }
+
default:
{
/// invalid token, ignore
@@ -354,6 +373,10 @@ namespace svgio
/// styles (as stylesheets)
case SVGTokenStyle:
+ /// structural elements clip-path and mask
+ case SVGTokenClipPathNode:
+ case SVGTokenMask:
+
/// content handling after parsing
{
if(mpTarget)
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggradientnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggradientnode.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggradientnode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggradientnode.cxx Fri Dec 9 12:07:02 2011
@@ -187,14 +187,11 @@ namespace svgio
{
if(aContent.getLength())
{
- static rtl::OUString aStrUserSpaceOnUse(rtl::OUString::createFromAscii("userSpaceOnUse"));
- static rtl::OUString aStrObjectBoundingBox(rtl::OUString::createFromAscii("objectBoundingBox"));
-
- if(aContent.match(aStrUserSpaceOnUse, 0))
+ if(aContent.match(commonStrings::aStrUserSpaceOnUse, 0))
{
setGradientUnits(userSpaceOnUse);
}
- else if(aContent.match(aStrObjectBoundingBox, 0))
+ else if(aContent.match(commonStrings::aStrObjectBoundingBox, 0))
{
setGradientUnits(objectBoundingBox);
}
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgnode.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgnode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgnode.cxx Fri Dec 9 12:07:02 2011
@@ -136,12 +136,22 @@ namespace svgio
void SvgNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DVector& rTarget, bool bReferenced) const
{
- if(!bReferenced && (SVGTokenDefs == getType() || SVGTokenSymbol == getType()))
+ if(!bReferenced)
{
- // do not decompose defs or symbol nodes (these hold only style-like
- // objects which may be used by referencing them) except when doing
- // so controlled referenced
- return;
+ if(SVGTokenDefs == getType() ||
+ SVGTokenSymbol == getType() ||
+ SVGTokenClipPathNode == getType() ||
+ SVGTokenMask == getType())
+ {
+ // do not decompose defs or symbol nodes (these hold only style-like
+ // objects which may be used by referencing them) except when doing
+ // so controlled referenced
+
+ // also do not decompose ClipPaths and Masks. These should be embedded
+ // in a defs node (which gets not decomposed by itself), but you never
+ // know
+ return;
+ }
}
const SvgNodeVector& rChildren = getChildren();
@@ -152,7 +162,32 @@ namespace svgio
for(sal_uInt32 a(0); a < nCount; a++)
{
- rChildren[a]->decomposeSvgNode(rTarget, bReferenced);
+ SvgNode* pCandidate = rChildren[a];
+
+ if(pCandidate)
+ {
+ drawinglayer::primitive2d::Primitive2DVector aNewTarget;
+
+ pCandidate->decomposeSvgNode(aNewTarget, bReferenced);
+
+ if(aNewTarget.size())
+ {
+ const SvgStyleAttributes* pAttributes = pCandidate->getSvgStyleAttributes();
+
+ if(pAttributes)
+ {
+ // check for global attributes which need to be applied,
+ // e.g. ClipPath or Mask
+ pAttributes->decomposePostProcess(aNewTarget);
+ }
+
+ rTarget.insert(rTarget.end(), aNewTarget.begin(), aNewTarget.end());
+ }
+ }
+ else
+ {
+ OSL_ENSURE(false, "Null-Pointer in child node list (!)");
+ }
}
}
}
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx Fri Dec 9 12:07:02 2011
@@ -34,6 +34,8 @@
#include <drawinglayer/processor2d/linegeometryextractor2d.hxx>
#include <drawinglayer/processor2d/textaspolygonextractor2d.hxx>
#include <basegfx/polygon/b2dpolypolygoncutter.hxx>
+#include <svgio/svgreader/svgclippathnode.hxx>
+#include <svgio/svgreader/svgmasknode.hxx>
//////////////////////////////////////////////////////////////////////////////
@@ -204,6 +206,37 @@ namespace svgio
}
}
+ void SvgStyleAttributes::decomposePostProcess(drawinglayer::primitive2d::Primitive2DVector& rTarget) const
+ {
+ if(rTarget.size())
+ {
+ if(getClipPathXLink().getLength())
+ {
+ // try to access linked ClipPath
+ const SvgClipPathNode* mpClip = dynamic_cast< const SvgClipPathNode* >(mrOwner.getDocument().findSvgNodeById(getClipPathXLink()));
+
+ if(mpClip)
+ {
+ mpClip->apply(rTarget);
+ }
+ }
+ }
+
+ if(rTarget.size()) // test again, applied clipPath may have lead to empty geometry
+ {
+ if(getMaskXLink().getLength())
+ {
+ // try to access linked Mask
+ const SvgMaskNode* mpMask = dynamic_cast< const SvgMaskNode* >(mrOwner.getDocument().findSvgNodeById(getMaskXLink()));
+
+ if(mpMask)
+ {
+ mpMask->apply(rTarget);
+ }
+ }
+ }
+ }
+
const SvgStyleAttributes* SvgStyleAttributes::getParentStyle() const
{
if(mpCssStyleParent)
@@ -666,10 +699,22 @@ namespace svgio
maTextDecoration(TextDecoration_notset),
maTextAnchor(TextAnchor_notset),
maColor(),
-
+ maClipPathXLink(),
+ maMaskXLink(),
+
maFillRule(true),
- maFillRuleSet(false)
+ maFillRuleSet(false),
+ mbIsClipPathContent(SVGTokenClipPathNode == mrOwner.getType())
{
+ if(!mbIsClipPathContent)
+ {
+ const SvgStyleAttributes* pParentStyle = getParentStyle();
+
+ if(pParentStyle)
+ {
+ mbIsClipPathContent = pParentStyle->mbIsClipPathContent;
+ }
+ }
}
SvgStyleAttributes::~SvgStyleAttributes()
@@ -1203,12 +1248,28 @@ namespace svgio
}
break;
}
+ case SVGTokenClipPathProperty:
+ {
+ readLocalUrl(aContent, maClipPathXLink);
+ break;
+ }
+ case SVGTokenMask:
+ {
+ readLocalUrl(aContent, maMaskXLink);
+ break;
+ }
}
}
const basegfx::BColor* SvgStyleAttributes::getFill() const
{
- if(maFill.isSet())
+ if(mbIsClipPathContent)
+ {
+ static basegfx::BColor aBlack(0.0, 0.0, 0.0);
+
+ return &aBlack;
+ }
+ else if(maFill.isSet())
{
if(maFill.isCurrent())
{
@@ -1234,7 +1295,11 @@ namespace svgio
const basegfx::BColor* SvgStyleAttributes::getStroke() const
{
- if(maStroke.isSet())
+ if(mbIsClipPathContent)
+ {
+ return 0;
+ }
+ else if(maStroke.isSet())
{
if(maStroke.isCurrent())
{
@@ -1272,7 +1337,11 @@ namespace svgio
const SvgGradientNode* SvgStyleAttributes::getSvgGradientNodeFill() const
{
- if(mpSvgGradientNodeFill)
+ if(mbIsClipPathContent)
+ {
+ return 0;
+ }
+ else if(mpSvgGradientNodeFill)
{
return mpSvgGradientNodeFill;
}
@@ -1291,7 +1360,11 @@ namespace svgio
const SvgGradientNode* SvgStyleAttributes::getSvgGradientNodeStroke() const
{
- if(mpSvgGradientNodeStroke)
+ if(mbIsClipPathContent)
+ {
+ return 0;
+ }
+ else if(mpSvgGradientNodeStroke)
{
return mpSvgGradientNodeStroke;
}
@@ -1310,7 +1383,11 @@ namespace svgio
const SvgNumber SvgStyleAttributes::getStrokeWidth() const
{
- if(maStrokeWidth.isSet())
+ if(mbIsClipPathContent)
+ {
+ return SvgNumber(0.0);
+ }
+ else if(maStrokeWidth.isSet())
{
return maStrokeWidth;
}
@@ -1339,7 +1416,11 @@ namespace svgio
const SvgNumber SvgStyleAttributes::getFillOpacity() const
{
- if(maFillOpacity.isSet())
+ if(mbIsClipPathContent)
+ {
+ return SvgNumber(1.0);
+ }
+ else if(maFillOpacity.isSet())
{
return maFillOpacity;
}
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextpathnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextpathnode.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextpathnode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextpathnode.cxx Fri Dec 9 12:07:02 2011
@@ -272,21 +272,12 @@ namespace svgio
{
namespace svgreader
{
- void SvgTextPathNode::tryToFindLink()
- {
- if(!mpXLink && maXLink.getLength())
- {
- mpXLink = dynamic_cast< const SvgPathNode* >(getDocument().findSvgNodeById(maXLink));
- }
- }
-
SvgTextPathNode::SvgTextPathNode(
SvgDocument& rDocument,
SvgNode* pParent)
: SvgNode(SVGTokenTextPath, rDocument, pParent),
maSvgStyleAttributes(*this),
maXLink(),
- mpXLink(0),
maStartOffset(),
mbMethod(true),
mbSpacing(false)
@@ -374,23 +365,15 @@ namespace svgio
if(nLen && sal_Unicode('#') == aContent[0])
{
maXLink = aContent.copy(1);
- tryToFindLink();
}
break;
}
}
}
- const SvgPathNode* SvgTextPathNode::getReferencedSvgPathNode() const
- {
- const_cast< SvgTextPathNode* >(this)->tryToFindLink();
-
- return mpXLink;
- }
-
bool SvgTextPathNode::isValid() const
{
- const SvgPathNode* pSvgPathNode = getReferencedSvgPathNode();
+ const SvgPathNode* pSvgPathNode = dynamic_cast< const SvgPathNode* >(getDocument().findSvgNodeById(maXLink));
if(!pSvgPathNode)
{
@@ -428,7 +411,7 @@ namespace svgio
{
if(rPathContent.hasElements())
{
- const SvgPathNode* pSvgPathNode = getReferencedSvgPathNode();
+ const SvgPathNode* pSvgPathNode = dynamic_cast< const SvgPathNode* >(getDocument().findSvgNodeById(maXLink));
if(pSvgPathNode)
{
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx Fri Dec 9 12:07:02 2011
@@ -75,6 +75,12 @@ namespace svgio
static rtl::OUString aSVGStrTextAnchor(rtl::OUString::createFromAscii("text-anchor"));
static rtl::OUString aSVGStrXmlSpace(rtl::OUString::createFromAscii("xml:space"));
static rtl::OUString aSVGStrColor(rtl::OUString::createFromAscii("color"));
+ static rtl::OUString aSVGStrClipPathNode(rtl::OUString::createFromAscii("clipPath"));
+ static rtl::OUString aSVGStrClipPathProperty(rtl::OUString::createFromAscii("clip-path"));
+ static rtl::OUString aSVGStrMask(rtl::OUString::createFromAscii("mask"));
+ static rtl::OUString aSVGStrClipPathUnits(rtl::OUString::createFromAscii("clipPathUnits"));
+ static rtl::OUString aSVGStrMaskUnits(rtl::OUString::createFromAscii("maskUnits"));
+ static rtl::OUString aSVGStrMaskContentUnits(rtl::OUString::createFromAscii("maskContentUnits"));
static rtl::OUString aSVGStrPreserveAspectRatio(rtl::OUString::createFromAscii("preserveAspectRatio"));
static rtl::OUString aSVGStrDefer(rtl::OUString::createFromAscii("defer"));
@@ -192,6 +198,12 @@ namespace svgio
aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrTextAnchor, SVGTokenTextAnchor));
aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrXmlSpace, SVGTokenXmlSpace));
aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrColor, SVGTokenColor));
+ aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrClipPathNode, SVGTokenClipPathNode));
+ aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrClipPathProperty, SVGTokenClipPathProperty));
+ aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrMask, SVGTokenMask));
+ aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrClipPathUnits, SVGTokenClipPathUnits));
+ aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrMaskUnits, SVGTokenMaskUnits));
+ aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrMaskContentUnits, SVGTokenMaskContentUnits));
aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPreserveAspectRatio, SVGTokenPreserveAspectRatio));
aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrDefer, SVGTokenDefer));
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtools.cxx Fri Dec 9 12:07:02 2011
@@ -46,6 +46,10 @@ namespace svgio
}
#endif
+ // common non-token strings
+ const rtl::OUString commonStrings::aStrUserSpaceOnUse(rtl::OUString::createFromAscii("userSpaceOnUse"));
+ const rtl::OUString commonStrings::aStrObjectBoundingBox(rtl::OUString::createFromAscii("objectBoundingBox"));
+
basegfx::B2DHomMatrix SvgAspectRatio::createLinearMapping(const basegfx::B2DRange& rTarget, const basegfx::B2DRange& rSource)
{
basegfx::B2DHomMatrix aRetval;
@@ -1138,6 +1142,26 @@ namespace svgio
return readNumberAndUnit(rCandidate, nPos, aNum, nLen);
}
+ bool readLocalUrl(const rtl::OUString& rCandidate, rtl::OUString& rURL)
+ {
+ static rtl::OUString aStrUrl(rtl::OUString::createFromAscii("url"));
+
+ if(rCandidate.match(aStrUrl, 0))
+ {
+ const sal_Int32 nLen(rCandidate.getLength());
+ sal_Int32 nPos(aStrUrl.getLength());
+
+ skip_char(rCandidate, sal_Unicode('('), sal_Unicode('#'), nPos, nLen);
+ rtl::OUStringBuffer aTokenValue;
+ copyToLimiter(rCandidate, sal_Unicode(')'), nPos, aTokenValue, nLen);
+ rURL = aTokenValue.makeStringAndClear();
+
+ return true;
+ }
+
+ return false;
+ }
+
bool readSvgPaint(const rtl::OUString& rCandidate, SvgPaint& rSvgPaint, rtl::OUString& rURL)
{
const sal_Int32 nLen(rCandidate.getLength());
@@ -1154,7 +1178,6 @@ namespace svgio
else
{
static rtl::OUString aStrNone(rtl::OUString::createFromAscii("none"));
- static rtl::OUString aStrUrl(rtl::OUString::createFromAscii("url"));
static rtl::OUString aStrCurrentColor(rtl::OUString::createFromAscii("currentColor"));
if(rCandidate.match(aStrNone, 0))
@@ -1162,16 +1185,9 @@ namespace svgio
rSvgPaint = SvgPaint(aColor, true, false, false);
return true;
}
- else if(rCandidate.match(aStrUrl, 0))
+ else if(readLocalUrl(rCandidate, rURL))
{
- const sal_Int32 nLen(rCandidate.getLength());
- sal_Int32 nPos(aStrUrl.getLength());
-
- skip_char(rCandidate, sal_Unicode('('), sal_Unicode('#'), nPos, nLen);
- rtl::OUStringBuffer aTokenValue;
- copyToLimiter(rCandidate, sal_Unicode(')'), nPos, aTokenValue, nLen);
- skip_char(rCandidate, sal_Unicode(' '), sal_Unicode(')'), nPos, nLen);
- rURL = aTokenValue.makeStringAndClear();
+ /// Url is copied to rURL, but needs to be solved outside this helper
return false;
}
else if(rCandidate.match(aStrCurrentColor, 0))
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtrefnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtrefnode.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtrefnode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtrefnode.cxx Fri Dec 9 12:07:02 2011
@@ -31,21 +31,12 @@ namespace svgio
{
namespace svgreader
{
- void SvgTrefNode::tryToFindLink()
- {
- if(!mpXLink && maXLink.getLength())
- {
- mpXLink = dynamic_cast< const SvgTextNode* >(getDocument().findSvgNodeById(maXLink));
- }
- }
-
SvgTrefNode::SvgTrefNode(
SvgDocument& rDocument,
SvgNode* pParent)
: SvgNode(SVGTokenTref, rDocument, pParent),
maSvgStyleAttributes(*this),
- maXLink(),
- mpXLink(0)
+ maXLink()
{
}
@@ -81,7 +72,6 @@ namespace svgio
if(nLen && sal_Unicode('#') == aContent[0])
{
maXLink = aContent.copy(1);
- tryToFindLink();
}
break;
}
@@ -90,9 +80,7 @@ namespace svgio
const SvgTextNode* SvgTrefNode::getReferencedSvgTextNode() const
{
- const_cast< SvgTrefNode* >(this)->tryToFindLink();
-
- return mpXLink;
+ return dynamic_cast< const SvgTextNode* >(getDocument().findSvgNodeById(maXLink));
}
} // end of namespace svgreader
Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx?rev=1212349&r1=1212348&r2=1212349&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx Fri Dec 9 12:07:02 2011
@@ -32,14 +32,6 @@ namespace svgio
{
namespace svgreader
{
- void SvgUseNode::tryToFindLink()
- {
- if(!mpXLink && maXLink.getLength())
- {
- mpXLink = getDocument().findSvgNodeById(maXLink);
- }
- }
-
SvgUseNode::SvgUseNode(
SvgDocument& rDocument,
SvgNode* pParent)
@@ -50,8 +42,7 @@ namespace svgio
maY(),
maWidth(),
maHeight(),
- maXLink(),
- mpXLink(0)
+ maXLink()
{
}
@@ -143,7 +134,6 @@ namespace svgio
if(nLen && sal_Unicode('#') == aContent[0])
{
maXLink = aContent.copy(1);
- tryToFindLink();
}
break;
}
@@ -153,7 +143,7 @@ namespace svgio
void SvgUseNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DVector& rTarget, bool bReferenced) const
{
// try to access link to content
- const_cast< SvgUseNode* >(this)->tryToFindLink();
+ const SvgNode* mpXLink = getDocument().findSvgNodeById(maXLink);
if(mpXLink)
{