/*
 * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

enum CanvasWindingRule { "nonzero", "evenodd" };

interface CanvasRenderingContext2D : CanvasRenderingContext {

    void save();
    void restore();

    void scale([Default=Undefined] optional float sx,
               [Default=Undefined] optional float sy);
    void rotate([Default=Undefined] optional float angle);
    void translate([Default=Undefined] optional float tx,
                   [Default=Undefined] optional float ty);
    void transform([Default=Undefined] optional float m11,
                   [Default=Undefined] optional float m12,
                   [Default=Undefined] optional float m21,
                   [Default=Undefined] optional float m22,
                   [Default=Undefined] optional float dx,
                   [Default=Undefined] optional float dy);
    void setTransform([Default=Undefined] optional float m11,
                      [Default=Undefined] optional float m12,
                      [Default=Undefined] optional float m21,
                      [Default=Undefined] optional float m22,
                      [Default=Undefined] optional float dx,
                      [Default=Undefined] optional float dy);

    attribute float globalAlpha;
    [TreatNullAs=NullString] attribute DOMString globalCompositeOperation;

    [RaisesException] CanvasGradient createLinearGradient([Default=Undefined] optional float x0,
                                        [Default=Undefined] optional float y0,
                                        [Default=Undefined] optional float x1,
                                        [Default=Undefined] optional float y1);
    [RaisesException] CanvasGradient createRadialGradient([Default=Undefined] optional float x0,
                                        [Default=Undefined] optional float y0,
                                        [Default=Undefined] optional float r0,
                                        [Default=Undefined] optional float x1,
                                        [Default=Undefined] optional float y1,
                                        [Default=Undefined] optional float r1);

    attribute float lineWidth;
    [TreatNullAs=NullString] attribute DOMString lineCap;
    [TreatNullAs=NullString] attribute DOMString lineJoin;
    attribute float miterLimit;

    attribute float shadowOffsetX;
    attribute float shadowOffsetY;
    attribute float shadowBlur;
    [TreatNullAs=NullString] attribute DOMString shadowColor;

    void setLineDash(sequence<float> dash);
    sequence<float> getLineDash();
    attribute float lineDashOffset;

    // FIXME: These attributes should be implemented.
    // [Custom] attribute Array webkitLineDash;
    // attribute float webkitLineDashOffset;

    void clearRect([Default=Undefined] optional float x,
                   [Default=Undefined] optional float y,
                   [Default=Undefined] optional float width,
                   [Default=Undefined] optional float height);
    void fillRect([Default=Undefined] optional float x,
                  [Default=Undefined] optional float y,
                  [Default=Undefined] optional float width,
                  [Default=Undefined] optional float height);

    void beginPath();

    attribute DOMPath currentPath;

    // FIXME: These methods should be shared with CanvasRenderingContext2D in the CanvasPathMethods interface.
    void closePath();
    void moveTo([Default=Undefined] optional float x,
                [Default=Undefined] optional float y);
    void lineTo([Default=Undefined] optional float x,
                [Default=Undefined] optional float y);
    void quadraticCurveTo([Default=Undefined] optional float cpx,
                          [Default=Undefined] optional float cpy,
                          [Default=Undefined] optional float x,
                          [Default=Undefined] optional float y);
    void bezierCurveTo([Default=Undefined] optional float cp1x,
                       [Default=Undefined] optional float cp1y,
                       [Default=Undefined] optional float cp2x,
                       [Default=Undefined] optional float cp2y,
                       [Default=Undefined] optional float x,
                       [Default=Undefined] optional float y);
    [RaisesException] void arcTo([Default=Undefined] optional float x1,
               [Default=Undefined] optional float y1,
               [Default=Undefined] optional float x2,
               [Default=Undefined] optional float y2,
               [Default=Undefined] optional float radius);
    void rect([Default=Undefined] optional float x,
              [Default=Undefined] optional float y,
              [Default=Undefined] optional float width,
              [Default=Undefined] optional float height);
    [RaisesException] void arc([Default=Undefined] optional float x,
             [Default=Undefined] optional float y,
             [Default=Undefined] optional float radius,
             [Default=Undefined] optional float startAngle,
             [Default=Undefined] optional float endAngle,
             [Default=Undefined] optional boolean anticlockwise);

    void fill(optional CanvasWindingRule winding);
    void stroke();
    void clip(optional CanvasWindingRule winding);
    boolean isPointInPath([Default=Undefined] optional float x,
                          [Default=Undefined] optional float y,
                          optional CanvasWindingRule winding);
    boolean isPointInStroke([Default=Undefined] optional float x,
                            [Default=Undefined] optional float y);

    // text
    attribute DOMString font;
    attribute DOMString textAlign;
    attribute DOMString textBaseline;

    TextMetrics measureText([Default=Undefined] optional DOMString text);

    // other

    void setAlpha([Default=Undefined] optional float alpha);
    void setCompositeOperation([Default=Undefined] optional DOMString compositeOperation);

    void setLineWidth([Default=Undefined] optional float width);
    void setLineCap([Default=Undefined] optional DOMString cap);
    void setLineJoin([Default=Undefined] optional DOMString join);
    void setMiterLimit([Default=Undefined] optional float limit);

    void clearShadow();

    void fillText(DOMString text, float x, float y, optional float maxWidth);
    void strokeText(DOMString text, float x, float y, optional float maxWidth);

    void setStrokeColor([StrictTypeChecking] DOMString color, optional float alpha);
    void setStrokeColor(float grayLevel, optional float alpha);
    void setStrokeColor(float r, float g, float b, float a);
    void setStrokeColor(float c, float m, float y, float k, float a);

    void setFillColor([StrictTypeChecking] DOMString color, optional float alpha);
    void setFillColor(float grayLevel, optional float alpha);
    void setFillColor(float r, float g, float b, float a);
    void setFillColor(float c, float m, float y, float k, float a);

    void strokeRect([Default=Undefined] optional float x,
                    [Default=Undefined] optional float y,
                    [Default=Undefined] optional float width,
                    [Default=Undefined] optional float height,
                    optional float lineWidth);

    [RaisesException] void drawImage(HTMLImageElement? image, float x, float y);
    [RaisesException] void drawImage(HTMLImageElement? image, float x, float y, float width, float height);
    [RaisesException] void drawImage(HTMLImageElement? image, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);
    [RaisesException] void drawImage(HTMLCanvasElement? canvas, float x, float y);
    [RaisesException] void drawImage(HTMLCanvasElement? canvas, float x, float y, float width, float height);
    [RaisesException] void drawImage(HTMLCanvasElement? canvas, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);
    [RaisesException] void drawImage(HTMLVideoElement? video, float x, float y);
    [RaisesException] void drawImage(HTMLVideoElement? video, float x, float y, float width, float height);
    [RaisesException] void drawImage(HTMLVideoElement? video, float sx, float sy, float sw, float sh, float dx, float dy, float dw, float dh);

    void drawImageFromRect(HTMLImageElement image,
                           optional float sx, optional float sy, optional float sw, optional float sh,
                           optional float dx, optional float dy, optional float dw, optional float dh,
                           optional DOMString compositeOperation);

    void setShadow(float width, float height, float blur, [StrictTypeChecking] optional DOMString color, optional float alpha);
    void setShadow(float width, float height, float blur, float grayLevel, optional float alpha);
    void setShadow(float width, float height, float blur, float r, float g, float b, float a);
    void setShadow(float width, float height, float blur, float c, float m, float y, float k, float a);

    [RaisesException] void putImageData(ImageData? imagedata, float dx, float dy);
    [RaisesException] void putImageData(ImageData? imagedata, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight);

    [RaisesException] void webkitPutImageDataHD(ImageData? imagedata, float dx, float dy);
    [RaisesException] void webkitPutImageDataHD(ImageData? imagedata, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight);

    [RaisesException] CanvasPattern createPattern(HTMLCanvasElement? canvas, [TreatNullAs=NullString] DOMString repetitionType);
    [RaisesException] CanvasPattern createPattern(HTMLImageElement? image, [TreatNullAs=NullString] DOMString repetitionType);
    [RaisesException] ImageData createImageData(ImageData? imagedata);
    [RaisesException] ImageData createImageData(float sw, float sh);

    [Custom] attribute custom strokeStyle;
    [Custom] attribute custom fillStyle;

    // pixel manipulation
    [RaisesException] ImageData getImageData([Default=Undefined] optional float sx, [Default=Undefined] optional float sy,
                           [Default=Undefined] optional float sw, [Default=Undefined] optional float sh);

    [RaisesException] ImageData webkitGetImageDataHD([Default=Undefined] optional float sx, [Default=Undefined] optional float sy,
                                   [Default=Undefined] optional float sw, [Default=Undefined] optional float sh);

    readonly attribute float webkitBackingStorePixelRatio;

    attribute boolean webkitImageSmoothingEnabled;

    [EnabledAtRuntime=experimentalCanvasFeatures] Canvas2DContextAttributes getContextAttributes();
};

