summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2024-04-09 16:04:40 +0500
committerMike Kaganski <mike.kaganski@collabora.com>2024-04-22 08:15:12 +0500
commitc10fba9c937e4a52bfd1ed13aa813d4faee833fe (patch)
tree226ef3203cf32db9db7a8a875885f4506f8d1b17
parent28ff1b05047ef3a19cf692527a23cb38768c9764 (diff)
Same as in commit e27572686130df43d1d65c574b0c34f39fc0d1a9 (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>
-rw-r--r--svgio/inc/SvgNumber.hxx4
-rw-r--r--svgio/inc/svgnode.hxx4
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx14
-rw-r--r--svgio/qa/cppunit/SvgNumberTest.cxx2
-rw-r--r--svgio/source/svgreader/SvgNumber.cxx2
-rw-r--r--svgio/source/svgreader/svgnode.cxx21
6 files changed, 22 insertions, 25 deletions
diff --git a/svgio/inc/SvgNumber.hxx b/svgio/inc/SvgNumber.hxx
index fe4ab8e2683e..c62576c2b082 100644
--- a/svgio/inc/SvgNumber.hxx
+++ b/svgio/inc/SvgNumber.hxx
@@ -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
diff --git a/svgio/inc/svgnode.hxx b/svgio/inc/svgnode.hxx
index 5d3a2453d727..d24cdecf3729 100644
--- a/svgio/inc/svgnode.hxx
+++ b/svgio/inc/svgnode.hxx
@@ -157,9 +157,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; }
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx
index 4d6f7568e2cd..d61c5c761f79 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -1148,7 +1148,7 @@ 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">:
std::u16string_view aPath = u"/svgio/qa/cppunit/data/dy_in_exs.svg";
Primitive2DSequence aSequence = parseSvg(aPath);
drawinglayer::Primitive2dXmlDump aDumper;
@@ -1156,6 +1156,7 @@ CPPUNIT_TEST_FIXTURE(Test, testExs)
assertXPath(pDocument, "//textsimpleportion", 2);
assertXPath(pDocument, "//textsimpleportion[1]", "height", "16");
+ assertXPath(pDocument, "//textsimpleportion[1]", "y", "20");
sal_Int32 nSize = getXPath(pDocument, "//textsimpleportion[2]", "height").toInt32();
// Without the accompanying fix in place, this test would have failed with:
@@ -1163,6 +1164,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]", "y").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);
}
}
diff --git a/svgio/qa/cppunit/SvgNumberTest.cxx b/svgio/qa/cppunit/SvgNumberTest.cxx
index 9b12e52bf956..49e1394bcef2 100644
--- a/svgio/qa/cppunit/SvgNumberTest.cxx
+++ b/svgio/qa/cppunit/SvgNumberTest.cxx
@@ -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()
diff --git a/svgio/source/svgreader/SvgNumber.cxx b/svgio/source/svgreader/SvgNumber.cxx
index 4a48ffbfb4e9..72a44dbdd032 100644
--- a/svgio/source/svgreader/SvgNumber.cxx
+++ b/svgio/source/svgreader/SvgNumber.cxx
@@ -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:
diff --git a/svgio/source/svgreader/svgnode.cxx b/svgio/source/svgreader/svgnode.cxx
index ec2e8e0589a9..5e3c37b07bb7 100644
--- a/svgio/source/svgreader/svgnode.cxx
+++ b/svgio/source/svgreader/svgnode.cxx
@@ -609,25 +609,12 @@ namespace svgio::svgreader
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)