src/lib/VSDContentCollector.cpp | 29 ++++--------- src/lib/VSDContentCollector.h | 7 --- src/lib/VSDOutputElementList.cpp | 81 ++++++++++++++++++++++----------------- src/lib/VSDOutputElementList.h | 5 +- 4 files changed, 62 insertions(+), 60 deletions(-)
New commits: commit a77d75a76538c0217613ec59bff8a2494b61601b Author: David Tardon <[email protected]> Date: Sat Apr 15 11:45:21 2017 +0200 avoid self-assignment Change-Id: I57eb9e74fbe3430fb99d13505865e7b5633d85bf diff --git a/src/lib/VSDOutputElementList.cpp b/src/lib/VSDOutputElementList.cpp index a25da51..1d1ecde 100644 --- a/src/lib/VSDOutputElementList.cpp +++ b/src/lib/VSDOutputElementList.cpp @@ -519,10 +519,13 @@ libvisio::VSDOutputElementList::VSDOutputElementList(const libvisio::VSDOutputEl libvisio::VSDOutputElementList &libvisio::VSDOutputElementList::operator=(const libvisio::VSDOutputElementList &elementList) { - m_elements.clear(); + if (&elementList != this) + { + m_elements.clear(); - for (const auto &elem : elementList.m_elements) - m_elements.push_back(clone(elem)); + for (const auto &elem : elementList.m_elements) + m_elements.push_back(clone(elem)); + } return *this; } commit 66854863c4ea412f2ce11c2ca4c4dc4fa373f9fa Author: David Tardon <[email protected]> Date: Sat Apr 15 11:42:24 2017 +0200 simplify container traversal Change-Id: Id2e19536a679a62f0ff7da398e44aeeca0de8ce5 diff --git a/src/lib/VSDOutputElementList.cpp b/src/lib/VSDOutputElementList.cpp index 7556dad..a25da51 100644 --- a/src/lib/VSDOutputElementList.cpp +++ b/src/lib/VSDOutputElementList.cpp @@ -513,24 +513,24 @@ libvisio::VSDOutputElementList::VSDOutputElementList() libvisio::VSDOutputElementList::VSDOutputElementList(const libvisio::VSDOutputElementList &elementList) : m_elements() { - for (auto iter = elementList.m_elements.begin(); iter != elementList.m_elements.end(); ++iter) - m_elements.push_back(clone(*iter)); + for (const auto &elem : elementList.m_elements) + m_elements.push_back(clone(elem)); } libvisio::VSDOutputElementList &libvisio::VSDOutputElementList::operator=(const libvisio::VSDOutputElementList &elementList) { m_elements.clear(); - for (auto cstiter = elementList.m_elements.begin(); cstiter != elementList.m_elements.end(); ++cstiter) - m_elements.push_back(clone(*cstiter)); + for (const auto &elem : elementList.m_elements) + m_elements.push_back(clone(elem)); return *this; } void libvisio::VSDOutputElementList::append(const libvisio::VSDOutputElementList &elementList) { - for (auto cstiter = elementList.m_elements.begin(); cstiter != elementList.m_elements.end(); ++cstiter) - m_elements.push_back(clone(*cstiter)); + for (const auto &elem : elementList.m_elements) + m_elements.push_back(clone(elem)); } libvisio::VSDOutputElementList::~VSDOutputElementList() @@ -539,8 +539,8 @@ libvisio::VSDOutputElementList::~VSDOutputElementList() void libvisio::VSDOutputElementList::draw(librevenge::RVNGDrawingInterface *painter) const { - for (auto iter = m_elements.begin(); iter != m_elements.end(); ++iter) - (*iter)->draw(painter); + for (const auto &elem : m_elements) + elem->draw(painter); } void libvisio::VSDOutputElementList::addStyle(const librevenge::RVNGPropertyList &propList) commit ac6dd7ff5f0156e3f5ed322a1d8c96b93bf04fbd Author: David Tardon <[email protected]> Date: Sat Apr 15 11:43:29 2017 +0200 the dtor does not need to be virtual Change-Id: I57cdfd7469b979d29da7f82e2495c183e08ac299 diff --git a/src/lib/VSDOutputElementList.h b/src/lib/VSDOutputElementList.h index aef0bab..3222596 100644 --- a/src/lib/VSDOutputElementList.h +++ b/src/lib/VSDOutputElementList.h @@ -27,7 +27,7 @@ public: VSDOutputElementList(); VSDOutputElementList(const VSDOutputElementList &elementList); VSDOutputElementList &operator=(const VSDOutputElementList &elementList); - virtual ~VSDOutputElementList(); + ~VSDOutputElementList(); void append(const VSDOutputElementList &elementList); void draw(librevenge::RVNGDrawingInterface *painter) const; void addStyle(const librevenge::RVNGPropertyList &propList); commit 0a9bbb5cd3d9d9fec4b2e7cc81f89cfff6c27e44 Author: David Tardon <[email protected]> Date: Sat Apr 15 11:39:56 2017 +0200 avoid manual memory management Change-Id: Idd0c24ea2008303b948040d3cca9faf97481426c diff --git a/src/lib/VSDOutputElementList.cpp b/src/lib/VSDOutputElementList.cpp index 59cf392..7556dad 100644 --- a/src/lib/VSDOutputElementList.cpp +++ b/src/lib/VSDOutputElementList.cpp @@ -320,6 +320,23 @@ public: } // namespace libvisio +namespace +{ + +template<typename T, typename... Args> +std::unique_ptr<T> make_unique(Args &&... args) +{ + return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); +} + +template<typename T> +std::unique_ptr<T> clone(const std::unique_ptr<T> &other) +{ + return std::unique_ptr<T>(other->clone()); +} + +} + libvisio::VSDStyleOutputElement::VSDStyleOutputElement(const librevenge::RVNGPropertyList &propList) : m_propList(propList) {} @@ -496,131 +513,124 @@ libvisio::VSDOutputElementList::VSDOutputElementList() libvisio::VSDOutputElementList::VSDOutputElementList(const libvisio::VSDOutputElementList &elementList) : m_elements() { - std::vector<libvisio::VSDOutputElement *>::const_iterator iter; - for (iter = elementList.m_elements.begin(); iter != elementList.m_elements.end(); ++iter) - m_elements.push_back((*iter)->clone()); + for (auto iter = elementList.m_elements.begin(); iter != elementList.m_elements.end(); ++iter) + m_elements.push_back(clone(*iter)); } libvisio::VSDOutputElementList &libvisio::VSDOutputElementList::operator=(const libvisio::VSDOutputElementList &elementList) { - for (std::vector<VSDOutputElement *>::iterator iter = m_elements.begin(); iter != m_elements.end(); ++iter) - delete (*iter); - m_elements.clear(); - for (std::vector<VSDOutputElement *>::const_iterator cstiter = elementList.m_elements.begin(); cstiter != elementList.m_elements.end(); ++cstiter) - m_elements.push_back((*cstiter)->clone()); + for (auto cstiter = elementList.m_elements.begin(); cstiter != elementList.m_elements.end(); ++cstiter) + m_elements.push_back(clone(*cstiter)); return *this; } void libvisio::VSDOutputElementList::append(const libvisio::VSDOutputElementList &elementList) { - for (std::vector<VSDOutputElement *>::const_iterator cstiter = elementList.m_elements.begin(); cstiter != elementList.m_elements.end(); ++cstiter) - m_elements.push_back((*cstiter)->clone()); + for (auto cstiter = elementList.m_elements.begin(); cstiter != elementList.m_elements.end(); ++cstiter) + m_elements.push_back(clone(*cstiter)); } libvisio::VSDOutputElementList::~VSDOutputElementList() { - for (std::vector<VSDOutputElement *>::iterator iter = m_elements.begin(); iter != m_elements.end(); ++iter) - delete (*iter); - m_elements.clear(); } void libvisio::VSDOutputElementList::draw(librevenge::RVNGDrawingInterface *painter) const { - for (std::vector<VSDOutputElement *>::const_iterator iter = m_elements.begin(); iter != m_elements.end(); ++iter) + for (auto iter = m_elements.begin(); iter != m_elements.end(); ++iter) (*iter)->draw(painter); } void libvisio::VSDOutputElementList::addStyle(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDStyleOutputElement(propList)); + m_elements.push_back(make_unique<VSDStyleOutputElement>(propList)); } void libvisio::VSDOutputElementList::addPath(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDPathOutputElement(propList)); + m_elements.push_back(make_unique<VSDPathOutputElement>(propList)); } void libvisio::VSDOutputElementList::addGraphicObject(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDGraphicObjectOutputElement(propList)); + m_elements.push_back(make_unique<VSDGraphicObjectOutputElement>(propList)); } void libvisio::VSDOutputElementList::addStartTextObject(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDStartTextObjectOutputElement(propList)); + m_elements.push_back(make_unique<VSDStartTextObjectOutputElement>(propList)); } void libvisio::VSDOutputElementList::addOpenParagraph(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDOpenParagraphOutputElement(propList)); + m_elements.push_back(make_unique<VSDOpenParagraphOutputElement>(propList)); } void libvisio::VSDOutputElementList::addOpenSpan(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDOpenSpanOutputElement(propList)); + m_elements.push_back(make_unique<VSDOpenSpanOutputElement>(propList)); } void libvisio::VSDOutputElementList::addInsertText(const librevenge::RVNGString &text) { - m_elements.push_back(new VSDInsertTextOutputElement(text)); + m_elements.push_back(make_unique<VSDInsertTextOutputElement>(text)); } void libvisio::VSDOutputElementList::addInsertLineBreak() { - m_elements.push_back(new VSDInsertLineBreakOutputElement()); + m_elements.push_back(make_unique<VSDInsertLineBreakOutputElement>()); } void libvisio::VSDOutputElementList::addInsertTab() { - m_elements.push_back(new VSDInsertTabOutputElement()); + m_elements.push_back(make_unique<VSDInsertTabOutputElement>()); } void libvisio::VSDOutputElementList::addCloseSpan() { - m_elements.push_back(new VSDCloseSpanOutputElement()); + m_elements.push_back(make_unique<VSDCloseSpanOutputElement>()); } void libvisio::VSDOutputElementList::addCloseParagraph() { - m_elements.push_back(new VSDCloseParagraphOutputElement()); + m_elements.push_back(make_unique<VSDCloseParagraphOutputElement>()); } void libvisio::VSDOutputElementList::addEndTextObject() { - m_elements.push_back(new VSDEndTextObjectOutputElement()); + m_elements.push_back(make_unique<VSDEndTextObjectOutputElement>()); } void libvisio::VSDOutputElementList::addStartLayer(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDStartLayerOutputElement(propList)); + m_elements.push_back(make_unique<VSDStartLayerOutputElement>(propList)); } void libvisio::VSDOutputElementList::addEndLayer() { - m_elements.push_back(new VSDEndLayerOutputElement()); + m_elements.push_back(make_unique<VSDEndLayerOutputElement>()); } void libvisio::VSDOutputElementList::addOpenListElement(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDOpenListElementOutputElement(propList)); + m_elements.push_back(make_unique<VSDOpenListElementOutputElement>(propList)); } void libvisio::VSDOutputElementList::addOpenUnorderedListLevel(const librevenge::RVNGPropertyList &propList) { - m_elements.push_back(new VSDOpenUnorderedListLevelOutputElement(propList)); + m_elements.push_back(make_unique<VSDOpenUnorderedListLevelOutputElement>(propList)); } void libvisio::VSDOutputElementList::addCloseListElement() { - m_elements.push_back(new VSDCloseListElementOutputElement()); + m_elements.push_back(make_unique<VSDCloseListElementOutputElement>()); } void libvisio::VSDOutputElementList::addCloseUnorderedListLevel() { - m_elements.push_back(new VSDCloseUnorderedListLevelOutputElement()); + m_elements.push_back(make_unique<VSDCloseUnorderedListLevelOutputElement>()); } /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/VSDOutputElementList.h b/src/lib/VSDOutputElementList.h index 0a500e2..aef0bab 100644 --- a/src/lib/VSDOutputElementList.h +++ b/src/lib/VSDOutputElementList.h @@ -11,6 +11,7 @@ #define __VSDOUTPUTELEMENTLIST_H__ #include <map> +#include <memory> #include <list> #include <vector> #include <librevenge/librevenge.h> @@ -52,7 +53,7 @@ public: return m_elements.empty(); } private: - std::vector<VSDOutputElement *> m_elements; + std::vector<std::unique_ptr<VSDOutputElement>> m_elements; }; commit 3bc1019910b759c4f27e0ff5f070eec1eeddc2a2 Author: David Tardon <[email protected]> Date: Sat Apr 15 11:07:12 2017 +0200 avoid manual memory management Change-Id: If6557a9222cf6183b6e14ff2bcab134d8215dce5 diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp index dd5ef82..2716b64 100644 --- a/src/lib/VSDContentCollector.cpp +++ b/src/lib/VSDContentCollector.cpp @@ -118,7 +118,7 @@ libvisio::VSDContentCollector::VSDContentCollector( ) : m_painter(painter), m_isPageStarted(false), m_pageWidth(0.0), m_pageHeight(0.0), m_shadowOffsetX(0.0), m_shadowOffsetY(0.0), - m_scale(1.0), m_x(0.0), m_y(0.0), m_originalX(0.0), m_originalY(0.0), m_xform(), m_txtxform(0), m_misc(), + m_scale(1.0), m_x(0.0), m_y(0.0), m_originalX(0.0), m_originalY(0.0), m_xform(), m_txtxform(), m_misc(), m_currentFillGeometry(), m_currentLineGeometry(), m_groupXForms(groupXFormsSequence.empty() ? 0 : &groupXFormsSequence[0]), m_currentForeignData(), m_currentOLEData(), m_currentForeignProps(), m_currentShapeId(0), m_foreignType((unsigned)-1), m_foreignFormat(0), m_foreignOffsetX(0.0), m_foreignOffsetY(0.0), m_foreignWidth(0.0), m_foreignHeight(0.0), @@ -617,13 +617,13 @@ void libvisio::VSDContentCollector::_flushText() double xmiddle = m_txtxform ? m_txtxform->width / 2.0 : m_xform.width / 2.0; double ymiddle = m_txtxform ? m_txtxform->height / 2.0 : m_xform.height / 2.0; - transformPoint(xmiddle,ymiddle, m_txtxform); + transformPoint(xmiddle,ymiddle, m_txtxform.get()); double x = xmiddle - (m_txtxform ? m_txtxform->width / 2.0 : m_xform.width / 2.0); double y = ymiddle - (m_txtxform ? m_txtxform->height / 2.0 : m_xform.height / 2.0); double angle = 0.0; - transformAngle(angle, m_txtxform); + transformAngle(angle, m_txtxform.get()); librevenge::RVNGPropertyList textBlockProps; @@ -2329,9 +2329,7 @@ void libvisio::VSDContentCollector::collectXFormData(unsigned level, const XForm void libvisio::VSDContentCollector::collectTxtXForm(unsigned level, const XForm &txtxform) { _handleLevelChange(level); - if (m_txtxform) - delete (m_txtxform); - m_txtxform = new XForm(txtxform); + m_txtxform.reset(new XForm(txtxform)); m_txtxform->x = m_txtxform->pinX - m_txtxform->pinLocX; m_txtxform->y = m_txtxform->pinY - m_txtxform->pinLocY; } @@ -2569,11 +2567,7 @@ void libvisio::VSDContentCollector::collectShape(unsigned id, unsigned level, un } if (m_stencilShape->m_txtxform) - { - if (m_txtxform) - delete m_txtxform; - m_txtxform = new XForm(*(m_stencilShape->m_txtxform)); - } + m_txtxform.reset(new XForm(*(m_stencilShape->m_txtxform))); m_stencilFields = m_stencilShape->m_fields; for (unsigned i = 0; i < m_stencilFields.size(); i++) @@ -3477,9 +3471,7 @@ void libvisio::VSDContentCollector::_handleLevelChange(unsigned level) m_originalY = 0.0; m_x = 0; m_y = 0; - if (m_txtxform) - delete (m_txtxform); - m_txtxform = 0; + m_txtxform.reset(); m_xform = XForm(); m_NURBSData.clear(); m_polylineData.clear(); @@ -3499,9 +3491,7 @@ void libvisio::VSDContentCollector::startPage(unsigned pageId) _flushShape(); m_originalX = 0.0; m_originalY = 0.0; - if (m_txtxform) - delete (m_txtxform); - m_txtxform = 0; + m_txtxform.reset(); m_xform = XForm(); m_x = 0; m_y = 0; diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h index edf7b2a..049223c 100644 --- a/src/lib/VSDContentCollector.h +++ b/src/lib/VSDContentCollector.h @@ -15,6 +15,7 @@ #include <string> #include <cmath> #include <map> +#include <memory> #include <list> #include <vector> #include "libvisio_utils.h" @@ -37,10 +38,6 @@ public: std::vector<std::list<unsigned> > &documentPageShapeOrders, VSDStyles &styles, VSDStencils &stencils ); - virtual ~VSDContentCollector() - { - if (m_txtxform) delete (m_txtxform); - }; void collectDocumentTheme(const VSDXTheme *theme); void collectEllipticalArcTo(unsigned id, unsigned level, double x3, double y3, double x2, double y2, double angle, double ecc); @@ -246,7 +243,7 @@ private: double m_originalX; double m_originalY; XForm m_xform; - XForm *m_txtxform; + std::unique_ptr<XForm> m_txtxform; VSDMisc m_misc; std::vector<librevenge::RVNGPropertyList> m_currentFillGeometry; std::vector<librevenge::RVNGPropertyList> m_currentLineGeometry; commit 511dcb3dd6525f501ebed2f3f33472982972e34e Author: David Tardon <[email protected]> Date: Sat Apr 15 11:02:27 2017 +0200 explain what is being done Change-Id: I9036aba359ce62bd7b3cbbd912626dcc12f7819f diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp index 34192bd..dd5ef82 100644 --- a/src/lib/VSDContentCollector.cpp +++ b/src/lib/VSDContentCollector.cpp @@ -84,7 +84,8 @@ unsigned computeBMPDataOffset(librevenge::RVNGInputStream *const input, const un // determine palette size input->seek(10, librevenge::RVNG_SEEK_CUR); unsigned bpp = readU16(input); - // sanitize bpp + // sanitize bpp - limit to the allowed range and then round up to one + // of the allowed values if (bpp > 32) bpp = 32; const unsigned allowedBpp[] = {1, 4, 8, 16, 24, 32}; commit d23fcf032369c9d68ce0d8e2262e3f25a5a83342 Author: David Tardon <[email protected]> Date: Sat Apr 15 10:59:44 2017 +0200 ofz#1109 fix thinko Change-Id: I45375acaf09e3bd9ce821c7aa7edcd357e120d2d diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp index ab37c41..34192bd 100644 --- a/src/lib/VSDContentCollector.cpp +++ b/src/lib/VSDContentCollector.cpp @@ -89,7 +89,7 @@ unsigned computeBMPDataOffset(librevenge::RVNGInputStream *const input, const un bpp = 32; const unsigned allowedBpp[] = {1, 4, 8, 16, 24, 32}; size_t bppIdx = 0; - while (bppIdx < VSD_NUM_ELEMENTS(allowedBpp) && bpp < allowedBpp[bppIdx]) + while (bppIdx < VSD_NUM_ELEMENTS(allowedBpp) && bpp > allowedBpp[bppIdx]) ++bppIdx; if (bpp < allowedBpp[bppIdx]) bpp = allowedBpp[bppIdx]; _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
