Git commit deff966ee3041104f0e2bda587c94d58403670af by Boudewijn Rempt. Committed on 12/09/2016 at 13:37. Pushed by rempt into branch 'master'.
Fix a memory leak: the popup action should "own" the image collection And the pattern background should check whether the popup still exists. This bug probably is also in Calligra. CCMAIL:calligra-devel@kde.org M +15 -6 libs/flake/KoPatternBackground.cpp M +4 -3 libs/widgets/KoResourcePopupAction.cpp http://commits.kde.org/krita/deff966ee3041104f0e2bda587c94d58403670af diff --git a/libs/flake/KoPatternBackground.cpp b/libs/flake/KoPatternBackground.cpp index a2289b7..9f0a170 100644 --- a/libs/flake/KoPatternBackground.cpp +++ b/libs/flake/KoPatternBackground.cpp @@ -37,6 +37,7 @@ #include <QBrush> #include <QPainter> +#include <QPointer> class KoPatternBackgroundPrivate : public KoShapeBackgroundPrivate { @@ -123,7 +124,7 @@ public: QSizeF targetImageSizePercent; QPointF refPointOffsetPercent; QPointF tileRepeatOffsetPercent; - KoImageCollection * imageCollection; + QPointer<KoImageCollection> imageCollection; KoImageData * imageData; }; @@ -131,7 +132,7 @@ public: // ---------------------------------------------------------------- -KoPatternBackground::KoPatternBackground(KoImageCollection * imageCollection) +KoPatternBackground::KoPatternBackground(KoImageCollection *imageCollection) : KoShapeBackground(*(new KoPatternBackgroundPrivate())) { Q_D(KoPatternBackground); @@ -160,7 +161,9 @@ void KoPatternBackground::setPattern(const QImage &pattern) { Q_D(KoPatternBackground); delete d->imageData; - d->imageData = d->imageCollection->createImageData(pattern); + if (d->imageCollection) { + d->imageData = d->imageCollection->createImageData(pattern); + } } void KoPatternBackground::setPattern(KoImageData *imageData) @@ -358,7 +361,9 @@ void KoPatternBackground::fillStyle(KoGenStyle &style, KoShapeSavingContext &con style.addProperty("draw:fill", "bitmap"); style.addProperty("draw:fill-image-name", patternStyleName); - context.addDataCenter(d->imageCollection); + if (d->imageCollection) { + context.addDataCenter(d->imageCollection); + } } bool KoPatternBackground::loadStyle(KoOdfLoadingContext &context, const QSizeF &) @@ -383,9 +388,13 @@ bool KoPatternBackground::loadStyle(KoOdfLoadingContext &context, const QSizeF & return false; delete d->imageData; - d->imageData = d->imageCollection->createImageData(href, context.store()); - if (! d->imageData) + d->imageData = 0; + if (d->imageCollection) { + d->imageData = d->imageCollection->createImageData(href, context.store()); + } + if (! d->imageData) { return false; + } // read the pattern repeat style QString style = styleStack.property(KoXmlNS::style, "repeat"); diff --git a/libs/widgets/KoResourcePopupAction.cpp b/libs/widgets/KoResourcePopupAction.cpp index 95f0192..1c27b0c 100644 --- a/libs/widgets/KoResourcePopupAction.cpp +++ b/libs/widgets/KoResourcePopupAction.cpp @@ -50,6 +50,7 @@ public: QMenu *menu; KoResourceItemView *resourceList; QSharedPointer<KoShapeBackground> background; + KoImageCollection *imageCollection; KoCheckerBoardPainter checkerPainter; }; @@ -83,8 +84,8 @@ KoResourcePopupAction::KoResourcePopupAction(QSharedPointer<KoAbstractResourceSe qg->setCoordinateMode(QGradient::ObjectBoundingMode); d->background = QSharedPointer<KoShapeBackground>(new KoGradientBackground(qg)); } else if (pattern) { - KoImageCollection *collection = new KoImageCollection(); - d->background = QSharedPointer<KoShapeBackground>(new KoPatternBackground(collection)); + d->imageCollection = new KoImageCollection(); + d->background = QSharedPointer<KoShapeBackground>(new KoPatternBackground(d->imageCollection)); static_cast<KoPatternBackground*>(d->background.data())->setPattern(pattern->pattern()); } @@ -116,7 +117,7 @@ KoResourcePopupAction::~KoResourcePopupAction() } delete d->menu; - + delete d->imageCollection; delete d; }