Kaydet (Commit) b7a425aa authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Caolán McNamara

Resolves: #i121801# Corrected handling of gradient transformations

(cherry picked from commit 4f49f1d9)

Conflicts:
	drawinglayer/inc/drawinglayer/primitive2d/svggradientprimitive2d.hxx
	svgio/source/svgreader/svgnode.cxx
	svgio/source/svgreader/svgstyleattributes.cxx

Change-Id: I155854692a9d1771826867d2666fc6174e2c9256
üst 821446a0
...@@ -280,12 +280,14 @@ namespace drawinglayer ...@@ -280,12 +280,14 @@ namespace drawinglayer
} }
SvgGradientHelper::SvgGradientHelper( SvgGradientHelper::SvgGradientHelper(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries, const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart, const basegfx::B2DPoint& rStart,
bool bUseUnitCoordinates, bool bUseUnitCoordinates,
SpreadMethod aSpreadMethod) SpreadMethod aSpreadMethod)
: maPolyPolygon(rPolyPolygon), : maGradientTransform(rGradientTransform),
maPolyPolygon(rPolyPolygon),
maGradientEntries(rGradientEntries), maGradientEntries(rGradientEntries),
maStart(rStart), maStart(rStart),
maSpreadMethod(aSpreadMethod), maSpreadMethod(aSpreadMethod),
...@@ -301,7 +303,8 @@ namespace drawinglayer ...@@ -301,7 +303,8 @@ namespace drawinglayer
{ {
const SvgGradientHelper& rCompare = static_cast< const SvgGradientHelper& >(rSvgGradientHelper); const SvgGradientHelper& rCompare = static_cast< const SvgGradientHelper& >(rSvgGradientHelper);
return (getPolyPolygon() == rCompare.getPolyPolygon() return (getGradientTransform() == rCompare.getGradientTransform()
&& getPolyPolygon() == rCompare.getPolyPolygon()
&& getGradientEntries() == rCompare.getGradientEntries() && getGradientEntries() == rCompare.getGradientEntries()
&& getStart() == rCompare.getStart() && getStart() == rCompare.getStart()
&& getUseUnitCoordinates() == rCompare.getUseUnitCoordinates() && getUseUnitCoordinates() == rCompare.getUseUnitCoordinates()
...@@ -427,6 +430,11 @@ namespace drawinglayer ...@@ -427,6 +430,11 @@ namespace drawinglayer
aUnitGradientToObject.translate(aStart.getX(), aStart.getY()); aUnitGradientToObject.translate(aStart.getX(), aStart.getY());
} }
if(!getGradientTransform().isIdentity())
{
aUnitGradientToObject = getGradientTransform() * aUnitGradientToObject;
}
// create inverse from it // create inverse from it
basegfx::B2DHomMatrix aObjectToUnitGradient(aUnitGradientToObject); basegfx::B2DHomMatrix aObjectToUnitGradient(aUnitGradientToObject);
aObjectToUnitGradient.invert(); aObjectToUnitGradient.invert();
...@@ -545,6 +553,7 @@ namespace drawinglayer ...@@ -545,6 +553,7 @@ namespace drawinglayer
} }
SvgLinearGradientPrimitive2D::SvgLinearGradientPrimitive2D( SvgLinearGradientPrimitive2D::SvgLinearGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries, const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart, const basegfx::B2DPoint& rStart,
...@@ -552,7 +561,7 @@ namespace drawinglayer ...@@ -552,7 +561,7 @@ namespace drawinglayer
bool bUseUnitCoordinates, bool bUseUnitCoordinates,
SpreadMethod aSpreadMethod) SpreadMethod aSpreadMethod)
: BufferedDecompositionPrimitive2D(), : BufferedDecompositionPrimitive2D(),
SvgGradientHelper(rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod), SvgGradientHelper(rGradientTransform, rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod),
maEnd(rEnd) maEnd(rEnd)
{ {
} }
...@@ -748,6 +757,8 @@ namespace drawinglayer ...@@ -748,6 +757,8 @@ namespace drawinglayer
else else
{ {
// interpret in object coordinate system -> object aspect ratio will not scale result // 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 double fRadius((aObjectTransform * basegfx::B2DVector(getRadius(), 0.0)).getLength());
const basegfx::B2DPoint aStart(aObjectTransform * getStart()); const basegfx::B2DPoint aStart(aObjectTransform * getStart());
...@@ -755,6 +766,11 @@ namespace drawinglayer ...@@ -755,6 +766,11 @@ namespace drawinglayer
aUnitGradientToObject.translate(aStart.getX(), aStart.getY()); aUnitGradientToObject.translate(aStart.getX(), aStart.getY());
} }
if(!getGradientTransform().isIdentity())
{
aUnitGradientToObject = getGradientTransform() * aUnitGradientToObject;
}
// create inverse from it // create inverse from it
basegfx::B2DHomMatrix aObjectToUnitGradient(aUnitGradientToObject); basegfx::B2DHomMatrix aObjectToUnitGradient(aUnitGradientToObject);
aObjectToUnitGradient.invert(); aObjectToUnitGradient.invert();
...@@ -822,6 +838,7 @@ namespace drawinglayer ...@@ -822,6 +838,7 @@ namespace drawinglayer
} }
SvgRadialGradientPrimitive2D::SvgRadialGradientPrimitive2D( SvgRadialGradientPrimitive2D::SvgRadialGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries, const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart, const basegfx::B2DPoint& rStart,
...@@ -830,7 +847,7 @@ namespace drawinglayer ...@@ -830,7 +847,7 @@ namespace drawinglayer
SpreadMethod aSpreadMethod, SpreadMethod aSpreadMethod,
const basegfx::B2DPoint* pFocal) const basegfx::B2DPoint* pFocal)
: BufferedDecompositionPrimitive2D(), : BufferedDecompositionPrimitive2D(),
SvgGradientHelper(rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod), SvgGradientHelper(rGradientTransform, rPolyPolygon, rGradientEntries, rStart, bUseUnitCoordinates, aSpreadMethod),
mfRadius(fRadius), mfRadius(fRadius),
maFocal(rStart), maFocal(rStart),
maFocalVector(0.0, 0.0), maFocalVector(0.0, 0.0),
......
...@@ -93,6 +93,9 @@ namespace drawinglayer ...@@ -93,6 +93,9 @@ namespace drawinglayer
class SvgGradientHelper class SvgGradientHelper
{ {
private: private:
/// the extra gradient transform
basegfx::B2DHomMatrix maGradientTransform;
/// geometric definition, the geometry to be filled /// geometric definition, the geometry to be filled
basegfx::B2DPolyPolygon maPolyPolygon; basegfx::B2DPolyPolygon maPolyPolygon;
...@@ -147,6 +150,7 @@ namespace drawinglayer ...@@ -147,6 +150,7 @@ namespace drawinglayer
public: public:
/// constructor /// constructor
SvgGradientHelper( SvgGradientHelper(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries, const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart, const basegfx::B2DPoint& rStart,
...@@ -155,6 +159,7 @@ namespace drawinglayer ...@@ -155,6 +159,7 @@ namespace drawinglayer
virtual ~SvgGradientHelper() {} virtual ~SvgGradientHelper() {}
/// data read access /// data read access
const basegfx::B2DHomMatrix& getGradientTransform() const { return maGradientTransform; }
const basegfx::B2DPolyPolygon& getPolyPolygon() const { return maPolyPolygon; } const basegfx::B2DPolyPolygon& getPolyPolygon() const { return maPolyPolygon; }
const SvgGradientEntryVector& getGradientEntries() const { return maGradientEntries; } const SvgGradientEntryVector& getGradientEntries() const { return maGradientEntries; }
const basegfx::B2DPoint& getStart() const { return maStart; } const basegfx::B2DPoint& getStart() const { return maStart; }
...@@ -197,6 +202,7 @@ namespace drawinglayer ...@@ -197,6 +202,7 @@ namespace drawinglayer
public: public:
/// constructor /// constructor
SvgLinearGradientPrimitive2D( SvgLinearGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries, const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart, const basegfx::B2DPoint& rStart,
...@@ -265,6 +271,7 @@ namespace drawinglayer ...@@ -265,6 +271,7 @@ namespace drawinglayer
public: public:
/// constructor /// constructor
SvgRadialGradientPrimitive2D( SvgRadialGradientPrimitive2D(
const basegfx::B2DHomMatrix& rGradientTransform,
const basegfx::B2DPolyPolygon& rPolyPolygon, const basegfx::B2DPolyPolygon& rPolyPolygon,
const SvgGradientEntryVector& rGradientEntries, const SvgGradientEntryVector& rGradientEntries,
const basegfx::B2DPoint& rStart, const basegfx::B2DPoint& rStart,
......
...@@ -79,6 +79,11 @@ namespace svgio ...@@ -79,6 +79,11 @@ namespace svgio
Display_inherit 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 class SvgNode : private boost::noncopyable, public InfoProvider
{ {
private: private:
......
...@@ -90,7 +90,7 @@ namespace svgio ...@@ -90,7 +90,7 @@ namespace svgio
{ {
const double fOpacity(pStyle->getOpacity().getNumber()); const double fOpacity(pStyle->getOpacity().getNumber());
if(fOpacity > 0.0) if(fOpacity > 0.0 && Display_none != getDisplay())
{ {
drawinglayer::primitive2d::Primitive2DSequence aContent; drawinglayer::primitive2d::Primitive2DSequence aContent;
......
...@@ -219,45 +219,7 @@ namespace svgio ...@@ -219,45 +219,7 @@ namespace svgio
} }
} }
void SvgNode::parseAttribute(const OUString& /*rTokenName*/, SVGToken aSVGToken, const OUString& aContent) Display getDisplayFromContent(const rtl::OUString& aContent)
{
switch(aSVGToken)
{
case SVGTokenId:
{
if(aContent.getLength())
{
setId(&aContent);
}
break;
}
case SVGTokenClass:
{
if(aContent.getLength())
{
setClass(&aContent);
}
break;
}
case SVGTokenXmlSpace:
{
if(aContent.getLength())
{
static OUString aStrDefault(OUString::createFromAscii("default"));
static OUString aStrPreserve(OUString::createFromAscii("preserve"));
if(aContent.match(aStrDefault))
{
setXmlSpace(XmlSpace_default);
}
else if(aContent.match(aStrPreserve))
{
setXmlSpace(XmlSpace_preserve);
}
}
break;
}
case SVGTokenDisplay:
{ {
if(aContent.getLength()) if(aContent.getLength())
{ {
...@@ -282,76 +244,125 @@ namespace svgio ...@@ -282,76 +244,125 @@ namespace svgio
if(aContent.match(aStrInline)) if(aContent.match(aStrInline))
{ {
setDisplay(Display_inline); return Display_inline;
} }
else if(aContent.match(aStrNone)) else if(aContent.match(aStrNone))
{ {
setDisplay(Display_none); return Display_none;
} }
else if(aContent.match(aStrInherit)) else if(aContent.match(aStrInherit))
{ {
setDisplay(Display_inherit); return Display_inherit;
} }
else if(aContent.match(aStrBlock)) else if(aContent.match(aStrBlock))
{ {
setDisplay(Display_block); return Display_block;
} }
else if(aContent.match(aStrList_item)) else if(aContent.match(aStrList_item))
{ {
setDisplay(Display_list_item); return Display_list_item;
} }
else if(aContent.match(aStrRun_in)) else if(aContent.match(aStrRun_in))
{ {
setDisplay(Display_run_in); return Display_run_in;
} }
else if(aContent.match(aStrCompact)) else if(aContent.match(aStrCompact))
{ {
setDisplay(Display_compact); return Display_compact;
} }
else if(aContent.match(aStrMarker)) else if(aContent.match(aStrMarker))
{ {
setDisplay(Display_marker); return Display_marker;
} }
else if(aContent.match(aStrTable)) else if(aContent.match(aStrTable))
{ {
setDisplay(Display_table); return Display_table;
} }
else if(aContent.match(aStrInline_table)) else if(aContent.match(aStrInline_table))
{ {
setDisplay(Display_inline_table); return Display_inline_table;
} }
else if(aContent.match(aStrTable_row_group)) else if(aContent.match(aStrTable_row_group))
{ {
setDisplay(Display_table_row_group); return Display_table_row_group;
} }
else if(aContent.match(aStrTable_header_group)) else if(aContent.match(aStrTable_header_group))
{ {
setDisplay(Display_table_header_group); return Display_table_header_group;
} }
else if(aContent.match(aStrTable_footer_group)) else if(aContent.match(aStrTable_footer_group))
{ {
setDisplay(Display_table_footer_group); return Display_table_footer_group;
} }
else if(aContent.match(aStrTable_row)) else if(aContent.match(aStrTable_row))
{ {
setDisplay(Display_table_row); return Display_table_row;
} }
else if(aContent.match(aStrTable_column_group)) else if(aContent.match(aStrTable_column_group))
{ {
setDisplay(Display_table_column_group); return Display_table_column_group;
} }
else if(aContent.match(aStrTable_column)) else if(aContent.match(aStrTable_column))
{ {
setDisplay(Display_table_column); return Display_table_column;
} }
else if(aContent.match(aStrTable_cell)) else if(aContent.match(aStrTable_cell))
{ {
setDisplay(Display_table_cell); return Display_table_cell;
} }
else if(aContent.match(aStrTable_caption)) else if(aContent.match(aStrTable_caption))
{ {
setDisplay(Display_table_caption); return Display_table_caption;
}
} }
// return the default
return Display_inline;
}
void SvgNode::parseAttribute(const OUString& /*rTokenName*/, SVGToken aSVGToken, const OUString& aContent)
{
switch(aSVGToken)
{
case SVGTokenId:
{
if(aContent.getLength())
{
setId(&aContent);
}
break;
}
case SVGTokenClass:
{
if(aContent.getLength())
{
setClass(&aContent);
}
break;
}
case SVGTokenXmlSpace:
{
if(aContent.getLength())
{
static OUString aStrDefault(OUString::createFromAscii("default"));
static OUString aStrPreserve(OUString::createFromAscii("preserve"));
if(aContent.match(aStrDefault))
{
setXmlSpace(XmlSpace_default);
}
else if(aContent.match(aStrPreserve))
{
setXmlSpace(XmlSpace_preserve);
}
}
break;
}
case SVGTokenDisplay:
{
if(aContent.getLength())
{
setDisplay(getDisplayFromContent(aContent));
} }
break; break;
} }
......
...@@ -309,10 +309,11 @@ namespace svgio ...@@ -309,10 +309,11 @@ namespace svgio
if(!aSvgGradientEntryVector.empty()) if(!aSvgGradientEntryVector.empty())
{ {
basegfx::B2DHomMatrix aGeoToUnit; basegfx::B2DHomMatrix aGeoToUnit;
basegfx::B2DHomMatrix aGradientTransform;
if(rFillGradient.getGradientTransform()) if(rFillGradient.getGradientTransform())
{ {
aGeoToUnit = *rFillGradient.getGradientTransform(); aGradientTransform = *rFillGradient.getGradientTransform();
} }
if(userSpaceOnUse == rFillGradient.getGradientUnits()) if(userSpaceOnUse == rFillGradient.getGradientUnits())
...@@ -357,6 +358,7 @@ namespace svgio ...@@ -357,6 +358,7 @@ namespace svgio
drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence( drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(
rTarget, rTarget,
new drawinglayer::primitive2d::SvgLinearGradientPrimitive2D( new drawinglayer::primitive2d::SvgLinearGradientPrimitive2D(
aGradientTransform,
rPath, rPath,
aSvgGradientEntryVector, aSvgGradientEntryVector,
aStart, aStart,
...@@ -418,6 +420,7 @@ namespace svgio ...@@ -418,6 +420,7 @@ namespace svgio
drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence( drawinglayer::primitive2d::appendPrimitive2DReferenceToPrimitive2DSequence(
rTarget, rTarget,
new drawinglayer::primitive2d::SvgRadialGradientPrimitive2D( new drawinglayer::primitive2d::SvgRadialGradientPrimitive2D(
aGradientTransform,
rPath, rPath,
aSvgGradientEntryVector, aSvgGradientEntryVector,
aStart, aStart,
...@@ -1779,6 +1782,18 @@ namespace svgio ...@@ -1779,6 +1782,18 @@ namespace svgio
readLocalUrl(aContent, maMarkerEndXLink); readLocalUrl(aContent, maMarkerEndXLink);
break; 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: default:
{ {
break; 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