| /**************************************************************************** |
| ** |
| ** 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 plugins 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 QDIRECTFBSCREEN_H |
| #define QDIRECTFBSCREEN_H |
| |
| #include <qglobal.h> |
| #ifndef QT_NO_QWS_DIRECTFB |
| #include <QtGui/qscreen_qws.h> |
| #include <directfb.h> |
| #include <directfb_version.h> |
| |
| QT_BEGIN_HEADER |
| |
| QT_BEGIN_NAMESPACE |
| |
| QT_MODULE(Gui) |
| |
| #if !defined QT_DIRECTFB_SUBSURFACE && !defined QT_NO_DIRECTFB_SUBSURFACE |
| #define QT_NO_DIRECTFB_SUBSURFACE |
| #endif |
| #if !defined QT_NO_DIRECTFB_LAYER && !defined QT_DIRECTFB_LAYER |
| #define QT_DIRECTFB_LAYER |
| #endif |
| #if !defined QT_NO_DIRECTFB_WM && !defined QT_DIRECTFB_WM |
| #define QT_DIRECTFB_WM |
| #endif |
| #if !defined QT_DIRECTFB_IMAGECACHE && !defined QT_NO_DIRECTFB_IMAGECACHE |
| #define QT_NO_DIRECTFB_IMAGECACHE |
| #endif |
| #if !defined QT_NO_DIRECTFB_IMAGEPROVIDER && !defined QT_DIRECTFB_IMAGEPROVIDER |
| #define QT_DIRECTFB_IMAGEPROVIDER |
| #endif |
| #if !defined QT_NO_DIRECTFB_STRETCHBLIT && !defined QT_DIRECTFB_STRETCHBLIT |
| #define QT_DIRECTFB_STRETCHBLIT |
| #endif |
| #if !defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE && !defined QT_NO_DIRECTFB_IMAGEPROVIDER_KEEPALIVE |
| #define QT_NO_DIRECTFB_IMAGEPROVIDER_KEEPALIVE |
| #endif |
| #if !defined QT_DIRECTFB_WINDOW_AS_CURSOR && !defined QT_NO_DIRECTFB_WINDOW_AS_CURSOR |
| #define QT_NO_DIRECTFB_WINDOW_AS_CURSOR |
| #endif |
| #if !defined QT_DIRECTFB_PALETTE && !defined QT_NO_DIRECTFB_PALETTE |
| #define QT_NO_DIRECTFB_PALETTE |
| #endif |
| #if !defined QT_NO_DIRECTFB_PREALLOCATED && !defined QT_DIRECTFB_PREALLOCATED |
| #define QT_DIRECTFB_PREALLOCATED |
| #endif |
| #if !defined QT_NO_DIRECTFB_MOUSE && !defined QT_DIRECTFB_MOUSE |
| #define QT_DIRECTFB_MOUSE |
| #endif |
| #if !defined QT_NO_DIRECTFB_KEYBOARD && !defined QT_DIRECTFB_KEYBOARD |
| #define QT_DIRECTFB_KEYBOARD |
| #endif |
| #if !defined QT_NO_DIRECTFB_OPAQUE_DETECTION && !defined QT_DIRECTFB_OPAQUE_DETECTION |
| #define QT_DIRECTFB_OPAQUE_DETECTION |
| #endif |
| #ifndef QT_NO_QWS_CURSOR |
| #if defined QT_DIRECTFB_WM && defined QT_DIRECTFB_WINDOW_AS_CURSOR |
| #define QT_DIRECTFB_CURSOR |
| #elif defined QT_DIRECTFB_LAYER |
| #define QT_DIRECTFB_CURSOR |
| #endif |
| #endif |
| #ifndef QT_DIRECTFB_CURSOR |
| #define QT_NO_DIRECTFB_CURSOR |
| #endif |
| #if defined QT_NO_DIRECTFB_LAYER && defined QT_DIRECTFB_WM |
| #error QT_NO_DIRECTFB_LAYER requires QT_NO_DIRECTFB_WM |
| #endif |
| #if defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE && defined QT_NO_DIRECTFB_IMAGEPROVIDER |
| #error QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE requires QT_DIRECTFB_IMAGEPROVIDER to be defined |
| #endif |
| #if defined QT_DIRECTFB_WINDOW_AS_CURSOR && defined QT_NO_DIRECTFB_WM |
| #error QT_DIRECTFB_WINDOW_AS_CURSOR requires QT_DIRECTFB_WM to be defined |
| #endif |
| |
| #define Q_DIRECTFB_VERSION ((DIRECTFB_MAJOR_VERSION << 16) | (DIRECTFB_MINOR_VERSION << 8) | DIRECTFB_MICRO_VERSION) |
| |
| #define DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(F) \ |
| static inline F operator~(F f) { return F(~int(f)); } \ |
| static inline F operator&(F left, F right) { return F(int(left) & int(right)); } \ |
| static inline F operator|(F left, F right) { return F(int(left) | int(right)); } \ |
| static inline F &operator|=(F &left, F right) { left = (left | right); return left; } \ |
| static inline F &operator&=(F &left, F right) { left = (left & right); return left; } |
| |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBInputDeviceCapabilities); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBWindowDescriptionFlags); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBWindowCapabilities); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBWindowOptions); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceDescriptionFlags); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceCapabilities); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceLockFlags); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceBlittingFlags); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceDrawingFlags); |
| DIRECTFB_DECLARE_OPERATORS_FOR_FLAGS(DFBSurfaceFlipFlags); |
| |
| class QDirectFBScreenPrivate; |
| class Q_GUI_EXPORT QDirectFBScreen : public QScreen |
| { |
| public: |
| QDirectFBScreen(int display_id); |
| ~QDirectFBScreen(); |
| |
| enum DirectFBFlag { |
| NoFlags = 0x00, |
| VideoOnly = 0x01, |
| SystemOnly = 0x02, |
| BoundingRectFlip = 0x04, |
| NoPartialFlip = 0x08 |
| }; |
| |
| Q_DECLARE_FLAGS(DirectFBFlags, DirectFBFlag); |
| |
| DirectFBFlags directFBFlags() const; |
| |
| bool connect(const QString &displaySpec); |
| void disconnect(); |
| bool initDevice(); |
| void shutdownDevice(); |
| |
| void exposeRegion(QRegion r, int changing); |
| void solidFill(const QColor &color, const QRegion ®ion); |
| static void solidFill(IDirectFBSurface *surface, const QColor &color, const QRegion ®ion); |
| |
| void setMode(int width, int height, int depth); |
| void blank(bool on); |
| |
| QWSWindowSurface *createSurface(QWidget *widget) const; |
| QWSWindowSurface *createSurface(const QString &key) const; |
| |
| static QDirectFBScreen *instance(); |
| void waitIdle(); |
| IDirectFBSurface *surfaceForWidget(const QWidget *widget, QRect *rect) const; |
| #ifdef QT_DIRECTFB_SUBSURFACE |
| IDirectFBSurface *subSurfaceForWidget(const QWidget *widget, const QRect &area = QRect()) const; |
| #endif |
| IDirectFB *dfb(); |
| #ifdef QT_DIRECTFB_WM |
| IDirectFBWindow *windowForWidget(const QWidget *widget) const; |
| #else |
| IDirectFBSurface *primarySurface(); |
| #endif |
| #ifndef QT_NO_DIRECTFB_LAYER |
| IDirectFBDisplayLayer *dfbDisplayLayer(); |
| #endif |
| |
| // Track surface creation/release so we can release all on exit |
| enum SurfaceCreationOption { |
| DontTrackSurface = 0x1, |
| TrackSurface = 0x2, |
| NoPreallocated = 0x4 |
| }; |
| Q_DECLARE_FLAGS(SurfaceCreationOptions, SurfaceCreationOption); |
| IDirectFBSurface *createDFBSurface(const QImage &image, |
| QImage::Format format, |
| SurfaceCreationOptions options, |
| DFBResult *result = 0); |
| IDirectFBSurface *createDFBSurface(const QSize &size, |
| QImage::Format format, |
| SurfaceCreationOptions options, |
| DFBResult *result = 0); |
| IDirectFBSurface *copyDFBSurface(IDirectFBSurface *src, |
| QImage::Format format, |
| SurfaceCreationOptions options, |
| DFBResult *result = 0); |
| IDirectFBSurface *createDFBSurface(DFBSurfaceDescription desc, |
| SurfaceCreationOptions options, |
| DFBResult *result); |
| #ifdef QT_DIRECTFB_SUBSURFACE |
| IDirectFBSurface *getSubSurface(IDirectFBSurface *surface, |
| const QRect &rect, |
| SurfaceCreationOptions options, |
| DFBResult *result); |
| #endif |
| |
| void flipSurface(IDirectFBSurface *surface, DFBSurfaceFlipFlags flipFlags, |
| const QRegion ®ion, const QPoint &offset); |
| void releaseDFBSurface(IDirectFBSurface *surface); |
| |
| using QScreen::depth; |
| static int depth(DFBSurfacePixelFormat format); |
| static int depth(QImage::Format format); |
| |
| static DFBSurfacePixelFormat getSurfacePixelFormat(QImage::Format format); |
| static DFBSurfaceDescription getSurfaceDescription(const uint *buffer, |
| int length); |
| static QImage::Format getImageFormat(IDirectFBSurface *surface); |
| static bool initSurfaceDescriptionPixelFormat(DFBSurfaceDescription *description, QImage::Format format); |
| static inline bool isPremultiplied(QImage::Format format); |
| static inline bool hasAlphaChannel(DFBSurfacePixelFormat format); |
| static inline bool hasAlphaChannel(IDirectFBSurface *surface); |
| QImage::Format alphaPixmapFormat() const; |
| |
| #ifndef QT_NO_DIRECTFB_PALETTE |
| static void setSurfaceColorTable(IDirectFBSurface *surface, |
| const QImage &image); |
| #endif |
| |
| static uchar *lockSurface(IDirectFBSurface *surface, DFBSurfaceLockFlags flags, int *bpl = 0); |
| #if defined QT_DIRECTFB_IMAGEPROVIDER && defined QT_DIRECTFB_IMAGEPROVIDER_KEEPALIVE |
| void setDirectFBImageProvider(IDirectFBImageProvider *provider); |
| #endif |
| private: |
| QDirectFBScreenPrivate *d_ptr; |
| }; |
| |
| Q_DECLARE_OPERATORS_FOR_FLAGS(QDirectFBScreen::SurfaceCreationOptions); |
| Q_DECLARE_OPERATORS_FOR_FLAGS(QDirectFBScreen::DirectFBFlags); |
| |
| inline bool QDirectFBScreen::isPremultiplied(QImage::Format format) |
| { |
| switch (format) { |
| case QImage::Format_ARGB32_Premultiplied: |
| case QImage::Format_ARGB8565_Premultiplied: |
| case QImage::Format_ARGB6666_Premultiplied: |
| case QImage::Format_ARGB8555_Premultiplied: |
| case QImage::Format_ARGB4444_Premultiplied: |
| return true; |
| default: |
| break; |
| } |
| return false; |
| } |
| |
| inline bool QDirectFBScreen::hasAlphaChannel(DFBSurfacePixelFormat format) |
| { |
| switch (format) { |
| case DSPF_ARGB1555: |
| case DSPF_ARGB: |
| case DSPF_LUT8: |
| case DSPF_AiRGB: |
| case DSPF_A1: |
| case DSPF_ARGB2554: |
| case DSPF_ARGB4444: |
| #if (Q_DIRECTFB_VERSION >= 0x000923) |
| case DSPF_AYUV: |
| #endif |
| #if (Q_DIRECTFB_VERSION >= 0x010000) |
| case DSPF_A4: |
| case DSPF_ARGB1666: |
| case DSPF_ARGB6666: |
| case DSPF_LUT2: |
| #endif |
| return true; |
| default: |
| return false; |
| } |
| } |
| |
| inline bool QDirectFBScreen::hasAlphaChannel(IDirectFBSurface *surface) |
| { |
| Q_ASSERT(surface); |
| DFBSurfacePixelFormat format; |
| surface->GetPixelFormat(surface, &format); |
| return QDirectFBScreen::hasAlphaChannel(format); |
| } |
| |
| QT_END_NAMESPACE |
| |
| QT_END_HEADER |
| |
| #endif // QT_NO_QWS_DIRECTFB |
| #endif // QDIRECTFBSCREEN_H |
| |