/*
 * 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([Optional=DefaultIsUndefined] float sx,
               [Optional=DefaultIsUndefined] float sy);
    void rotate([Optional=DefaultIsUndefined] float angle);
    void translate([Optional=DefaultIsUndefined] float tx,
                   [Optional=DefaultIsUndefined] float ty);
    void transform([Optional=DefaultIsUndefined] float m11,
                   [Optional=DefaultIsUndefined] float m12,
                   [Optional=DefaultIsUndefined] float m21,
                   [Optional=DefaultIsUndefined] float m22,
                   [Optional=DefaultIsUndefined] float dx,
                   [Optional=DefaultIsUndefined] float dy);
    void setTransform([Optional=DefaultIsUndefined] float m11,
                      [Optional=DefaultIsUndefined] float m12,
                      [Optional=DefaultIsUndefined] float m21,
                      [Optional=DefaultIsUndefined] float m22,
                      [Optional=DefaultIsUndefined] float dx,
                      [Optional=DefaultIsUndefined] float dy);

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

    [RaisesException] CanvasGradient createLinearGradient([Optional=DefaultIsUndefined] float x0,
                                        [Optional=DefaultIsUndefined] float y0,
                                        [Optional=DefaultIsUndefined] float x1,
                                        [Optional=DefaultIsUndefined] float y1);
    [RaisesException] CanvasGradient createRadialGradient([Optional=DefaultIsUndefined] float x0,
                                        [Optional=DefaultIsUndefined] float y0,
                                        [Optional=DefaultIsUndefined] float r0,
                                        [Optional=DefaultIsUndefined] float x1,
                                        [Optional=DefaultIsUndefined] float y1,
                                        [Optional=DefaultIsUndefined] 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([Optional=DefaultIsUndefined] float x,
                   [Optional=DefaultIsUndefined] float y,
                   [Optional=DefaultIsUndefined] float width,
                   [Optional=DefaultIsUndefined] float height);
    void fillRect([Optional=DefaultIsUndefined] float x,
                  [Optional=DefaultIsUndefined] float y,
                  [Optional=DefaultIsUndefined] float width,
                  [Optional=DefaultIsUndefined] float height);

    void beginPath();

    attribute DOMPath currentPath;

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

    void fill([Optional] CanvasWindingRule winding);
    void stroke();
    void clip([Optional] CanvasWindingRule winding);
    boolean isPointInPath([Optional=DefaultIsUndefined] float x,
                          [Optional=DefaultIsUndefined] float y,
                          [Optional] CanvasWindingRule winding);
    boolean isPointInStroke([Optional=DefaultIsUndefined] float x,
                            [Optional=DefaultIsUndefined] float y);

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

    TextMetrics measureText([Optional=DefaultIsUndefined] DOMString text);

    // other

    void setAlpha([Optional=DefaultIsUndefined] float alpha);
    void setCompositeOperation([Optional=DefaultIsUndefined] DOMString compositeOperation);

    void setLineWidth([Optional=DefaultIsUndefined] float width);
    void setLineCap([Optional=DefaultIsUndefined] DOMString cap);
    void setLineJoin([Optional=DefaultIsUndefined] DOMString join);
    void setMiterLimit([Optional=DefaultIsUndefined] 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([Optional=DefaultIsUndefined] float x,
                    [Optional=DefaultIsUndefined] float y,
                    [Optional=DefaultIsUndefined] float width,
                    [Optional=DefaultIsUndefined] 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);
#if defined(ENABLE_VIDEO) && ENABLE_VIDEO
    [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);
#endif

    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, [Optional, StrictTypeChecking] 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([Optional=DefaultIsUndefined] float sx, [Optional=DefaultIsUndefined] float sy,
                           [Optional=DefaultIsUndefined] float sw, [Optional=DefaultIsUndefined] float sh);

    [RaisesException] ImageData webkitGetImageDataHD([Optional=DefaultIsUndefined] float sx, [Optional=DefaultIsUndefined] float sy,
                                   [Optional=DefaultIsUndefined] float sw, [Optional=DefaultIsUndefined] float sh);

    readonly attribute float webkitBackingStorePixelRatio;

    attribute boolean webkitImageSmoothingEnabled;
};

