summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMichael Stahl <michael.stahl@allotropia.de>2021-12-22 16:52:28 +0100
committerMichael Stahl <michael.stahl@allotropia.de>2021-12-23 09:11:20 +0100
commitd11fb6cecaf72787973990e09cc7e8d03bdbf9d7 (patch)
treef014c706d253a892ca3ccd48f2cc5634d2a17340 /sw
parent763c2a436baa1814d2bf95477b9d79fa3934d5e5 (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.cxx68
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