diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2021-12-22 16:52:28 +0100 |
---|---|---|
committer | Michael Stahl <michael.stahl@allotropia.de> | 2021-12-23 09:11:20 +0100 |
commit | d11fb6cecaf72787973990e09cc7e8d03bdbf9d7 (patch) | |
tree | f014c706d253a892ca3ccd48f2cc5634d2a17340 /sw | |
parent | 763c2a436baa1814d2bf95477b9d79fa3934d5e5 (diff) |
tdf#138771 sw_fieldmarkhide: fix overlaps in SwScriptInfo::InitScriptInfo()
For sw_redlinehide, the MergedPara::extents were guaranteed not to
overlap with the MultiSelection aHiddenMulti in this function because
CalcHiddenRanges() took care to remove deleted redlines, but now extents
may be created for fieldmarks and it does nothing for fieldmarks.
Fix InitScriptInfo() to handle overlaps between extents and hidden
ranges.
(regression from c0864f26f3143ea81c65d3826fae32a8fd54c531)
Change-Id: Ic7aa432e1b5b960f3a865176cf9dbc096b2cfd5e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127329
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/source/core/text/porlay.cxx | 68 |
1 files changed, 48 insertions, 20 deletions
diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx index e1e5796294a3..3db5d2ab0ac3 100644 --- a/sw/source/core/text/porlay.cxx +++ b/sw/source/core/text/porlay.cxx @@ -1034,11 +1034,12 @@ void SwScriptInfo::InitScriptInfo(const SwTextNode& rNode, TextFrameIndex nOffset(0); std::optional<std::vector<sw::Extent>::const_iterator> oPrevIter; for (auto iter = pMerged->extents.begin(); iter != pMerged->extents.end(); - oPrevIter = iter, ++iter) + oPrevIter = iter) { if (iter->pNode == pNode) { nOffset += TextFrameIndex(iter->nEnd - iter->nStart); + ++iter; continue; // skip extents at end of previous node } pNode = iter->pNode; @@ -1054,39 +1055,66 @@ void SwScriptInfo::InitScriptInfo(const SwTextNode& rNode, const Range& rRange = aHiddenMulti.GetRange( i ); const sal_Int32 nStart = rRange.Min(); const sal_Int32 nEnd = rRange.Max() + 1; + bool isStartHandled(false); + ::std::optional<sal_Int32> oExtend; - while (true) + if (nEnd <= iter->nStart) + { // entirely in gap, skip this hidden range + continue; + } + + do { - // because of the selectRedLineDeleted call, never overlaps - // extents, must be contained inside one extent - assert(!(iter->nStart <= nStart && nStart < iter->nEnd && iter->nEnd < nEnd)); - assert(!(nStart < iter->nStart && iter->nStart < nEnd && nEnd <= iter->nEnd)); - if (iter->nStart <= nStart && nEnd <= iter->nEnd) + if (!isStartHandled && nStart <= iter->nEnd) { - if (iter->nStart == nStart && !m_HiddenChg.empty() + isStartHandled = true; + if (nStart <= iter->nStart && !m_HiddenChg.empty() && m_HiddenChg.back() == nOffset) { // previous one went until end of extent, extend it - m_HiddenChg.back() += TextFrameIndex(nEnd - iter->nStart); + oExtend.emplace(::std::min(iter->nEnd, nEnd) - ::std::max(iter->nStart, nStart)); } - else // new one + else { - m_HiddenChg.push_back(nOffset + TextFrameIndex(nStart - iter->nStart)); - m_HiddenChg.push_back(nOffset + TextFrameIndex(nEnd - iter->nStart)); + m_HiddenChg.push_back(nOffset + TextFrameIndex(::std::max(nStart - iter->nStart, sal_Int32(0)))); } - break; } - else + else if (oExtend) { - nOffset += TextFrameIndex(iter->nEnd - iter->nStart); - ++iter; - // because selectRedLineDeleted, must find it in pNode - assert(iter != pMerged->extents.end()); - assert(iter->pNode == pNode); + *oExtend += ::std::min(iter->nEnd, nEnd) - iter->nStart; } + if (nEnd <= iter->nEnd) + { + if (oExtend) + { + m_HiddenChg.back() += TextFrameIndex(*oExtend); + } + else + { + m_HiddenChg.push_back(nOffset + TextFrameIndex(::std::max(nEnd - iter->nStart, sal_Int32(0)))); + } + break; // iterate to next hidden range + } + nOffset += TextFrameIndex(iter->nEnd - iter->nStart); + ++iter; + } + while (iter != pMerged->extents.end() && iter->pNode == pNode); + if (iter == pMerged->extents.end() || iter->pNode != pNode) + { + if (isStartHandled) + { // dangling end + if (oExtend) + { + m_HiddenChg.back() += TextFrameIndex(*oExtend); + } + else + { + m_HiddenChg.push_back(nOffset); + } + } // else: beyond last extent in node, ignore + break; // skip hidden ranges beyond last extent in node } } - nOffset += TextFrameIndex(iter->nEnd - iter->nStart); } } else |