diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2011-06-21 13:39:26 +0200 |
---|---|---|
committer | Samuel Rødal <samuel.rodal@nokia.com> | 2011-06-21 14:02:22 +0200 |
commit | 176f30b13739b352cbe453cba7796d9a9c808bcd (patch) | |
tree | 8fa60b6ae4ef06455652863a0406bc5e86a22303 /src/gui/kernel/qsurfaceformat.cpp | |
parent | 272daebaa07b21e372ad4274fafb51ce0be92396 (diff) |
OpenGL API refactor.
Rename QGuiGLFormat to QSurfaceFormat, and make QWindow sub-class of
QSurface and QPlatformWindow sub-class of QPlatformSurface, instead of
having QPlatformGLSurface accessor in QWindow.
Diffstat (limited to 'src/gui/kernel/qsurfaceformat.cpp')
-rw-r--r-- | src/gui/kernel/qsurfaceformat.cpp | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/src/gui/kernel/qsurfaceformat.cpp b/src/gui/kernel/qsurfaceformat.cpp new file mode 100644 index 0000000000..88601cab1f --- /dev/null +++ b/src/gui/kernel/qsurfaceformat.cpp @@ -0,0 +1,368 @@ +/**************************************************************************** +** +** 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$ +** 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qsurfaceformat.h" + +#include <QtCore/qatomic.h> +#include <QtCore/QDebug> + +class QSurfaceFormatPrivate +{ +public: + QSurfaceFormatPrivate() + : ref(1) + , opts(QSurfaceFormat::DoubleBuffer) + , redBufferSize(-1) + , greenBufferSize(-1) + , blueBufferSize(-1) + , alphaBufferSize(-1) + , depthSize(-1) + , stencilSize(-1) + , swapBehavior(QSurfaceFormat::DefaultSwapBehavior) + , numSamples(-1) + { + } + + QSurfaceFormatPrivate(const QSurfaceFormatPrivate *other) + : ref(1), + opts(other->opts), + redBufferSize(other->redBufferSize), + greenBufferSize(other->greenBufferSize), + blueBufferSize(other->blueBufferSize), + alphaBufferSize(other->alphaBufferSize), + depthSize(other->depthSize), + stencilSize(other->stencilSize), + swapBehavior(other->swapBehavior), + numSamples(other->numSamples) + { + } + + QAtomicInt ref; + QSurfaceFormat::FormatOptions opts; + int redBufferSize; + int greenBufferSize; + int blueBufferSize; + int alphaBufferSize; + int depthSize; + int stencilSize; + QSurfaceFormat::SwapBehavior swapBehavior; + int numSamples; +}; + +QSurfaceFormat::QSurfaceFormat() +{ + d = new QSurfaceFormatPrivate; +} + +QSurfaceFormat::QSurfaceFormat(QSurfaceFormat::FormatOptions options) +{ + d = new QSurfaceFormatPrivate; + d->opts = options; +} + +/*! + \internal +*/ +void QSurfaceFormat::detach() +{ + if (d->ref != 1) { + QSurfaceFormatPrivate *newd = new QSurfaceFormatPrivate(d); + if (!d->ref.deref()) + delete d; + d = newd; + } +} + +/*! + Constructs a copy of \a other. +*/ + +QSurfaceFormat::QSurfaceFormat(const QSurfaceFormat &other) +{ + d = other.d; + d->ref.ref(); +} + +/*! + Assigns \a other to this object. +*/ + +QSurfaceFormat &QSurfaceFormat::operator=(const QSurfaceFormat &other) +{ + if (d != other.d) { + other.d->ref.ref(); + if (!d->ref.deref()) + delete d; + d = other.d; + } + return *this; +} + +/*! + Destroys the QSurfaceFormat. +*/ +QSurfaceFormat::~QSurfaceFormat() +{ + if (!d->ref.deref()) + delete d; +} + +/*! + \fn bool QSurfaceFormat::stereo() const + + Returns true if stereo buffering is enabled; otherwise returns + false. Stereo buffering is disabled by default. + + \sa setStereo() +*/ + +/*! + If \a enable is true enables stereo buffering; otherwise disables + stereo buffering. + + Stereo buffering is disabled by default. + + Stereo buffering provides extra color buffers to generate left-eye + and right-eye images. + + \sa stereo() +*/ + +void QSurfaceFormat::setStereo(bool enable) +{ + if (enable) { + d->opts |= QSurfaceFormat::StereoBuffers; + } else { + d->opts &= ~QSurfaceFormat::StereoBuffers; + } +} + +/*! + Returns the number of samples per pixel when multisampling is + enabled. By default, the highest number of samples that is + available is used. + + \sa setSampleBuffers(), sampleBuffers(), setSamples() +*/ +int QSurfaceFormat::samples() const +{ + return d->numSamples; +} + +/*! + Set the preferred number of samples per pixel when multisampling + is enabled to \a numSamples. By default, the highest number of + samples available is used. + + \sa setSampleBuffers(), sampleBuffers(), samples() +*/ +void QSurfaceFormat::setSamples(int numSamples) +{ + detach(); + d->numSamples = numSamples; +} + +/*! + Sets the format option to \a opt. + + \sa testOption() +*/ + +void QSurfaceFormat::setOption(QSurfaceFormat::FormatOptions opt) +{ + detach(); + d->opts |= opt; +} + +/*! + Returns true if format option \a opt is set; otherwise returns false. + + \sa setOption() +*/ + +bool QSurfaceFormat::testOption(QSurfaceFormat::FormatOptions opt) const +{ + return d->opts & opt; +} + +/*! + Set the minimum depth buffer size to \a size. + + \sa depthBufferSize(), setDepth(), depth() +*/ +void QSurfaceFormat::setDepthBufferSize(int size) +{ + detach(); + d->depthSize = size; +} + +/*! + Returns the depth buffer size. + + \sa depth(), setDepth(), setDepthBufferSize() +*/ +int QSurfaceFormat::depthBufferSize() const +{ + return d->depthSize; +} + +void QSurfaceFormat::setSwapBehavior(SwapBehavior behavior) +{ + d->swapBehavior = behavior; +} + +QSurfaceFormat::SwapBehavior QSurfaceFormat::swapBehavior() const +{ + return d->swapBehavior; +} + +bool QSurfaceFormat::hasAlpha() const +{ + return d->alphaBufferSize > 0; +} + +/*! + Set the preferred stencil buffer size to \a size. + + \sa stencilBufferSize(), setStencil(), stencil() +*/ +void QSurfaceFormat::setStencilBufferSize(int size) +{ + detach(); + d->stencilSize = size; +} + +/*! + Returns the stencil buffer size. + + \sa stencil(), setStencil(), setStencilBufferSize() +*/ +int QSurfaceFormat::stencilBufferSize() const +{ + return d->stencilSize; +} + +int QSurfaceFormat::redBufferSize() const +{ + return d->redBufferSize; +} + +int QSurfaceFormat::greenBufferSize() const +{ + return d->greenBufferSize; +} + +int QSurfaceFormat::blueBufferSize() const +{ + return d->blueBufferSize; +} + +int QSurfaceFormat::alphaBufferSize() const +{ + return d->alphaBufferSize; +} + +void QSurfaceFormat::setRedBufferSize(int size) +{ + d->redBufferSize = size; +} + +void QSurfaceFormat::setGreenBufferSize(int size) +{ + d->greenBufferSize = size; +} + +void QSurfaceFormat::setBlueBufferSize(int size) +{ + d->blueBufferSize = size; +} + +void QSurfaceFormat::setAlphaBufferSize(int size) +{ + d->alphaBufferSize = size; +} + +bool operator==(const QSurfaceFormat& a, const QSurfaceFormat& b) +{ + return (a.d == b.d) || ((int) a.d->opts == (int) b.d->opts + && a.d->stencilSize == b.d->stencilSize + && a.d->redBufferSize == b.d->redBufferSize + && a.d->greenBufferSize == b.d->greenBufferSize + && a.d->blueBufferSize == b.d->blueBufferSize + && a.d->alphaBufferSize == b.d->alphaBufferSize + && a.d->depthSize == b.d->depthSize + && a.d->numSamples == b.d->numSamples + && a.d->swapBehavior == b.d->swapBehavior); +} + + +/*! + Returns false if all the options of the two QSurfaceFormat objects + \a a and \a b are equal; otherwise returns true. + + \relates QSurfaceFormat +*/ + +bool operator!=(const QSurfaceFormat& a, const QSurfaceFormat& b) +{ + return !(a == b); +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug dbg, const QSurfaceFormat &f) +{ + const QSurfaceFormatPrivate * const d = f.d; + + dbg.nospace() << "QSurfaceFormat(" + << "options " << d->opts + << ", depthBufferSize " << d->depthSize + << ", redBufferSize " << d->redBufferSize + << ", greenBufferSize " << d->greenBufferSize + << ", blueBufferSize " << d->blueBufferSize + << ", alphaBufferSize " << d->alphaBufferSize + << ", stencilBufferSize " << d->stencilSize + << ", samples " << d->numSamples + << ", swapBehavior " << d->swapBehavior + << ')'; + + return dbg.space(); +} +#endif |