Kaydet (Commit) 4f49f1d9 authored tarafından Armin Le Grand's avatar Armin Le Grand

i121801 Corrected handling of gradient transformations

üst 58d20429
......@@ -95,6 +95,9 @@ namespace drawinglayer
class SvgGradientHelper
{
private:
/// the extra gradient transform
basegfx::B2DHomMatrix maGradientTransform;
/// geometric definition, the geometry to be filled
basegfx::B2DPolyPolygon maPolyPolygon;
......@@ -149,6 +152,7 @@ namespace drawinglayer
public:
/// constructor
SvgGradientHelper(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart,
......@@ -156,6 +160,7 @@ namespace drawinglayer
SpreadMethod aSpreadMethod = Spread_pad);
/// data read access
const basegfx::B2DHomMatrix& getGradientTransform() const { return maGradientTransform; }
const basegfx::B2DPolyPolygon& getPolyPolygon() const { return maPolyPolygon; }
const SvgGradientEntryVector& getGradientEntries() const { return maGradientEntries; }
const basegfx::B2DPoint& getStart() const { return maStart; }
......@@ -198,6 +203,7 @@ namespace drawinglayer
public:
/// constructor
SvgLinearGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart,
......@@ -266,6 +272,7 @@ namespace drawinglayer
public:
/// constructor
SvgRadialGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart,
......
......@@ -285,12 +285,14 @@ namespace drawinglayer
}
SvgGradientHelper::SvgGradientHelper(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart,
bool bUseUnitCoordinates,
SpreadMethod aSpreadMethod)
: maPolyPolygon(rPolyPolygon),
: maGradientTransform(rGradientTransform),
maPolyPolygon(rPolyPolygon),
maGradientEntries(rGradientEntries),
maStart(rStart),
maSpreadMethod(aSpreadMethod),
......@@ -306,7 +308,8 @@ namespace drawinglayer
{
const SvgGradientHelper& rCompare = static_cast< const SvgGradientHelper& >(rSvgGradientHelper);
return (getPolyPolygon() == rCompare.getPolyPolygon()
return (getGradientTransform() == rCompare.getGradientTransform()
&& getPolyPolygon() == rCompare.getPolyPolygon()
&& getGradientEntries() == rCompare.getGradientEntries()
&& getStart() == rCompare.getStart()
&& getUseUnitCoordinates() == rCompare.getUseUnitCoordinates()
......@@ -432,6 +435,11 @@ namespace drawinglayer
aUnitGradientToObject.translate(aStart.getX(), aStart.getY());
}
if(!getGradientTransform().isIdentity())
{
aUnitGradientToObject = getGradientTransform() * aUnitGradientToObject;
}
// create inverse from it
basegfx::B2DHomMatrix aObjectToUnitGradient(aUnitGradientToObject);
aObjectToUnitGradient.invert();
......@@ -550,6 +558,7 @@ namespace drawinglayer
}
SvgLinearGradientPrimitive2D::SvgLinearGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart,
......@@ -557,7 +566,7 @@ namespace drawinglayer
bool bUseUnitCoordinates,
SpreadMethod aSpreadMethod)
: BufferedDecompositionPrimitive2D(),
SvgGradientHelper(rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod),
SvgGradientHelper(rGradientTransform, rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod),
maEnd(rEnd)
{
}
......@@ -753,6 +762,8 @@ namespace drawinglayer
else
{
// interpret in object coordinate system -> object aspect ratio will not scale result
// use X-Axis with radius, it was already made relative to object width when coming from
// SVG import
const double fRadius((aObjectTransform * basegfx::B2DVector(getRadius(), 0.0)).getLength());
const basegfx::B2DPoint aStart(aObjectTransform * getStart());
......@@ -760,6 +771,11 @@ namespace drawinglayer
aUnitGradientToObject.translate(aStart.getX(), aStart.getY());
}
if(!getGradientTransform().isIdentity())
{
aUnitGradientToObject = getGradientTransform() * aUnitGradientToObject;
}
// create inverse from it
basegfx::B2DHomMatrix aObjectToUnitGradient(aUnitGradientToObject);
aObjectToUnitGradient.invert();
......@@ -827,6 +843,7 @@ namespace drawinglayer
}
SvgRadialGradientPrimitive2D::SvgRadialGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart,
......@@ -835,7 +852,7 @@ namespace drawinglayer
SpreadMethod aSpreadMethod,
const basegfx::B2DPoint* pFocal)
: BufferedDecompositionPrimitive2D(),
SvgGradientHelper(rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod),
SvgGradientHelper(rGradientTransform, rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod),
mfRadius(fRadius),
maFocal(rStart),
maFocalVector(0.0, 0.0),
......
......@@ -82,6 +82,11 @@ namespace svgio
Display_inherit
};
// helper to convert a string associated with a token of type SVGTokenDisplay
// to the enum Display. Empty trings return the default 'Display_inline' with
// which members should be initialized
Display getDisplayFromContent(const rtl::OUString& aContent);
class SvgNode : private boost::noncopyable, public InfoProvider
{
private:
......
......@@ -96,7 +96,7 @@ namespace svgio
{
const double fOpacity(pStyle->getOpacity().getNumber());
if(fOpacity > 0.0)
if(fOpacity > 0.0 && Display_none != getDisplay())
{
drawinglayer::primitive2d::Primitive2DSequence aContent;
......
......@@ -318,10 +318,11 @@ namespace svgio
if(!aSvgGradientEntryVector.empty())
{
basegfx::B2DHomMatrix aGeoToUnit;
basegfx::B2DHomMatrix aGradientTransform;
if(rFillGradient.getGradientTransform())
{
aGeoToUnit = *rFillGradient.getGradientTransform();
aGradientTransform = *rFillGradient.getGradientTransform();
}
if(userSpaceOnUse == rFillGradient.getGradientUnits())
......@@ -366,6 +367,7 @@ namespace svgio
drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(
rTarget,
new drawinglayer::primitive2d::SvgLinearGradientPrimitive2D(
aGradientTransform,
rPath,
aSvgGradientEntryVector,
aStart,
......@@ -427,6 +429,7 @@ namespace svgio
drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(
rTarget,
new drawinglayer::primitive2d::SvgRadialGradientPrimitive2D(
aGradientTransform,
rPath,
aSvgGradientEntryVector,
aStart,
......@@ -1184,7 +1187,7 @@ namespace svgio
{
}
void SvgStyleAttributes::parseStyleAttribute(const rtl::OUString& /*rTokenName*/, SVGToken aSVGToken, const rtl::OUString& aContent)
void SvgStyleAttributes::parseStyleAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent)
{
switch(aSVGToken)
{
......@@ -1788,6 +1791,18 @@ namespace svgio
readLocalUrl(aContent, maMarkerEndXLink);
break;
}
case SVGTokenDisplay:
{
// There may be display:none statements inside of style defines, e.g. the following line:
// style="display:none"
// taken from a svg example; this needs to be parsed and set at the owning node. Do not call
// mrOwner.parseAttribute(...) here, this would lead to a recursion
if(aContent.getLength())
{
mrOwner.setDisplay(getDisplayFromContent(aContent));
}
break;
}
default:
{
break;
......
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