blob: c3cee67fa35c1c26e63022aff11f4a7e34b2c829 [file] [log] [blame]
/****************************************************************************
**
** 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 QtGui 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$
**
****************************************************************************/
#ifndef QWINDOWSURFACE_QWS_P_H
#define QWINDOWSURFACE_QWS_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qwindowsurface_p.h"
#include <qregion.h>
#include <qimage.h>
#include <qdirectpainter_qws.h>
#include <qmutex.h>
#include <private/qwssharedmemory_p.h>
QT_BEGIN_NAMESPACE
class QScreen;
class QWSWindowSurfacePrivate;
class Q_GUI_EXPORT QWSWindowSurface : public QWindowSurface
{
public:
QWSWindowSurface();
QWSWindowSurface(QWidget *widget);
~QWSWindowSurface();
virtual bool isValid() const = 0;
virtual void setGeometry(const QRect &rect);
virtual void setGeometry(const QRect &rect, const QRegion &mask);
virtual void flush(QWidget *widget, const QRegion &region,
const QPoint &offset);
virtual bool move(const QPoint &offset);
virtual QRegion move(const QPoint &offset, const QRegion &newClip);
virtual QPoint painterOffset() const; // remove!!!
virtual void beginPaint(const QRegion &);
virtual void endPaint(const QRegion &);
virtual bool lock(int timeout = -1);
virtual void unlock();
virtual QString key() const = 0;
// XXX: not good enough
virtual QByteArray transientState() const;
virtual QByteArray permanentState() const;
virtual void setTransientState(const QByteArray &state);
virtual void setPermanentState(const QByteArray &state);
virtual QImage image() const = 0;
virtual QPaintDevice *paintDevice() = 0;
const QRegion clipRegion() const;
void setClipRegion(const QRegion &);
#ifdef QT_QWS_CLIENTBLIT
virtual const QRegion directRegion() const;
virtual int directRegionId() const;
virtual void setDirectRegion(const QRegion &, int);
#endif
enum SurfaceFlag {
RegionReserved = 0x1,
Buffered = 0x2,
Opaque = 0x4
};
Q_DECLARE_FLAGS(SurfaceFlags, SurfaceFlag)
SurfaceFlags surfaceFlags() const;
inline bool isRegionReserved() const {
return surfaceFlags() & RegionReserved;
}
inline bool isBuffered() const { return surfaceFlags() & Buffered; }
inline bool isOpaque() const { return surfaceFlags() & Opaque; }
int winId() const;
virtual void releaseSurface();
protected:
void setSurfaceFlags(SurfaceFlags type);
void setWinId(int id);
private:
friend class QWidgetPrivate;
void invalidateBuffer();
QWSWindowSurfacePrivate *d_ptr;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QWSWindowSurface::SurfaceFlags)
class QWSWindowSurfacePrivate
{
public:
QWSWindowSurfacePrivate();
void setWinId(int id);
QWSWindowSurface::SurfaceFlags flags;
QRegion clip;
#ifdef QT_QWS_CLIENTBLIT
QRegion direct;
int directId;
#endif
int winId;
};
class QWSLock;
class Q_GUI_EXPORT QWSMemorySurface : public QWSWindowSurface
{
public:
QWSMemorySurface();
QWSMemorySurface(QWidget *widget);
~QWSMemorySurface();
bool isValid() const;
QPaintDevice *paintDevice() { return &img; }
bool scroll(const QRegion &area, int dx, int dy);
QImage image() const { return img; }
QPoint painterOffset() const;
void beginPaint(const QRegion &rgn);
bool lock(int timeout = -1);
void unlock();
protected:
QImage::Format preferredImageFormat(const QWidget *widget) const;
#ifndef QT_NO_QWS_MULTIPROCESS
void setLock(int lockId);
QWSLock *memlock;
#endif
#ifndef QT_NO_THREAD
QMutex threadLock;
#endif
QImage img;
};
class Q_GUI_EXPORT QWSLocalMemSurface : public QWSMemorySurface
{
public:
QWSLocalMemSurface();
QWSLocalMemSurface(QWidget *widget);
~QWSLocalMemSurface();
void setGeometry(const QRect &rect);
QString key() const { return QLatin1String("mem"); }
QByteArray permanentState() const;
void setPermanentState(const QByteArray &data);
virtual void releaseSurface();
protected:
uchar *mem;
int memsize;
};
#ifndef QT_NO_QWS_MULTIPROCESS
class Q_GUI_EXPORT QWSSharedMemSurface : public QWSMemorySurface
{
public:
QWSSharedMemSurface();
QWSSharedMemSurface(QWidget *widget);
~QWSSharedMemSurface();
void setGeometry(const QRect &rect);
QString key() const { return QLatin1String("shm"); }
QByteArray permanentState() const;
void setPermanentState(const QByteArray &data);
#ifdef QT_QWS_CLIENTBLIT
virtual void setDirectRegion(const QRegion &, int);
virtual const QRegion directRegion() const;
#endif
virtual void releaseSurface();
private:
bool setMemory(int memId);
QWSSharedMemory mem;
};
#endif // QT_NO_QWS_MULTIPROCESS
#ifndef QT_NO_PAINTONSCREEN
class Q_GUI_EXPORT QWSOnScreenSurface : public QWSMemorySurface
{
public:
QWSOnScreenSurface();
QWSOnScreenSurface(QWidget *widget);
~QWSOnScreenSurface();
bool isValid() const;
QPoint painterOffset() const;
QString key() const { return QLatin1String("OnScreen"); }
QByteArray permanentState() const;
void setPermanentState(const QByteArray &data);
private:
void attachToScreen(const QScreen *screen);
const QScreen *screen;
};
#endif // QT_NO_PAINTONSCREEN
#ifndef QT_NO_PAINT_DEBUG
class Q_GUI_EXPORT QWSYellowSurface : public QWSWindowSurface
{
public:
QWSYellowSurface(bool isClient = false);
~QWSYellowSurface();
void setDelay(int msec) { delay = msec; }
bool isValid() const { return true; }
void flush(QWidget *widget, const QRegion &region, const QPoint &offset);
QString key() const { return QLatin1String("Yellow"); }
QByteArray permanentState() const;
void setPermanentState(const QByteArray &data);
QPaintDevice *paintDevice() { return &img; }
QImage image() const { return img; }
private:
int delay;
QSize surfaceSize; // client side
QImage img; // server side
};
#endif // QT_NO_PAINT_DEBUG
#ifndef QT_NO_DIRECTPAINTER
class QScreen;
class Q_GUI_EXPORT QWSDirectPainterSurface : public QWSWindowSurface
{
public:
QWSDirectPainterSurface(bool isClient = false,
QDirectPainter::SurfaceFlag flags = QDirectPainter::NonReserved);
~QWSDirectPainterSurface();
void setReserved() { setSurfaceFlags(RegionReserved); }
void setGeometry(const QRect &rect) { setRegion(rect); }
void setRegion(const QRegion &region);
QRegion region() const { return clipRegion(); }
void flush(QWidget*, const QRegion &, const QPoint &);
bool isValid() const { return false; }
QString key() const { return QLatin1String("DirectPainter"); }
QByteArray permanentState() const;
void setPermanentState(const QByteArray &);
QImage image() const { return QImage(); }
QPaintDevice *paintDevice() { return 0; }
// hw: get rid of this
WId windowId() const { return static_cast<WId>(winId()); }
QScreen *screen() const { return _screen; }
void beginPaint(const QRegion &);
bool lock(int timeout = -1);
void unlock();
void setLocking(bool b) { doLocking = b; }
bool hasPendingRegionEvents() const;
private:
QScreen *_screen;
#ifndef QT_NO_THREAD
QMutex threadLock;
#endif
friend void qt_directpainter_region(QDirectPainter*, const QRegion&, int);
bool flushingRegionEvents;
bool synchronous;
bool doLocking;
};
#endif // QT_NO_DIRECTPAINTER
QT_END_NAMESPACE
#endif // QWINDOWSURFACE_QWS_P_H