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