1/*
2 * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20#ifndef PainterOpenVG_h
21#define PainterOpenVG_h
22
23#include "Color.h"
24#include "GraphicsContext.h"
25
26#include <openvg.h>
27
28#include <wtf/Noncopyable.h>
29#include <wtf/Vector.h>
30
31namespace WebCore {
32
33class AffineTransform;
34class FloatPoint;
35class FloatRect;
36class IntRect;
37class IntSize;
38class Path;
39class SurfaceOpenVG;
40class TiledImageOpenVG;
41
42struct PlatformPainterState;
43
44class PainterOpenVG {
45    WTF_MAKE_NONCOPYABLE(PainterOpenVG);
46public:
47    friend class SurfaceOpenVG;
48    friend struct PlatformPainterState;
49
50    enum SaveMode {
51        CreateNewState,
52        KeepCurrentState,
53        CreateNewStateWithPaintStateOnly // internal usage only, do not use outside PainterOpenVG
54    };
55    enum ClipOperation {
56        IntersectClip = VG_INTERSECT_MASK,
57        SubtractClip = VG_SUBTRACT_MASK
58    };
59
60    PainterOpenVG();
61    PainterOpenVG(SurfaceOpenVG*);
62    ~PainterOpenVG();
63
64    void begin(SurfaceOpenVG*);
65    void end();
66
67    AffineTransform transformation() const;
68    void setTransformation(const AffineTransform&);
69    void concatTransformation(const AffineTransform&);
70
71    static void transformPath(VGPath dst, VGPath src, const AffineTransform&);
72
73    CompositeOperator compositeOperation() const;
74    void setCompositeOperation(CompositeOperator);
75    float opacity() const;
76    void setOpacity(float);
77
78    float strokeThickness() const;
79    void setStrokeThickness(float);
80    StrokeStyle strokeStyle() const;
81    void setStrokeStyle(StrokeStyle);
82
83    void setLineDash(const DashArray&, float dashOffset);
84    void setLineCap(LineCap);
85    void setLineJoin(LineJoin);
86    void setMiterLimit(float);
87
88    Color strokeColor() const;
89    void setStrokeColor(const Color&);
90
91    Color fillColor() const;
92    void setFillColor(const Color&);
93
94    int textDrawingMode() const;
95    void setTextDrawingMode(int mode);
96
97    bool antialiasingEnabled() const;
98    void setAntialiasingEnabled(bool);
99
100    void drawRect(const FloatRect&, VGbitfield paintModes = (VG_STROKE_PATH | VG_FILL_PATH));
101    void drawRoundedRect(const FloatRect&, const IntSize& topLeft, const IntSize& topRight, const IntSize& bottomLeft, const IntSize& bottomRight, VGbitfield paintModes = (VG_STROKE_PATH | VG_FILL_PATH));
102    void drawLine(const IntPoint& from, const IntPoint& to);
103    void drawArc(const IntRect& ellipseBounds, int startAngle, int angleSpan, VGbitfield paintModes = (VG_STROKE_PATH | VG_FILL_PATH));
104    void drawEllipse(const IntRect& bounds, VGbitfield paintModes = (VG_STROKE_PATH | VG_FILL_PATH));
105    void drawPolygon(size_t numPoints, const FloatPoint* points, VGbitfield paintModes = (VG_STROKE_PATH | VG_FILL_PATH));
106    void drawImage(TiledImageOpenVG*, const FloatRect& dst, const FloatRect& src);
107#ifdef OPENVG_VERSION_1_1
108    void drawText(VGFont, Vector<VGuint>& characters, VGfloat* adjustmentsX, VGfloat* adjustmentsY, const FloatPoint&);
109#endif
110
111    void scale(const FloatSize& scaleFactors);
112    void rotate(float radians);
113    void translate(float dx, float dy);
114
115    void drawPath(const Path&, VGbitfield paintModes = (VG_STROKE_PATH | VG_FILL_PATH), WindRule fillRule = RULE_NONZERO);
116
117    void intersectClipRect(const FloatRect&);
118    void clipPath(const Path&, PainterOpenVG::ClipOperation, WindRule clipRule = RULE_NONZERO);
119
120    TiledImageOpenVG* asNewNativeImage(const IntRect& src, VGImageFormat);
121
122    void save(PainterOpenVG::SaveMode saveMode = CreateNewState);
123    void restore();
124
125    SurfaceOpenVG* surface() { return m_surface; }
126    void blitToSurface();
127
128private:
129    void destroyPainterStates();
130    void applyState();
131
132    void intersectScissorRect(const FloatRect&);
133
134private:
135    Vector<PlatformPainterState*> m_stateStack;
136    PlatformPainterState* m_state;
137    SurfaceOpenVG* m_surface;
138};
139
140}
141
142#endif
143