diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:34:13 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:34:13 (GMT) |
commit | 67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch) | |
tree | 1dbf50b3dff8d5ca7e9344733968c72704eb15ff /src/gui/painting/qwindowsurface_qws_p.h | |
download | Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.zip Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.gz Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.bz2 |
Long live Qt!
Diffstat (limited to 'src/gui/painting/qwindowsurface_qws_p.h')
-rw-r--r-- | src/gui/painting/qwindowsurface_qws_p.h | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/src/gui/painting/qwindowsurface_qws_p.h b/src/gui/painting/qwindowsurface_qws_p.h new file mode 100644 index 0000000..5eb5c8a --- /dev/null +++ b/src/gui/painting/qwindowsurface_qws_p.h @@ -0,0 +1,353 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, 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.0, 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $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 ®ion, + 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; + + 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 ®ion, 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 ®ion); + 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 |