diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-09-13 19:27:48 +0200 |
---|---|---|
committer | Xisco Fauli <xiscofauli@libreoffice.org> | 2021-09-14 11:41:03 +0200 |
commit | 168065841250c190808261cf65afa00f9ecd52e7 (patch) | |
tree | 495c04642a7fb1c54b405c154d52e092ee6cf267 /sw/qa/core/text/text.cxx | |
parent | tdf#142415 mouse events not propogated to table control event handlers (diff) | |
download | core-168065841250c190808261cf65afa00f9ecd52e7.tar.gz core-168065841250c190808261cf65afa00f9ecd52e7.zip |
tdf#144305 sw: fix rendering of ruby portions with non-default ruby alignment
Regression from 301278b656e76b6f42af5cf8a6f5c6c02acfffeb (sw: allow the
height of a line to be larger than 65536 twips, 2021-05-20), the problem
was that changing from sal_uInt16 to sal_uInt32 broke
SwRubyPortion::Adjust_(), which relied on integer promotion rules to
have a negative diff.
Old storage size was smaller than int, so got promoted to signed int, so
the result could be a small negative number.
New storage size is an unsigned int, so no promotion happens, so the new
result was a large positive number.
Fix this by casting to signed int explicitly.
Change-Id: I8778c1bd0d62e27c99d4ceb1bb7bc6107a179803
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122048
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
(cherry picked from commit 0c3e47cc2f0570a7cd8ff4889763991a86b29f26)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122066
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'sw/qa/core/text/text.cxx')
-rw-r--r-- | sw/qa/core/text/text.cxx | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/sw/qa/core/text/text.cxx b/sw/qa/core/text/text.cxx index be6406f6b654..6832ad2cb436 100644 --- a/sw/qa/core/text/text.cxx +++ b/sw/qa/core/text/text.cxx @@ -21,6 +21,12 @@ #include <docsh.hxx> #include <unotxdoc.hxx> #include <wrtsh.hxx> +#include <IDocumentLayoutAccess.hxx> +#include <rootfrm.hxx> +#include <txtfrm.hxx> + +#include <porlay.hxx> +#include <pormulti.hxx> constexpr OUStringLiteral DATA_DIRECTORY = u"/sw/qa/core/text/data/"; @@ -170,6 +176,46 @@ CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testLineWidth) CPPUNIT_ASSERT_GREATER(static_cast<sal_Int32>(65536), nNewLeft - nOldLeft); } +CPPUNIT_TEST_FIXTURE(SwCoreTextTest, testRuby) +{ + // Given a document with multiple ruby portions: + SwDoc* pDoc = createSwDoc(DATA_DIRECTORY, "ruby.fodt"); + + // When laying out that document: + SwRootFrame* pLayout = pDoc->getIDocumentLayoutAccess().GetCurrentLayout(); + + // Then make sure that no unwanted margin portions are created, making the actual text + // invisible: + SwFrame* pPageFrame = pLayout->GetLower(); + SwFrame* pBodyFrame = pPageFrame->GetLower(); + SwFrame* pFrame = pBodyFrame->GetLower(); + CPPUNIT_ASSERT(pFrame->IsTextFrame()); + auto pTextFrame = static_cast<SwTextFrame*>(pFrame); + SwParaPortion* pPara = pTextFrame->GetPara(); + bool bFirst = true; + for (SwLinePortion* pPor = pPara->GetFirstPortion(); pPor; pPor = pPor->GetNextPortion()) + { + // Look for multi-portions in the only paragraph of the document. + if (pPor->GetWhichPor() != PortionType::Multi) + { + continue; + } + + if (bFirst) + { + bFirst = false; + continue; + } + + // The second multi-portion has two lines, check the start of the second line. + auto pMulti = static_cast<SwMultiPortion*>(pPor); + // Without the accompanying fix in place, this test would have failed, as the portion was a + // margin portion, not a text portion. The margin was so large that the actual text portion was + // hidden. No margin is needed here at all. + CPPUNIT_ASSERT(pMulti->GetRoot().GetNext()->GetFirstPortion()->IsTextPortion()); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |