Kaydet (Commit) 3a545893 authored tarafından Noel Grandin's avatar Noel Grandin

convert Primitive2DContainer to std::deque

since we only care about appending to this container, and then
traversing it (normally once). So reduce the re-allocations that
std::vector requires

Change-Id: I206a7b82d9eefc1fa3762c4a03e7b5e21136951f
Reviewed-on: https://gerrit.libreoffice.org/30706Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 81e3f5f2
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <com/sun/star/util/XAccounting.hpp> #include <com/sun/star/util/XAccounting.hpp>
#include <cppuhelper/basemutex.hxx> #include <cppuhelper/basemutex.hxx>
#include <basegfx/range/b2drange.hxx> #include <basegfx/range/b2drange.hxx>
#include <deque>
/** defines for DeclPrimitive2DIDBlock and ImplPrimitive2DIDBlock /** defines for DeclPrimitive2DIDBlock and ImplPrimitive2DIDBlock
...@@ -58,21 +59,21 @@ namespace drawinglayer { namespace primitive2d { ...@@ -58,21 +59,21 @@ namespace drawinglayer { namespace primitive2d {
typedef css::uno::Sequence< Primitive2DReference > Primitive2DSequence; typedef css::uno::Sequence< Primitive2DReference > Primitive2DSequence;
class SAL_WARN_UNUSED DRAWINGLAYER_DLLPUBLIC Primitive2DContainer : public std::vector< Primitive2DReference > class SAL_WARN_UNUSED DRAWINGLAYER_DLLPUBLIC Primitive2DContainer : public std::deque< Primitive2DReference >
{ {
public: public:
explicit Primitive2DContainer() {} explicit Primitive2DContainer() {}
explicit Primitive2DContainer( size_type count ) : vector(count) {} explicit Primitive2DContainer( size_type count ) : deque(count) {}
Primitive2DContainer( const Primitive2DContainer& other ) : vector(other) {} Primitive2DContainer( const Primitive2DContainer& other ) : deque(other) {}
Primitive2DContainer( const Primitive2DContainer&& other ) : vector(other) {} Primitive2DContainer( const Primitive2DContainer&& other ) : deque(other) {}
Primitive2DContainer( const vector< Primitive2DReference >& other ) : vector(other) {} Primitive2DContainer( const std::deque< Primitive2DReference >& other ) : deque(other) {}
Primitive2DContainer( std::initializer_list<Primitive2DReference> init ) : vector(init) {} Primitive2DContainer( std::initializer_list<Primitive2DReference> init ) : deque(init) {}
void append(const Primitive2DContainer& rSource); void append(const Primitive2DContainer& rSource);
void append(const Primitive2DSequence& rSource); void append(const Primitive2DSequence& rSource);
void append(Primitive2DContainer&& rSource); void append(Primitive2DContainer&& rSource);
Primitive2DContainer& operator=(const Primitive2DContainer& r) { vector::operator=(r); return *this; } Primitive2DContainer& operator=(const Primitive2DContainer& r) { deque::operator=(r); return *this; }
Primitive2DContainer& operator=(const Primitive2DContainer&& r) { vector::operator=(r); return *this; } Primitive2DContainer& operator=(const Primitive2DContainer&& r) { deque::operator=(r); return *this; }
bool operator==(const Primitive2DContainer& rB) const; bool operator==(const Primitive2DContainer& rB) const;
bool operator!=(const Primitive2DContainer& rB) const { return !operator==(rB); } bool operator!=(const Primitive2DContainer& rB) const { return !operator==(rB); }
basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D& aViewInformation) const; basegfx::B2DRange getB2DRange(const geometry::ViewInformation2D& aViewInformation) const;
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <cppuhelper/basemutex.hxx> #include <cppuhelper/basemutex.hxx>
#include <com/sun/star/graphic/XPrimitive3D.hpp> #include <com/sun/star/graphic/XPrimitive3D.hpp>
#include <basegfx/range/b3drange.hxx> #include <basegfx/range/b3drange.hxx>
#include <deque>
/** defines for DeclPrimitive3DIDBlock and ImplPrimitive3DIDBlock /** defines for DeclPrimitive3DIDBlock and ImplPrimitive3DIDBlock
...@@ -53,18 +54,18 @@ namespace drawinglayer { namespace primitive3d { ...@@ -53,18 +54,18 @@ namespace drawinglayer { namespace primitive3d {
typedef css::uno::Reference< css::graphic::XPrimitive3D > Primitive3DReference; typedef css::uno::Reference< css::graphic::XPrimitive3D > Primitive3DReference;
typedef css::uno::Sequence< Primitive3DReference > Primitive3DSequence; typedef css::uno::Sequence< Primitive3DReference > Primitive3DSequence;
class SAL_WARN_UNUSED DRAWINGLAYER_DLLPUBLIC Primitive3DContainer : public std::vector< Primitive3DReference > class SAL_WARN_UNUSED DRAWINGLAYER_DLLPUBLIC Primitive3DContainer : public std::deque< Primitive3DReference >
{ {
public: public:
explicit Primitive3DContainer() {} explicit Primitive3DContainer() {}
explicit Primitive3DContainer( size_type count ) : vector(count) {} explicit Primitive3DContainer( size_type count ) : deque(count) {}
Primitive3DContainer( const Primitive3DContainer& other ) : vector(other) {} Primitive3DContainer( const Primitive3DContainer& other ) : deque(other) {}
Primitive3DContainer( const Primitive3DContainer&& other ) : vector(other) {} Primitive3DContainer( const Primitive3DContainer&& other ) : deque(other) {}
Primitive3DContainer( std::initializer_list<Primitive3DReference> init ) : vector(init) {} Primitive3DContainer( std::initializer_list<Primitive3DReference> init ) : deque(init) {}
void append(const Primitive3DContainer& rSource); void append(const Primitive3DContainer& rSource);
Primitive3DContainer& operator=(const Primitive3DContainer& r) { vector::operator=(r); return *this; } Primitive3DContainer& operator=(const Primitive3DContainer& r) { deque::operator=(r); return *this; }
Primitive3DContainer& operator=(const Primitive3DContainer&& r) { vector::operator=(r); return *this; } Primitive3DContainer& operator=(const Primitive3DContainer&& r) { deque::operator=(r); return *this; }
bool operator==(const Primitive3DContainer& rB) const; bool operator==(const Primitive3DContainer& rB) const;
bool operator!=(const Primitive3DContainer& rB) const { return !operator==(rB); } bool operator!=(const Primitive3DContainer& rB) const { return !operator==(rB); }
basegfx::B3DRange getB3DRange(const geometry::ViewInformation3D& aViewInformation) const; basegfx::B3DRange getB3DRange(const geometry::ViewInformation3D& aViewInformation) const;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <com/sun/star/graphic/XPrimitive2D.hpp> #include <com/sun/star/graphic/XPrimitive2D.hpp>
#include <vcl/bitmapex.hxx> #include <vcl/bitmapex.hxx>
#include <rtl/ustring.hxx> #include <rtl/ustring.hxx>
#include <deque>
typedef css::uno::Sequence<sal_Int8> SvgDataArray; typedef css::uno::Sequence<sal_Int8> SvgDataArray;
...@@ -33,7 +34,7 @@ typedef css::uno::Sequence<sal_Int8> SvgDataArray; ...@@ -33,7 +34,7 @@ typedef css::uno::Sequence<sal_Int8> SvgDataArray;
// using default parameters and graphic::XPrimitive2DRenderer // using default parameters and graphic::XPrimitive2DRenderer
BitmapEx VCL_DLLPUBLIC convertPrimitive2DSequenceToBitmapEx( BitmapEx VCL_DLLPUBLIC convertPrimitive2DSequenceToBitmapEx(
const std::vector< css::uno::Reference< css::graphic::XPrimitive2D > >& rSequence, const std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >& rSequence,
const basegfx::B2DRange& rTargetRange, const basegfx::B2DRange& rTargetRange,
const sal_uInt32 nMaximumQuadraticPixels = 500000); const sal_uInt32 nMaximumQuadraticPixels = 500000);
...@@ -49,7 +50,7 @@ private: ...@@ -49,7 +50,7 @@ private:
// on demand created content // on demand created content
basegfx::B2DRange maRange; basegfx::B2DRange maRange;
std::vector< css::uno::Reference< css::graphic::XPrimitive2D > > std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >
maSequence; maSequence;
BitmapEx maReplacement; BitmapEx maReplacement;
size_t mNestedBitmapSize; size_t mNestedBitmapSize;
...@@ -74,7 +75,7 @@ public: ...@@ -74,7 +75,7 @@ public:
/// data read and evtl. on demand creation /// data read and evtl. on demand creation
const basegfx::B2DRange& getRange() const; const basegfx::B2DRange& getRange() const;
const std::vector< css::uno::Reference< css::graphic::XPrimitive2D > >& getPrimitive2DSequence() const; const std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >& getPrimitive2DSequence() const;
const BitmapEx& getReplacement() const; const BitmapEx& getReplacement() const;
}; };
......
...@@ -105,7 +105,7 @@ namespace svgio ...@@ -105,7 +105,7 @@ namespace svgio
const uno::Reference< ::io::XInputStream >& xSVGStream, const uno::Reference< ::io::XInputStream >& xSVGStream,
const OUString& aAbsolutePath ) throw (uno::RuntimeException, std::exception) const OUString& aAbsolutePath ) throw (uno::RuntimeException, std::exception)
{ {
drawinglayer::primitive2d::Primitive2DSequence aRetval; drawinglayer::primitive2d::Primitive2DContainer aRetval;
if(xSVGStream.is()) if(xSVGStream.is())
{ {
...@@ -156,9 +156,7 @@ namespace svgio ...@@ -156,9 +156,7 @@ namespace svgio
if(Display_none != pCandidate->getDisplay()) if(Display_none != pCandidate->getDisplay())
{ {
drawinglayer::primitive2d::Primitive2DContainer aTmp = comphelper::sequenceToContainer<drawinglayer::primitive2d::Primitive2DContainer>(aRetval); pCandidate->decomposeSvgNode(aRetval, false);
pCandidate->decomposeSvgNode(aTmp, false);
aRetval = comphelper::containerToSequence(aTmp);
} }
} }
} }
...@@ -167,7 +165,7 @@ namespace svgio ...@@ -167,7 +165,7 @@ namespace svgio
OSL_ENSURE(false, "Invalid stream (!)"); OSL_ENSURE(false, "Invalid stream (!)");
} }
return aRetval; return comphelper::containerToSequence(aRetval);
} }
OUString SAL_CALL XSvgParser::getImplementationName() throw(uno::RuntimeException, std::exception) OUString SAL_CALL XSvgParser::getImplementationName() throw(uno::RuntimeException, std::exception)
......
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
using namespace ::com::sun::star; using namespace ::com::sun::star;
BitmapEx convertPrimitive2DSequenceToBitmapEx( BitmapEx convertPrimitive2DSequenceToBitmapEx(
const std::vector< css::uno::Reference< css::graphic::XPrimitive2D > >& rSequence, const std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >& rSequence,
const basegfx::B2DRange& rTargetRange, const basegfx::B2DRange& rTargetRange,
const sal_uInt32 nMaximumQuadraticPixels) const sal_uInt32 nMaximumQuadraticPixels)
{ {
...@@ -90,7 +90,7 @@ BitmapEx convertPrimitive2DSequenceToBitmapEx( ...@@ -90,7 +90,7 @@ BitmapEx convertPrimitive2DSequenceToBitmapEx(
} }
size_t estimateSize( size_t estimateSize(
std::vector<uno::Reference<graphic::XPrimitive2D>> const& rSequence) std::deque<uno::Reference<graphic::XPrimitive2D>> const& rSequence)
{ {
size_t nRet(0); size_t nRet(0);
for (auto& it : rSequence) for (auto& it : rSequence)
...@@ -131,7 +131,8 @@ void SvgData::ensureSequenceAndRange() ...@@ -131,7 +131,8 @@ void SvgData::ensureSequenceAndRange()
{ {
const uno::Reference< graphic::XSvgParser > xSvgParser = graphic::SvgTools::create(xContext); const uno::Reference< graphic::XSvgParser > xSvgParser = graphic::SvgTools::create(xContext);
maSequence = comphelper::sequenceToContainer< std::vector< css::uno::Reference< css::graphic::XPrimitive2D > > >(xSvgParser->getDecomposition(myInputStream, maPath)); maSequence = comphelper::sequenceToContainer<std::deque<css::uno::Reference< css::graphic::XPrimitive2D >>,
css::uno::Reference< css::graphic::XPrimitive2D >>(xSvgParser->getDecomposition(myInputStream, maPath));
} }
catch(const uno::Exception&) catch(const uno::Exception&)
{ {
...@@ -220,7 +221,7 @@ const basegfx::B2DRange& SvgData::getRange() const ...@@ -220,7 +221,7 @@ const basegfx::B2DRange& SvgData::getRange() const
return maRange; return maRange;
} }
const std::vector< css::uno::Reference< css::graphic::XPrimitive2D > >& SvgData::getPrimitive2DSequence() const const std::deque< css::uno::Reference< css::graphic::XPrimitive2D > >& SvgData::getPrimitive2DSequence() const
{ {
const_cast< SvgData* >(this)->ensureSequenceAndRange(); const_cast< SvgData* >(this)->ensureSequenceAndRange();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment