Kaydet (Commit) 199eb760 authored tarafından Oliver-Rainer Wittmann's avatar Oliver-Rainer Wittmann Kaydeden (comit) Caolán McNamara

Related: #i122600# access memory problem in SvgSvgNode::getCurrentViewPort

(cherry picked from commit d41dc0bb)

Conflicts:
	svgio/inc/svgio/svgreader/svgnode.hxx
	svgio/inc/svgio/svgreader/svgtools.hxx

Change-Id: Ie4d5cd29461845edb5b8a57fe639302947d80ebd
üst 172c3752
...@@ -71,7 +71,7 @@ namespace svgio ...@@ -71,7 +71,7 @@ namespace svgio
const drawinglayer::primitive2d::Primitive2DSequence& getMarkerPrimitives() const; const drawinglayer::primitive2d::Primitive2DSequence& getMarkerPrimitives() const;
/// InfoProvider support for % values /// InfoProvider support for % values
virtual const basegfx::B2DRange* getCurrentViewPort() const; virtual const basegfx::B2DRange getCurrentViewPort() const;
/// viewBox content /// viewBox content
const basegfx::B2DRange* getViewBox() const { return mpViewBox; } const basegfx::B2DRange* getViewBox() const { return mpViewBox; }
......
...@@ -134,7 +134,7 @@ namespace svgio ...@@ -134,7 +134,7 @@ namespace svgio
const SvgNodeVector& getChildren() const { return maChildren; } const SvgNodeVector& getChildren() const { return maChildren; }
/// InfoProvider support for %, em and ex values /// InfoProvider support for %, em and ex values
virtual const basegfx::B2DRange* getCurrentViewPort() const SAL_OVERRIDE; virtual const basegfx::B2DRange getCurrentViewPort() const SAL_OVERRIDE;
virtual double getCurrentFontSizeInherited() const SAL_OVERRIDE; virtual double getCurrentFontSizeInherited() const SAL_OVERRIDE;
virtual double getCurrentXHeightInherited() const SAL_OVERRIDE; virtual double getCurrentXHeightInherited() const SAL_OVERRIDE;
......
...@@ -74,7 +74,7 @@ namespace svgio ...@@ -74,7 +74,7 @@ namespace svgio
const drawinglayer::primitive2d::Primitive2DSequence& getPatternPrimitives() const; const drawinglayer::primitive2d::Primitive2DSequence& getPatternPrimitives() const;
/// InfoProvider support for % values /// InfoProvider support for % values
virtual const basegfx::B2DRange* getCurrentViewPort() const; virtual const basegfx::B2DRange getCurrentViewPort() const;
/// viewBox content /// viewBox content
const basegfx::B2DRange* getViewBox() const; const basegfx::B2DRange* getViewBox() const;
......
...@@ -62,7 +62,7 @@ namespace svgio ...@@ -62,7 +62,7 @@ namespace svgio
// The returned 'CurrentViewPort' is the viewport as it is set by this svg element // The returned 'CurrentViewPort' is the viewport as it is set by this svg element
// and as it is needed to resolve relative values in childs // and as it is needed to resolve relative values in childs
// The method does not check for invalid width and height // The method does not check for invalid width and height
virtual const basegfx::B2DRange* getCurrentViewPort() const; virtual const basegfx::B2DRange getCurrentViewPort() const;
/// viewBox content /// viewBox content
const basegfx::B2DRange* getViewBox() const { return mpViewBox; } const basegfx::B2DRange* getViewBox() const { return mpViewBox; }
......
...@@ -66,7 +66,7 @@ namespace svgio ...@@ -66,7 +66,7 @@ namespace svgio
{ {
public: public:
virtual ~InfoProvider() {} virtual ~InfoProvider() {}
virtual const basegfx::B2DRange* getCurrentViewPort() const = 0; virtual const basegfx::B2DRange getCurrentViewPort() const = 0;
/// return font size of node inherited from parents /// return font size of node inherited from parents
virtual double getCurrentFontSizeInherited() const = 0; virtual double getCurrentFontSizeInherited() const = 0;
/// return xheight of node inherited from parents /// return xheight of node inherited from parents
......
...@@ -190,11 +190,11 @@ namespace svgio ...@@ -190,11 +190,11 @@ namespace svgio
return aPrimitives; return aPrimitives;
} }
const basegfx::B2DRange* SvgMarkerNode::getCurrentViewPort() const const basegfx::B2DRange SvgMarkerNode::getCurrentViewPort() const
{ {
if(getViewBox()) if(getViewBox())
{ {
return getViewBox(); return *(getViewBox());
} }
else else
{ {
......
...@@ -479,7 +479,7 @@ namespace svgio ...@@ -479,7 +479,7 @@ namespace svgio
} }
} }
const basegfx::B2DRange* SvgNode::getCurrentViewPort() const const basegfx::B2DRange SvgNode::getCurrentViewPort() const
{ {
if(getParent()) if(getParent())
{ {
...@@ -487,7 +487,7 @@ namespace svgio ...@@ -487,7 +487,7 @@ namespace svgio
} }
else else
{ {
return 0; return basegfx::B2DRange(); // return empty B2DRange
} }
} }
......
...@@ -287,11 +287,11 @@ namespace svgio ...@@ -287,11 +287,11 @@ namespace svgio
return aPrimitives; return aPrimitives;
} }
const basegfx::B2DRange* SvgPatternNode::getCurrentViewPort() const const basegfx::B2DRange SvgPatternNode::getCurrentViewPort() const
{ {
if(getViewBox()) if(getViewBox())
{ {
return getViewBox(); return *(getViewBox());
} }
else else
{ {
......
...@@ -600,11 +600,11 @@ namespace svgio ...@@ -600,11 +600,11 @@ namespace svgio
} }
} }
const basegfx::B2DRange* SvgSvgNode::getCurrentViewPort() const const basegfx::B2DRange SvgSvgNode::getCurrentViewPort() const
{ {
if(getViewBox()) if(getViewBox())
{ {
return getViewBox(); return *(getViewBox());
} }
else // viewport should be given by x, y, width, and height else // viewport should be given by x, y, width, and height
{ {
...@@ -628,7 +628,7 @@ namespace svgio ...@@ -628,7 +628,7 @@ namespace svgio
if (bXIsAbsolute && bYIsAbsolute && bWidthIsAbsolute && bHeightIsAbsolute) if (bXIsAbsolute && bYIsAbsolute && bWidthIsAbsolute && bHeightIsAbsolute)
{ {
return &basegfx::B2DRange(fX, fY, fX+fW, fY+fH); return basegfx::B2DRange(fX, fY, fX+fW, fY+fH);
} }
else // try to resolve relative values else // try to resolve relative values
{ {
...@@ -671,7 +671,7 @@ namespace svgio ...@@ -671,7 +671,7 @@ namespace svgio
if (bXIsAbsolute && bYIsAbsolute && bWidthIsAbsolute && bHeightIsAbsolute) if (bXIsAbsolute && bYIsAbsolute && bWidthIsAbsolute && bHeightIsAbsolute)
{ {
return &basegfx::B2DRange(fX, fY, fX+fW, fY+fH); return basegfx::B2DRange(fX, fY, fX+fW, fY+fH);
} }
else // relative values could not be resolved, there exists no fallback else // relative values could not be resolved, there exists no fallback
{ {
...@@ -690,7 +690,7 @@ namespace svgio ...@@ -690,7 +690,7 @@ namespace svgio
double fH( bHeightIsAbsolute ? getHeight().solveNonPercentage(*this) : 0.0); double fH( bHeightIsAbsolute ? getHeight().solveNonPercentage(*this) : 0.0);
if (bWidthIsAbsolute && bHeightIsAbsolute) if (bWidthIsAbsolute && bHeightIsAbsolute)
{ {
return &basegfx::B2DRange(0.0, 0.0, fW, fH); return basegfx::B2DRange(0.0, 0.0, fW, fH);
} }
else // no fallback exists else // no fallback exists
{ {
......
...@@ -226,40 +226,39 @@ namespace svgio ...@@ -226,40 +226,39 @@ namespace svgio
case Unit_percent: case Unit_percent:
{ {
double fRetval(mfNumber * 0.01); double fRetval(mfNumber * 0.01);
const basegfx::B2DRange* pViewPort = rInfoProvider.getCurrentViewPort(); basegfx::B2DRange aViewPort = rInfoProvider.getCurrentViewPort();
if(!pViewPort) if ( aViewPort.isEmpty() )
{ {
#ifdef DBG_UTIL #ifdef DBG_UTIL
myAssert(rtl::OUString::createFromAscii("Design error, this case should have been handled in the caller")); myAssert(rtl::OUString::createFromAscii("Design error, this case should have been handled in the caller"));
#endif #endif
// no viewPort, assume a normal page size (A4) // no viewPort, assume a normal page size (A4)
static basegfx::B2DRange aDinA4Range( aViewPort = basegfx::B2DRange(
0.0, 0.0,
0.0, 0.0,
210.0 * F_SVG_PIXEL_PER_INCH / 2.54, 210.0 * F_SVG_PIXEL_PER_INCH / 2.54,
297.0 * F_SVG_PIXEL_PER_INCH / 2.54); 297.0 * F_SVG_PIXEL_PER_INCH / 2.54);
pViewPort = &aDinA4Range;
} }
if(pViewPort) if ( !aViewPort.isEmpty() )
{ {
if(xcoordinate == aNumberType) if(xcoordinate == aNumberType)
{ {
// it's a x-coordinate, relative to current width (w) // it's a x-coordinate, relative to current width (w)
fRetval *= pViewPort->getWidth(); fRetval *= aViewPort.getWidth();
} }
else if(ycoordinate == aNumberType) else if(ycoordinate == aNumberType)
{ {
// it's a y-coordinate, relative to current height (h) // it's a y-coordinate, relative to current height (h)
fRetval *= pViewPort->getHeight(); fRetval *= aViewPort.getHeight();
} }
else // length else // length
{ {
// it's a length, relative to sqrt(w*w + h*h)/sqrt(2) // it's a length, relative to sqrt(w*w + h*h)/sqrt(2)
const double fCurrentWidth(pViewPort->getWidth()); const double fCurrentWidth(aViewPort.getWidth());
const double fCurrentHeight(pViewPort->getHeight()); const double fCurrentHeight(aViewPort.getHeight());
const double fCurrentLength( const double fCurrentLength(
sqrt(fCurrentWidth * fCurrentWidth + fCurrentHeight * fCurrentHeight)/sqrt(2.0)); sqrt(fCurrentWidth * fCurrentWidth + fCurrentHeight * fCurrentHeight)/sqrt(2.0));
......
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