[Libreoffice-commits] core.git: sd/source
Takeshi Abe
tabe at fixedpoint.jp
Wed Sep 10 08:53:52 PDT 2014
sd/source/filter/eppt/epptso.cxx | 74 ++++++++++++++++++------------------
sd/source/filter/eppt/pptx-text.cxx | 34 +++++++++-------
sd/source/filter/eppt/text.hxx | 12 ++++-
3 files changed, 66 insertions(+), 54 deletions(-)
New commits:
commit d707d025b6c3773538abd2eedc6dc4c6d869aa86
Author: Takeshi Abe <tabe at fixedpoint.jp>
Date: Wed Sep 10 16:14:42 2014 +0900
fdo#75757: remove inheritance to std::vector
from ParagraphObj, by using boost::ptr_vector.
This is also a supposed fix for ParagraphObj::operator=(),
because ParagraphObj::ImplClear() now makes the vector empty
while its original code kept deleted pointers.
Change-Id: I7710eb33fc05bed55474ff00baaeb8e19cd79f3d
Reviewed-on: https://gerrit.libreoffice.org/11379
Reviewed-by: Michael Stahl <mstahl at redhat.com>
Tested-by: Michael Stahl <mstahl at redhat.com>
diff --git a/sd/source/filter/eppt/epptso.cxx b/sd/source/filter/eppt/epptso.cxx
index e40fa13..8c0eb7f 100644
--- a/sd/source/filter/eppt/epptso.cxx
+++ b/sd/source/filter/eppt/epptso.cxx
@@ -659,7 +659,7 @@ void PPTWriter::ImplWriteParagraphs( SvStream& rOut, TextObj& rTextObj )
for ( sal_uInt32 i = 0; i < rTextObj.ParagraphCount(); ++i, bFirstParagraph = false )
{
ParagraphObj* pPara = rTextObj.GetParagraph(i);
- PortionObj* pPortion = pPara->front();
+ const PortionObj& rPortion = pPara->front();
nCharCount = pPara->CharacterCount();
nDepth = pPara->nDepth;
@@ -671,7 +671,7 @@ void PPTWriter::ImplWriteParagraphs( SvStream& rOut, TextObj& rTextObj )
nPropertyFlags |= 0x00000800;
nLineSpacing = pPara->mnLineSpacing;
- const FontCollectionEntry* pDesc = maFontCollection.GetById( pPortion->mnFont );
+ const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
sal_Int16 nNormalSpacing = 100;
if ( !mbFontIndependentLineSpacing && pDesc )
{
@@ -693,7 +693,7 @@ void PPTWriter::ImplWriteParagraphs( SvStream& rOut, TextObj& rTextObj )
}
else
{
- if ( !pPara->mbFixedLineSpacing && pPortion->mnCharHeight > (sal_uInt16)( ((double)-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
+ if ( !pPara->mbFixedLineSpacing && rPortion.mnCharHeight > (sal_uInt16)( ((double)-nLineSpacing) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
nLineSpacing = nNormalSpacing;
else
nLineSpacing = (sal_Int16)( (double)nLineSpacing / 4.40972 );
@@ -799,12 +799,12 @@ void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
for ( sal_uInt32 i = 0; i < rTextObj.ParagraphCount(); ++i )
{
ParagraphObj* pPara = rTextObj.GetParagraph(i);
- for ( ParagraphObj::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
+ for ( boost::ptr_vector<PortionObj>::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
{
- PortionObj* pPortion = *it;
+ const PortionObj& rPortion = *it;
nPropertyFlags = 0;
- sal_uInt32 nCharAttr = pPortion->mnCharAttr;
- sal_uInt32 nCharColor = pPortion->mnCharColor;
+ sal_uInt32 nCharAttr = rPortion.mnCharAttr;
+ sal_uInt32 nCharColor = rPortion.mnCharColor;
if ( nCharColor == COL_AUTO ) // nCharColor depends to the background color
{
@@ -917,19 +917,19 @@ void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
nPropertyFlags |= nCharAttr & 0x217; // not all attributes ar inherited
else
{
- if ( /* ( pPortion->mnCharAttrHard & 1 ) || */
+ if ( /* ( rPortion.mnCharAttrHard & 1 ) || */
( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Bold, nCharAttr ) ) )
nPropertyFlags |= 1;
- if ( /* ( pPortion->mnCharAttrHard & 2 ) || */
+ if ( /* ( rPortion.mnCharAttrHard & 2 ) || */
( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Italic, nCharAttr ) ) )
nPropertyFlags |= 2;
- if ( /* ( pPortion->mnCharAttrHard & 4 ) || */
+ if ( /* ( rPortion.mnCharAttrHard & 4 ) || */
( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Underline, nCharAttr ) ) )
nPropertyFlags |= 4;
- if ( /* ( pPortion->mnCharAttrHard & 0x10 ) || */
+ if ( /* ( rPortion.mnCharAttrHard & 0x10 ) || */
( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Shadow, nCharAttr ) ) )
nPropertyFlags |= 0x10;
- if ( /* ( pPortion->mnCharAttrHard & 0x200 ) || */
+ if ( /* ( rPortion.mnCharAttrHard & 0x200 ) || */
( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Embossed, nCharAttr ) ) )
nPropertyFlags |= 512;
}
@@ -938,23 +938,23 @@ void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
nPropertyFlags |= ( i & 0x3f ) << 10 ;
nCharAttr |= ( i & 0x3f ) << 10;
}
- if ( ( pPortion->meFontName == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
- ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Font, pPortion->mnFont ) ) )
+ if ( ( rPortion.meFontName == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Font, rPortion.mnFont ) ) )
nPropertyFlags |= 0x00010000;
- if ( ( pPortion->meAsianOrComplexFont == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
- ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_AsianOrComplexFont, pPortion->mnAsianOrComplexFont ) ) )
+ if ( ( rPortion.meAsianOrComplexFont == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_AsianOrComplexFont, rPortion.mnAsianOrComplexFont ) ) )
nPropertyFlags |= 0x00200000;
- if ( ( pPortion->meCharHeight == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
- ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontHeight, pPortion->mnCharHeight ) ) )
+ if ( ( rPortion.meCharHeight == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontHeight, rPortion.mnCharHeight ) ) )
nPropertyFlags |= 0x00020000;
- if ( ( pPortion->meCharColor == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
+ if ( ( rPortion.meCharColor == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_FontColor, nCharColor & 0xffffff ) ) )
nPropertyFlags |= 0x00040000;
- if ( ( pPortion->meCharEscapement == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
- ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Escapement, pPortion->mnCharEscapement ) ) )
+ if ( ( rPortion.meCharEscapement == ::com::sun::star::beans::PropertyState_DIRECT_VALUE ) ||
+ ( mpStyleSheet->IsHardAttribute( nInstance, pPara->nDepth, CharAttr_Escapement, rPortion.mnCharEscapement ) ) )
nPropertyFlags |= 0x00080000;
- sal_uInt32 nCharCount = pPortion->Count();
+ sal_uInt32 nCharCount = rPortion.Count();
rOut.WriteUInt32( nCharCount )
.WriteUInt32( nPropertyFlags ); //PropertyFlags
@@ -962,15 +962,15 @@ void PPTWriter::ImplWritePortions( SvStream& rOut, TextObj& rTextObj )
if ( nPropertyFlags & 0xffff )
rOut.WriteUInt16( (sal_uInt16)( nCharAttr ) );
if ( nPropertyFlags & 0x00010000 )
- rOut.WriteUInt16( pPortion->mnFont );
+ rOut.WriteUInt16( rPortion.mnFont );
if ( nPropertyFlags & 0x00200000 )
- rOut.WriteUInt16( pPortion->mnAsianOrComplexFont );
+ rOut.WriteUInt16( rPortion.mnAsianOrComplexFont );
if ( nPropertyFlags & 0x00020000 )
- rOut.WriteUInt16( (sal_uInt16)( pPortion->mnCharHeight ) );
+ rOut.WriteUInt16( (sal_uInt16)( rPortion.mnCharHeight ) );
if ( nPropertyFlags & 0x00040000 )
rOut.WriteUInt32( (sal_uInt32)nCharColor );
if ( nPropertyFlags & 0x00080000 )
- rOut.WriteInt16( pPortion->mnCharEscapement );
+ rOut.WriteInt16( rPortion.mnCharEscapement );
}
}
}
@@ -1039,15 +1039,15 @@ void PPTWriter::ImplAdjustFirstLineLineSpacing( TextObj& rTextObj, EscherPropert
ParagraphObj* pPara = rTextObj.GetParagraph(0);
if ( !pPara->empty() )
{
- PortionObj* pPortion = pPara->front();
+ const PortionObj& rPortion = pPara->front();
sal_Int16 nLineSpacing = pPara->mnLineSpacing;
- const FontCollectionEntry* pDesc = maFontCollection.GetById( pPortion->mnFont );
+ const FontCollectionEntry* pDesc = maFontCollection.GetById( rPortion.mnFont );
if ( pDesc )
nLineSpacing = (sal_Int16)( (double)nLineSpacing * pDesc->Scaling + 0.5 );
if ( ( nLineSpacing > 0 ) && ( nLineSpacing < 100 ) )
{
- double fCharHeight = pPortion->mnCharHeight;
+ double fCharHeight = rPortion.mnCharHeight;
fCharHeight *= 2540 / 72;
fCharHeight *= 100 - nLineSpacing;
fCharHeight /= 100;
@@ -1098,12 +1098,12 @@ void PPTWriter::ImplWriteTextStyleAtom( SvStream& rOut, int nTextInstance, sal_u
for ( sal_uInt32 i = 0; i < aTextObj.ParagraphCount(); ++i )
{
pPara = aTextObj.GetParagraph(i);
- for ( ParagraphObj::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
+ for ( boost::ptr_vector<PortionObj>::const_iterator it = pPara->begin(); it != pPara->end(); ++it )
{
- PortionObj* pPortion = *it;
- if ( pPortion->mpFieldEntry )
+ const PortionObj& rPortion = *it;
+ if ( rPortion.mpFieldEntry )
{
- const FieldEntry* pFieldEntry = pPortion->mpFieldEntry;
+ const FieldEntry* pFieldEntry = rPortion.mpFieldEntry;
switch ( pFieldEntry->nFieldType >> 28 )
{
@@ -3859,16 +3859,16 @@ void TextObjBinary::WriteTextSpecInfo( SvStream* pStrm )
for ( sal_uInt32 i = 0; nCharactersLeft && i < ParagraphCount(); ++i )
{
ParagraphObj* pPtr = GetParagraph(i);
- for ( ParagraphObj::const_iterator it = pPtr->begin(); nCharactersLeft && it != pPtr->end(); ++it )
+ for ( boost::ptr_vector<PortionObj>::const_iterator it = pPtr->begin(); nCharactersLeft && it != pPtr->end(); ++it )
{
- PortionObj* pPortion = *it;
- sal_Int32 nPortionSize = pPortion->mnTextSize >= nCharactersLeft ? nCharactersLeft : pPortion->mnTextSize;
+ const PortionObj& rPortion = *it;
+ sal_Int32 nPortionSize = rPortion.mnTextSize >= nCharactersLeft ? nCharactersLeft : rPortion.mnTextSize;
sal_Int32 nFlags = 7;
nCharactersLeft -= nPortionSize;
pStrm ->WriteUInt32( static_cast< sal_uInt32 >( nPortionSize ) )
.WriteInt32( nFlags )
.WriteInt16( static_cast< sal_Int16 >( 1 ) ) // spellinfo -> needs rechecking
- .WriteInt16( static_cast< sal_Int16 >( LanguageTag( pPortion->meCharLocale ).makeFallback().getLanguageType() ) )
+ .WriteInt16( static_cast< sal_Int16 >( LanguageTag( rPortion.meCharLocale ).makeFallback().getLanguageType() ) )
.WriteInt16( static_cast< sal_Int16 >( 0 ) ); // alt language
}
}
diff --git a/sd/source/filter/eppt/pptx-text.cxx b/sd/source/filter/eppt/pptx-text.cxx
index 9980d84..22a62b4 100644
--- a/sd/source/filter/eppt/pptx-text.cxx
+++ b/sd/source/filter/eppt/pptx-text.cxx
@@ -648,7 +648,10 @@ PortionObj& PortionObj::operator=( const PortionObj& rPortionObj )
ParagraphObj::ParagraphObj(const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSet,
PPTExBulletProvider& rProv)
- : maMapModeSrc(MAP_100TH_MM)
+ : PropStateValue()
+ , SOParagraph()
+ , mvPortions()
+ , maMapModeSrc(MAP_100TH_MM)
, maMapModeDest(MAP_INCH, Point(), Fraction( 1, 576 ), Fraction( 1, 576 ))
, mnTextSize(0)
, mbFirstParagraph(false)
@@ -675,7 +678,10 @@ ParagraphObj::ParagraphObj(const ::com::sun::star::uno::Reference< ::com::sun::s
ParagraphObj::ParagraphObj(::com::sun::star::uno::Reference< ::com::sun::star::text::XTextContent > & rXTextContent,
ParaFlags aParaFlags, FontCollection& rFontCollection, PPTExBulletProvider& rProv )
- : maMapModeSrc(MAP_100TH_MM)
+ : PropStateValue()
+ , SOParagraph()
+ , mvPortions()
+ , maMapModeSrc(MAP_100TH_MM)
, maMapModeDest(MAP_INCH, Point(), Fraction( 1, 576 ), Fraction( 1, 576 ))
, mnTextSize(0)
, mbIsBullet(false)
@@ -730,7 +736,7 @@ ParagraphObj::ParagraphObj(::com::sun::star::uno::Reference< ::com::sun::star::t
{
PortionObj* pPortionObj = new PortionObj( aXCursorText, !aXTextPortionE->hasMoreElements(), rFontCollection );
if ( pPortionObj->Count() )
- push_back( pPortionObj );
+ mvPortions.push_back( pPortionObj );
else
delete pPortionObj;
}
@@ -742,9 +748,9 @@ ParagraphObj::ParagraphObj(::com::sun::star::uno::Reference< ::com::sun::star::t
}
ParagraphObj::ParagraphObj( const ParagraphObj& rObj )
-: std::vector<PortionObj*>()
-, PropStateValue()
+: PropStateValue()
, SOParagraph()
+, mvPortions()
{
ImplConstruct( rObj );
}
@@ -756,14 +762,13 @@ ParagraphObj::~ParagraphObj()
void ParagraphObj::Write( SvStream* pStrm )
{
- for ( const_iterator it = begin(); it != end(); ++it )
- (*it)->Write( pStrm, mbLastParagraph );
+ for ( boost::ptr_vector<PortionObj>::iterator it = mvPortions.begin(); it != mvPortions.end(); ++it )
+ it->Write( pStrm, mbLastParagraph );
}
void ParagraphObj::ImplClear()
{
- for ( const_iterator it = begin(); it != end(); ++it )
- delete *it;
+ mvPortions.clear();
}
void ParagraphObj::CalculateGraphicBulletSize( sal_uInt16 nFontHeight )
@@ -922,8 +927,7 @@ void ParagraphObj::ImplGetNumberingLevel( PPTExBulletProvider& rBuProv, sal_Int1
}
}
- PortionObj* pPortion = front();
- CalculateGraphicBulletSize( ( pPortion ) ? pPortion->mnCharHeight : 24 );
+ CalculateGraphicBulletSize( ( mvPortions.empty() ) ? 24 : mvPortions.front().mnCharHeight );
switch( nNumberingType )
{
@@ -1235,8 +1239,8 @@ void ParagraphObj::ImplConstruct( const ParagraphObj& rParagraphObj )
mbForbiddenRules = rParagraphObj.mbForbiddenRules;
mnBiDi = rParagraphObj.mnBiDi;
- for ( ParagraphObj::const_iterator it = rParagraphObj.begin(); it != rParagraphObj.end(); ++it )
- push_back( new PortionObj( **it ) );
+ for ( boost::ptr_vector<PortionObj>::const_iterator it = rParagraphObj.begin(); it != rParagraphObj.end(); ++it )
+ mvPortions.push_back( new PortionObj( *it ) );
maTabStop = rParagraphObj.maTabStop;
bExtendedParameters = rParagraphObj.bExtendedParameters;
@@ -1264,8 +1268,8 @@ void ParagraphObj::ImplConstruct( const ParagraphObj& rParagraphObj )
sal_uInt32 ParagraphObj::ImplCalculateTextPositions( sal_uInt32 nCurrentTextPosition )
{
mnTextSize = 0;
- for ( const_iterator it = begin(); it != end(); ++it )
- mnTextSize += (*it)->ImplCalculateTextPositions( nCurrentTextPosition + mnTextSize );
+ for ( boost::ptr_vector<PortionObj>::iterator it = mvPortions.begin(); it != mvPortions.end(); ++it )
+ mnTextSize += it->ImplCalculateTextPositions( nCurrentTextPosition + mnTextSize );
return mnTextSize;
}
diff --git a/sd/source/filter/eppt/text.hxx b/sd/source/filter/eppt/text.hxx
index e7fe688..15d87ba 100644
--- a/sd/source/filter/eppt/text.hxx
+++ b/sd/source/filter/eppt/text.hxx
@@ -27,7 +27,7 @@
#include <com/sun/star/awt/FontDescriptor.hpp>
#include <com/sun/star/lang/Locale.hpp>
#include <editeng/svxenum.hxx>
-
+#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/shared_ptr.hpp>
namespace com { namespace sun { namespace star {
@@ -172,11 +172,12 @@ struct ParaFlags
ParaFlags() { bFirstParagraph = true; bLastParagraph = false; };
};
-class ParagraphObj : public std::vector<PortionObj*>, public PropStateValue, public SOParagraph
+class ParagraphObj : public PropStateValue, public SOParagraph
{
friend class TextObj;
friend struct PPTExParaSheet;
+ boost::ptr_vector<PortionObj> mvPortions;
MapMode maMapModeSrc;
MapMode maMapModeDest;
@@ -223,6 +224,13 @@ class ParagraphObj : public std::vector<PortionObj*>, public PropStateValue, pub
ParagraphObj( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > & rXPropSetRef,
PPTExBulletProvider& rBuProv );
+ bool empty() const { return mvPortions.empty(); }
+
+ const PortionObj& front() const { return mvPortions.front(); }
+
+ boost::ptr_vector<PortionObj>::const_iterator begin() const { return mvPortions.begin(); }
+ boost::ptr_vector<PortionObj>::const_iterator end() const { return mvPortions.end(); }
+
void CalculateGraphicBulletSize( sal_uInt16 nFontHeight );
~ParagraphObj();
More information about the Libreoffice-commits
mailing list