Kaydet (Commit) 8a9164f5 authored tarafından Armin Le Grand's avatar Armin Le Grand

i122600 Added patch from Regina that fixes a bunch of tasks (list see in task…

i122600 Added patch from Regina that fixes a bunch of tasks (list see in task itself) and a reression/crash

Patch by: regina
Review by: ALG
üst 4ccb1eb7
...@@ -56,7 +56,15 @@ namespace svgio ...@@ -56,7 +56,15 @@ namespace svgio
virtual void parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent); virtual void parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent);
virtual void decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const; virtual void decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const;
/// InfoProvider support for % values /// Seeks width and height of viewport, which is current before the new viewport is set.
// needed for percentage unit in x, y, width or height
virtual void seekReferenceWidth(double& fWidth, bool& bHasFound) const;
virtual void seekReferenceHeight(double& fHeight, bool& bHasFound) const;
/// InfoProvider support for % values in childs
// 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
// 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
......
...@@ -40,6 +40,9 @@ namespace svgio ...@@ -40,6 +40,9 @@ namespace svgio
void myAssert(const rtl::OUString& rMessage); void myAssert(const rtl::OUString& rMessage);
#endif #endif
// recommended value for this devise dependend unit, see CSS2 section 4.3.2 Lenghts
#define F_SVG_PIXEL_PER_INCH 90.0
// common non-token strings // common non-token strings
struct commonStrings struct commonStrings
{ {
...@@ -126,7 +129,12 @@ namespace svgio ...@@ -126,7 +129,12 @@ namespace svgio
bool isPositive() const; bool isPositive() const;
// Only usable in cases, when the unit is not Unit_percent, otherwise use method solve
double solveNonPercentage(const InfoProvider& rInfoProvider) const;
double solve(const InfoProvider& rInfoProvider, NumberType aNumberType = length) const; double solve(const InfoProvider& rInfoProvider, NumberType aNumberType = length) const;
}; };
typedef ::std::vector< SvgNumber > SvgNumberVector; typedef ::std::vector< SvgNumber > SvgNumberVector;
......
...@@ -128,7 +128,7 @@ namespace svgio ...@@ -128,7 +128,7 @@ namespace svgio
if(pStyle && getR().isSet()) if(pStyle && getR().isSet())
{ {
const double fR(getR().solve(*this, xcoordinate)); const double fR(getR().solve(*this, length));
if(fR > 0.0) if(fR > 0.0)
{ {
......
...@@ -156,7 +156,7 @@ namespace svgio ...@@ -156,7 +156,7 @@ namespace svgio
return aRetval; return aRetval;
} }
double SvgNumber::solve(const InfoProvider& rInfoProvider, NumberType aNumberType) const double SvgNumber::solveNonPercentage(const InfoProvider& rInfoProvider) const
{ {
if(isSet()) if(isSet())
{ {
...@@ -187,17 +187,53 @@ namespace svgio ...@@ -187,17 +187,53 @@ namespace svgio
switch(meUnit) switch(meUnit)
{ {
case Unit_pt: fRetval *= 1.25; break; case Unit_pt: fRetval *= F_SVG_PIXEL_PER_INCH / 72.0; break;
case Unit_pc: fRetval *= 15.0; break; case Unit_pc: fRetval *= F_SVG_PIXEL_PER_INCH / 6.0; break;
case Unit_cm: fRetval *= 35.43307; break; case Unit_cm: fRetval *= F_SVG_PIXEL_PER_INCH / 2.54; break;
case Unit_mm: fRetval *= 3.543307; break; case Unit_mm: fRetval *= 0.1 * F_SVG_PIXEL_PER_INCH / 2.54; break;
case Unit_in: fRetval *= 90.0; break; case Unit_in: fRetval *= F_SVG_PIXEL_PER_INCH; break;
default: break; default: break;
} }
return fRetval; return fRetval;
break; break;
} }
default:
{
OSL_ENSURE(false, "Do not use with percentage! ");
return 0.0;
break;
}
}
}
/// not set
OSL_ENSURE(false, "SvgNumber not set (!)");
return 0.0;
}
double SvgNumber::solve(const InfoProvider& rInfoProvider, NumberType aNumberType) const
{
if(isSet())
{
switch(meUnit)
{
case Unit_px:
{
return mfNumber;
break;
}
case Unit_pt:
case Unit_pc:
case Unit_cm:
case Unit_mm:
case Unit_in:
case Unit_em:
case Unit_ex:
{
return solveNonPercentage( rInfoProvider);
break;
}
case Unit_percent: case Unit_percent:
{ {
double fRetval(mfNumber * 0.01); double fRetval(mfNumber * 0.01);
...@@ -205,12 +241,15 @@ namespace svgio ...@@ -205,12 +241,15 @@ namespace svgio
if(!pViewPort) if(!pViewPort)
{ {
#ifdef DBG_UTIL
myAssert(rtl::OUString::createFromAscii("Design error, this case should have been handled in the caller"));
#endif
// no viewPort, assume a normal page size (A4) // no viewPort, assume a normal page size (A4)
static basegfx::B2DRange aDinA4Range( static basegfx::B2DRange aDinA4Range(
0.0, 0.0,
0.0, 0.0,
210.0 * 3.543307, 210.0 * F_SVG_PIXEL_PER_INCH / 2.54,
297.0 * 3.543307); 297.0 * F_SVG_PIXEL_PER_INCH / 2.54);
pViewPort = &aDinA4Range; pViewPort = &aDinA4Range;
} }
...@@ -924,11 +963,11 @@ namespace svgio ...@@ -924,11 +963,11 @@ namespace svgio
if(readNumberAndUnit(rCandidate, nPos, aHeight, nLen)) if(readNumberAndUnit(rCandidate, nPos, aHeight, nLen))
{ {
return basegfx::B2DRange( double fX(aMinX.solve(rInfoProvider, xcoordinate));
aMinX.solve(rInfoProvider, xcoordinate), double fY(aMinY.solve(rInfoProvider, ycoordinate));
aMinY.solve(rInfoProvider, ycoordinate), double fW(aWidth.solve(rInfoProvider,xcoordinate));
aWidth.solve(rInfoProvider, xcoordinate), double fH(aHeight.solve(rInfoProvider,ycoordinate));
aHeight.solve(rInfoProvider, ycoordinate)); return basegfx::B2DRange(fX,fY,fX+fW,fY+fH);
} }
} }
} }
......
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