[Development] Problem with QML Context2D

Helmut Mülner helmut.muelner at gmail.com
Fri Sep 26 14:43:18 CEST 2014


I am developing  a mixed C++/QML application using
qt-opensource-windows-x86-msvc2012_opengl-5.3.2 (and 5.4.0-beta).
The QML GUI contains a zoomable Canvas item embedded in a ScrollView.
Zooming the Canvas changes its size, and after experiencing some strange
crashes of the application during zooming, I researched the reason for the
crash
and found out that it crashed in QImage::detach():

	void QImage::detach()
	{
	    if (d) {
	        if (d->is_cached && d->ref.load() == 1)
	            QImagePixmapCleanupHooks::executeImageHooks(cacheKey());
 
	        if (d->ref.load() != 1 || d->ro_data)
	            *this = copy();
 
-->	        ++d->detach_no;
	    }
	}

... because copy() failed (because malloc failed) and d was 0 and led to a
null pointer access.
This is a bug in QImage that should be fixed.

The reason for the failure lies in QQuickContext2DTexture which has the
QImage members m_image and m_displayImage with the size of the Canvas item.

If the user zooms in and out a lot those members a recreated a lot with
changing sizes which leads to cathastrophic memory fragmentation and finally
to a malloc failure.

The only (hacky) solution I could find so far is to use a big fixed size
(maximum) Canvas and fake the logical size for the ScrollView.

Any other ideas or some fix for QQuickContext2DImageTexture?








More information about the Development mailing list