/*
 * 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.
 */

// FIXME: we should use CanvasWindingRule once support for WebIDL is completed. (bug #106553)
enum CanvasWindingRule { "nonzero", "evenodd" };

interface CanvasRenderingContext2D : CanvasRenderingContext {

    void save();
    void restore();

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

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

    CanvasGradient createLinearGradient(in [Optional=DefaultIsUndefined] float x0,
                                        in [Optional=DefaultIsUndefined] float y0,
                                        in [Optional=DefaultIsUndefined] float x1,
                                        in [Optional=DefaultIsUndefined] float y1)
        raises (DOMException);
    CanvasGradient createRadialGradient(in [Optional=DefaultIsUndefined] float x0,
                                        in [Optional=DefaultIsUndefined] float y0,
                                        in [Optional=DefaultIsUndefined] float r0,
                                        in [Optional=DefaultIsUndefined] float x1,
                                        in [Optional=DefaultIsUndefined] float y1,
                                        in [Optional=DefaultIsUndefined] float r1)
        raises (DOMException);

    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(in sequence<float> dash);
    sequence<float> getLineDash();
    attribute float lineDashOffset;

    // FIXME: These attributes should also be implemented for V8.
#if !(defined(V8_BINDING) && V8_BINDING)
    [Custom] attribute Array webkitLineDash;
    attribute float webkitLineDashOffset;
#endif

    void clearRect(in [Optional=DefaultIsUndefined] float x,
                   in [Optional=DefaultIsUndefined] float y,
                   in [Optional=DefaultIsUndefined] float width,
                   in [Optional=DefaultIsUndefined] float height);
    void fillRect(in [Optional=DefaultIsUndefined] float x,
                  in [Optional=DefaultIsUndefined] float y,
                  in [Optional=DefaultIsUndefined] float width,
                  in [Optional=DefaultIsUndefined] float height);

    void beginPath();

#if defined(ENABLE_CANVAS_PATH) && ENABLE_CANVAS_PATH
    attribute DOMPath currentPath;
#endif

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

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

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

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

    // other

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

#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
    void setLineWidth(in [Optional=DefaultIsUndefined] float width);
    void setLineCap(in [Optional=DefaultIsUndefined] DOMString cap);
    void setLineJoin(in [Optional=DefaultIsUndefined] DOMString join);
    void setMiterLimit(in [Optional=DefaultIsUndefined] float limit);
#endif

    void clearShadow();

    void fillText(in DOMString text, in float x, in float y, in [Optional] float maxWidth);
    void strokeText(in DOMString text, in float x, in float y, in [Optional] float maxWidth);

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

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

    void strokeRect(in [Optional=DefaultIsUndefined] float x,
                    in [Optional=DefaultIsUndefined] float y,
                    in [Optional=DefaultIsUndefined] float width,
                    in [Optional=DefaultIsUndefined] float height,
                    in [Optional] float lineWidth);

    void drawImage(in HTMLImageElement? image, in float x, in float y)
        raises (DOMException);
    void drawImage(in HTMLImageElement? image, in float x, in float y, in float width, in float height)
        raises (DOMException);
    void drawImage(in HTMLImageElement? image, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
        raises (DOMException);
    void drawImage(in HTMLCanvasElement? canvas, in float x, in float y)
        raises (DOMException);
    void drawImage(in HTMLCanvasElement? canvas, in float x, in float y, in float width, in float height)
        raises (DOMException);
    void drawImage(in HTMLCanvasElement? canvas, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
        raises (DOMException);
#if defined(ENABLE_VIDEO) && ENABLE_VIDEO
    void drawImage(in HTMLVideoElement? video, in float x, in float y)
        raises (DOMException);
    void drawImage(in HTMLVideoElement? video, in float x, in float y, in float width, in float height)
        raises (DOMException);
    void drawImage(in HTMLVideoElement? video, in float sx, in float sy, in float sw, in float sh, in float dx, in float dy, in float dw, in float dh)
        raises (DOMException);
#endif

    void drawImageFromRect(in HTMLImageElement image,
                           in [Optional] float sx, in [Optional] float sy, in [Optional] float sw, in [Optional] float sh,
                           in [Optional] float dx, in [Optional] float dy, in [Optional] float dw, in [Optional] float dh,
                           in [Optional] DOMString compositeOperation);

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

    void putImageData(in ImageData? imagedata, in float dx, in float dy)
        raises(DOMException);
    void putImageData(in ImageData? imagedata, in float dx, in float dy, in float dirtyX, in float dirtyY, in float dirtyWidth, in float dirtyHeight)
        raises(DOMException);

    void webkitPutImageDataHD(in ImageData? imagedata, in float dx, in float dy)
        raises(DOMException);
    void webkitPutImageDataHD(in ImageData? imagedata, in float dx, in float dy, in float dirtyX, in float dirtyY, in float dirtyWidth, in float dirtyHeight)
        raises(DOMException);

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

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

    // pixel manipulation
    ImageData getImageData(in [Optional=DefaultIsUndefined] float sx, in [Optional=DefaultIsUndefined] float sy,
                           in [Optional=DefaultIsUndefined] float sw, in [Optional=DefaultIsUndefined] float sh)
        raises(DOMException);

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

    readonly attribute float webkitBackingStorePixelRatio;

    attribute boolean webkitImageSmoothingEnabled;
};

