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
virtual void parseAttribute(const rtl::OUString& rTokenName, SVGToken aSVGToken, const rtl::OUString& aContent);
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;
/// viewBox content
......
......@@ -40,6 +40,9 @@ namespace svgio
void myAssert(const rtl::OUString& rMessage);
#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
struct commonStrings
{
......@@ -126,7 +129,12 @@ namespace svgio
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;
};
typedef ::std::vector< SvgNumber > SvgNumberVector;
......
......@@ -128,7 +128,7 @@ namespace svgio
if(pStyle && getR().isSet())
{
const double fR(getR().solve(*this, xcoordinate));
const double fR(getR().solve(*this, length));
if(fR > 0.0)
{
......
......@@ -156,7 +156,7 @@ namespace svgio
return aRetval;
}
double SvgNumber::solve(const InfoProvider& rInfoProvider, NumberType aNumberType) const
double SvgNumber::solveNonPercentage(const InfoProvider& rInfoProvider) const
{
if(isSet())
{
......@@ -187,17 +187,53 @@ namespace svgio
switch(meUnit)
{
case Unit_pt: fRetval *= 1.25; break;
case Unit_pc: fRetval *= 15.0; break;
case Unit_cm: fRetval *= 35.43307; break;
case Unit_mm: fRetval *= 3.543307; break;
case Unit_in: fRetval *= 90.0; break;
case Unit_pt: fRetval *= F_SVG_PIXEL_PER_INCH / 72.0; break;
case Unit_pc: fRetval *= F_SVG_PIXEL_PER_INCH / 6.0; break;
case Unit_cm: fRetval *= F_SVG_PIXEL_PER_INCH / 2.54; break;
case Unit_mm: fRetval *= 0.1 * F_SVG_PIXEL_PER_INCH / 2.54; break;
case Unit_in: fRetval *= F_SVG_PIXEL_PER_INCH; break;
default: break;
}
return fRetval;
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:
{
double fRetval(mfNumber * 0.01);
......@@ -205,12 +241,15 @@ namespace svgio
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)
static basegfx::B2DRange aDinA4Range(
0.0,
0.0,
210.0 * 3.543307,
297.0 * 3.543307);
210.0 * F_SVG_PIXEL_PER_INCH / 2.54,
297.0 * F_SVG_PIXEL_PER_INCH / 2.54);
pViewPort = &aDinA4Range;
}
......@@ -924,11 +963,11 @@ namespace svgio
if(readNumberAndUnit(rCandidate, nPos, aHeight, nLen))
{
return basegfx::B2DRange(
aMinX.solve(rInfoProvider, xcoordinate),
aMinY.solve(rInfoProvider, ycoordinate),
aWidth.solve(rInfoProvider, xcoordinate),
aHeight.solve(rInfoProvider, ycoordinate));
double fX(aMinX.solve(rInfoProvider, xcoordinate));
double fY(aMinY.solve(rInfoProvider, ycoordinate));
double fW(aWidth.solve(rInfoProvider,xcoordinate));
double fH(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