diff options
author | Fabian Kosmale <[email protected]> | 2025-10-09 11:46:01 +0200 |
---|---|---|
committer | Fabian Kosmale <[email protected]> | 2025-10-10 19:31:34 +0200 |
commit | eee4e767ab77e6643b0b5992a6879b2f8230f700 (patch) | |
tree | 95ec478d2a745cbeaf70792c66d2cddc4a933c19 | |
parent | 7f4ba3aece3783bdacc5239a2f3d7c600db62c3e (diff) |
CanvasImageData: Track image data size for gc purposes
Images can consume a substantial amount of memory on the native heap,
while the actual CanvasImageData object is rather small. Our gc already
keeps track of native heap consumption (e.g. for strings), so reuse that
support to also properly account for CanvasImageData.
Pick-to: 6.10 6.8
Fixes: QTBUG-32298
Change-Id: Ie36e9c2399517154d9c46e490a49b16409cbecc1
Reviewed-by: Ulf Hermann <[email protected]>
-rw-r--r-- | src/quick/items/context2d/qquickcontext2d.cpp | 7 | ||||
-rw-r--r-- | tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml | 18 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/quick/items/context2d/qquickcontext2d.cpp b/src/quick/items/context2d/qquickcontext2d.cpp index 7102ab27f4..ed283213b5 100644 --- a/src/quick/items/context2d/qquickcontext2d.cpp +++ b/src/quick/items/context2d/qquickcontext2d.cpp @@ -497,7 +497,11 @@ struct QQuickContext2DStyle : Object { struct QQuickJSContext2DPixelData : Object { void init(); void destroy() { - delete image; + if (image) { + auto *mm = internalClass->engine->memoryManager; + mm->changeUnmanagedHeapSizeUsage(-image->sizeInBytes()); + delete image; + } Object::destroy(); } @@ -940,6 +944,7 @@ static QV4::ReturnedValue qt_create_image_data(qreal w, qreal h, QV4::ExecutionE QV4::Scope scope(v4); QQuickContext2DEngineData *ed = engineData(scope.engine); QV4::Scoped<QQuickJSContext2DPixelData> pixelData(scope, scope.engine->memoryManager->allocate<QQuickJSContext2DPixelData>()); + v4->memoryManager->changeUnmanagedHeapSizeUsage(image.sizeInBytes()); QV4::ScopedObject p(scope, ed->pixelArrayProto.value()); pixelData->setPrototypeOf(p); diff --git a/tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml b/tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml new file mode 100644 index 0000000000..fd18099866 --- /dev/null +++ b/tests/auto/quick/qquickcanvasitem/data/tst_grabManyImages.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Item { + width: 800 + height: 800 + + Canvas { + id: canvas + renderStrategy: Canvas.Immediate + anchors.fill: parent + onPaint: {} + onAvailableChanged: { + // must not run out of memory + for (let i = 0; i < 2000; ++i) + canvas.getContext("2d").getImageData(0, 0, canvas.width, canvas.height); + } + } +} |