diff options
Diffstat (limited to 'src/declarative/items/qsgcontext2d_p.h')
-rw-r--r-- | src/declarative/items/qsgcontext2d_p.h | 409 |
1 files changed, 409 insertions, 0 deletions
diff --git a/src/declarative/items/qsgcontext2d_p.h b/src/declarative/items/qsgcontext2d_p.h new file mode 100644 index 0000000000..1a900100de --- /dev/null +++ b/src/declarative/items/qsgcontext2d_p.h @@ -0,0 +1,409 @@ +/**************************************************************************** +** +** 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$ +** 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$ +** +****************************************************************************/ + +#ifndef QSGCONTEXT2D_P_H +#define QSGCONTEXT2D_P_H + +#include <QtDeclarative/qdeclarative.h> +#include <QtDeclarative/qdeclarativecomponent.h> + +#include "qsgtexturematerial.h" + +#include <QtGui/qpainter.h> +#include <QtGui/qpainterpath.h> +#include <QtGui/qpixmap.h> +#include <QtCore/qstring.h> +#include <QtCore/qstack.h> +#include <QtCore/qmetatype.h> +#include <QtCore/qcoreevent.h> +#include <QtCore/qvariant.h> +#include <QtScript/qscriptvalue.h> +#include <QMutex> +#include <QWaitCondition> +#include "qsgimage_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +QT_MODULE(Declarative) + +QColor colorFromString(const QString &name); + +class QSGCanvasGradient : public QObject +{ + Q_OBJECT +public: + QSGCanvasGradient(const QGradient &gradient) : m_gradient(gradient) {} + +public slots: + QGradient value() { return m_gradient; } + void addColorStop(float pos, const QString &color) { m_gradient.setColorAt(pos, colorFromString(color));} + +public: + QGradient m_gradient; +}; + +Q_DECLARE_METATYPE(QSGCanvasGradient*) + + +//class QSGCanvasImage: public QObject +//{ +// Q_OBJECT +// Q_PROPERTY(QString src READ src WRITE setSrc NOTIFY sourceChanged) +//public: +// QSGCanvasImage() {} +// QSGCanvasImage(const QString &url) : m_image(url), m_src(url) { +// } +// QSGCanvasImage(const QImage &img) {m_image = img;} + +//public slots: +// QImage &value() { return m_image; } +// const QImage &value() const{ return m_image; } +// QString src() { return m_src; } +// void setSrc(const QString &src) { m_src = src; m_image.load(src); emit sourceChanged();} +//signals: +// void sourceChanged(); + +//private: +// QSGImage* img; +// QString src; +//}; + +//Q_DECLARE_METATYPE(QSGCanvasImage*) + + +/* + + */ + +class QSGContext2DWorkerAgent; +class QSGContext2DPrivate; +class QSGContext2D : public QObject +{ + Q_OBJECT + // compositing + Q_PROPERTY(qreal globalAlpha READ globalAlpha WRITE setGlobalAlpha) + Q_PROPERTY(QString globalCompositeOperation READ globalCompositeOperation WRITE setGlobalCompositeOperation) + Q_PROPERTY(QVariant strokeStyle READ strokeStyle WRITE setStrokeStyle) + Q_PROPERTY(QVariant fillStyle READ fillStyle WRITE setFillStyle) + Q_PROPERTY(QColor strokeColor READ strokeColor WRITE setStrokeColor) + Q_PROPERTY(QColor fillColor READ fillColor WRITE setFillColor) + // line caps/joins + Q_PROPERTY(qreal lineWidth READ lineWidth WRITE setLineWidth) + Q_PROPERTY(QString lineCap READ lineCap WRITE setLineCap) + Q_PROPERTY(QString lineJoin READ lineJoin WRITE setLineJoin) + Q_PROPERTY(qreal miterLimit READ miterLimit WRITE setMiterLimit) + // shadows + Q_PROPERTY(qreal shadowOffsetX READ shadowOffsetX WRITE setShadowOffsetX) + Q_PROPERTY(qreal shadowOffsetY READ shadowOffsetY WRITE setShadowOffsetY) + Q_PROPERTY(qreal shadowBlur READ shadowBlur WRITE setShadowBlur) + Q_PROPERTY(QString shadowColor READ shadowColor WRITE setShadowColor) + // fonts + Q_PROPERTY(QString font READ font WRITE setFont) + Q_PROPERTY(QString textBaseline READ textBaseline WRITE setTextBaseline) + Q_PROPERTY(QString textAlign READ textAlign WRITE setTextAlign) + Q_ENUMS(PaintCommand) +public: + enum TextBaseLineType { Alphabetic=0, Top, Middle, Bottom, Hanging}; + enum TextAlignType { Start=0, End, Left, Right, Center}; + enum PaintCommand { + Invalid = 0, + Save, + Restore, + //matrix operations + UpdateMatrix, + Scale, + Rotate, + Translate, + Transform, + SetTransform, + + ClearRect, + FillRect, + + //path operations + UpdatePath, + BeginPath, + ClosePath, + MoveTo, + LineTo, + QuadraticCurveTo, + BezierCurveTo, + ArcTo, + Rect, + Arc, + Fill, + Stroke, + Clip, + StrokeRect, + + //brushes and pens + UpdateBrush, + UpdatePen, + GlobalAlpha, + GlobalCompositeOperation, + StrokeStyle, + FillStyle, + StrokeColor, + FillColor, + LineWidth, + LineCap, + LineJoin, + MiterLimit, + + //shadows + UpdateShadow, + ShadowOffsetX, + ShadowOffsetY, + ShadowBlur, + ShadowColor, + + //font&text + Font, + TextBaseline, + TextAlign, + FillText, + StrokeText, + + //image + DrawImage1, + DrawImage2, + DrawImage3, + GetImageData, + PutImageData + }; + + QSGContext2D(QObject *parent = 0); + QSGContext2D(QSGContext2D *ctx2d, QSGContext2DWorkerAgent* agentData); + ~QSGContext2D(); + void setSize(int width, int height); + void setSize(const QSize &size); + QSize size() const; + + void clear(); + void reset(); + QPaintDevice* paintDevice(); + const QImage& toImage() const; + bool requireCachedImage() const; + void setCachedImage(const QImage& image); + // compositing + qreal globalAlpha() const; // (default 1.0) + QString globalCompositeOperation() const; // (default over) + QVariant strokeStyle() const; // (default black) + QVariant fillStyle() const; // (default black) + QColor strokeColor() const; // (default black) + QColor fillColor() const; // (default black) + + void setGlobalAlpha(qreal alpha); + void setGlobalCompositeOperation(const QString &op); + void setStrokeStyle(const QVariant &style); + void setFillStyle(const QVariant &style); + void setStrokeColor(const QColor& color); + void setFillColor(const QColor& color); + + // line caps/joins + qreal lineWidth() const; // (default 1) + QString lineCap() const; // "butt", "round", "square" (default "butt") + QString lineJoin() const; // "round", "bevel", "miter" (default "miter") + qreal miterLimit() const; // (default 10) + + void setLineWidth(qreal w); + void setLineCap(const QString &s); + void setLineJoin(const QString &s); + void setMiterLimit(qreal m); + + void setFont(const QString &font); + QString font() const; + void setTextBaseline(const QString &font); + QString textBaseline() const; + void setTextAlign(const QString &font); + QString textAlign() const; + + + // shadows + qreal shadowOffsetX() const; // (default 0) + qreal shadowOffsetY() const; // (default 0) + qreal shadowBlur() const; // (default 0) + QString shadowColor() const; // (default black) + + void setShadowOffsetX(qreal x); + void setShadowOffsetY(qreal y); + void setShadowBlur(qreal b); + void setShadowColor(const QString &str); + +public slots: + void save(); // push state on state stack + void restore(); // pop state stack and restore state + + // QTextMetrics measureText(const QString& text); + + void fillText(const QString &text, qreal x, qreal y); + void strokeText(const QString &text, qreal x, qreal y); + + void scale(qreal x, qreal y); + void rotate(qreal angle); + void translate(qreal x, qreal y); + void transform(qreal m11, qreal m12, qreal m21, qreal m22, + qreal dx, qreal dy); + void setTransform(qreal m11, qreal m12, qreal m21, qreal m22, + qreal dx, qreal dy); + + QSGCanvasGradient *createLinearGradient(qreal x0, qreal y0, + qreal x1, qreal y1); + QSGCanvasGradient *createRadialGradient(qreal x0, qreal y0, + qreal r0, qreal x1, + qreal y1, qreal r1); + + // rects + void clearRect(qreal x, qreal y, qreal w, qreal h); + void fillRect(qreal x, qreal y, qreal w, qreal h); + void strokeRect(qreal x, qreal y, qreal w, qreal h); + + // path API + void beginPath(); + void closePath(); + void moveTo(qreal x, qreal y); + void lineTo(qreal x, qreal y); + void quadraticCurveTo(qreal cpx, qreal cpy, qreal x, qreal y); + void bezierCurveTo(qreal cp1x, qreal cp1y, + qreal cp2x, qreal cp2y, qreal x, qreal y); + void arcTo(qreal x1, qreal y1, qreal x2, qreal y2, qreal radius); + void rect(qreal x, qreal y, qreal w, qreal h); + void arc(qreal x, qreal y, qreal radius, + qreal startAngle, qreal endAngle, + bool anticlockwise); + void fill(); + void stroke(); + void clip(); + bool isPointInPath(qreal x, qreal y) const; + + + QSGImage *createImage(const QString &url); + + void drawImage(const QString& imgUrl, qreal dx, qreal dy); + void drawImage(const QString& imgUrl, qreal dx, qreal dy, qreal dw, qreal dh); + void drawImage(const QString& imgUrl, qreal sx, qreal sy, qreal sw, qreal sh, qreal dx, qreal dy, qreal dw, qreal dh); + + // pixel manipulation + QList<int> getImageData(qreal sx, qreal sy, qreal sw, qreal sh); + void putImageData(const QVariant& imageData, qreal x, qreal y, qreal w, qreal h); + + void paint(QPainter* painter); + void sync(); + void processCommands(const QScriptValue& commands); +signals: + void changed(); + void painted(); +public: + bool isDirty() const; + QScriptValue scriptValue() const; + void setScriptEngine(QScriptEngine *eng); + QScriptEngine *scriptEngine() const; + + void addref(); + void release(); + + struct VariantRef + { + VariantRef() : a(0) {} + VariantRef(const VariantRef &r) : a(r.a) { if (a) a->addref(); } + VariantRef(QSGContext2D *_a) : a(_a) { if (a) a->addref(); } + ~VariantRef() { if (a) a->release(); } + + VariantRef &operator=(const VariantRef &o) { + if (o.a) o.a->addref(); + if (a) a->release(); a = o.a; + return *this; + } + + QSGContext2D *a; + }; + struct Sync : public QEvent { + Sync() : QEvent(QEvent::User) {} + QSGContext2DWorkerAgent *data; + }; + inline bool inWorkerThread() const; + QSGContext2D *agent(); + const QString& agentScript() const; + + + struct State { + QMatrix matrix; + QPainterPath clipPath; + QBrush strokeStyle; + QBrush fillStyle; + qreal globalAlpha; + qreal lineWidth; + Qt::PenCapStyle lineCap; + Qt::PenJoinStyle lineJoin; + qreal miterLimit; + qreal shadowOffsetX; + qreal shadowOffsetY; + qreal shadowBlur; + QColor shadowColor; + QPainter::CompositionMode globalCompositeOperation; + QFont font; + QSGContext2D::TextAlignType textAlign; + QSGContext2D::TextBaseLineType textBaseline; + QPen pen; + }; + + QMatrix worldMatrix() const; + +protected: + virtual bool event(QEvent *); + +private: + void processCommand(const QScriptValue& command); + + Q_DECLARE_PRIVATE(QSGContext2D) +}; + + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QSGContext2D::VariantRef) +QML_DECLARE_TYPE(QSGContext2D) + +QT_END_HEADER + +#endif // QSGCONTEXT2D_P_H |