Author: alg
Date: Wed May 15 08:47:52 2013
New Revision: 1482726
URL: http://svn.apache.org/r1482726
Log:
i121801 Corrected handling of gradient transformations
Modified:
openoffice/trunk/main/drawinglayer/inc/drawinglayer/primitive2d/svggradientprimitive2d.hxx
openoffice/trunk/main/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx
openoffice/trunk/main/svgio/source/svgreader/svggnode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx
openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx
Modified:
openoffice/trunk/main/drawinglayer/inc/drawinglayer/primitive2d/svggradientprimitive2d.hxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/drawinglayer/inc/drawinglayer/primitive2d/svggradientprimitive2d.hxx?rev=1482726&r1=1482725&r2=1482726&view=diff
==============================================================================
---
openoffice/trunk/main/drawinglayer/inc/drawinglayer/primitive2d/svggradientprimitive2d.hxx
(original)
+++
openoffice/trunk/main/drawinglayer/inc/drawinglayer/primitive2d/svggradientprimitive2d.hxx
Wed May 15 08:47:52 2013
@@ -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,
Modified:
openoffice/trunk/main/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx?rev=1482726&r1=1482725&r2=1482726&view=diff
==============================================================================
---
openoffice/trunk/main/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
(original)
+++
openoffice/trunk/main/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
Wed May 15 08:47:52 2013
@@ -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),
Modified: openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx?rev=1482726&r1=1482725&r2=1482726&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx (original)
+++ openoffice/trunk/main/svgio/inc/svgio/svgreader/svgnode.hxx Wed May 15
08:47:52 2013
@@ -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:
Modified: openoffice/trunk/main/svgio/source/svgreader/svggnode.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svggnode.cxx?rev=1482726&r1=1482725&r2=1482726&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/source/svgreader/svggnode.cxx (original)
+++ openoffice/trunk/main/svgio/source/svgreader/svggnode.cxx Wed May 15
08:47:52 2013
@@ -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;
Modified: openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx?rev=1482726&r1=1482725&r2=1482726&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx (original)
+++ openoffice/trunk/main/svgio/source/svgreader/svgnode.cxx Wed May 15
08:47:52 2013
@@ -194,6 +194,107 @@ namespace svgio
}
}
+ Display getDisplayFromContent(const rtl::OUString& aContent)
+ {
+ if(aContent.getLength())
+ {
+ static rtl::OUString
aStrInline(rtl::OUString::createFromAscii("inline"));
+ static rtl::OUString
aStrBlock(rtl::OUString::createFromAscii("block"));
+ static rtl::OUString
aStrList_item(rtl::OUString::createFromAscii("list-item"));
+ static rtl::OUString
aStrRun_in(rtl::OUString::createFromAscii("run-in"));
+ static rtl::OUString
aStrCompact(rtl::OUString::createFromAscii("compact"));
+ static rtl::OUString
aStrMarker(rtl::OUString::createFromAscii("marker"));
+ static rtl::OUString
aStrTable(rtl::OUString::createFromAscii("table"));
+ static rtl::OUString
aStrInline_table(rtl::OUString::createFromAscii("inline-table"));
+ static rtl::OUString
aStrTable_row_group(rtl::OUString::createFromAscii("table-row-group"));
+ static rtl::OUString
aStrTable_header_group(rtl::OUString::createFromAscii("table-header-group"));
+ static rtl::OUString
aStrTable_footer_group(rtl::OUString::createFromAscii("table-footer-group"));
+ static rtl::OUString
aStrTable_row(rtl::OUString::createFromAscii("table-row"));
+ static rtl::OUString
aStrTable_column_group(rtl::OUString::createFromAscii("table-column-group"));
+ static rtl::OUString
aStrTable_column(rtl::OUString::createFromAscii("table-column"));
+ static rtl::OUString
aStrTable_cell(rtl::OUString::createFromAscii("table-cell"));
+ static rtl::OUString
aStrTable_caption(rtl::OUString::createFromAscii("table-caption"));
+ static rtl::OUString
aStrNone(rtl::OUString::createFromAscii("none"));
+ static rtl::OUString
aStrInherit(rtl::OUString::createFromAscii("inherit"));
+
+ if(aContent.match(aStrInline))
+ {
+ return Display_inline;
+ }
+ else if(aContent.match(aStrNone))
+ {
+ return Display_none;
+ }
+ else if(aContent.match(aStrInherit))
+ {
+ return Display_inherit;
+ }
+ else if(aContent.match(aStrBlock))
+ {
+ return Display_block;
+ }
+ else if(aContent.match(aStrList_item))
+ {
+ return Display_list_item;
+ }
+ else if(aContent.match(aStrRun_in))
+ {
+ return Display_run_in;
+ }
+ else if(aContent.match(aStrCompact))
+ {
+ return Display_compact;
+ }
+ else if(aContent.match(aStrMarker))
+ {
+ return Display_marker;
+ }
+ else if(aContent.match(aStrTable))
+ {
+ return Display_table;
+ }
+ else if(aContent.match(aStrInline_table))
+ {
+ return Display_inline_table;
+ }
+ else if(aContent.match(aStrTable_row_group))
+ {
+ return Display_table_row_group;
+ }
+ else if(aContent.match(aStrTable_header_group))
+ {
+ return Display_table_header_group;
+ }
+ else if(aContent.match(aStrTable_footer_group))
+ {
+ return Display_table_footer_group;
+ }
+ else if(aContent.match(aStrTable_row))
+ {
+ return Display_table_row;
+ }
+ else if(aContent.match(aStrTable_column_group))
+ {
+ return Display_table_column_group;
+ }
+ else if(aContent.match(aStrTable_column))
+ {
+ return Display_table_column;
+ }
+ else if(aContent.match(aStrTable_cell))
+ {
+ return Display_table_cell;
+ }
+ else if(aContent.match(aStrTable_caption))
+ {
+ return Display_table_caption;
+ }
+ }
+
+ // return the default
+ return Display_inline;
+ }
+
void SvgNode::parseAttribute(const rtl::OUString& /*rTokenName*/,
SVGToken aSVGToken, const rtl::OUString& aContent)
{
switch(aSVGToken)
@@ -236,97 +337,7 @@ namespace svgio
{
if(aContent.getLength())
{
- static rtl::OUString
aStrInline(rtl::OUString::createFromAscii("inline"));
- static rtl::OUString
aStrBlock(rtl::OUString::createFromAscii("block"));
- static rtl::OUString
aStrList_item(rtl::OUString::createFromAscii("list-item"));
- static rtl::OUString
aStrRun_in(rtl::OUString::createFromAscii("run-in"));
- static rtl::OUString
aStrCompact(rtl::OUString::createFromAscii("compact"));
- static rtl::OUString
aStrMarker(rtl::OUString::createFromAscii("marker"));
- static rtl::OUString
aStrTable(rtl::OUString::createFromAscii("table"));
- static rtl::OUString
aStrInline_table(rtl::OUString::createFromAscii("inline-table"));
- static rtl::OUString
aStrTable_row_group(rtl::OUString::createFromAscii("table-row-group"));
- static rtl::OUString
aStrTable_header_group(rtl::OUString::createFromAscii("table-header-group"));
- static rtl::OUString
aStrTable_footer_group(rtl::OUString::createFromAscii("table-footer-group"));
- static rtl::OUString
aStrTable_row(rtl::OUString::createFromAscii("table-row"));
- static rtl::OUString
aStrTable_column_group(rtl::OUString::createFromAscii("table-column-group"));
- static rtl::OUString
aStrTable_column(rtl::OUString::createFromAscii("table-column"));
- static rtl::OUString
aStrTable_cell(rtl::OUString::createFromAscii("table-cell"));
- static rtl::OUString
aStrTable_caption(rtl::OUString::createFromAscii("table-caption"));
- static rtl::OUString
aStrNone(rtl::OUString::createFromAscii("none"));
- static rtl::OUString
aStrInherit(rtl::OUString::createFromAscii("inherit"));
-
- if(aContent.match(aStrInline))
- {
- setDisplay(Display_inline);
- }
- else if(aContent.match(aStrNone))
- {
- setDisplay(Display_none);
- }
- else if(aContent.match(aStrInherit))
- {
- setDisplay(Display_inherit);
- }
- else if(aContent.match(aStrBlock))
- {
- setDisplay(Display_block);
- }
- else if(aContent.match(aStrList_item))
- {
- setDisplay(Display_list_item);
- }
- else if(aContent.match(aStrRun_in))
- {
- setDisplay(Display_run_in);
- }
- else if(aContent.match(aStrCompact))
- {
- setDisplay(Display_compact);
- }
- else if(aContent.match(aStrMarker))
- {
- setDisplay(Display_marker);
- }
- else if(aContent.match(aStrTable))
- {
- setDisplay(Display_table);
- }
- else if(aContent.match(aStrInline_table))
- {
- setDisplay(Display_inline_table);
- }
- else if(aContent.match(aStrTable_row_group))
- {
- setDisplay(Display_table_row_group);
- }
- else if(aContent.match(aStrTable_header_group))
- {
- setDisplay(Display_table_header_group);
- }
- else if(aContent.match(aStrTable_footer_group))
- {
- setDisplay(Display_table_footer_group);
- }
- else if(aContent.match(aStrTable_row))
- {
- setDisplay(Display_table_row);
- }
- else if(aContent.match(aStrTable_column_group))
- {
- setDisplay(Display_table_column_group);
- }
- else if(aContent.match(aStrTable_column))
- {
- setDisplay(Display_table_column);
- }
- else if(aContent.match(aStrTable_cell))
- {
- setDisplay(Display_table_cell);
- }
- else if(aContent.match(aStrTable_caption))
- {
- setDisplay(Display_table_caption);
- }
+ setDisplay(getDisplayFromContent(aContent));
}
break;
}
Modified: openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx?rev=1482726&r1=1482725&r2=1482726&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx
(original)
+++ openoffice/trunk/main/svgio/source/svgreader/svgstyleattributes.cxx Wed May
15 08:47:52 2013
@@ -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;