aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/items/context2d/qsgcanvasitem.cpp
diff options
context:
space:
mode:
authorKent Hansen <kent.hansen@nokia.com>2011-10-14 10:51:42 +0200
committerQt by Nokia <qt-info@nokia.com>2011-10-21 11:53:26 +0200
commitbfb3c424abc7c839dc44de0e36024ede99ece736 (patch)
treeb6814d0238bead8518b23c078beb818432de6ce4 /src/declarative/items/context2d/qsgcanvasitem.cpp
parent2d119a137f1bc0c8b1113cd6c58413a1b89a4c1c (diff)
Rename Qt Quick-specific classes to QQuick*
The QSG (SceneGraph) prefix is too generic for Qt Quick(2)-specific classes. All the classes and files in the declarative/items directory have been renamed. In particular, for classes that are currently public, the renaming is as follows: QSGView --> QQuickView QSGCanvas --> QQuickCanvas QSGItem --> QQuickItem QSGPaintedItem --> QQuickPaintedItem The header files have been renamed accordingly (e.g. qsgview.h --> qquickview.h). Change-Id: Iac937fff81db20bb639486a793c3aeb5230b038c Reviewed-by: Kent Hansen <kent.hansen@nokia.com>
Diffstat (limited to 'src/declarative/items/context2d/qsgcanvasitem.cpp')
-rw-r--r--src/declarative/items/context2d/qsgcanvasitem.cpp728
1 files changed, 0 insertions, 728 deletions
diff --git a/src/declarative/items/context2d/qsgcanvasitem.cpp b/src/declarative/items/context2d/qsgcanvasitem.cpp
deleted file mode 100644
index b3b4eab30d..0000000000
--- a/src/declarative/items/context2d/qsgcanvasitem.cpp
+++ /dev/null
@@ -1,728 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtDeclarative 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$
-**
-****************************************************************************/
-
-#include <private/qsgadaptationlayer_p.h>
-#include "qsgcanvasitem_p.h"
-#include <private/qsgitem_p.h>
-#include "qsgcontext2d_p.h"
-#include "qsgcontext2dnode_p.h"
-#include "qsgcontext2dtexture_p.h"
-#include <private/qdeclarativepixmapcache_p.h>
-
-#include <qdeclarativeinfo.h>
-#include <private/qdeclarativeengine_p.h>
-#include <QtCore/QBuffer>
-
-QT_BEGIN_NAMESPACE
-
-class QSGCanvasItemPrivate : public QSGItemPrivate
-{
-public:
- QSGCanvasItemPrivate();
- ~QSGCanvasItemPrivate();
- QSGContext2D* context;
- QSGContext2DTexture* texture;
- QSizeF canvasSize;
- QSize tileSize;
- QRectF canvasWindow;
- QRectF dirtyRect;
- uint renderInThread : 1;
- uint hasCanvasSize :1;
- uint hasTileSize :1;
- uint hasCanvasWindow :1;
- uint componentCompleted :1;
- QSGCanvasItem::RenderTarget renderTarget;
- QHash<QUrl, QDeclarativePixmap*> images;
- QUrl baseUrl;
-};
-
-QSGCanvasItemPrivate::QSGCanvasItemPrivate()
- : QSGItemPrivate()
- , context(0)
- , texture(0)
- , canvasSize(1, 1)
- , tileSize(1, 1)
- , renderInThread(false)
- , hasCanvasSize(false)
- , hasTileSize(false)
- , hasCanvasWindow(false)
- , componentCompleted(false)
- , renderTarget(QSGCanvasItem::FramebufferObject)
-{
-}
-
-QSGCanvasItemPrivate::~QSGCanvasItemPrivate()
-{
- qDeleteAll(images);
-}
-
-/*!
- \qmlclass Canvas QSGCanvasItem
- \inqmlmodule QtQuick 2
- \since QtQuick 2.0
- \brief The Canvas item provides HTML5 like canvas element which enables you to
- draw within the item area by using Javascript.
- \inherits Item
- \ingroup qml-basic-visual-elements
-
- With the Canvas item, users can draw straight and curved lines, simple and
- complex shapes, graphs, and referenced graphic images. can also add texts, colors,
- shadows, gradients, and patterns, and do low level pixel operations, etc. The Canvas item
- also enables you to save or export the canvas as a image file or serialize the image data
- to data url string.
-
- To define a drawing area in the Canvas item, just set the \c width and \c height properties.
- For example, the following code creates a Canvas item which has a drawing area with a height of 100
- pixels and width of 200 pixels:
- \qml
- import QtQuick 2.0
- Canvas {
- id:mycanvas
- width:100
- height:200
- }
- \endqml
-
- Currently the Canvas item only supports the two-dimensional rendering context.
-
- \section1 Thread Rendering and Render Target
- The Canvas item supports two render targets:Canvas.Image and Canvas.FramebufferObject.
- The Canvas.Image render target is a \a QImage object which is actually a block of system
- memory. This render target support background thread rendering. So if some complex or long
- running painting need to be done, the Canvas.Image with thread rendering mode should be
- chosen to avoid blocking the UI. Otherwise the Canvas.FramebufferObject render target should
- be chosen as it could be much faster with good OpenGL hardware accelaration than rendering into
- system memory, especially when the CPU is already very busy.
-
- The default render target is Canvas.Image and the default renderInThread property is
- false.
-
- \section1 Tiled Canvas
- The Canvas item also supports tiled rendering mode by setting the proper canvasSize, tileSize
- and the canvasWindow properties.
-
- With tiled canvas, a virtually very large canvas can be provided by a relatively small canvas
- window. The actual memory consumption only relates to the canvas window size. So the canvas size
- can be chosen freely as needed. The painting code then doesn't need to worry about the coordinate
- system and complex matrix transformations at all.
-
- As a side effect, by setting a good tile size, the tiles overlapped with the canvas window could be
- cached and don't need to redraw, which can improve the performance significantly in some situations.
-
- \section1 Pixel Operations
- The Canvas item support all HTML5 2d context pixel operations. In order to get better
- pixel reading/writing performance, the Canvas.Image render target should be chosen. As
- for Canvas.FramebufferObject render target, the pixel data need to be exchanged between
- the system memory and the graphic card, which can't be benefit from the hardware acceleration
- at all. And the OpenGL rendering may synchronise with the V-Sync signal to avoid the
- {en.wikipedia.org/wiki/Screen_tearing}{screen tearing} which makes the pixel operations
- even slower with the Canvas.FrambufferObject render target.
-
- \section1 Tips for Porting Existing HTML5 Canvas applications
-
- Although the Canvas item is provided as a HTML5 like API, and
- the canvas context API is as compatible with HTML5 2d context standard
- as possible, the working HTML5 canvas applications are still need to
- be modified to run in the Canvas item:
- \list
- \o Removes and replaces all DOM API calls with QML property bindings or Canvas item methods.
- \o Removes and replaces all HTML envent handlers with the \a MouseArea item.
- \o Changes the setInterval/setTimeout function calls with the \a Timer item.
- \o Puts the actual painting code into the \a QtQuick2::Canvas::onPaint handler and triggers the
- painting by calling the Canvas's \c markDirty or \c requestPaint methods.
- \o For drawing images, loads them by calling the Canvas's loadImage method and then request to paint
- them in the onImageLoaded handler.
- \endlist
-
- \sa QtQuick2::Context2D
-*/
-
-QSGCanvasItem::QSGCanvasItem(QSGItem *parent)
- : QSGItem(*(new QSGCanvasItemPrivate), parent)
-{
- setFlag(ItemHasContents);
-}
-
-QSGCanvasItem::~QSGCanvasItem()
-{
- Q_D(QSGCanvasItem);
- delete d->context;
-}
-
-/*!
- \qmlproperty size QtQuick2::Canvas::canvasSize
- Holds the logical canvas size that the context paints on.
-
- By default, the canvas size is the same size as the current canvas item size.
- By setting the canvas size, tile size and canvas window, the Canvas
- item can act as a virtual large canvas with many seperately rendered tile rectangle
- areas. Only those tiles within the current canvas window would be painted by
- the Canvas render engine.
- \sa QtQuick2::Canvas::tileSize QtQuick2::Canvas::canvasWindow
-*/
-QSizeF QSGCanvasItem::canvasSize() const
-{
- Q_D(const QSGCanvasItem);
- return d->canvasSize;
-}
-
-void QSGCanvasItem::setCanvasSize(const QSizeF & size)
-{
- Q_D(QSGCanvasItem);
- if (d->canvasSize != size) {
- d->hasCanvasSize = true;
- d->canvasSize = size;
- emit canvasSizeChanged();
- polish();
- update();
- }
-}
-
-/*!
- \qmlproperty size QtQuick2::Canvas::tileSize
- Holds the canvas rendering tile size.
-
- When the Canvas item in tiled mode by setting the canvas size, tile size and
- the canvas window. The canvas render can improve the rendering performance
- by rendering and caching tiles instead of rendering the whole canvas everytime.
-
- Additionally, the canvas size could be infinitely large without allocating more
- memories because only those tiles within the current visible region
- are actually rendered.
-
- By default, the tile size is the same with the canvas size.
- \sa QtQuick2::Canvas::canvaasSize QtQuick2::Canvas::canvasWindow
-*/
-QSize QSGCanvasItem::tileSize() const
-{
- Q_D(const QSGCanvasItem);
- return d->tileSize;
-}
-
-void QSGCanvasItem::setTileSize(const QSize & size)
-{
- Q_D(QSGCanvasItem);
- if (d->tileSize != size) {
- d->hasTileSize = true;
- d->tileSize = size;
-
- emit tileSizeChanged();
- polish();
- update();
- }
-}
-
-/*!
- \qmlproperty rect QtQuick2::Canvas::canvasWindow
- Holds the current canvas visible window.
-
- By default, the canvas window size is the same as the Canvas item
- size with the topleft point as (0, 0).
-
- If the canvas size is different with the Canvas item size, the Canvas
- item can display different visible areas by changing the canvas window's size
- and/or position.
- \sa QtQuick2::Canvas::canvasSize QtQuick2::Canvas::tileSize
-*/
-QRectF QSGCanvasItem::canvasWindow() const
-{
- Q_D(const QSGCanvasItem);
- return d->canvasWindow;
-}
-
-void QSGCanvasItem::setCanvasWindow(const QRectF& rect)
-{
- Q_D(QSGCanvasItem);
- if (d->canvasWindow != rect) {
- d->canvasWindow = rect;
-
- d->hasCanvasWindow = true;
- emit canvasWindowChanged();
- polish();
- update();
- }
-}
-
-
-QSGContext2D* QSGCanvasItem::context() const
-{
- Q_D(const QSGCanvasItem);
- return d->context;
-}
-/*!
- \qmlproperty bool QtQuick2::Canvas::renderInThread
- Holds the current canvas rendering mode.
-
- By setting the renderInThread to true, complex and long
- running painting can be rendered in a dedicated background
- rendering thread to avoid blocking the main GUI.
-
- Note: Different renderTarget may or may not support the
- background rendering thread, if not, the renderInThread
- property will be ignored.
-
- The default value is false.
- \sa QtQuick2::Canvas::renderTarget
-*/
-bool QSGCanvasItem::renderInThread() const
-{
- Q_D(const QSGCanvasItem);
- return d->renderInThread;
-}
-/*!
- \qmlproperty bool QtQuick2::Canvas::renderTarget
- Holds the current canvas render target.
-
- \list
- \o Canvas.Image - render to an in memory image buffer, the render
- target supports background rendering.
- \o Canvas.FramebufferObject - render to an OpenGL frame buffer,
- this render target will ignore the
- renderInThread property. The actual
- rendering happens in the main QML rendering
- process, which may be in a seperate render thread
- or in the main GUI thread depends on the platforms.
- \endlist
-
- The default render target is \c Canvas.Image.
- \sa QtQuick2::Canvas::renderInThread
-*/
-QSGCanvasItem::RenderTarget QSGCanvasItem::renderTarget() const
-{
- Q_D(const QSGCanvasItem);
- return d->renderTarget;
-}
-
-void QSGCanvasItem::setRenderTarget(RenderTarget target)
-{
- Q_D(QSGCanvasItem);
- if (d->renderTarget != target) {
- d->renderTarget = target;
-
- if (d->componentCompleted)
- createTexture();
- emit renderTargetChanged();
- }
-}
-
-void QSGCanvasItem::_doPainting(const QRectF& region)
-{
- Q_D(QSGCanvasItem);
- emit paint(QDeclarativeV8Handle::fromHandle(d->context->v8value())
- , QSGContext2DTexture::tiledRect(region, d->tileSize));
- if (d->texture)
- d->texture->wake();
-}
-
-/*!
- \qmlproperty bool QtQuick2::Canvas::renderInThread
- Holds the current canvas rendering mode.
-
- When this property is true, all canvas painting commands
- are rendered in a background rendering thread, otherwise
- the rendering happens in the main GUI thread.
-
- The default renderInThread value is false.
-*/
-void QSGCanvasItem::setRenderInThread(bool renderInThread)
-{
- Q_D(QSGCanvasItem);
- if (d->renderInThread != renderInThread) {
- d->renderInThread = renderInThread;
-
- if (d->componentCompleted)
- createTexture();
-
- if (d->renderInThread)
- connect(this, SIGNAL(painted()), SLOT(update()));
- else
- disconnect(this, SIGNAL(painted()), this, SLOT(update()));
- emit renderInThreadChanged();
- polish();
- update();
- }
-}
-
-void QSGCanvasItem::geometryChanged(const QRectF &newGeometry,
- const QRectF &oldGeometry)
-{
- Q_D(QSGCanvasItem);
- QSGItem::geometryChanged(newGeometry, oldGeometry);
-
- const qreal w = newGeometry.width();
- const qreal h = newGeometry.height();
-
- if (!d->hasCanvasSize) {
- d->canvasSize = QSizeF(w, h);
- emit canvasSizeChanged();
- }
-
- if (!d->hasTileSize) {
- d->tileSize = d->canvasSize.toSize();
- emit tileSizeChanged();
- }
-
- if (!d->hasCanvasWindow) {
- d->canvasWindow = newGeometry;
- emit canvasWindowChanged();
- }
-
- polish();
- update();
-}
-
-void QSGCanvasItem::componentComplete()
-{
- Q_D(QSGCanvasItem);
- QSGItem::componentComplete();
-
- if (!d->context)
- createContext();
- createTexture();
-
- d->baseUrl = qmlEngine(this)->contextForObject(this)->baseUrl();
- requestPaint();
- updatePolish(); //force update the canvas sizes to texture for the first time
- update();
- d->componentCompleted = true;
-}
-
-void QSGCanvasItem::updatePolish()
-{
- Q_D(QSGCanvasItem);
- QSGItem::updatePolish();
- if (d->texture) {
- if (!d->renderInThread && d->dirtyRect.isValid())
- _doPainting(d->dirtyRect);
-
- d->texture->canvasChanged(d->canvasSize.toSize()
- , d->tileSize
- , d->canvasWindow.toAlignedRect()
- , d->dirtyRect.toAlignedRect()
- , d->smooth);
- d->dirtyRect = QRectF();
- }
-}
-
-QSGNode *QSGCanvasItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
-{
- Q_D(QSGCanvasItem);
- QSGContext2DNode *node = static_cast<QSGContext2DNode *>(oldNode);
- if (!node)
- node = new QSGContext2DNode(this);
-
- node->setTexture(d->texture);
- node->setSize(d->canvasWindow.size());
- node->update();
- return node;
-}
-
-void QSGCanvasItem::createTexture()
-{
- Q_D(QSGCanvasItem);
-
- if (!d->texture
- || d->texture->threadRendering() != d->renderInThread
- || d->texture->renderTarget() != d->renderTarget) {
- if (d->texture) {
- d->texture->deleteLater();
- d->texture = 0;
- }
-
- if (d->renderTarget == QSGCanvasItem::Image) {
- d->texture = new QSGContext2DImageTexture(d->renderInThread);
- } else if (d->renderTarget == QSGCanvasItem::FramebufferObject) {
- d->texture = new QSGContext2DFBOTexture();
- }
-
- if (d->renderInThread && !d->texture->supportThreadRendering()) {
- qWarning("Canvas: render target does not support thread rendering, force to non-thread rendering mode.");
- d->renderInThread = false;
- emit renderInThreadChanged();
- }
-
- if (d->renderInThread)
- connect(d->texture, SIGNAL(textureChanged()), this, SLOT(update()));
-
- d->texture->setItem(this);
- }
-}
-
-void QSGCanvasItem::createContext()
-{
- Q_D(QSGCanvasItem);
-
- delete d->context;
-
- d->context = new QSGContext2D(this);
-
- QV8Engine *e = QDeclarativeEnginePrivate::getV8Engine(qmlEngine(this));
- d->context->setV8Engine(e);
-}
-
-/*!
- \qmlmethod object QtQuick2::Canvas::getContext(string contextId)
-
- Currently, the canvas item only support the 2D context. If the \a contextId
- parameter isn't provided or is "2d", then the QtQuick2::Context2D object is
- returned, otherwise returns an invalid value.
- */
-QDeclarativeV8Handle QSGCanvasItem::getContext(const QString &contextId)
-{
- Q_D(QSGCanvasItem);
-
- if (contextId.toLower() != QLatin1String("2d"))
- return QDeclarativeV8Handle::fromHandle(v8::Undefined());
-
- if (!d->context)
- createContext();
- return QDeclarativeV8Handle::fromHandle(d->context->v8value());
-}
-
-/*!
- \qmlmethod void QtQuick2::Canvas::markDirty(rect region)
-
- Mark the given \a region as dirty, so that when this region is visible
- the canvas render will redraw it. During the rendering process, the
- canvas renderer may emit the canvas' "paint" signal so the actual painting
- scripts can be putted into the canvas's "onPaint" signal handler function.
-
- \sa QtQuick2::Canvas::paint QtQuick2::Canvas::requestPaint
- */
-void QSGCanvasItem::markDirty(const QRectF& region)
-{
- Q_D(QSGCanvasItem);
- d->dirtyRect |= region;
- if (d->componentCompleted)
- polish();
- update();
-}
-
-
-/*!
- \qmlmethod bool QtQuick2::Canvas::save(string filename)
-
- Save the current canvas content into an image file \a filename.
- The saved image format is automatically decided by the \a filename's
- suffix.
-
- Note: calling this method will force painting the whole canvas, not the
- current canvas visible window.
-
- \sa canvasWindow canvasSize toDataURL
- */
-bool QSGCanvasItem::save(const QString &filename) const
-{
- Q_D(const QSGCanvasItem);
- QUrl url = d->baseUrl.resolved(QUrl::fromLocalFile(filename));
- return toImage().save(url.toLocalFile());
-}
-
-QImage QSGCanvasItem::loadedImage(const QUrl& url)
-{
- Q_D(QSGCanvasItem);
- QUrl fullPathUrl = d->baseUrl.resolved(url);
- if (!d->images.contains(fullPathUrl)) {
- loadImage(url);
- }
- QDeclarativePixmap* pix = d->images.value(fullPathUrl);
- if (pix->isLoading() || pix->isError()) {
- return QImage();
- }
- return pix->pixmap().toImage();
-}
-
-/*!
- \qmlmethod void QtQuick2::Canvas::loadImage(url image)
- Loads the given \c image asynchronously, when the image is
- ready, an imageLoaded signal will be emitted.
- The loaded image can be unloaded by the \a QtQuick2::Canvas::unloadImage method.
-
- Note: Only loaded images can be painted on the Canvas item.
- \sa QtQuick2::Canvas::unloadImage QtQuick2::Canvas::imageLoaded QtQuick2::Canvas::isImageLoaded
- \sa QtQuick2::Context2D::createImageData QtQuick2::Context2D::drawImage
- */
-void QSGCanvasItem::loadImage(const QUrl& url)
-{
- Q_D(QSGCanvasItem);
- QUrl fullPathUrl = d->baseUrl.resolved(url);
- if (!d->images.contains(fullPathUrl)) {
- QDeclarativePixmap* pix = new QDeclarativePixmap();
- d->images.insert(fullPathUrl, pix);
-
- pix->load(qmlEngine(this)
- , fullPathUrl
- , QDeclarativePixmap::Cache | QDeclarativePixmap::Asynchronous);
- pix->connectFinished(this, SIGNAL(imageLoaded()));
- }
-}
-/*!
- \qmlmethod void QtQuick2::Canvas::loadImage(url image)
- Unloads the \c image.
-
- If the image is unloaded from the Canvas item, it can't be painted by the canvas context
- until it's loaded again.
-
- \sa QtQuick2::Canvas::loadImage QtQuick2::Canvas::imageLoaded QtQuick2::Canvas::isImageLoaded
- \sa QtQuick2::Context2D::createImageData QtQuick2::Context2D::drawImage
- */
-void QSGCanvasItem::unloadImage(const QUrl& url)
-{
- Q_D(QSGCanvasItem);
- QUrl removeThis = d->baseUrl.resolved(url);
- if (d->images.contains(removeThis)) {
- delete d->images.value(removeThis);
- d->images.remove(removeThis);
- }
-}
-
-/*!
- \qmlmethod void QtQuick2::Canvas::isImageError(url image)
- Returns true if the image can't be loaded because of error happens.
-
- \sa QtQuick2::Canvas::loadImage
- */
-bool QSGCanvasItem::isImageError(const QUrl& url) const
-{
- Q_D(const QSGCanvasItem);
- QUrl fullPathUrl = d->baseUrl.resolved(url);
- return d->images.contains(fullPathUrl)
- && d->images.value(fullPathUrl)->isError();
-}
-
-/*!
- \qmlmethod void QtQuick2::Canvas::isImageLoading(url image)
- Returns true if the Canvas item still is loading the \c image.
-
- \sa QtQuick2::Canvas::loadImage
- */
-bool QSGCanvasItem::isImageLoading(const QUrl& url) const
-{
- Q_D(const QSGCanvasItem);
- QUrl fullPathUrl = d->baseUrl.resolved(url);
- return d->images.contains(fullPathUrl)
- && d->images.value(fullPathUrl)->isLoading();
-}
-/*!
- \qmlmethod void QtQuick2::Canvas::isImageLoaded(url image)
- Returns true if the \c image is sucessfully loaded and ready to use.
-
- \sa QtQuick2::Canvas::loadImage
- */
-bool QSGCanvasItem::isImageLoaded(const QUrl& url) const
-{
- Q_D(const QSGCanvasItem);
- QUrl fullPathUrl = d->baseUrl.resolved(url);
- return d->images.contains(fullPathUrl)
- && d->images.value(fullPathUrl)->isReady();
-}
-
-QImage QSGCanvasItem::toImage(const QRectF& region) const
-{
- Q_D(const QSGCanvasItem);
- if (d->texture) {
- if (region.isEmpty())
- return d->texture->toImage(canvasWindow());
- else
- return d->texture->toImage(region);
- }
- return QImage();
-}
-
-/*!
- \qmlmethod string QtQuick2::Canvas::toDataURL(string mimeType)
-
- Returns a data: URL for the image in the canvas.
-
- The default \a mimeType is "image/png".
-
- \sa QtQuick2::Canvas::save
- */
-QString QSGCanvasItem::toDataURL(const QString& mimeType) const
-{
- QImage image = toImage();
-
- if (!image.isNull()) {
- QByteArray ba;
- QBuffer buffer(&ba);
- buffer.open(QIODevice::WriteOnly);
- QString mime = mimeType.toLower();
- QString type;
- if (mime == QLatin1Literal("image/png")) {
- type = QLatin1Literal("PNG");
- } else if (mime == QLatin1Literal("image/bmp"))
- type = QLatin1Literal("BMP");
- else if (mime == QLatin1Literal("image/jpeg"))
- type = QLatin1Literal("JPEG");
- else if (mime == QLatin1Literal("image/x-portable-pixmap"))
- type = QLatin1Literal("PPM");
- else if (mime == QLatin1Literal("image/tiff"))
- type = QLatin1Literal("TIFF");
- else if (mime == QLatin1Literal("image/xpm"))
- type = QLatin1Literal("XPM");
- else
- return QLatin1Literal("data:,");
-
- image.save(&buffer, type.toAscii());
- buffer.close();
- QString dataUrl = QLatin1Literal("data:%1;base64,%2");
- return dataUrl.arg(mime).arg(QLatin1String(ba.toBase64().constData()));
- }
- return QLatin1Literal("data:,");
-}
-
-/*!
- \qmlsignal QtQuick2::Canvas::onPaint(QtQuick2::Context2D context, rect region)
-
- This handler is called before the given \c region needs to be rendered.
-
- This signal can be triggered by QtQuick2::Canvas::markdirty, QtQuick2::Canvas::requestPaint
- or by changing the current canvas window.
-*/
-
-/*!
- \qmlsignal QtQuick2::Canvas::onPainted()
-
- This handler is called after all context painting commands are executed and
- the Canvas is actually rendered.
-*/
-
-QT_END_NAMESPACE