summaryrefslogtreecommitdiffstats
path: root/src/openvg/qwindowsurface_vgegl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvg/qwindowsurface_vgegl.cpp')
-rw-r--r--src/openvg/qwindowsurface_vgegl.cpp783
1 files changed, 0 insertions, 783 deletions
diff --git a/src/openvg/qwindowsurface_vgegl.cpp b/src/openvg/qwindowsurface_vgegl.cpp
deleted file mode 100644
index f7961b4a7d..0000000000
--- a/src/openvg/qwindowsurface_vgegl.cpp
+++ /dev/null
@@ -1,783 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtOpenVG module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qwindowsurface_vgegl_p.h"
-#include "qpaintengine_vg_p.h"
-#include "qpixmapdata_vg_p.h"
-#include "qvgimagepool_p.h"
-#include "qvg_p.h"
-
-#if !defined(QT_NO_EGL)
-
-QT_BEGIN_NAMESPACE
-
-// Turn off "direct to window" rendering if EGL cannot support it.
-#if !defined(EGL_RENDER_BUFFER) || !defined(EGL_SINGLE_BUFFER)
-#if defined(QVG_DIRECT_TO_WINDOW)
-#undef QVG_DIRECT_TO_WINDOW
-#endif
-#endif
-
-// Determine if preserved window contents should be used.
-#if !defined(EGL_SWAP_BEHAVIOR) || !defined(EGL_BUFFER_PRESERVED)
-#if !defined(QVG_NO_PRESERVED_SWAP)
-#define QVG_NO_PRESERVED_SWAP 1
-#endif
-#endif
-
-VGImageFormat qt_vg_config_to_vg_format(QEglContext *context)
-{
- return qt_vg_image_to_vg_format
- (qt_vg_config_to_image_format(context));
-}
-
-QImage::Format qt_vg_config_to_image_format(QEglContext *context)
-{
- EGLint red = context->configAttrib(EGL_RED_SIZE);
- EGLint green = context->configAttrib(EGL_GREEN_SIZE);
- EGLint blue = context->configAttrib(EGL_BLUE_SIZE);
- EGLint alpha = context->configAttrib(EGL_ALPHA_SIZE);
- QImage::Format argbFormat;
-#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
- EGLint type = context->configAttrib(EGL_SURFACE_TYPE);
- if ((type & EGL_VG_ALPHA_FORMAT_PRE_BIT) != 0)
- argbFormat = QImage::Format_ARGB32_Premultiplied;
- else
- argbFormat = QImage::Format_ARGB32;
-#else
- argbFormat = QImage::Format_ARGB32;
-#endif
- if (red == 8 && green == 8 && blue == 8 && alpha == 8)
- return argbFormat;
- else if (red == 8 && green == 8 && blue == 8 && alpha == 0)
- return QImage::Format_RGB32;
- else if (red == 5 && green == 6 && blue == 5 && alpha == 0)
- return QImage::Format_RGB16;
- else if (red == 4 && green == 4 && blue == 4 && alpha == 4)
- return QImage::Format_ARGB4444_Premultiplied;
- else
- return argbFormat; // XXX
-}
-
-#if !defined(QVG_NO_SINGLE_CONTEXT)
-
-class QVGSharedContext
-{
-public:
- QVGSharedContext();
- ~QVGSharedContext();
-
- QEglContext *context;
- int refCount;
- int widgetRefCount;
- QVGPaintEngine *engine;
- EGLSurface surface;
- QVGPixmapData *firstPixmap;
-};
-
-QVGSharedContext::QVGSharedContext()
- : context(0)
- , refCount(0)
- , widgetRefCount(0)
- , engine(0)
- , surface(EGL_NO_SURFACE)
- , firstPixmap(0)
-{
-}
-
-QVGSharedContext::~QVGSharedContext()
-{
- // Don't accidentally destroy the QEglContext if the reference
- // count falls to zero while deleting the paint engine.
- ++refCount;
-
- if (context)
- context->makeCurrent(qt_vg_shared_surface());
- delete engine;
- if (context)
- context->doneCurrent();
- if (context && surface != EGL_NO_SURFACE)
- context->destroySurface(surface);
- delete context;
-}
-
-Q_GLOBAL_STATIC(QVGSharedContext, sharedContext);
-
-QVGPaintEngine *qt_vg_create_paint_engine(void)
-{
- QVGSharedContext *shared = sharedContext();
- if (!shared->engine)
- shared->engine = new QVGPaintEngine();
- return shared->engine;
-}
-
-void qt_vg_destroy_paint_engine(QVGPaintEngine *engine)
-{
- Q_UNUSED(engine);
-}
-
-void qt_vg_register_pixmap(QVGPixmapData *pd)
-{
- QVGSharedContext *shared = sharedContext();
- pd->next = shared->firstPixmap;
- pd->prev = 0;
- if (shared->firstPixmap)
- shared->firstPixmap->prev = pd;
- shared->firstPixmap = pd;
-}
-
-void qt_vg_unregister_pixmap(QVGPixmapData *pd)
-{
- if (pd->next)
- pd->next->prev = pd->prev;
- if (pd->prev) {
- pd->prev->next = pd->next;
- } else {
- QVGSharedContext *shared = sharedContext();
- if (shared)
- shared->firstPixmap = pd->next;
- }
-}
-
-#else
-
-QVGPaintEngine *qt_vg_create_paint_engine(void)
-{
- return new QVGPaintEngine();
-}
-
-void qt_vg_destroy_paint_engine(QVGPaintEngine *engine)
-{
- delete engine;
-}
-
-void qt_vg_register_pixmap(QVGPixmapData *pd)
-{
- Q_UNUSED(pd);
-}
-
-void qt_vg_unregister_pixmap(QVGPixmapData *pd)
-{
- Q_UNUSED(pd);
-}
-
-#endif
-
-#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
-
-static bool isPremultipliedContext(const QEglContext *context)
-{
- return context->configAttrib(EGL_SURFACE_TYPE) & EGL_VG_ALPHA_FORMAT_PRE_BIT;
-}
-
-#endif
-
-static QEglContext *createContext(QPaintDevice *device)
-{
- QEglContext *context;
-
- // Create the context object and open the display.
- context = new QEglContext();
- context->setApi(QEgl::OpenVG);
-
- // Set the swap interval for the display.
- QByteArray interval = qgetenv("QT_VG_SWAP_INTERVAL");
- if (!interval.isEmpty())
- eglSwapInterval(QEgl::display(), interval.toInt());
- else
- eglSwapInterval(QEgl::display(), 1);
-
-#ifdef EGL_RENDERABLE_TYPE
- // Has the user specified an explicit EGL configuration to use?
- QByteArray configId = qgetenv("QT_VG_EGL_CONFIG");
- if (!configId.isEmpty()) {
- EGLint cfgId = configId.toInt();
- EGLint properties[] = {
- EGL_CONFIG_ID, cfgId,
- EGL_NONE
- };
- EGLint matching = 0;
- EGLConfig cfg;
- if (eglChooseConfig
- (QEgl::display(), properties, &cfg, 1, &matching) &&
- matching > 0) {
- // Check that the selected configuration actually supports OpenVG
- // and then create the context with it.
- EGLint id = 0;
- EGLint type = 0;
- eglGetConfigAttrib
- (QEgl::display(), cfg, EGL_CONFIG_ID, &id);
- eglGetConfigAttrib
- (QEgl::display(), cfg, EGL_RENDERABLE_TYPE, &type);
- if (cfgId == id && (type & EGL_OPENVG_BIT) != 0) {
- context->setConfig(cfg);
- if (!context->createContext()) {
- delete context;
- return 0;
- }
- return context;
- } else {
- qWarning("QT_VG_EGL_CONFIG: %d is not a valid OpenVG configuration", int(cfgId));
- }
- }
- }
-#endif
-
- // Choose an appropriate configuration for rendering into the device.
- QEglProperties configProps;
- configProps.setPaintDeviceFormat(device);
- int redSize = configProps.value(EGL_RED_SIZE);
- if (redSize == EGL_DONT_CARE || redSize == 0)
- configProps.setPixelFormat(QImage::Format_ARGB32); // XXX
- configProps.setValue(EGL_ALPHA_MASK_SIZE, 1);
-#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
- configProps.setValue(EGL_SURFACE_TYPE, EGL_WINDOW_BIT
- | EGL_SWAP_BEHAVIOR_PRESERVED_BIT
- | EGL_VG_ALPHA_FORMAT_PRE_BIT);
- configProps.setRenderableType(QEgl::OpenVG);
- if (!context->chooseConfig(configProps)) {
- // Try again without the "pre" bit.
- configProps.setValue(EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT);
- if (!context->chooseConfig(configProps)) {
- delete context;
- return 0;
- }
- }
-#else
- configProps.setValue(EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_SWAP_BEHAVIOR_PRESERVED_BIT);
- configProps.setRenderableType(QEgl::OpenVG);
- if (!context->chooseConfig(configProps)) {
- delete context;
- return 0;
- }
-#endif
-
- // Construct a new EGL context for the selected configuration.
- if (!context->createContext()) {
- delete context;
- return 0;
- }
-
- return context;
-}
-
-#if !defined(QVG_NO_SINGLE_CONTEXT)
-
-QEglContext *qt_vg_create_context(QPaintDevice *device, int devType)
-{
- QVGSharedContext *shared = sharedContext();
- if (devType == QInternal::Widget)
- ++(shared->widgetRefCount);
- if (shared->context) {
- ++(shared->refCount);
- return shared->context;
- } else {
- shared->context = createContext(device);
- shared->refCount = 1;
- return shared->context;
- }
-}
-
-static void qt_vg_destroy_shared_context(QVGSharedContext *shared)
-{
- shared->context->makeCurrent(qt_vg_shared_surface());
- delete shared->engine;
- shared->engine = 0;
- shared->context->doneCurrent();
- if (shared->surface != EGL_NO_SURFACE) {
- eglDestroySurface(QEgl::display(), shared->surface);
- shared->surface = EGL_NO_SURFACE;
- }
- delete shared->context;
- shared->context = 0;
-}
-
-void qt_vg_hibernate_pixmaps(QVGSharedContext *shared)
-{
- // Artificially increase the reference count to prevent the
- // context from being destroyed until after we have finished
- // the hibernation process.
- ++(shared->refCount);
-
- // We need a context current to hibernate the VGImage objects.
- shared->context->makeCurrent(qt_vg_shared_surface());
-
- // Scan all QVGPixmapData objects in the system and hibernate them.
- QVGPixmapData *pd = shared->firstPixmap;
- while (pd != 0) {
- pd->hibernate();
- pd = pd->next;
- }
-
- // Hibernate any remaining VGImage's in the image pool.
- QVGImagePool::instance()->hibernate();
-
- // Don't need the current context any more.
- shared->context->lazyDoneCurrent();
-
- // Decrease the reference count and destroy the context if necessary.
- if (--(shared->refCount) <= 0)
- qt_vg_destroy_shared_context(shared);
-}
-
-void qt_vg_destroy_context(QEglContext *context, int devType)
-{
- QVGSharedContext *shared = sharedContext();
- if (shared->context != context) {
- // This is not the shared context. Shouldn't happen!
- delete context;
- return;
- }
- if (devType == QInternal::Widget)
- --(shared->widgetRefCount);
- if (--(shared->refCount) <= 0) {
- qt_vg_destroy_shared_context(shared);
- } else if (shared->widgetRefCount <= 0 && devType == QInternal::Widget) {
- // All of the widget window surfaces have been destroyed
- // but we still have VG pixmaps active. Ask them to hibernate
- // to free up GPU resources until a widget is shown again.
- // This may eventually cause the EGLContext to be destroyed
- // because nothing in the system needs a context, which will
- // free up even more GPU resources.
- qt_vg_hibernate_pixmaps(shared);
- }
-}
-
-EGLSurface qt_vg_shared_surface(void)
-{
- QVGSharedContext *shared = sharedContext();
- if (shared->surface == EGL_NO_SURFACE) {
- EGLint attribs[7];
- attribs[0] = EGL_WIDTH;
- attribs[1] = 16;
- attribs[2] = EGL_HEIGHT;
- attribs[3] = 16;
-#ifdef EGL_VG_ALPHA_FORMAT_PRE_BIT
- if (isPremultipliedContext(shared->context)) {
- attribs[4] = EGL_VG_ALPHA_FORMAT;
- attribs[5] = EGL_VG_ALPHA_FORMAT_PRE;
- attribs[6] = EGL_NONE;
- } else
-#endif
- {
- attribs[4] = EGL_NONE;
- }
- shared->surface = eglCreatePbufferSurface
- (QEgl::display(), shared->context->config(), attribs);
- }
- return shared->surface;
-}
-
-#else
-
-QEglContext *qt_vg_create_context(QPaintDevice *device, int devType)
-{
- Q_UNUSED(devType);
- return createContext(device);
-}
-
-void qt_vg_destroy_context(QEglContext *context, int devType)
-{
- Q_UNUSED(devType);
- delete context;
-}
-
-EGLSurface qt_vg_shared_surface(void)
-{
- return EGL_NO_SURFACE;
-}
-
-#endif
-
-QVGEGLWindowSurfacePrivate::QVGEGLWindowSurfacePrivate(QWindowSurface *win)
-{
- winSurface = win;
- engine = 0;
-}
-
-QVGEGLWindowSurfacePrivate::~QVGEGLWindowSurfacePrivate()
-{
- // Destroy the paint engine if it hasn't been destroyed already.
- destroyPaintEngine();
-}
-
-QVGPaintEngine *QVGEGLWindowSurfacePrivate::paintEngine()
-{
- if (!engine)
- engine = qt_vg_create_paint_engine();
- return engine;
-}
-
-VGImage QVGEGLWindowSurfacePrivate::surfaceImage() const
-{
- return VG_INVALID_HANDLE;
-}
-
-void QVGEGLWindowSurfacePrivate::destroyPaintEngine()
-{
- if (engine) {
- qt_vg_destroy_paint_engine(engine);
- engine = 0;
- }
-}
-
-QSize QVGEGLWindowSurfacePrivate::windowSurfaceSize(QWidget *widget) const
-{
- Q_UNUSED(widget);
-
- QRect rect = winSurface->geometry();
- QSize newSize = rect.size();
-
-#if defined(Q_WS_QWS)
- // Account for the widget mask, if any.
- if (widget && !widget->mask().isEmpty()) {
- const QRegion region = widget->mask()
- & rect.translated(-widget->geometry().topLeft());
- newSize = region.boundingRect().size();
- }
-#endif
-
- return newSize;
-}
-
-#if defined(QVG_VGIMAGE_BACKBUFFERS)
-
-QVGEGLWindowSurfaceVGImage::QVGEGLWindowSurfaceVGImage(QWindowSurface *win)
- : QVGEGLWindowSurfacePrivate(win)
- , context(0)
- , backBuffer(VG_INVALID_HANDLE)
- , backBufferSurface(EGL_NO_SURFACE)
- , recreateBackBuffer(false)
- , isPaintingActive(false)
- , windowSurface(EGL_NO_SURFACE)
-{
-}
-
-QVGEGLWindowSurfaceVGImage::~QVGEGLWindowSurfaceVGImage()
-{
- destroyPaintEngine();
- if (context) {
- if (backBufferSurface != EGL_NO_SURFACE) {
- // We need a current context to be able to destroy the image.
- // We use the shared surface because the native window handle
- // associated with "windowSurface" may have been destroyed already.
- context->makeCurrent(qt_vg_shared_surface());
- context->destroySurface(backBufferSurface);
- vgDestroyImage(backBuffer);
- context->doneCurrent();
- }
- if (windowSurface != EGL_NO_SURFACE)
- context->destroySurface(windowSurface);
- qt_vg_destroy_context(context, QInternal::Widget);
- }
-}
-
-QEglContext *QVGEGLWindowSurfaceVGImage::ensureContext(QWidget *widget)
-{
- QSize newSize = windowSurfaceSize(widget);
- if (context && size != newSize) {
- // The surface size has changed, so we need to recreate
- // the back buffer. Keep the same context and paint engine.
- size = newSize;
- if (isPaintingActive)
- context->doneCurrent();
- isPaintingActive = false;
- recreateBackBuffer = true;
- }
- if (!context) {
- // Create a new EGL context. We create the surface in beginPaint().
- size = newSize;
- context = qt_vg_create_context(widget, QInternal::Widget);
- if (!context)
- return 0;
- isPaintingActive = false;
- }
- return context;
-}
-
-void QVGEGLWindowSurfaceVGImage::beginPaint(QWidget *widget)
-{
- QEglContext *context = ensureContext(widget);
- if (context) {
- if (recreateBackBuffer || backBufferSurface == EGL_NO_SURFACE) {
- // Create a VGImage object to act as the back buffer
- // for this window. We have to create the VGImage with a
- // current context, so activate the main surface for the window.
- context->makeCurrent(mainSurface());
- recreateBackBuffer = false;
- if (backBufferSurface != EGL_NO_SURFACE) {
- eglDestroySurface(QEgl::display(), backBufferSurface);
- backBufferSurface = EGL_NO_SURFACE;
- }
- if (backBuffer != VG_INVALID_HANDLE) {
- vgDestroyImage(backBuffer);
- }
- VGImageFormat format = qt_vg_config_to_vg_format(context);
- backBuffer = vgCreateImage
- (format, size.width(), size.height(),
- VG_IMAGE_QUALITY_FASTER);
- if (backBuffer != VG_INVALID_HANDLE) {
- // Create an EGL surface for rendering into the VGImage.
- backBufferSurface = eglCreatePbufferFromClientBuffer
- (QEgl::display(), EGL_OPENVG_IMAGE,
- (EGLClientBuffer)(backBuffer),
- context->config(), NULL);
- if (backBufferSurface == EGL_NO_SURFACE) {
- vgDestroyImage(backBuffer);
- backBuffer = VG_INVALID_HANDLE;
- }
- }
- }
- if (backBufferSurface != EGL_NO_SURFACE)
- context->makeCurrent(backBufferSurface);
- else
- context->makeCurrent(mainSurface());
- isPaintingActive = true;
- }
-}
-
-void QVGEGLWindowSurfaceVGImage::endPaint
- (QWidget *widget, const QRegion& region, QImage *image)
-{
- Q_UNUSED(region);
- Q_UNUSED(image);
- QEglContext *context = ensureContext(widget);
- if (context) {
- if (backBufferSurface != EGL_NO_SURFACE) {
- if (isPaintingActive)
- vgFlush();
- context->lazyDoneCurrent();
- }
- isPaintingActive = false;
- }
-}
-
-VGImage QVGEGLWindowSurfaceVGImage::surfaceImage() const
-{
- return backBuffer;
-}
-
-EGLSurface QVGEGLWindowSurfaceVGImage::mainSurface() const
-{
- if (windowSurface != EGL_NO_SURFACE)
- return windowSurface;
- else
- return qt_vg_shared_surface();
-}
-
-#endif // QVG_VGIMAGE_BACKBUFFERS
-
-QVGEGLWindowSurfaceDirect::QVGEGLWindowSurfaceDirect(QWindowSurface *win)
- : QVGEGLWindowSurfacePrivate(win)
- , context(0)
- , isPaintingActive(false)
- , needToSwap(false)
- , windowSurface(EGL_NO_SURFACE)
-{
-}
-
-QVGEGLWindowSurfaceDirect::~QVGEGLWindowSurfaceDirect()
-{
- destroyPaintEngine();
- if (context) {
- if (windowSurface != EGL_NO_SURFACE)
- context->destroySurface(windowSurface);
- qt_vg_destroy_context(context, QInternal::Widget);
- }
-}
-
-QEglContext *QVGEGLWindowSurfaceDirect::ensureContext(QWidget *widget)
-{
- QSize newSize = windowSurfaceSize(widget);
- QEglProperties surfaceProps;
-
-#if defined(QVG_RECREATE_ON_SIZE_CHANGE)
-#if !defined(QVG_NO_SINGLE_CONTEXT)
- if (context && size != newSize) {
- // The surface size has changed, so we need to recreate it.
- // We can keep the same context and paint engine.
- size = newSize;
- if (isPaintingActive)
- context->doneCurrent();
- context->destroySurface(windowSurface);
-#if defined(EGL_VG_ALPHA_FORMAT_PRE_BIT)
- if (isPremultipliedContext(context)) {
- surfaceProps.setValue
- (EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_PRE);
- } else {
- surfaceProps.removeValue(EGL_VG_ALPHA_FORMAT);
- }
-#endif
- windowSurface = context->createSurface(widget, &surfaceProps);
- isPaintingActive = false;
- needToSwap = true;
- }
-#else
- if (context && size != newSize) {
- // The surface size has changed, so we need to recreate
- // the EGL context for the widget. We also need to recreate
- // the surface's paint engine if context sharing is not
- // enabled because we cannot reuse the existing paint objects
- // in the new context.
- qt_vg_destroy_paint_engine(engine);
- engine = 0;
- context->destroySurface(windowSurface);
- qt_vg_destroy_context(context, QInternal::Widget);
- context = 0;
- windowSurface = EGL_NO_SURFACE;
- }
-#endif
-#endif
- if (!context) {
- // Create a new EGL context and bind it to the widget surface.
- size = newSize;
- context = qt_vg_create_context(widget, QInternal::Widget);
- if (!context)
- return 0;
- // We want a direct to window rendering surface if possible.
-#if defined(QVG_DIRECT_TO_WINDOW)
- surfaceProps.setValue(EGL_RENDER_BUFFER, EGL_SINGLE_BUFFER);
-#endif
-#if defined(EGL_VG_ALPHA_FORMAT_PRE_BIT)
- if (isPremultipliedContext(context)) {
- surfaceProps.setValue
- (EGL_VG_ALPHA_FORMAT, EGL_VG_ALPHA_FORMAT_PRE);
- } else {
- surfaceProps.removeValue(EGL_VG_ALPHA_FORMAT);
- }
-#endif
- EGLSurface surface = context->createSurface(widget, &surfaceProps);
- if (surface == EGL_NO_SURFACE) {
- qt_vg_destroy_context(context, QInternal::Widget);
- context = 0;
- return 0;
- }
- needToSwap = true;
-#if defined(QVG_DIRECT_TO_WINDOW)
- // Did we get a direct to window rendering surface?
- EGLint buffer = 0;
- if (eglQueryContext(QEgl::display(), context->context(),
- EGL_RENDER_BUFFER, &buffer) &&
- buffer == EGL_SINGLE_BUFFER) {
- needToSwap = false;
- }
-#endif
- windowSurface = surface;
- isPaintingActive = false;
- }
-
-#if !defined(QVG_NO_PRESERVED_SWAP)
- // Try to force the surface back buffer to preserve its contents.
- if (needToSwap) {
- bool succeeded = eglSurfaceAttrib(QEgl::display(), windowSurface,
- EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);
- if (!succeeded && eglGetError() != EGL_SUCCESS) {
- qWarning("QVG: could not enable preserved swap");
- }
- }
-#endif
- return context;
-}
-
-void QVGEGLWindowSurfaceDirect::beginPaint(QWidget *widget)
-{
- QEglContext *context = ensureContext(widget);
- if (context) {
- context->makeCurrent(windowSurface);
- isPaintingActive = true;
- }
-}
-
-void QVGEGLWindowSurfaceDirect::endPaint
- (QWidget *widget, const QRegion& region, QImage *image)
-{
- Q_UNUSED(region);
- Q_UNUSED(image);
- QEglContext *context = ensureContext(widget);
- if (context) {
- if (needToSwap) {
- if (!isPaintingActive)
- context->makeCurrent(windowSurface);
- context->swapBuffers(windowSurface);
- context->lazyDoneCurrent();
- } else if (isPaintingActive) {
- vgFlush();
- context->lazyDoneCurrent();
- }
- isPaintingActive = false;
- }
-}
-
-bool QVGEGLWindowSurfaceDirect::supportsStaticContents() const
-{
-#if defined(QVG_BUFFER_SCROLLING) && !defined(QVG_NO_PRESERVED_SWAP)
- return true;
-#else
- return QVGEGLWindowSurfacePrivate::supportsStaticContents();
-#endif
-}
-
-bool QVGEGLWindowSurfaceDirect::scroll(QWidget *widget, const QRegion& area, int dx, int dy)
-{
-#ifdef QVG_BUFFER_SCROLLING
- QEglContext *context = ensureContext(widget);
- if (context) {
- context->makeCurrent(windowSurface);
- QRect scrollRect = area.boundingRect();
- int sx = scrollRect.x();
- int sy = size.height() - scrollRect.y() - scrollRect.height();
- vgSeti(VG_SCISSORING, VG_FALSE);
- vgCopyPixels(sx + dx, sy - dy, sx, sy, scrollRect.width(), scrollRect.height());
- context->lazyDoneCurrent();
- return true;
- }
-#else
- Q_UNUSED(widget);
- Q_UNUSED(area);
- Q_UNUSED(dx);
- Q_UNUSED(dy);
-#endif
- return false;
-}
-
-QT_END_NAMESPACE
-
-#endif