summaryrefslogtreecommitdiff
path: root/sc/source
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2022-07-05 14:07:20 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2022-07-06 18:58:14 +0200
commit51e1f131ac30beab0c56d56004451688db44ca3d (patch)
treebedcc3df202005eecba7f8c236ba6d1f1326182a /sc/source
parent779f38adf952e816218e2dac26513e8ff106d651 (diff)
compact the RichStringPortion class
Which reduces peak memory load from 548M to 495M when loading a large spreadsheet Change-Id: I74adfddd1722bba7a9dfae6dd0135e5f2b78b1a7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136826 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> (cherry picked from commit 16c722b2b13373d2206cb562ad8cf606efc48d35) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/136771 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Diffstat (limited to 'sc/source')
-rw-r--r--sc/source/filter/inc/richstring.hxx29
-rw-r--r--sc/source/filter/inc/richstringcontext.hxx2
-rw-r--r--sc/source/filter/inc/worksheethelper.hxx2
-rw-r--r--sc/source/filter/oox/richstring.cxx55
-rw-r--r--sc/source/filter/oox/richstringcontext.cxx12
-rw-r--r--sc/source/filter/oox/worksheethelper.cxx2
6 files changed, 50 insertions, 52 deletions
diff --git a/sc/source/filter/inc/richstring.hxx b/sc/source/filter/inc/richstring.hxx
index 71b393c1db41..fe0d0f2f527a 100644
--- a/sc/source/filter/inc/richstring.hxx
+++ b/sc/source/filter/inc/richstring.hxx
@@ -35,20 +35,20 @@ namespace oox { class SequenceInputStream; }
namespace oox::xls {
/** Contains text data and font attributes for a part of a rich formatted string. */
-class RichStringPortion : public WorkbookHelper
+class RichStringPortion
{
public:
- explicit RichStringPortion( const WorkbookHelper& rHelper );
+ RichStringPortion();
/** Sets text data for this portion. */
void setText( const OUString& rText );
/** Creates and returns a new font formatting object. */
- FontRef const & createFont();
+ FontRef const & createFont(const WorkbookHelper& rHelper);
/** Links this portion to a font object from the global font list. */
void setFontId( sal_Int32 nFontId );
/** Final processing after import of all strings. */
- void finalizeImport();
+ void finalizeImport(const WorkbookHelper& rHelper);
/** Returns the text data of this portion. */
const OUString& getText() const { return maText; }
@@ -71,8 +71,6 @@ private:
bool mbConverted; /// Without repeatedly convert
};
-typedef std::shared_ptr< RichStringPortion > RichStringPortionRef;
-
/** Represents a position in a rich-string containing current font identifier.
This object stores the position of a formatted character in a rich-string
@@ -210,10 +208,10 @@ class RichString : public WorkbookHelper
public:
explicit RichString( const WorkbookHelper& rHelper );
- /** Appends and returns a portion object for a plain string (t element). */
- RichStringPortionRef importText();
- /** Appends and returns a portion object for a new formatting run (r element). */
- RichStringPortionRef importRun();
+ /** Appends and returns an index of a portion object for a plain string (t element). */
+ sal_Int32 importText();
+ /** Appends and returns an index of a portion object for a new formatting run (r element). */
+ sal_Int32 importRun();
/** Appends and returns a phonetic text object for a new phonetic run (rPh element). */
RichStringPhoneticRef importPhoneticRun( const AttributeList& rAttribs );
/** Imports phonetic settings from the rPhoneticPr element. */
@@ -234,12 +232,14 @@ public:
/** Converts the string and writes it into the passed XText, replace old contents of the text object,.
@param rxText The XText interface of the target object.
*/
- void convert( const css::uno::Reference< css::text::XText >& rxText ) const;
- std::unique_ptr<EditTextObject> convert( ScEditEngineDefaulter& rEE, const oox::xls::Font* pFont ) const;
+ void convert( const css::uno::Reference< css::text::XText >& rxText );
+ std::unique_ptr<EditTextObject> convert( ScEditEngineDefaulter& rEE, const oox::xls::Font* pFont );
+
+ RichStringPortion& getPortion(sal_Int32 nPortionIdx) { return maTextPortions[nPortionIdx]; }
private:
/** Creates, appends, and returns a new empty string portion. */
- RichStringPortionRef createPortion();
+ sal_Int32 createPortion();
/** Creates, appends, and returns a new empty phonetic text portion. */
RichStringPhoneticRef createPhonetic();
@@ -249,10 +249,9 @@ private:
void createPhoneticPortions( const OUString& rText, PhoneticPortionModelList& rPortions, sal_Int32 nBaseLen );
private:
- typedef RefVector< RichStringPortion > PortionVector;
typedef RefVector< RichStringPhonetic > PhoneticVector;
- PortionVector maTextPortions; /// String portions with font data.
+ std::vector<RichStringPortion> maTextPortions; /// String portions with font data.
PhoneticSettings maPhonSettings; /// Phonetic settings for this string.
PhoneticVector maPhonPortions; /// Phonetic text portions.
};
diff --git a/sc/source/filter/inc/richstringcontext.hxx b/sc/source/filter/inc/richstringcontext.hxx
index 83e2fa4cc070..b944bfa84b9d 100644
--- a/sc/source/filter/inc/richstringcontext.hxx
+++ b/sc/source/filter/inc/richstringcontext.hxx
@@ -37,7 +37,7 @@ protected:
private:
RichStringRef mxString; /// Processed string.
- RichStringPortionRef mxPortion; /// Processed portion in the string.
+ sal_Int32 mnPortionIdx = -1; /// Processed portion in the string.
RichStringPhoneticRef mxPhonetic; /// Processed phonetic text portion.
};
diff --git a/sc/source/filter/inc/worksheethelper.hxx b/sc/source/filter/inc/worksheethelper.hxx
index 3aeb576f93de..3a44dc2e105e 100644
--- a/sc/source/filter/inc/worksheethelper.hxx
+++ b/sc/source/filter/inc/worksheethelper.hxx
@@ -262,7 +262,7 @@ public:
/** Inserts a rich-string cell directly into the Calc sheet. */
void putRichString(
const ScAddress& rAddress,
- const RichString& rString, const oox::xls::Font* pFirstPortionFont );
+ RichString& rString, const oox::xls::Font* pFirstPortionFont );
/** Inserts a formula cell directly into the Calc sheet. */
void putFormulaTokens(
diff --git a/sc/source/filter/oox/richstring.cxx b/sc/source/filter/oox/richstring.cxx
index 294fddfbc86a..bc040cdceeb5 100644
--- a/sc/source/filter/oox/richstring.cxx
+++ b/sc/source/filter/oox/richstring.cxx
@@ -160,8 +160,7 @@ OUString lcl_unEscapeUnicodeChars(const OUString& rSrc)
} // namespace
-RichStringPortion::RichStringPortion( const WorkbookHelper& rHelper ) :
- WorkbookHelper( rHelper ),
+RichStringPortion::RichStringPortion() :
mnFontId( -1 ),
mbConverted( false )
{
@@ -172,9 +171,9 @@ void RichStringPortion::setText( const OUString& rText )
maText = lcl_unEscapeUnicodeChars(rText);
}
-FontRef const & RichStringPortion::createFont()
+FontRef const & RichStringPortion::createFont(const WorkbookHelper& rHelper)
{
- mxFont = std::make_shared<Font>( *this, false );
+ mxFont = std::make_shared<Font>( rHelper, false );
return mxFont;
}
@@ -183,12 +182,12 @@ void RichStringPortion::setFontId( sal_Int32 nFontId )
mnFontId = nFontId;
}
-void RichStringPortion::finalizeImport()
+void RichStringPortion::finalizeImport(const WorkbookHelper& rHelper)
{
if( mxFont )
mxFont->finalizeImport();
else if( mnFontId >= 0 )
- mxFont = getStyles().getFont( mnFontId );
+ mxFont = rHelper.getStyles().getFont( mnFontId );
}
void RichStringPortion::convert( const Reference< XText >& rxText, bool bReplace )
@@ -411,12 +410,12 @@ RichString::RichString( const WorkbookHelper& rHelper ) :
{
}
-RichStringPortionRef RichString::importText()
+sal_Int32 RichString::importText()
{
return createPortion();
}
-RichStringPortionRef RichString::importRun()
+sal_Int32 RichString::importRun()
{
return createPortion();
}
@@ -446,7 +445,7 @@ void RichString::importString( SequenceInputStream& rStrm, bool bRich )
}
else
{
- createPortion()->setText( aBaseText );
+ getPortion(createPortion()).setText( aBaseText );
}
if( !rStrm.isEof() && getFlag( nFlags, BIFF12_STRINGFLAG_PHONETICS ) )
@@ -461,7 +460,8 @@ void RichString::importString( SequenceInputStream& rStrm, bool bRich )
void RichString::finalizeImport()
{
- maTextPortions.forEachMem( &RichStringPortion::finalizeImport );
+ for (RichStringPortion& rPortion : maTextPortions)
+ rPortion.finalizeImport( *this );
}
bool RichString::extractPlainString( OUString& orString, const oox::xls::Font* pFirstPortionFont ) const
@@ -473,50 +473,50 @@ bool RichString::extractPlainString( OUString& orString, const oox::xls::Font* p
orString.clear();
return true;
}
- if( (maTextPortions.size() == 1) && !maTextPortions.front()->hasFont() && !lclNeedsRichTextFormat( pFirstPortionFont ) )
+ if( (maTextPortions.size() == 1) && !maTextPortions.front().hasFont() && !lclNeedsRichTextFormat( pFirstPortionFont ) )
{
- orString = maTextPortions.front()->getText();
+ orString = maTextPortions.front().getText();
return orString.indexOf( '\x0A' ) < 0;
}
return false;
}
-void RichString::convert( const Reference< XText >& rxText ) const
+void RichString::convert( const Reference< XText >& rxText )
{
if (maTextPortions.size() == 1)
{
// Set text directly to the cell when the string has only one portion.
// It's much faster this way.
- RichStringPortion& rPtn = *maTextPortions.front();
+ const RichStringPortion& rPtn = maTextPortions.front();
rxText->setString(rPtn.getText());
rPtn.writeFontProperties(rxText);
return;
}
bool bReplaceOld = true;
- for( const auto& rxTextPortion : maTextPortions )
+ for( auto& rTextPortion : maTextPortions )
{
- rxTextPortion->convert( rxText, bReplaceOld );
+ rTextPortion.convert( rxText, bReplaceOld );
bReplaceOld = false; // do not replace first portion text with following portions
}
}
-std::unique_ptr<EditTextObject> RichString::convert( ScEditEngineDefaulter& rEE, const oox::xls::Font* pFirstPortionFont ) const
+std::unique_ptr<EditTextObject> RichString::convert( ScEditEngineDefaulter& rEE, const oox::xls::Font* pFirstPortionFont )
{
ESelection aSelection;
OUStringBuffer sString;
- for( const auto& rxTextPortion : maTextPortions )
- sString.append(rxTextPortion->getText());
+ for( auto& rTextPortion : maTextPortions )
+ sString.append(rTextPortion.getText());
// fdo#84370 - diving into editeng is not thread safe.
SolarMutexGuard aGuard;
rEE.SetTextCurrentDefaults( sString.makeStringAndClear() );
- for( const auto& rxTextPortion : maTextPortions )
+ for( auto& rTextPortion : maTextPortions )
{
- rxTextPortion->convert( rEE, aSelection, pFirstPortionFont );
+ rTextPortion.convert( rEE, aSelection, pFirstPortionFont );
pFirstPortionFont = nullptr;
}
@@ -525,11 +525,10 @@ std::unique_ptr<EditTextObject> RichString::convert( ScEditEngineDefaulter& rEE,
// private --------------------------------------------------------------------
-RichStringPortionRef RichString::createPortion()
+sal_Int32 RichString::createPortion()
{
- RichStringPortionRef xPortion = std::make_shared<RichStringPortion>( *this );
- maTextPortions.push_back( xPortion );
- return xPortion;
+ maTextPortions.emplace_back();
+ return maTextPortions.size() - 1;
}
RichStringPhoneticRef RichString::createPhonetic()
@@ -558,9 +557,9 @@ void RichString::createTextPortions( const OUString& rText, FontPortionModelList
sal_Int32 nPortionLen = (aIt + 1)->mnPos - aIt->mnPos;
if( (0 < nPortionLen) && (aIt->mnPos + nPortionLen <= nStrLen) )
{
- RichStringPortionRef xPortion = createPortion();
- xPortion->setText( rText.copy( aIt->mnPos, nPortionLen ) );
- xPortion->setFontId( aIt->mnFontId );
+ RichStringPortion& rPortion = getPortion(createPortion());
+ rPortion.setText( rText.copy( aIt->mnPos, nPortionLen ) );
+ rPortion.setFontId( aIt->mnFontId );
}
}
}
diff --git a/sc/source/filter/oox/richstringcontext.cxx b/sc/source/filter/oox/richstringcontext.cxx
index e7c3fd618bed..7f899f23bb27 100644
--- a/sc/source/filter/oox/richstringcontext.cxx
+++ b/sc/source/filter/oox/richstringcontext.cxx
@@ -33,10 +33,10 @@ ContextHandlerRef RichStringContext::onCreateContext( sal_Int32 nElement, const
switch( nElement )
{
case XLS_TOKEN( t ):
- mxPortion = mxString->importText();
+ mnPortionIdx = mxString->importText();
return this; // collect text in onCharacters()
case XLS_TOKEN( r ):
- mxPortion = mxString->importRun();
+ mnPortionIdx = mxString->importRun();
return this;
case XLS_TOKEN( rPh ):
mxPhonetic = mxString->importPhoneticRun( rAttribs );
@@ -52,8 +52,8 @@ ContextHandlerRef RichStringContext::onCreateContext( sal_Int32 nElement, const
switch( nElement )
{
case XLS_TOKEN( rPr ):
- if( mxPortion )
- return new FontContext( *this, mxPortion->createFont() );
+ if( mnPortionIdx != -1 )
+ return new FontContext( *this, mxString->getPortion(mnPortionIdx).createFont(*this) );
break;
case XLS_TOKEN( t ):
@@ -81,8 +81,8 @@ void RichStringContext::onCharacters( const OUString& rChars )
mxPhonetic->setText( rChars );
break;
default:
- if( mxPortion )
- mxPortion->setText( rChars );
+ if( mnPortionIdx != -1 )
+ mxString->getPortion(mnPortionIdx).setText( rChars );
}
}
diff --git a/sc/source/filter/oox/worksheethelper.cxx b/sc/source/filter/oox/worksheethelper.cxx
index 1cb02316ebdf..a50f46d8662a 100644
--- a/sc/source/filter/oox/worksheethelper.cxx
+++ b/sc/source/filter/oox/worksheethelper.cxx
@@ -1591,7 +1591,7 @@ void WorksheetHelper::setCellFormulaValue(
getFormulaBuffer().setCellFormulaValue(rAddress, rValueStr, nCellType);
}
-void WorksheetHelper::putRichString( const ScAddress& rAddress, const RichString& rString, const oox::xls::Font* pFirstPortionFont )
+void WorksheetHelper::putRichString( const ScAddress& rAddress, RichString& rString, const oox::xls::Font* pFirstPortionFont )
{
ScEditEngineDefaulter& rEE = getEditEngine();