/**************************************************************************** ** ** 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 #include 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