• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2006, The Android Open Source Project
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *  * Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  *  * Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef platform_graphics_context_h
27 #define platform_graphics_context_h
28 
29 #include "IntRect.h"
30 #include "GraphicsContext.h"
31 #include "RenderSkinAndroid.h"
32 #include "SkCanvas.h"
33 #include "SkPicture.h"
34 #include "SkTDArray.h"
35 #include <wtf/Vector.h>
36 
37 class SkCanvas;
38 
39 namespace WebCore {
40 
41 class PlatformGraphicsContext {
42 public:
43     PlatformGraphicsContext();
44     virtual ~PlatformGraphicsContext();
45     virtual bool isPaintingDisabled() = 0;
46     virtual SkCanvas* getCanvas() = 0;
47 
setGraphicsContext(GraphicsContext * gc)48     void setGraphicsContext(GraphicsContext* gc) { m_gc = gc; }
deleteUs()49     virtual bool deleteUs() const { return false; }
50 
51     typedef enum { PaintingContext, RecordingContext } ContextType;
52     virtual ContextType type() = 0;
53 
54     // State management
55     virtual void beginTransparencyLayer(float opacity) = 0;
56     virtual void endTransparencyLayer() = 0;
57     virtual void save();
58     virtual void restore();
59 
60     // State values
61     virtual void setAlpha(float alpha);
62     int getNormalizedAlpha() const;
63     virtual void setCompositeOperation(CompositeOperator op);
64     virtual void setFillColor(const Color& c);
65     virtual void setFillShader(SkShader* fillShader);
66     virtual void setLineCap(LineCap cap);
67     virtual void setLineDash(const DashArray& dashes, float dashOffset);
68     virtual void setLineJoin(LineJoin join);
69     virtual void setMiterLimit(float limit);
70     virtual void setShadow(int radius, int dx, int dy, SkColor c);
71     virtual void setShouldAntialias(bool useAA);
72     virtual void setStrokeColor(const Color& c);
73     virtual void setStrokeShader(SkShader* strokeShader);
74     virtual void setStrokeStyle(StrokeStyle style);
75     virtual void setStrokeThickness(float f);
76 
77     // FIXME: These setupPaint* should be private, but
78     //        they are used by FontAndroid currently
79     virtual void setupPaintFill(SkPaint* paint) const;
80     virtual bool setupPaintShadow(SkPaint* paint, SkPoint* offset) const;
81     // Sets up the paint for stroking. Returns true if the style is really
82     // just a dash of squares (the size of the paint's stroke-width.
83     virtual bool setupPaintStroke(SkPaint* paint, SkRect* rect, bool isHLine = false);
84 
85     // Matrix operations
86     virtual void concatCTM(const AffineTransform& affine) = 0;
87     virtual void rotate(float angleInRadians) = 0;
88     virtual void scale(const FloatSize& size) = 0;
89     virtual void translate(float x, float y) = 0;
90     virtual const SkMatrix& getTotalMatrix() = 0;
91 
92     // Clipping
93     virtual void addInnerRoundedRectClip(const IntRect& rect, int thickness) = 0;
94     virtual void canvasClip(const Path& path) = 0;
95     virtual void clip(const FloatRect& rect) = 0;
96     virtual void clip(const Path& path) = 0;
97     virtual void clipConvexPolygon(size_t numPoints, const FloatPoint*, bool antialias) = 0;
98     virtual void clipOut(const IntRect& r) = 0;
99     virtual void clipOut(const Path& p) = 0;
100     virtual void clipPath(const Path& pathToClip, WindRule clipRule) = 0;
101 
102     // Drawing
103     virtual void clearRect(const FloatRect& rect) = 0;
104     virtual void drawBitmapPattern(const SkBitmap& bitmap, const SkMatrix& matrix,
105                            CompositeOperator compositeOp, const FloatRect& destRect) = 0;
106     virtual void drawBitmapRect(const SkBitmap& bitmap, const SkIRect* src,
107                         const SkRect& dst, CompositeOperator op) = 0;
108     virtual void drawConvexPolygon(size_t numPoints, const FloatPoint* points,
109                            bool shouldAntialias) = 0;
110     virtual void drawEllipse(const IntRect& rect) = 0;
111     virtual void drawFocusRing(const Vector<IntRect>& rects, int /* width */,
112                        int /* offset */, const Color& color) = 0;
113     virtual void drawHighlightForText(const Font& font, const TextRun& run,
114                               const FloatPoint& point, int h,
115                               const Color& backgroundColor, ColorSpace colorSpace,
116                               int from, int to, bool isActive) = 0;
117     virtual void drawLine(const IntPoint& point1, const IntPoint& point2) = 0;
118     virtual void drawLineForText(const FloatPoint& pt, float width) = 0;
119     virtual void drawLineForTextChecking(const FloatPoint& pt, float width,
120                                  GraphicsContext::TextCheckingLineStyle) = 0;
121     virtual void drawRect(const IntRect& rect) = 0;
122     virtual void fillPath(const Path& pathToFill, WindRule fillRule) = 0;
123     virtual void fillRect(const FloatRect& rect) = 0;
fillRect(const FloatRect & rect,const Color & color,ColorSpace)124     void fillRect(const FloatRect& rect, const Color& color, ColorSpace) {
125         fillRect(rect, color);
126     }
127     virtual void fillRect(const FloatRect& rect, const Color& color) = 0;
fillRoundedRect(const IntRect & rect,const IntSize & topLeft,const IntSize & topRight,const IntSize & bottomLeft,const IntSize & bottomRight,const Color & color,ColorSpace)128     void fillRoundedRect(const IntRect& rect, const IntSize& topLeft,
129                          const IntSize& topRight, const IntSize& bottomLeft,
130                          const IntSize& bottomRight, const Color& color,
131                          ColorSpace) {
132         fillRoundedRect(rect, topLeft, topRight, bottomLeft, bottomRight, color);
133     }
134     virtual void fillRoundedRect(const IntRect& rect, const IntSize& topLeft,
135                          const IntSize& topRight, const IntSize& bottomLeft,
136                          const IntSize& bottomRight, const Color& color) = 0;
137     virtual void strokeArc(const IntRect& r, int startAngle, int angleSpan) = 0;
138     virtual void strokePath(const Path& pathToStroke) = 0;
139     virtual void strokeRect(const FloatRect& rect, float lineWidth) = 0;
140 
141     virtual SkCanvas* recordingCanvas() = 0;
142     virtual void endRecording(int type = 0) = 0;
143 
144 protected:
145 
146     struct ShadowRec {
147         SkScalar blur;
148         SkScalar dx;
149         SkScalar dy;
150         SkColor color;  // alpha>0 means valid shadow
151         ShadowRec(SkScalar b = 0,
152                   SkScalar x = 0,
153                   SkScalar y = 0,
154                   SkColor c = 0) // by default, alpha=0, so no shadow
blurShadowRec155                 : blur(b), dx(x), dy(y), color(c)
156             {};
157     };
158 
159     class State {
160     public:
161         SkPathEffect* pathEffect;
162         float miterLimit;
163         float alpha;
164         float strokeThickness;
165         SkPaint::Cap lineCap;
166         SkPaint::Join lineJoin;
167         SkXfermode::Mode mode;
168         int dashRatio; // Ratio of the length of a dash to its width
169         ShadowRec shadow;
170         SkColor fillColor;
171         SkShader* fillShader;
172         SkColor strokeColor;
173         SkShader* strokeShader;
174         bool useAA;
175         StrokeStyle strokeStyle;
176 
177         State();
178         State(const State& other);
179         ~State();
180 
181         void setShadow(int radius, int dx, int dy, SkColor c);
182         bool setupShadowPaint(SkPaint* paint, SkPoint* offset,
183                               bool shadowsIgnoreTransforms);
184         SkColor applyAlpha(SkColor c) const;
185 
186         State cloneInheritedProperties();
187     private:
188         // Not supported.
189         void operator=(const State&);
190 
191         friend class PlatformGraphicsContextRecording;
192         friend class PlatformGraphicsContextSkia;
193     };
194 
195     virtual bool shadowsIgnoreTransforms() const = 0;
196     void setupPaintCommon(SkPaint* paint) const;
197     GraphicsContext* m_gc; // Back-ptr to our parent
198 
199     struct State;
200     WTF::Vector<State> m_stateStack;
201     State* m_state;
202 };
203 
204 }
205 #endif
206