An error occurred while loading the file. Please try again.
-
Charles Yin authored
1. Use QQuickContext2DRenderThread for Threaded rendering 2. Make FBO target works with all render strategies 3. Remove some unnessary locks, call texture methods by invoking meta calls 4. Run existing tests with all render targets and strategies (except Cooperative) Change-Id: I0db5c91d848b86bcc1536c30d7a5804b66a817f1 Reviewed-by:
Yunqiao Yin <charles.yin@nokia.com>
4236e7f7
qquickcanvasitem_p.h 6.48 KiB
/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the QtQml module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** 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.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QQUICKCANVASITEM_P_H
#define QQUICKCANVASITEM_P_H
#include <QtQuick/qquickitem.h>
#include <private/qv8engine_p.h>
#include <QtCore/QThread>
#include <QtGui/QImage>
QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE
class QQuickCanvasContext;
class QQuickCanvasItemPrivate;
class QSGTexture;
class QQuickPixmap;
class QQuickCanvasPixmap : public QQmlRefCount
{
public:
QQuickCanvasPixmap(const QImage& image, QQuickWindow *window);
QQuickCanvasPixmap(QQuickPixmap *pixmap, QQuickWindow *window);
~QQuickCanvasPixmap();
QSGTexture *texture();
QImage image();
qreal width() const;
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
qreal height() const;
bool isValid() const;
QQuickPixmap *pixmap() const { return m_pixmap;}
private:
QQuickPixmap *m_pixmap;
QImage m_image;
QSGTexture *m_texture;
QQuickWindow *m_window;
};
class QQuickCanvasItem : public QQuickItem
{
Q_OBJECT
Q_ENUMS(RenderTarget)
Q_ENUMS(RenderStrategy)
Q_PROPERTY(bool available READ isAvailable NOTIFY availableChanged)
Q_PROPERTY(QString contextType READ contextType WRITE setContextType NOTIFY contextTypeChanged)
Q_PROPERTY(QQmlV8Handle context READ context NOTIFY contextChanged)
Q_PROPERTY(QSizeF canvasSize READ canvasSize WRITE setCanvasSize NOTIFY canvasSizeChanged)
Q_PROPERTY(QSize tileSize READ tileSize WRITE setTileSize NOTIFY tileSizeChanged)
Q_PROPERTY(QRectF canvasWindow READ canvasWindow WRITE setCanvasWindow NOTIFY canvasWindowChanged)
Q_PROPERTY(RenderTarget renderTarget READ renderTarget WRITE setRenderTarget NOTIFY renderTargetChanged)
Q_PROPERTY(RenderStrategy renderStrategy READ renderStrategy WRITE setRenderStrategy NOTIFY renderStrategyChanged)
public:
enum RenderTarget {
Image,
FramebufferObject
};
enum RenderStrategy {
Immediate,
Threaded,
Cooperative
};
QQuickCanvasItem(QQuickItem *parent = 0);
~QQuickCanvasItem();
bool isAvailable() const;
QString contextType() const;
void setContextType(const QString &contextType);
QQmlV8Handle context() const;
QSizeF canvasSize() const;
void setCanvasSize(const QSizeF &);
QSize tileSize() const;
void setTileSize(const QSize &);
QRectF canvasWindow() const;
void setCanvasWindow(const QRectF& rect);
RenderTarget renderTarget() const;
void setRenderTarget(RenderTarget target);
RenderStrategy renderStrategy() const;
void setRenderStrategy(RenderStrategy strategy);
QQuickCanvasContext *rawContext() const;
QImage toImage(const QRectF& rect = QRectF()) const;
Q_INVOKABLE void getContext(QQmlV8Function *args);
Q_INVOKABLE void requestAnimationFrame(QQmlV8Function *args);
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
Q_INVOKABLE void cancelRequestAnimationFrame(QQmlV8Function *args);
Q_INVOKABLE void requestPaint();
Q_INVOKABLE void markDirty(const QRectF& dirtyRect = QRectF());
Q_INVOKABLE bool save(const QString &filename) const;
Q_INVOKABLE QString toDataURL(const QString& type = QLatin1String("image/png")) const;
QQmlRefPointer<QQuickCanvasPixmap> loadedPixmap(const QUrl& url);
Q_SIGNALS:
void paint(const QRect ®ion);
void painted();
void availableChanged();
void contextTypeChanged();
void contextChanged();
void canvasSizeChanged();
void tileSizeChanged();
void canvasWindowChanged();
void renderTargetChanged();
void renderStrategyChanged();
void imageLoaded();
public Q_SLOTS:
void loadImage(const QUrl& url);
void unloadImage(const QUrl& url);
bool isImageLoaded(const QUrl& url) const;
bool isImageLoading(const QUrl& url) const;
bool isImageError(const QUrl& url) const;
private Q_SLOTS:
void sceneGraphInitialized();
void checkAnimationCallbacks();
protected:
void componentComplete();
void itemChange(QQuickItem::ItemChange, const QQuickItem::ItemChangeData &);
void updatePolish();
QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
void releaseResources();
private:
Q_DECLARE_PRIVATE(QQuickCanvasItem)
Q_INVOKABLE void delayedCreate();
bool createContext(const QString &contextType);
void initializeContext(QQuickCanvasContext *context, const QVariantMap &args = QVariantMap());
QRect tiledRect(const QRectF &window, const QSize &tileSize);
bool isPaintConnected();
};
class QQuickContext2DRenderThread : public QThread
{
Q_OBJECT
public:
QQuickContext2DRenderThread(QQmlEngine *eng);
~QQuickContext2DRenderThread();
static QQuickContext2DRenderThread *instance(QQmlEngine *engine);
private:
QQmlEngine *m_engine;
QObject *m_eventLoopQuitHack;
static QHash<QQmlEngine *,QQuickContext2DRenderThread*> renderThreads;
static QMutex renderThreadsMutex;
};
QT_END_NAMESPACE
QML_DECLARE_TYPE(QQuickCanvasItem)
QT_END_HEADER
211212213
#endif //QQUICKCANVASITEM_P_H