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