From 9346760f5a173bd3b697b8f800b3c992db1019bd Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 10 Sep 2020 17:48:41 +0200 Subject: Minimal ABI necessary for future optimized QPixmap Add virtual hooks that can make it possible in Qt6 to implement paint device specific pixmaps. Change-Id: Ib1d1d7b5e32d9430203f718534344b25c0ead744 Reviewed-by: Eirik Aavitsland --- src/gui/painting/qpaintengine.cpp | 42 ++++++++++++++++++++++++++++++++++++++- src/gui/painting/qpaintengine.h | 3 +++ 2 files changed, 44 insertions(+), 1 deletion(-) (limited to 'src/gui/painting') diff --git a/src/gui/painting/qpaintengine.cpp b/src/gui/painting/qpaintengine.cpp index fe6ddfaffe..075a802a6e 100644 --- a/src/gui/painting/qpaintengine.cpp +++ b/src/gui/painting/qpaintengine.cpp @@ -44,10 +44,13 @@ #include #include #include -#include #include +#include +#include #include +#include #include +#include QT_BEGIN_NAMESPACE @@ -994,6 +997,43 @@ QRect QPaintEngine::systemRect() const return d_func()->systemRect; } +/*! + \internal + + Creates a QPixmap optimized for this paint engine and device. +*/ +QPixmap QPaintEngine::createPixmap(QSize size) +{ + if (Q_UNLIKELY(!qobject_cast(QCoreApplication::instance()))) { + qWarning("QPaintEngine::createPixmap: QPixmap cannot be created without a QGuiApplication"); + return QPixmap(); + } + + QScopedPointer data(QGuiApplicationPrivate::platformIntegration()->createPlatformPixmap(QPlatformPixmap::PixmapType)); + data->resize(size.width(), size.height()); + return QPixmap(data.take()); +} + +/*! + \internal + + Creates a QPixmap optimized for this paint engine and device. +*/ +QPixmap QPaintEngine::createPixmapFromImage(QImage image, Qt::ImageConversionFlags flags) +{ + if (Q_UNLIKELY(!qobject_cast(QCoreApplication::instance()))) { + qWarning("QPaintEngine::createPixmapFromImage: QPixmap cannot be created without a QGuiApplication"); + return QPixmap(); + } + + QScopedPointer data(QGuiApplicationPrivate::platformIntegration()->createPlatformPixmap(QPlatformPixmap::PixmapType)); + if (image.isDetached()) + data->fromImageInPlace(image, flags); + else + data->fromImage(image, flags); + return QPixmap(data.take()); +} + QPaintEnginePrivate::~QPaintEnginePrivate() { } diff --git a/src/gui/painting/qpaintengine.h b/src/gui/painting/qpaintengine.h index 2b876356be..64170c513e 100644 --- a/src/gui/painting/qpaintengine.h +++ b/src/gui/painting/qpaintengine.h @@ -225,6 +225,9 @@ public: void syncState(); inline bool isExtended() const { return extended; } + virtual QPixmap createPixmap(QSize size); + virtual QPixmap createPixmapFromImage(QImage image, Qt::ImageConversionFlags flags = Qt::AutoColor); + protected: QPaintEngine(QPaintEnginePrivate &data, PaintEngineFeatures devcaps=PaintEngineFeatures()); -- cgit v1.2.3