diff options
Diffstat (limited to 'src/quickshapes/qquickshape_p_p.h')
-rw-r--r-- | src/quickshapes/qquickshape_p_p.h | 131 |
1 files changed, 36 insertions, 95 deletions
diff --git a/src/quickshapes/qquickshape_p_p.h b/src/quickshapes/qquickshape_p_p.h index bc06c8fde8..cce52d876f 100644 --- a/src/quickshapes/qquickshape_p_p.h +++ b/src/quickshapes/qquickshape_p_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQuick module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QQUICKSHAPE_P_P_H #define QQUICKSHAPE_P_P_H @@ -53,16 +17,19 @@ #include <QtQuickShapes/private/qquickshapesglobal_p.h> #include <QtQuickShapes/private/qquickshape_p.h> -#include <QtQuick/private/qquickitem_p.h> +#include <private/qquickitem_p.h> +#include <private/qsgtransform_p.h> #include <QPainterPath> #include <QColor> #include <QBrush> #include <QElapsedTimer> -#include <private/qopenglcontext_p.h> - +#if QT_CONFIG(opengl) +# include <private/qopenglcontext_p.h> +#endif QT_BEGIN_NAMESPACE class QSGPlainTexture; +class QRhi; class QQuickAbstractPathRenderer { @@ -71,24 +38,15 @@ public: SupportsAsync = 0x01 }; Q_DECLARE_FLAGS(Flags, Flag) - enum FillGradientType { NoGradient = 0, LinearGradient, RadialGradient, ConicalGradient }; - struct GradientDesc { // can fully describe a linear/radial/conical gradient - QGradientStops stops; - QQuickShapeGradient::SpreadMode spread; - QPointF a; // start (L) or center point (R/C) - QPointF b; // end (L) or focal point (R) - qreal v0; // center radius (R) or start angle (C) - qreal v1; // focal radius (R) - }; virtual ~QQuickAbstractPathRenderer() { } // Gui thread - virtual void beginSync(int totalCount) = 0; + virtual void beginSync(int totalCount, bool *countChanged) = 0; virtual void endSync(bool async) = 0; virtual void setAsyncCallback(void (*)(void *), void *) { } - virtual Flags flags() const { return 0; } + virtual Flags flags() const { return {}; } virtual void setPath(int index, const QQuickPath *path) = 0; virtual void setStrokeColor(int index, const QColor &color) = 0; virtual void setStrokeWidth(int index, qreal w) = 0; @@ -99,6 +57,10 @@ public: virtual void setStrokeStyle(int index, QQuickShapePath::StrokeStyle strokeStyle, qreal dashOffset, const QVector<qreal> &dashPattern) = 0; virtual void setFillGradient(int index, QQuickShapeGradient *gradient) = 0; + virtual void setFillTextureProvider(int index, QQuickItem *textureProviderItem) = 0; + virtual void setFillTransform(int index, const QSGTransform &transform) = 0; + virtual void setTriangulationScale(qreal) { } + virtual void handleSceneChange(QQuickWindow *window) = 0; // Render thread, with gui blocked virtual void updateNode() = 0; @@ -121,9 +83,11 @@ struct QQuickShapeStrokeFillParams qreal dashOffset; QVector<qreal> dashPattern; QQuickShapeGradient *fillGradient; + QSGTransform fillTransform; + QQuickItem *fillItem; }; -class Q_QUICKSHAPES_PRIVATE_EXPORT QQuickShapePathPrivate : public QQuickPathPrivate +class Q_QUICKSHAPES_EXPORT QQuickShapePathPrivate : public QQuickPathPrivate { Q_DECLARE_PUBLIC(QQuickShapePath) @@ -137,19 +101,25 @@ public: DirtyStyle = 0x20, DirtyDash = 0x40, DirtyFillGradient = 0x80, + DirtyFillTransform = 0x100, + DirtyFillItem = 0x200, - DirtyAll = 0xFF + DirtyAll = 0x3FF }; QQuickShapePathPrivate(); void _q_pathChanged(); void _q_fillGradientChanged(); + void _q_fillItemDestroyed(); + + void handleSceneChange(); static QQuickShapePathPrivate *get(QQuickShapePath *p) { return p->d_func(); } int dirty; QQuickShapeStrokeFillParams sfp; + QQuickShapePath::PathHints pathHints; }; class QQuickShapePrivate : public QQuickItemPrivate @@ -160,17 +130,22 @@ public: QQuickShapePrivate(); ~QQuickShapePrivate(); + QQuickShape::RendererType selectRendererType(); void createRenderer(); QSGNode *createNode(); void sync(); void _q_shapePathChanged(); void setStatus(QQuickShape::Status newStatus); + void handleSceneChange(QQuickWindow *w); static QQuickShapePrivate *get(QQuickShape *item) { return item->d_func(); } static void asyncShapeReady(void *data); + qreal getImplicitWidth() const override; + qreal getImplicitHeight() const override; + int effectRefCount; QVector<QQuickShapePath *> sp; QElapsedTimer syncTimer; @@ -179,54 +154,20 @@ public: int syncTimeCounter = 0; QQuickShape::Status status = QQuickShape::Null; QQuickShape::RendererType rendererType = QQuickShape::UnknownRenderer; + QQuickShape::RendererType preferredType = QQuickShape::UnknownRenderer; QQuickShape::ContainsMode containsMode = QQuickShape::BoundingRectContains; + QQuickShape::FillMode fillMode = QQuickShape::NoResize; + QQuickShape::HAlignment horizontalAlignment = QQuickShape::AlignLeft; + QQuickShape::VAlignment verticalAlignment = QQuickShape::AlignTop; + bool spChanged = false; + bool rendererChanged = false; bool async = false; bool enableVendorExts = false; bool syncTimingActive = false; + qreal triangulationScale = 1.0; }; -#if QT_CONFIG(opengl) - -class QQuickShapeGradientCache : public QOpenGLSharedResource -{ -public: - struct Key { - Key(const QGradientStops &stops, QQuickShapeGradient::SpreadMode spread) - : stops(stops), spread(spread) - { } - QGradientStops stops; - QQuickShapeGradient::SpreadMode spread; - bool operator==(const Key &other) const - { - return spread == other.spread && stops == other.stops; - } - }; - - QQuickShapeGradientCache(QOpenGLContext *context) : QOpenGLSharedResource(context->shareGroup()) { } - ~QQuickShapeGradientCache(); - - void invalidateResource() override; - void freeResource(QOpenGLContext *) override; - - QSGTexture *get(const Key &grad); - - static QQuickShapeGradientCache *currentCache(); - -private: - QHash<Key, QSGPlainTexture *> m_cache; -}; - -inline uint qHash(const QQuickShapeGradientCache::Key &v, uint seed = 0) -{ - uint h = seed + v.spread; - for (int i = 0; i < 3 && i < v.stops.count(); ++i) - h += v.stops[i].second.rgba(); - return h; -} - -#endif // QT_CONFIG(opengl) - QT_END_NAMESPACE #endif |