tdf#160717: fix ex handling

Same as in commit e275726861
(tdf#160593: make sure to use current element's font size for em unit,
2024-04-18) for em.

Change-Id: Id9003c0426a6b373456da1aa1550f7ff07f766a3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/166235
Tested-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
This commit is contained in:
Mike Kaganski
2024-04-19 05:18:50 +02:00
parent 75fe059974
commit edef46e82e
6 changed files with 22 additions and 25 deletions
+2 -2
View File
@@ -39,8 +39,8 @@ public:
virtual basegfx::B2DRange getCurrentViewPort() const = 0;
/// return font size of node, either set here or inherited from parents
virtual double getCurrentFontSize() const = 0;
/// return xheight of node inherited from parents
virtual double getCurrentXHeightInherited() const = 0;
/// return xheight of node, either set here or inherited from parents
virtual double getCurrentXHeight() const = 0;
};
enum class SvgUnit
+1 -3
View File
@@ -165,9 +165,7 @@ namespace svgio::svgreader
/// InfoProvider support for %, em and ex values
virtual basegfx::B2DRange getCurrentViewPort() const override;
virtual double getCurrentFontSize() const override;
virtual double getCurrentXHeightInherited() const override;
double getCurrentXHeight() const;
virtual double getCurrentXHeight() const override;
/// Id access
std::optional<OUString> const & getId() const { return mpId; }
+13 -1
View File
@@ -1679,11 +1679,12 @@ CPPUNIT_TEST_FIXTURE(Test, testDyInEms)
CPPUNIT_TEST_FIXTURE(Test, testExs)
{
// tdf#160594 given an SVG file with <tspan dy="3ex" style="font-size:1ex">:
// tdf#160594, tdf#160717 given an SVG file with <tspan dy="3ex" style="font-size:1ex">:
xmlDocUniquePtr pDocument = dumpAndParseSvg(u"/svgio/qa/cppunit/data/dy_in_exs.svg");
assertXPath(pDocument, "//textsimpleportion"_ostr, 2);
assertXPath(pDocument, "//textsimpleportion[1]"_ostr, "height"_ostr, u"16"_ustr);
assertXPath(pDocument, "//textsimpleportion[1]"_ostr, "y"_ostr, u"20"_ustr);
sal_Int32 nSize = getXPath(pDocument, "//textsimpleportion[2]"_ostr, "height"_ostr).toInt32();
// Without the accompanying fix in place, this test would have failed with:
@@ -1691,6 +1692,17 @@ CPPUNIT_TEST_FIXTURE(Test, testExs)
// - Actual : 16
// i.e. the parent font-size was used, instead of its x-size.
CPPUNIT_ASSERT_LESS(sal_Int32(16), nSize);
sal_Int32 nYPos = getXPath(pDocument, "//textsimpleportion[2]"_ostr, "y"_ostr).toInt32();
// Then make sure that the vertical offset is based on x-size of tspan, not of its parent.
// Given the tspan's font-size is nSize, its x-size is less than nSize, and the expected
// vertical offset is less than 3 * nSize, which means that the resulting y is expected
// to be strictly less than 20 + 3 * nSize.
// Without the accompanying fix in place, this test would have failed with:
// - Expected less than: 44
// - Actual : 44
// i.e. the parent x-size (or current font-size) was used, instead of current x-size.
CPPUNIT_ASSERT_LESS(sal_Int32(20 + 3 * nSize), nYPos);
}
CPPUNIT_PLUGIN_IMPLEMENT();
+1 -1
View File
@@ -40,7 +40,7 @@ public:
double getCurrentFontSize() const override { return 12.0; }
double getCurrentXHeightInherited() const override { return 5.0; }
double getCurrentXHeight() const override { return 5.0; }
};
void TestNumber::testSetting()
+1 -1
View File
@@ -39,7 +39,7 @@ double SvgNumber::solveNonPercentage(const InfoProvider& rInfoProvider) const
case SvgUnit::em:
return mfNumber * rInfoProvider.getCurrentFontSize();
case SvgUnit::ex:
return mfNumber * rInfoProvider.getCurrentXHeightInherited() * 0.5;
return mfNumber * rInfoProvider.getCurrentXHeight();
case SvgUnit::px:
return mfNumber;
case SvgUnit::pt:
+4 -17
View File
@@ -703,25 +703,12 @@ namespace {
return 0.0;
}
double SvgNode::getCurrentXHeightInherited() const
{
if(getParent())
{
return getParent()->getCurrentXHeight();
}
else
{
return 0.0;
}
}
double SvgNode::getCurrentXHeight() const
{
if(getSvgStyleAttributes())
// for XHeight, use FontSize currently
return getSvgStyleAttributes()->getFontSizeNumber().solve(*this, NumberType::ycoordinate);
return getCurrentXHeightInherited();
// https://drafts.csswg.org/css-values-4/#ex
// for XHeight, use 0.5em fallback currently
// FIXME: use "x-height of the first available font"
return getCurrentFontSize() * 0.5;
}
void SvgNode::setId(OUString const & rId)