[Libreoffice-commits] core.git: sw/source
Caolán McNamara
caolanm at redhat.com
Thu Mar 15 20:21:50 UTC 2018
sw/source/filter/ww8/ww8par.cxx | 17 ++++++++++-------
sw/source/filter/ww8/ww8par.hxx | 2 ++
sw/source/filter/ww8/ww8par6.cxx | 34 +++++++++++++++++++++++-----------
3 files changed, 35 insertions(+), 18 deletions(-)
New commits:
commit f4c451f2b3cbd360b7141626525ae3982d73e5a4
Author: Caolán McNamara <caolanm at redhat.com>
Date: Thu Mar 15 17:26:36 2018 +0000
ofz#6827 Bad-cast
Change-Id: I856d781f122c21c02a0a8cd01369d49f50b8a555
Reviewed-on: https://gerrit.libreoffice.org/51363
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
Tested-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index 55d2992bb9e8..d0efff84cbcb 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -3955,7 +3955,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
long nCpOfs = m_xPlcxMan->GetCpOfs(); // Offset for Header/Footer, Footnote
WW8_CP nNext = m_xPlcxMan->Where();
- SwTextNode* pPreviousNode = nullptr;
+ m_pPreviousNode = nullptr;
sal_uInt8 nDropLines = 0;
SwCharFormat* pNewSwCharFormat = nullptr;
const SwCharFormat* pFormat = nullptr;
@@ -3987,7 +3987,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
// If the previous paragraph was a dropcap then do not
// create a new txtnode and join the two paragraphs together
- if (bStartLine && !pPreviousNode) // Line end
+ if (bStartLine && !m_pPreviousNode) // Line end
{
bool bSplit = true;
if (m_bCareFirstParaEndInToc)
@@ -4011,10 +4011,10 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
}
}
- if (pPreviousNode && bStartLine)
+ if (m_pPreviousNode && bStartLine)
{
SwTextNode* pEndNd = m_pPaM->GetNode().GetTextNode();
- const sal_Int32 nDropCapLen = pPreviousNode->GetText().getLength();
+ const sal_Int32 nDropCapLen = m_pPreviousNode->GetText().getLength();
// Need to reset the font size and text position for the dropcap
{
@@ -4041,12 +4041,12 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
SwPosition aStart(*pEndNd);
m_xCtrlStck->NewAttr(aStart, aDrop);
m_xCtrlStck->SetAttr(*m_pPaM->GetPoint(), RES_PARATR_DROP);
- pPreviousNode = nullptr;
+ m_pPreviousNode = nullptr;
}
else if (m_bDropCap)
{
// If we have found a dropcap store the textnode
- pPreviousNode = m_pPaM->GetNode().GetTextNode();
+ m_pPreviousNode = m_pPaM->GetNode().GetTextNode();
SprmResult aDCS;
if (m_bVer67)
@@ -4057,7 +4057,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
if (aDCS.pSprm && aDCS.nRemainingData >= 1)
nDropLines = (*aDCS.pSprm) >> 3;
else // There is no Drop Cap Specifier hence no dropcap
- pPreviousNode = nullptr;
+ m_pPreviousNode = nullptr;
SprmResult aDistance = m_xPlcxMan->GetPapPLCF()->HasSprm(0x842F);
if (aDistance.pSprm && aDistance.nRemainingData >= 2)
@@ -4129,6 +4129,8 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
}
}
+ m_pPreviousNode = nullptr;
+
if (m_pPaM->GetPoint()->nContent.GetIndex())
AppendTextNode(*m_pPaM->GetPoint());
@@ -4244,6 +4246,7 @@ SwWW8ImplReader::SwWW8ImplReader(sal_uInt8 nVersionPara, SotStorage* pStorage,
, m_nEmbeddedTOXLevel(0)
, m_bLoadingTOXHyperlink(false)
, m_pPosAfterTOC(nullptr)
+ , m_pPreviousNode(nullptr)
, m_bCareFirstParaEndInToc(false)
, m_bCareLastParaEndInToc(false)
, m_aTOXEndCps()
diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
index a81e1754be32..1460083b85eb 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -1354,6 +1354,8 @@ private:
bool m_bLoadingTOXHyperlink;
// a document position recorded the after-position of TOC section, managed by Read_F_TOX() and End_Field()
SwPaM* m_pPosAfterTOC;
+ // used for some dropcap tweaking
+ SwTextNode* m_pPreviousNode;
std::unique_ptr< SwPosition > m_pLastAnchorPos;
diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx
index bf213496b6d5..b088f86e5c4d 100644
--- a/sw/source/filter/ww8/ww8par6.cxx
+++ b/sw/source/filter/ww8/ww8par6.cxx
@@ -2453,19 +2453,31 @@ bool SwWW8ImplReader::JoinNode(SwPaM &rPam, bool bStealAttr)
if (bStealAttr)
m_xCtrlStck->StealAttr(rPam.GetPoint()->nNode);
- if (m_pLastAnchorPos.get())
+ if (m_pLastAnchorPos || m_pPreviousNode)
{
- //If the last anchor pos is here, then clear the anchor pos.
- //This "last anchor pos" is only used for fixing up the
- //positions of things anchored to page breaks and here
- //we are removing the last paragraph of a frame, so there
- //cannot be a page break at this point so we can
- //safely reset m_pLastAnchorPos to avoid any dangling
- //SwIndex's pointing into the deleted paragraph
- SwNodeIndex aLastAnchorPos(m_pLastAnchorPos->nNode);
SwNodeIndex aToBeJoined(aPref, 1);
- if (aLastAnchorPos == aToBeJoined)
- m_pLastAnchorPos.reset();
+
+ if (m_pLastAnchorPos)
+ {
+ //If the last anchor pos is here, then clear the anchor pos.
+ //This "last anchor pos" is only used for fixing up the
+ //positions of things anchored to page breaks and here
+ //we are removing the last paragraph of a frame, so there
+ //cannot be a page break at this point so we can
+ //safely reset m_pLastAnchorPos to avoid any dangling
+ //SwIndex's pointing into the deleted paragraph
+ SwNodeIndex aLastAnchorPos(m_pLastAnchorPos->nNode);
+ if (aLastAnchorPos == aToBeJoined)
+ m_pLastAnchorPos.reset();
+ }
+
+ if (m_pPreviousNode)
+ {
+ //If the drop character start pos is here, then clear it.
+ SwNodeIndex aDropCharPos(*m_pPreviousNode);
+ if (aDropCharPos == aToBeJoined)
+ m_pPreviousNode = nullptr;
+ }
}
pNode->JoinNext();
More information about the Libreoffice-commits
mailing list