/*
 * Copyright (C) 2006-2016 Apple 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 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 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.
 */

[
    CustomIsReachable,
    JSGenerateToJSObject,
    JSCustomMarkFunction,
    CallTracingCallback=recordCanvasAction,
    Exposed=Window
] interface CanvasRenderingContext2D {
    // back-reference to the canvas
    readonly attribute HTMLCanvasElement canvas;

    // Non-standard legacy aliases (Compositing).
    [ImplementedAs=setGlobalAlpha] undefined setAlpha(optional unrestricted float alpha = NaN);
    [ImplementedAs=setGlobalCompositeOperation] undefined setCompositeOperation(optional DOMString compositeOperation);

    // Non-standard functionality (CanvasDrawImage).
    undefined drawImageFromRect(HTMLImageElement image,
        optional unrestricted float sx = 0, optional unrestricted float sy = 0, optional unrestricted float sw = 0, optional unrestricted float sh = 0,
        optional unrestricted float dx = 0, optional unrestricted float dy = 0, optional unrestricted float dw = 0, optional unrestricted float dh = 0,
        optional DOMString compositeOperation = "");

    // Non-standard legacy aliases (CanvasFillStrokeStyles).
    undefined setStrokeColor(DOMString color, optional unrestricted float alpha);
    undefined setStrokeColor(unrestricted float grayLevel, optional float alpha = 1);
    undefined setStrokeColor(unrestricted float r, unrestricted float g, unrestricted float b, unrestricted float a);
    undefined setFillColor(DOMString color, optional unrestricted float alpha);
    undefined setFillColor(unrestricted float grayLevel, optional unrestricted float alpha = 1);
    undefined setFillColor(unrestricted float r, unrestricted float g, unrestricted float b, unrestricted float a);

    // Non-standard functionality (CanvasImageData).
    readonly attribute float webkitBackingStorePixelRatio; // Always returns 1.

    // Non-standard legacy alias (CanvasImageSmoothing).
    [ImplementedAs=imageSmoothingEnabled] attribute boolean webkitImageSmoothingEnabled;

    // Non-standard legacy aliases (CanvasPathDrawingStyles).
    undefined setLineWidth(optional unrestricted float width = NaN);
    undefined setLineCap(optional DOMString cap);
    undefined setLineJoin(optional DOMString join);
    undefined setMiterLimit(optional unrestricted float limit = NaN);
    attribute sequence<unrestricted float> webkitLineDash;
    [ImplementedAs=lineDashOffset] attribute unrestricted float webkitLineDashOffset;

    // Non-standard legacy aliases (CanvasShadowStyles).
    undefined setShadow(unrestricted float width, unrestricted float height, unrestricted float blur, optional DOMString color, optional unrestricted float alpha);
    undefined setShadow(unrestricted float width, unrestricted float height, unrestricted float blur, unrestricted float grayLevel, optional unrestricted float alpha = 1);
    undefined setShadow(unrestricted float width, unrestricted float height, unrestricted float blur, unrestricted float r, unrestricted float g, unrestricted float b, unrestricted float a);
    undefined setShadow(float width, unrestricted float height, unrestricted float blur, unrestricted float c, unrestricted float m, unrestricted float y, unrestricted float k, unrestricted float a);
    undefined clearShadow();

    // Inspector-only.
    [EnabledAtRuntime=InspectorAdditions] undefined setPath(Path2D path);
    [EnabledAtRuntime=InspectorAdditions, NewObject] Path2D getPath();
};

CanvasRenderingContext2D includes CanvasState;
CanvasRenderingContext2D includes CanvasTransform;
CanvasRenderingContext2D includes CanvasCompositing;
CanvasRenderingContext2D includes CanvasImageSmoothing;
CanvasRenderingContext2D includes CanvasFillStrokeStyles;
CanvasRenderingContext2D includes CanvasShadowStyles;
CanvasRenderingContext2D includes CanvasFilters;
CanvasRenderingContext2D includes CanvasRect;
CanvasRenderingContext2D includes CanvasDrawPath;
CanvasRenderingContext2D includes CanvasUserInterface;
CanvasRenderingContext2D includes CanvasText;
CanvasRenderingContext2D includes CanvasDrawImage;
CanvasRenderingContext2D includes CanvasImageData;
CanvasRenderingContext2D includes CanvasPathDrawingStyles;
CanvasRenderingContext2D includes CanvasTextDrawingStyles;
CanvasRenderingContext2D includes CanvasPath;
