tdf#136588 sw: fix line break regression with small caps

Regression from commit 1b03a449161af225302e4b4dd2bb2e69c6d8d170
(tdf#112290 sw: fix missing line break in small capital).

This replaces the previous commit with a better solution.

Change-Id: I7510b78cd6520f260e6a3804ec69e0364b93440f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103178
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
diff --git a/sw/qa/extras/layout/data/tdf136588.docx b/sw/qa/extras/layout/data/tdf136588.docx
new file mode 100644
index 0000000..6069312
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf136588.docx
Binary files differ
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 5c7bfda..4a348bd 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -192,6 +192,17 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFootnotes)
    CheckRedlineFootnotesHidden();
}

CPPUNIT_TEST_FIXTURE(SwLayoutWriter, TestTdf136588)
{
    load(DATA_DIRECTORY, "tdf136588.docx");
    auto pXMLLayoutDump = parseLayoutDump();
    CPPUNIT_ASSERT(pXMLLayoutDump);

    //there was a bad line break before, the correct break layout is this:
    assertXPath(pXMLLayoutDump, "/root/page/body/txt[2]/LineBreak[2]", "Line",
                "effectively by modern-day small to ");
}

CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInBody)
{
    loadURL("private:factory/swriter", nullptr);
diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx
index 398b26e..ace1268 100644
--- a/sw/source/core/text/portxt.cxx
+++ b/sw/source/core/text/portxt.cxx
@@ -344,8 +344,7 @@ bool SwTextPortion::Format_( SwTextFormatInfo &rInf )
        Insert( aGuess.ReleaseHangingPortion() );
    }
    // breakPos >= index
    else if (aGuess.BreakPos() >= rInf.GetIdx() && aGuess.BreakPos() != TextFrameIndex(COMPLETE_STRING)
        && rInf.GetFont()->GetCaseMap() != SvxCaseMap::SmallCaps )
    else if (aGuess.BreakPos() >= rInf.GetIdx() && aGuess.BreakPos() != TextFrameIndex(COMPLETE_STRING))
    {
        // case B1
        if( aGuess.HyphWord().is() && aGuess.BreakPos() > rInf.GetLineStart()
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index 5d7188a..b558210 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -2536,6 +2536,13 @@ TextFrameIndex SwFont::GetTextBreak(SwDrawTextInfo const & rInf, long nTextWidth
            ? TextFrameIndex(COMPLETE_STRING)
            : nTextBreak;

    // tdf112290 tdf136588 Break the line correctly only if there is an image inline,
    // and the image wider than the line...
    if (GetCaseMap() == SvxCaseMap::SmallCaps && TextFrameIndex(COMPLETE_STRING) == nTextBreak2 &&
        ! bCompress && nTextWidth == 0)
        // If nTextWidth == 0 means the line is full, we have to break it
        nTextBreak2 = TextFrameIndex(1);

    if ( ! bCompress )
        return nTextBreak2;