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

module html {

    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;
        attribute [TreatNullAs=NullString] 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;
        attribute [TreatNullAs=NullString] DOMString lineCap;
        attribute [TreatNullAs=NullString] DOMString lineJoin;
        attribute float miterLimit;

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

        // FIXME: These attributes should also be implemented for V8.
#if !(defined(V8_BINDING) && V8_BINDING)
        attribute [Custom] 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();
        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();
        void stroke();
        void clip();
        boolean isPointInPath(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 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 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] 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);

        attribute [Custom] custom strokeStyle;
        attribute [Custom] 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;
    };

}

