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