diff options
Diffstat (limited to 'src/gui/kernel/qsurfaceformat.cpp')
-rw-r--r-- | src/gui/kernel/qsurfaceformat.cpp | 466 |
1 files changed, 466 insertions, 0 deletions
diff --git a/src/gui/kernel/qsurfaceformat.cpp b/src/gui/kernel/qsurfaceformat.cpp new file mode 100644 index 0000000000..c53c510d8c --- /dev/null +++ b/src/gui/kernel/qsurfaceformat.cpp @@ -0,0 +1,466 @@ +/**************************************************************************** +** +** 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> + +#ifdef major +#undef major +#endif + +#ifdef minor +#undef minor +#endif + +class QSurfaceFormatPrivate +{ +public: + explicit QSurfaceFormatPrivate(QSurfaceFormat::FormatOptions _opts = 0) + : ref(1) + , opts(_opts) + , redBufferSize(-1) + , greenBufferSize(-1) + , blueBufferSize(-1) + , alphaBufferSize(-1) + , depthSize(-1) + , stencilSize(-1) + , swapBehavior(QSurfaceFormat::DefaultSwapBehavior) + , numSamples(-1) + , profile(QSurfaceFormat::NoProfile) + , major(1) + , minor(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), + profile(other->profile), + major(other->major), + minor(other->minor) + { + } + + QAtomicInt ref; + QSurfaceFormat::FormatOptions opts; + int redBufferSize; + int greenBufferSize; + int blueBufferSize; + int alphaBufferSize; + int depthSize; + int stencilSize; + QSurfaceFormat::SwapBehavior swapBehavior; + int numSamples; + QSurfaceFormat::OpenGLContextProfile profile; + int major; + int minor; +}; + +QSurfaceFormat::QSurfaceFormat() : d(new QSurfaceFormatPrivate) +{ +} + +QSurfaceFormat::QSurfaceFormat(QSurfaceFormat::FormatOptions options) : + d(new QSurfaceFormatPrivate(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) +{ + QSurfaceFormat::FormatOptions newOptions = d->opts; + if (enable) { + newOptions |= QSurfaceFormat::StereoBuffers; + } else { + newOptions &= ~QSurfaceFormat::StereoBuffers; + } + if (int(newOptions) != int(d->opts)) { + detach(); + d->opts = newOptions; + } +} + +/*! + 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) +{ + if (d->numSamples != numSamples) { + detach(); + d->numSamples = numSamples; + } +} + +/*! + Sets the format option to \a opt. + + \sa testOption() +*/ + +void QSurfaceFormat::setOption(QSurfaceFormat::FormatOptions opt) +{ + const QSurfaceFormat::FormatOptions newOptions = d->opts | opt; + if (int(newOptions) != int(d->opts)) { + detach(); + d->opts = newOptions; + } +} + +/*! + 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) +{ + if (d->depthSize != 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) +{ + if (d->swapBehavior != behavior) { + detach(); + 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) +{ + if (d->stencilSize != 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) +{ + if (d->redBufferSize != size) { + detach(); + d->redBufferSize = size; + } +} + +void QSurfaceFormat::setGreenBufferSize(int size) +{ + if (d->greenBufferSize != size) { + detach(); + d->greenBufferSize = size; + } +} + +void QSurfaceFormat::setBlueBufferSize(int size) +{ + if (d->blueBufferSize != size) { + detach(); + d->blueBufferSize = size; + } +} + +void QSurfaceFormat::setAlphaBufferSize(int size) +{ + if (d->alphaBufferSize != size) { + detach(); + d->alphaBufferSize = size; + } +} + +/*! + Sets the desired OpenGL context profile. + + This setting is ignored if the requested OpenGL version is + less than 3.2. +*/ +void QSurfaceFormat::setProfile(OpenGLContextProfile profile) +{ + if (d->profile != profile) { + detach(); + d->profile = profile; + } +} + +QSurfaceFormat::OpenGLContextProfile QSurfaceFormat::profile() const +{ + return d->profile; +} + +/*! + Sets the desired major OpenGL version. +*/ +void QSurfaceFormat::setMajorVersion(int major) +{ + d->major = major; +} + +/*! + Returns the major OpenGL version. +*/ +int QSurfaceFormat::majorVersion() const +{ + return d->major; +} + +/*! + Sets the desired minor OpenGL version. +*/ +void QSurfaceFormat::setMinorVersion(int minor) +{ + d->minor = minor; +} + +/*! + Returns the minor OpenGL version. +*/ +int QSurfaceFormat::minorVersion() const +{ + return d->minor; +} + +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 + && a.d->profile == b.d->profile); +} + + +/*! + 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 + << ", profile " << d->profile + << ')'; + + return dbg.space(); +} +#endif |