diff options
author | Alexandru Croitor <alexandru.croitor@qt.io> | 2021-08-12 11:24:12 +0200 |
---|---|---|
committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2021-08-12 17:51:01 +0200 |
commit | 425911d07fc8c3bb899226a1355c38a166b5e1de (patch) | |
tree | 1d5e0e5ae3ec66b10920bb9104e7d12c69b4a52f /src/effects/private/qgfxsourceproxy.cpp | |
parent | 59ab3e11433a5157aac0f3af7c0d7fe70a373373 (diff) | |
download | qtgraphicaleffects-dev.tar.gz |
Add a README.md mentioning the documentation on where the ported
effects can be found, as well as how to check out the Qt5 branch.
Pick-to: 6.2
Fixes: QTBUG-95757
Change-Id: Ib47c7e73f8622c8e287df0f74c6f16a5113b357e
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'src/effects/private/qgfxsourceproxy.cpp')
-rw-r--r-- | src/effects/private/qgfxsourceproxy.cpp | 216 |
1 files changed, 0 insertions, 216 deletions
diff --git a/src/effects/private/qgfxsourceproxy.cpp b/src/effects/private/qgfxsourceproxy.cpp deleted file mode 100644 index cf64807..0000000 --- a/src/effects/private/qgfxsourceproxy.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 Jolla Ltd, author: <gunnar.sletta@jollamobile.com> -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Graphical Effects module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** BSD License Usage -** Alternatively, you may use this file under the terms of the BSD license -** as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of The Qt Company Ltd nor the names of its -** contributors may be used to endorse or promote products derived -** from this software without specific prior written permission. -** -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgfxsourceproxy_p.h" - -#include <private/qquickshadereffectsource_p.h> -#include <private/qquickitem_p.h> -#include <private/qquickimage_p.h> - -QT_BEGIN_NAMESPACE - -QGfxSourceProxy::QGfxSourceProxy(QQuickItem *parentItem) - : QQuickItem(parentItem) - , m_input(0) - , m_output(0) - , m_proxy(0) - , m_interpolation(AnyInterpolation) -{ -} - -QGfxSourceProxy::~QGfxSourceProxy() -{ - delete m_proxy; -} - -void QGfxSourceProxy::setInput(QQuickItem *input) -{ - if (m_input == input) - return; - - if (m_input != nullptr) - disconnect(m_input, nullptr, this, nullptr); - m_input = input; - polish(); - if (m_input != nullptr) { - if (QQuickImage *image = qobject_cast<QQuickImage *>(m_input)) { - connect(image, &QQuickImage::sourceSizeChanged, this, &QGfxSourceProxy::repolish); - connect(image, &QQuickImage::fillModeChanged, this, &QGfxSourceProxy::repolish); - } - connect(m_input, &QQuickItem::childrenChanged, this, &QGfxSourceProxy::repolish); - } - emit inputChanged(); -} - -void QGfxSourceProxy::setOutput(QQuickItem *output) -{ - if (m_output == output) - return; - m_output = output; - emit activeChanged(); - emit outputChanged(); -} - -void QGfxSourceProxy::setSourceRect(const QRectF &sourceRect) -{ - if (m_sourceRect == sourceRect) - return; - m_sourceRect = sourceRect; - polish(); - emit sourceRectChanged(); -} - -void QGfxSourceProxy::setInterpolation(Interpolation i) -{ - if (m_interpolation == i) - return; - m_interpolation = i; - polish(); - emit interpolationChanged(); -} - - -void QGfxSourceProxy::useProxy() -{ - if (!m_proxy) - m_proxy = new QQuickShaderEffectSource(this); - m_proxy->setSourceRect(m_sourceRect); - m_proxy->setSourceItem(m_input); - m_proxy->setSmooth(m_interpolation != NearestInterpolation); - setOutput(m_proxy); -} - -void QGfxSourceProxy::repolish() -{ - polish(); -} - -QObject *QGfxSourceProxy::findLayer(QQuickItem *item) -{ - if (!item) - return 0; - QQuickItemPrivate *d = QQuickItemPrivate::get(item); - if (d->extra.isAllocated() && d->extra->layer) { - QObject *layer = qvariant_cast<QObject *>(item->property("layer")); - if (layer && layer->property("enabled").toBool()) - return layer; - } - return 0; -} - -void QGfxSourceProxy::updatePolish() -{ - if (m_input == 0) { - setOutput(0); - return; - } - - QQuickImage *image = qobject_cast<QQuickImage *>(m_input); - QQuickShaderEffectSource *shaderSource = qobject_cast<QQuickShaderEffectSource *>(m_input); - bool childless = m_input->childItems().size() == 0; - bool interpOk = m_interpolation == AnyInterpolation - || (m_interpolation == LinearInterpolation && m_input->smooth() == true) - || (m_interpolation == NearestInterpolation && m_input->smooth() == false); - - // Layers can be used in two different ways. Option 1 is when the item is - // used as input to a separate ShaderEffect component. In this case, - // m_input will be the item itself. - QObject *layer = findLayer(m_input); - if (!layer && shaderSource) { - // Alternatively, the effect is applied via layer.effect, and the - // input to the effect will be the layer's internal ShaderEffectSource - // item. In this case, we need to backtrack and find the item that has - // the layer and configure it accordingly. - layer = findLayer(shaderSource->sourceItem()); - } - - // A bit crude test, but we're only using source rect for - // blurring+transparent edge, so this is good enough. - bool padded = m_sourceRect.x() < 0 || m_sourceRect.y() < 0; - - bool direct = false; - - if (layer) { - // Auto-configure the layer so interpolation and padding works as - // expected without allocating additional FBOs. In edgecases, where - // this feature is undesiered, the user can simply use - // ShaderEffectSource rather than layer. - layer->setProperty("sourceRect", m_sourceRect); - layer->setProperty("smooth", m_interpolation != NearestInterpolation); - direct = true; - - } else if (childless && interpOk) { - - if (shaderSource) { - if (shaderSource->sourceRect() == m_sourceRect || m_sourceRect.isEmpty()) - direct = true; - - } else if (!padded && ((image && image->fillMode() == QQuickImage::Stretch && !image->sourceSize().isNull()) - || (!image && m_input->isTextureProvider()) - ) - ) { - direct = true; - } - } - - if (direct) { - setOutput(m_input); - } else { - useProxy(); - } - - // Remove the proxy if it is not in use.. - if (m_proxy && m_output == m_input) { - delete m_proxy; - m_proxy = 0; - } -} - -QT_END_NAMESPACE |