summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-03-15 17:26:36 +0000
committerAndras Timar <andras.timar@collabora.com>2018-04-07 17:43:45 +0200
commit70c4f60096a7e0e8e2d96f97e0b850f5ae55d660 (patch)
tree374d15ea86ba5a94ae405dbe823913d1f846d853
parentcb54c594aa731c404bb911db014099d41f177155 (diff)
ofz#6827 Bad-cast
Change-Id: I856d781f122c21c02a0a8cd01369d49f50b8a555 Reviewed-on: https://gerrit.libreoffice.org/51365 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Stahl <mstahl@redhat.com> (cherry picked from commit 19f0b25acc2a23b790301755a9fee2629eb667b0)
-rw-r--r--sw/source/filter/ww8/ww8par.cxx17
-rw-r--r--sw/source/filter/ww8/ww8par.hxx2
-rw-r--r--sw/source/filter/ww8/ww8par6.cxx34
3 files changed, 35 insertions, 18 deletions
diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
index 216150651009..b03cea2ebaca 100644
--- a/sw/source/filter/ww8/ww8par.cxx
+++ b/sw/source/filter/ww8/ww8par.cxx
@@ -4051,7 +4051,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
long nCpOfs = m_pPlcxMan->GetCpOfs(); // Offset for Header/Footer, Footnote
WW8_CP nNext = m_pPlcxMan->Where();
- SwTextNode* pPreviousNode = nullptr;
+ m_pPreviousNode = nullptr;
sal_uInt8 nDropLines = 0;
SwCharFormat* pNewSwCharFormat = nullptr;
const SwCharFormat* pFormat = nullptr;
@@ -4080,7 +4080,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)
@@ -4104,10 +4104,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
{
@@ -4134,12 +4134,12 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
SwPosition aStart(*pEndNd);
m_pCtrlStck->NewAttr(aStart, aDrop);
m_pCtrlStck->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();
const sal_uInt8 *pDCS;
@@ -4151,7 +4151,7 @@ bool SwWW8ImplReader::ReadText(WW8_CP nStartCp, WW8_CP nTextLen, ManTypes nType)
if (pDCS)
nDropLines = (*pDCS) >> 3;
else // There is no Drop Cap Specifier hence no dropcap
- pPreviousNode = nullptr;
+ m_pPreviousNode = nullptr;
if (const sal_uInt8 *pDistance = m_pPlcxMan->GetPapPLCF()->HasSprm(0x842F))
nDistance = SVBT16ToShort( pDistance );
@@ -4220,6 +4220,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());
@@ -4358,6 +4360,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 e292b4690511..6b5b65f927bb 100644
--- a/sw/source/filter/ww8/ww8par.hxx
+++ b/sw/source/filter/ww8/ww8par.hxx
@@ -1343,6 +1343,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 6c97ce9ec681..cdf9dcad52d4 100644
--- a/sw/source/filter/ww8/ww8par6.cxx
+++ b/sw/source/filter/ww8/ww8par6.cxx
@@ -2370,19 +2370,31 @@ bool SwWW8ImplReader::JoinNode(SwPaM &rPam, bool bStealAttr)
if (bStealAttr)
m_pCtrlStck->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();