// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// https://html.spec.whatwg.org/multipage/scripting.html#the-offscreen-2d-rendering-context

[
    Exposed=(Window,Worker),
    RuntimeEnabled=ExperimentalCanvasFeatures
] interface OffscreenCanvasRenderingContext2D {
    // back-reference to the canvas
    [ImplementedAs=offscreenCanvasForBinding] readonly attribute OffscreenCanvas canvas;

    [CallWith=ScriptState, RaisesException] Promise commit();

    // state
    void save(); // push state on state stack
    void restore(); // pop state stack and restore state

    // transformations (default transform is the identity matrix)
    void scale(unrestricted double x, unrestricted double y);
    void rotate(unrestricted double angle);
    void translate(unrestricted double x, unrestricted double y);
    void transform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
    void setTransform(unrestricted double a, unrestricted double b, unrestricted double c, unrestricted double d, unrestricted double e, unrestricted double f);
    void resetTransform();

    // compositing
    attribute unrestricted double globalAlpha; // (default 1.0)
    attribute DOMString globalCompositeOperation; // (default source-over)
    [MeasureAs=Canvas2DFilter]attribute DOMString filter;

    // image smoothing
    attribute boolean imageSmoothingEnabled; // (default True)
    [MeasureAs=Canvas2DImageSmoothingQuality] attribute ImageSmoothingQuality imageSmoothingQuality; // (default "low")

    // colors and styles
    attribute (DOMString or CanvasGradient or CanvasPattern) strokeStyle; // (default black)
    attribute (DOMString or CanvasGradient or CanvasPattern) fillStyle; // (default black)
    CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1);
    [RaisesException] CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1);
    [CallWith=ScriptState, RaisesException] CanvasPattern? createPattern(CanvasImageSource image, [TreatNullAs=NullString] DOMString repetitionType);

    // shadows
    attribute unrestricted double shadowOffsetX;
    attribute unrestricted double shadowOffsetY;
    attribute unrestricted double shadowBlur;
    attribute DOMString shadowColor;

    // CanvasRect interface
    void clearRect(unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
    void fillRect(unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
    void strokeRect(unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);

    // Path API (See BaseRenderingContext2D)
    void beginPath();
    void fill(optional CanvasFillRule winding);
    void fill(Path2D path, optional CanvasFillRule winding);
    void stroke();
    void stroke(Path2D path);
    void clip();
    void clip(Path2D path);
    boolean isPointInPath(unrestricted double x, unrestricted double y, optional CanvasFillRule winding);
    boolean isPointInPath(Path2D path, unrestricted double x, unrestricted double y, optional CanvasFillRule winding);
    boolean isPointInStroke(unrestricted double x, unrestricted double y);
    boolean isPointInStroke(Path2D path, unrestricted double x, unrestricted double y);

    // text (see also the CanvasDrawingStyles interface)
    void fillText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
    void strokeText(DOMString text, unrestricted double x, unrestricted double y, optional unrestricted double maxWidth);
    TextMetrics measureText(DOMString text);

    // drawing images
    [CallWith=ScriptState, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y);
    [CallWith=ScriptState, RaisesException] void drawImage(CanvasImageSource image, unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height);
    [CallWith=ScriptState, RaisesException] void drawImage(CanvasImageSource image, unrestricted double sx, unrestricted double sy, unrestricted double sw, unrestricted double sh, unrestricted double dx, unrestricted double dy, unrestricted double dw, unrestricted double dh);

    // pixel manipulation
    [RaisesException] ImageData createImageData(ImageData imagedata);
    [RaisesException] ImageData createImageData(long sw, long sh);
    [RaisesException] ImageData getImageData(long sx, long sy, long sw, long sh);
    [RaisesException] void putImageData(ImageData imagedata, long dx, long dy);
    [RaisesException] void putImageData(ImageData imagedata, long dx, long dy, long dirtyX, long dirtyY, long dirtyWidth, long dirtyHeight);

    // If OffscreenCanva ships before color managed canvas, this method must remain behind flag.
    // https://github.com/WICG/canvas-color-space/blob/master/CanvasColorSpaceProposal.md
    [RuntimeEnabled=ExperimentalCanvasFeatures, RaisesException] ImageData createImageData(unsigned long sw, unsigned long sh, ImageDataColorSettings imageDataColorSettings);
    [RuntimeEnabled=ExperimentalCanvasFeatures, RaisesException] ImageData createImageData(ImageDataArray data, unsigned long sw, unsigned long sh, ImageDataColorSettings imageDataColorSettings);


    // Line caps/joins
    attribute unrestricted double lineWidth; // (default 1)
    attribute DOMString lineCap; // "butt", "round", "square" (default "butt")
    attribute DOMString lineJoin; // "round", "bevel", "miter" (default "miter")
    attribute unrestricted double miterLimit; // (default 10)

    // dashed lines
    void setLineDash(sequence<unrestricted double> dash);
    sequence<unrestricted double> getLineDash();
    attribute unrestricted double lineDashOffset;

    // text
    attribute DOMString font; // (default 10px sans-serif)
    attribute DOMString textAlign; // "start", "end", "left", "right", "center" (default: "start")
    attribute DOMString textBaseline; // "top", "hanging", "middle", "alphabetic", "ideographic", "bottom" (default: "alphabetic")
    [RuntimeEnabled=ExperimentalCanvasFeatures] attribute DOMString direction; // "inherit", "rtl", "ltr" (default: "inherit")
};

OffscreenCanvasRenderingContext2D implements CanvasPath;
