Make CanvasStyle a plain object instead of an RefCounted object
[WebKit-https.git] / Source / WebCore / html / canvas / CanvasRenderingContext2D.h
1 /*
2  * Copyright (C) 2006, 2007, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. 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 APPLE COMPUTER, INC. ``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 APPLE COMPUTER, INC. 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 CanvasRenderingContext2D_h
27 #define CanvasRenderingContext2D_h
28
29 #include "AffineTransform.h"
30 #include "CanvasPathMethods.h"
31 #include "CanvasRenderingContext.h"
32 #include "CanvasStyle.h"
33 #include "Color.h"
34 #include "ColorSpace.h"
35 #include "DashArray.h"
36 #include "FloatSize.h"
37 #include "Font.h"
38 #include "GraphicsTypes.h"
39 #include "ImageBuffer.h"
40 #include "Path.h"
41 #include <wtf/Vector.h>
42 #include <wtf/text/WTFString.h>
43
44 #if USE(ACCELERATED_COMPOSITING)
45 #include "PlatformLayer.h"
46 #endif
47
48 namespace WebCore {
49
50 class CanvasGradient;
51 class CanvasPattern;
52 #if ENABLE(CANVAS_PATH)
53 class DOMPath;
54 #endif
55 class FloatRect;
56 class GraphicsContext;
57 class HTMLCanvasElement;
58 class HTMLImageElement;
59 class HTMLVideoElement;
60 class ImageData;
61 class TextMetrics;
62
63 typedef int ExceptionCode;
64
65 class CanvasRenderingContext2D : public CanvasRenderingContext, public CanvasPathMethods {
66 public:
67     static PassOwnPtr<CanvasRenderingContext2D> create(HTMLCanvasElement* canvas, bool usesCSSCompatibilityParseMode, bool usesDashboardCompatibilityMode)
68     {
69         return adoptPtr(new CanvasRenderingContext2D(canvas, usesCSSCompatibilityParseMode, usesDashboardCompatibilityMode));
70     }
71     virtual ~CanvasRenderingContext2D();
72
73     const CanvasStyle& strokeStyle() const { return state().m_strokeStyle; }
74     void setStrokeStyle(CanvasStyle);
75
76     const CanvasStyle& fillStyle() const { return state().m_fillStyle; }
77     void setFillStyle(CanvasStyle);
78
79     float lineWidth() const;
80     void setLineWidth(float);
81
82     String lineCap() const;
83     void setLineCap(const String&);
84
85     String lineJoin() const;
86     void setLineJoin(const String&);
87
88     float miterLimit() const;
89     void setMiterLimit(float);
90
91     const Vector<float>& getLineDash() const;
92     void setLineDash(const Vector<float>&);
93     void setWebkitLineDash(const Vector<float>&);
94
95     float lineDashOffset() const;
96     void setLineDashOffset(float);
97     float webkitLineDashOffset() const;
98     void setWebkitLineDashOffset(float);
99
100     float shadowOffsetX() const;
101     void setShadowOffsetX(float);
102
103     float shadowOffsetY() const;
104     void setShadowOffsetY(float);
105
106     float shadowBlur() const;
107     void setShadowBlur(float);
108
109     String shadowColor() const;
110     void setShadowColor(const String&);
111
112     float globalAlpha() const;
113     void setGlobalAlpha(float);
114
115     String globalCompositeOperation() const;
116     void setGlobalCompositeOperation(const String&);
117
118     void save() { ++m_unrealizedSaveCount; }
119     void restore();
120
121     void scale(float sx, float sy);
122     void rotate(float angleInRadians);
123     void translate(float tx, float ty);
124     void transform(float m11, float m12, float m21, float m22, float dx, float dy);
125     void setTransform(float m11, float m12, float m21, float m22, float dx, float dy);
126
127     void setStrokeColor(const String& color);
128     void setStrokeColor(float grayLevel);
129     void setStrokeColor(const String& color, float alpha);
130     void setStrokeColor(float grayLevel, float alpha);
131     void setStrokeColor(float r, float g, float b, float a);
132     void setStrokeColor(float c, float m, float y, float k, float a);
133
134     void setFillColor(const String& color);
135     void setFillColor(float grayLevel);
136     void setFillColor(const String& color, float alpha);
137     void setFillColor(float grayLevel, float alpha);
138     void setFillColor(float r, float g, float b, float a);
139     void setFillColor(float c, float m, float y, float k, float a);
140
141     void beginPath();
142
143 #if ENABLE(CANVAS_PATH)
144     PassRefPtr<DOMPath> currentPath();
145     void setCurrentPath(DOMPath*);
146 #endif
147     void fill(const String& winding = "nonzero");
148     void stroke();
149     void clip(const String& winding = "nonzero");
150
151     bool isPointInPath(const float x, const float y, const String& winding = "nonzero");
152     bool isPointInStroke(const float x, const float y);
153
154     void clearRect(float x, float y, float width, float height);
155     void fillRect(float x, float y, float width, float height);
156     void strokeRect(float x, float y, float width, float height);
157     void strokeRect(float x, float y, float width, float height, float lineWidth);
158
159     void setShadow(float width, float height, float blur);
160     void setShadow(float width, float height, float blur, const String& color);
161     void setShadow(float width, float height, float blur, float grayLevel);
162     void setShadow(float width, float height, float blur, const String& color, float alpha);
163     void setShadow(float width, float height, float blur, float grayLevel, float alpha);
164     void setShadow(float width, float height, float blur, float r, float g, float b, float a);
165     void setShadow(float width, float height, float blur, float c, float m, float y, float k, float a);
166
167     void clearShadow();
168
169     void drawImage(HTMLImageElement*, float x, float y, ExceptionCode&);
170     void drawImage(HTMLImageElement*, float x, float y, float width, float height, ExceptionCode&);
171     void drawImage(HTMLImageElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
172     void drawImage(HTMLImageElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
173     void drawImage(HTMLCanvasElement*, float x, float y, ExceptionCode&);
174     void drawImage(HTMLCanvasElement*, float x, float y, float width, float height, ExceptionCode&);
175     void drawImage(HTMLCanvasElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
176     void drawImage(HTMLCanvasElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
177     void drawImage(HTMLImageElement*, const FloatRect& srcRect, const FloatRect& dstRect, const CompositeOperator&, const BlendMode&, ExceptionCode&);
178 #if ENABLE(VIDEO)
179     void drawImage(HTMLVideoElement*, float x, float y, ExceptionCode&);
180     void drawImage(HTMLVideoElement*, float x, float y, float width, float height, ExceptionCode&);
181     void drawImage(HTMLVideoElement*, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh, ExceptionCode&);
182     void drawImage(HTMLVideoElement*, const FloatRect& srcRect, const FloatRect& dstRect, ExceptionCode&);
183 #endif
184
185     void drawImageFromRect(HTMLImageElement*, float sx = 0, float sy = 0, float sw = 0, float sh = 0,
186                            float dx = 0, float dy = 0, float dw = 0, float dh = 0, const String& compositeOperation = emptyString());
187
188     void setAlpha(float);
189
190     void setCompositeOperation(const String&);
191
192     PassRefPtr<CanvasGradient> createLinearGradient(float x0, float y0, float x1, float y1, ExceptionCode&);
193     PassRefPtr<CanvasGradient> createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1, ExceptionCode&);
194     PassRefPtr<CanvasPattern> createPattern(HTMLImageElement*, const String& repetitionType, ExceptionCode&);
195     PassRefPtr<CanvasPattern> createPattern(HTMLCanvasElement*, const String& repetitionType, ExceptionCode&);
196
197     PassRefPtr<ImageData> createImageData(PassRefPtr<ImageData>, ExceptionCode&) const;
198     PassRefPtr<ImageData> createImageData(float width, float height, ExceptionCode&) const;
199     PassRefPtr<ImageData> getImageData(float sx, float sy, float sw, float sh, ExceptionCode&) const;
200     PassRefPtr<ImageData> webkitGetImageDataHD(float sx, float sy, float sw, float sh, ExceptionCode&) const;
201     void putImageData(ImageData*, float dx, float dy, ExceptionCode&);
202     void putImageData(ImageData*, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionCode&);
203     void webkitPutImageDataHD(ImageData*, float dx, float dy, ExceptionCode&);
204     void webkitPutImageDataHD(ImageData*, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionCode&);
205
206     float webkitBackingStorePixelRatio() const { return canvas()->deviceScaleFactor(); }
207
208     void reset();
209
210     String font() const;
211     void setFont(const String&);
212
213     String textAlign() const;
214     void setTextAlign(const String&);
215
216     String textBaseline() const;
217     void setTextBaseline(const String&);
218
219     void fillText(const String& text, float x, float y);
220     void fillText(const String& text, float x, float y, float maxWidth);
221     void strokeText(const String& text, float x, float y);
222     void strokeText(const String& text, float x, float y, float maxWidth);
223     PassRefPtr<TextMetrics> measureText(const String& text);
224
225     LineCap getLineCap() const { return state().m_lineCap; }
226     LineJoin getLineJoin() const { return state().m_lineJoin; }
227
228     bool webkitImageSmoothingEnabled() const;
229     void setWebkitImageSmoothingEnabled(bool);
230
231 private:
232     struct State : FontSelectorClient {
233         State();
234         virtual ~State();
235
236         State(const State&);
237         State& operator=(const State&);
238
239         virtual void fontsNeedUpdate(FontSelector*) OVERRIDE;
240
241         String m_unparsedStrokeColor;
242         String m_unparsedFillColor;
243         CanvasStyle m_strokeStyle;
244         CanvasStyle m_fillStyle;
245         float m_lineWidth;
246         LineCap m_lineCap;
247         LineJoin m_lineJoin;
248         float m_miterLimit;
249         FloatSize m_shadowOffset;
250         float m_shadowBlur;
251         RGBA32 m_shadowColor;
252         float m_globalAlpha;
253         CompositeOperator m_globalComposite;
254         BlendMode m_globalBlend;
255         AffineTransform m_transform;
256         bool m_invertibleCTM;
257         Vector<float> m_lineDash;
258         float m_lineDashOffset;
259         bool m_imageSmoothingEnabled;
260
261         // Text state.
262         TextAlign m_textAlign;
263         TextBaseline m_textBaseline;
264
265         String m_unparsedFont;
266         Font m_font;
267         bool m_realizedFont;
268     };
269
270     enum CanvasDidDrawOption {
271         CanvasDidDrawApplyNone = 0,
272         CanvasDidDrawApplyTransform = 1,
273         CanvasDidDrawApplyShadow = 1 << 1,
274         CanvasDidDrawApplyClip = 1 << 2,
275         CanvasDidDrawApplyAll = 0xffffffff
276     };
277
278     CanvasRenderingContext2D(HTMLCanvasElement*, bool usesCSSCompatibilityParseMode, bool usesDashboardCompatibilityMode);
279
280     State& modifiableState() { ASSERT(!m_unrealizedSaveCount); return m_stateStack.last(); }
281     const State& state() const { return m_stateStack.last(); }
282
283     void applyLineDash() const;
284     void setShadow(const FloatSize& offset, float blur, RGBA32 color);
285     void applyShadow();
286     bool shouldDrawShadows() const;
287
288     void didDraw(const FloatRect&, unsigned options = CanvasDidDrawApplyAll);
289     void didDrawEntireCanvas();
290
291     GraphicsContext* drawingContext() const;
292
293     void unwindStateStack();
294     void realizeSaves()
295     {
296         if (m_unrealizedSaveCount)
297             realizeSavesLoop();
298     }
299     void realizeSavesLoop();
300
301     void applyStrokePattern();
302     void applyFillPattern();
303
304     void drawTextInternal(const String& text, float x, float y, bool fill, float maxWidth = 0, bool useMaxWidth = false);
305
306     const Font& accessFont();
307
308 #if ENABLE(DASHBOARD_SUPPORT)
309     void clearPathForDashboardBackwardCompatibilityMode();
310 #endif
311
312     void clearCanvas();
313     Path transformAreaToDevice(const Path&) const;
314     Path transformAreaToDevice(const FloatRect&) const;
315     bool rectContainsCanvas(const FloatRect&) const;
316
317     template<class T> IntRect calculateCompositingBufferRect(const T&, IntSize*);
318     PassOwnPtr<ImageBuffer> createCompositingBuffer(const IntRect&);
319     void compositeBuffer(ImageBuffer*, const IntRect&, CompositeOperator);
320
321     void inflateStrokeRect(FloatRect&) const;
322
323     template<class T> void fullCanvasCompositedFill(const T&);
324     template<class T> void fullCanvasCompositedDrawImage(T*, ColorSpace, const FloatRect&, const FloatRect&, CompositeOperator);
325
326     void prepareGradientForDashboard(CanvasGradient* gradient) const;
327
328     PassRefPtr<ImageData> getImageData(ImageBuffer::CoordinateSystem, float sx, float sy, float sw, float sh, ExceptionCode&) const;
329     void putImageData(ImageData*, ImageBuffer::CoordinateSystem, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionCode&);
330
331     virtual bool is2d() const OVERRIDE { return true; }
332     virtual bool isAccelerated() const OVERRIDE;
333
334     virtual bool isTransformInvertible() const { return state().m_invertibleCTM; }
335
336 #if ENABLE(ACCELERATED_2D_CANVAS) && USE(ACCELERATED_COMPOSITING)
337     virtual PlatformLayer* platformLayer() const OVERRIDE;
338 #endif
339
340     Vector<State, 1> m_stateStack;
341     unsigned m_unrealizedSaveCount;
342     bool m_usesCSSCompatibilityParseMode;
343 #if ENABLE(DASHBOARD_SUPPORT)
344     bool m_usesDashboardCompatibilityMode;
345 #endif
346 };
347
348 } // namespace WebCore
349
350 #endif