[krita] libs: Fix a memory leak: the popup action should "own" the image collection
Friedrich W. H. Kossebau
kossebau at kde.org
Wed Oct 19 22:19:15 BST 2016
Am Montag, 12. September 2016, 13:37:26 CEST schrieb Boudewijn Rempt:
> 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 at 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<KoAbstractResou
> rceSe 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;
> }
Thanks for the cc:, Boud.
Just, this one results in a crash in ~KoResourcePopupAction() on the new
delete d->imageCollection;
when quitting the app (e.g. calligrastage) so this patch at least does not
apply like is to Calligra codebase.
I have no big picture of the usage of imageCollection, so myself for now
ignoring this memory leak reported here.
Cheers
Friedrich
More information about the calligra-devel
mailing list