5c126209b469a12042fa3a33f1ca645d92763271
[WebKit-https.git] / WebCore / html / CanvasRenderingContext2D.h
1 /*
2  * Copyright (C) 2006 Apple Computer, 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 HTMLCanvas2DContext_h
27 #define HTMLCanvas2DContext_h
28
29 #include "FloatRect.h"
30 #include "PlatformString.h"
31 #include <kxmlcore/Vector.h>
32
33 #if __APPLE__
34 #include <ApplicationServices/ApplicationServices.h>
35 #endif
36
37 namespace WebCore {
38
39     class HTMLCanvasElement;
40     class CanvasStyle;
41     class HTMLImageElement;
42     class CanvasGradient;
43     class CanvasPattern;
44
45     class CanvasRenderingContext2D : public Shared<CanvasRenderingContext2D> {
46     public:
47         CanvasRenderingContext2D(HTMLCanvasElement*);
48
49         HTMLCanvasElement* canvas() const { return m_canvas; }
50
51         CanvasStyle* strokeStyle() const;
52         void setStrokeStyle(PassRefPtr<CanvasStyle>);
53
54         CanvasStyle* fillStyle() const;
55         void setFillStyle(PassRefPtr<CanvasStyle>);
56
57         float lineWidth() const;
58         void setLineWidth(float);
59
60         String lineCap() const;
61         void setLineCap(const String&);
62
63         String lineJoin() const;
64         void setLineJoin(const String&);
65
66         float miterLimit() const;
67         void setMiterLimit(float);
68
69         float shadowOffsetX() const;
70         void setShadowOffsetX(float);
71
72         float shadowOffsetY() const;
73         void setShadowOffsetY(float);
74
75         float shadowBlur() const;
76         void setShadowBlur(float);
77
78         String shadowColor() const;
79         void setShadowColor(const String&);
80
81         float globalAlpha() const;
82         void setGlobalAlpha(float);
83
84         String globalCompositeOperation() const;
85         void setGlobalCompositeOperation(const String&);
86
87         void save();
88         void restore();
89
90         void scale(float sx, float sy);
91         void rotate(float angleInRadians);
92         void translate(float tx, float ty);
93
94         void setStrokeColor(const String& color);
95         void setStrokeColor(float grayLevel);
96         void setStrokeColor(const String& color, float alpha);
97         void setStrokeColor(float grayLevel, float alpha);
98         void setStrokeColor(float r, float g, float b, float a);
99         void setStrokeColor(float c, float m, float y, float k, float a);
100
101         void setFillColor(const String& color);
102         void setFillColor(float grayLevel);
103         void setFillColor(const String& color, float alpha);
104         void setFillColor(float grayLevel, float alpha);
105         void setFillColor(float r, float g, float b, float a);
106         void setFillColor(float c, float m, float y, float k, float a);
107
108         void beginPath();
109         void closePath();
110
111         void moveTo(float x, float y);
112         void lineTo(float x, float y);
113         void quadraticCurveTo(float cpx, float cpy, float x, float y);
114         void bezierCurveTo(float cp1x, float cp1y, float cp2x, float cp2y, float x, float y);
115         void arcTo(float x0, float y0, float x1, float y1, float radius);
116         void arc(float x, float y, float r, float sa, float ea, bool clockwise);
117         void rect(float x, float y, float width, float height);
118
119         void fill();
120         void stroke();
121         void clip();
122
123         void clearRect(float x, float y, float width, float height);
124         void fillRect(float x, float y, float width, float height);
125         void strokeRect(float x, float y, float width, float height);
126         void strokeRect(float x, float y, float width, float height, float lineWidth);
127
128         void setShadow(float width, float height, float blur);
129         void setShadow(float width, float height, float blur, const String& color);
130         void setShadow(float width, float height, float blur, float grayLevel);
131         void setShadow(float width, float height, float blur, const String& color, float alpha);
132         void setShadow(float width, float height, float blur, float grayLevel, float alpha);
133         void setShadow(float width, float height, float blur, float r, float g, float b, float a);
134         void setShadow(float width, float height, float blur, float c, float m, float y, float k, float a);
135
136         void clearShadow();
137
138         void drawImage(HTMLImageElement*, float x, float y);
139         void drawImage(HTMLImageElement*, float x, float y, float width, float height);
140         void drawImage(HTMLImageElement*, float sx, float sy, float sw, float sh,
141             float dx, float dy, float dw, float dh);
142         void drawImage(HTMLCanvasElement*, float x, float y);
143         void drawImage(HTMLCanvasElement*, float x, float y, float width, float height);
144         void drawImage(HTMLCanvasElement*, float sx, float sy, float sw, float sh,
145             float dx, float dy, float dw, float dh);
146
147         void drawImageFromRect(HTMLImageElement*, float sx, float sy, float sw, float sh,
148             float dx, float dy, float dw, float dh, const String& compositeOperation);
149
150         void setAlpha(float);
151
152         void setCompositeOperation(const String&);
153
154         PassRefPtr<CanvasGradient> createLinearGradient(float x0, float y0, float x1, float y1);
155         PassRefPtr<CanvasGradient> createRadialGradient(float x0, float y0, float r0, float x1, float y1, float r1);
156         PassRefPtr<CanvasPattern> createPattern(HTMLImageElement*, const String& repetitionType);
157
158         void reset();
159         void detachCanvas() { m_canvas = 0; }
160
161     private:
162         struct State {
163             State();
164
165             RefPtr<CanvasStyle> m_strokeStyle;
166             RefPtr<CanvasStyle> m_fillStyle;
167             float m_lineWidth;
168             String m_lineCap;
169             String m_lineJoin;
170             float m_miterLimit;
171             FloatSize m_shadowOffset;
172             float m_shadowBlur;
173             String m_shadowColor;
174             float m_globalAlpha;
175             String m_globalComposite;
176 #if __APPLE__
177             bool m_platformContextStrokeStyleIsPattern;
178             CGAffineTransform m_strokeStylePatternTransform;
179             bool m_platformContextFillStyleIsPattern;
180             CGAffineTransform m_fillStylePatternTransform;
181 #endif
182         };
183
184         State& state() { return m_stateStack.last(); }
185         const State& state() const { return m_stateStack.last(); }
186
187         void applyShadow();
188
189         void willDraw(const FloatRect&);
190
191 #if __APPLE__
192         void applyStrokePattern();
193         void applyFillPattern();
194
195         // FIXME: Use GraphicsContext instead.
196         CGContextRef drawingContext() const;
197 #endif
198
199         HTMLCanvasElement* m_canvas;
200         Vector<State, 1> m_stateStack;
201     };
202
203 } // namespace WebCore
204
205 #endif