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