/*
 * Copyright (C)2005-2019 Haxe Foundation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

// This file is generated from mozilla\CanvasRenderingContext2D.webidl. Do not edit!

package js.html;

/**
	To get an object of this interface, call `getContext()` on a `canvas element`, supplying "2d" as the argument:

	Documentation [CanvasRenderingContext2D](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D) by [Mozilla Contributors](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D$history), licensed under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/).

	@see <https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D>
**/
@:native("CanvasRenderingContext2D")
extern class CanvasRenderingContext2D {
	var canvas(default,null) : CanvasElement;
	var globalAlpha : Float;
	var globalCompositeOperation : String;
	var strokeStyle : haxe.extern.EitherType<String,haxe.extern.EitherType<CanvasGradient,CanvasPattern>>;
	var fillStyle : haxe.extern.EitherType<String,haxe.extern.EitherType<CanvasGradient,CanvasPattern>>;
	var filter : String;
	var imageSmoothingEnabled : Bool;
	var lineWidth : Float;
	var lineCap : String;
	var lineJoin : String;
	var miterLimit : Float;
	var lineDashOffset : Float;
	var shadowOffsetX : Float;
	var shadowOffsetY : Float;
	var shadowBlur : Float;
	var shadowColor : String;
	var font : String;
	var textAlign : String;
	var textBaseline : String;
	
	/** @throws DOMError */
	@:overload( function( image : js.html.svg.ImageElement, dx : Float, dy : Float) : Void {} )
	@:overload( function( image : CanvasElement, dx : Float, dy : Float) : Void {} )
	@:overload( function( image : VideoElement, dx : Float, dy : Float) : Void {} )
	@:overload( function( image : ImageBitmap, dx : Float, dy : Float) : Void {} )
	@:overload( function( image : js.html.svg.ImageElement, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : CanvasElement, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : VideoElement, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : ImageBitmap, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : js.html.svg.ImageElement, sx : Float, sy : Float, sw : Float, sh : Float, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : CanvasElement, sx : Float, sy : Float, sw : Float, sh : Float, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : VideoElement, sx : Float, sy : Float, sw : Float, sh : Float, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : ImageBitmap, sx : Float, sy : Float, sw : Float, sh : Float, dx : Float, dy : Float, dw : Float, dh : Float) : Void {} )
	@:overload( function( image : ImageElement, dx : Float, dy : Float ) : Void {} )
	@:overload( function( image : ImageElement, dx : Float, dy : Float, dw : Float, dh : Float ) : Void {} )
	function drawImage( image : ImageElement, sx : Float, sy : Float, sw : Float, sh : Float, dx : Float, dy : Float, dw : Float, dh : Float ) : Void;
	function beginPath() : Void;
	@:overload( function( winding : CanvasWindingRule = NONZERO ) : Void {} )
	function fill( path : Path2D, winding : CanvasWindingRule = NONZERO ) : Void;
	@:overload( function() : Void {} )
	function stroke( path : Path2D ) : Void;
	@:overload( function( winding : CanvasWindingRule = NONZERO ) : Void {} )
	function clip( path : Path2D, winding : CanvasWindingRule = NONZERO ) : Void;
	@:overload( function( x : Float, y : Float, winding : CanvasWindingRule = NONZERO ) : Bool {} )
	function isPointInPath( path : Path2D, x : Float, y : Float, winding : CanvasWindingRule = NONZERO ) : Bool;
	@:overload( function( x : Float, y : Float ) : Bool {} )
	function isPointInStroke( path : Path2D, x : Float, y : Float ) : Bool;
	function createLinearGradient( x0 : Float, y0 : Float, x1 : Float, y1 : Float ) : CanvasGradient;
	/** @throws DOMError */
	function createRadialGradient( x0 : Float, y0 : Float, r0 : Float, x1 : Float, y1 : Float, r1 : Float ) : CanvasGradient;
	/** @throws DOMError */
	@:overload( function( image : js.html.svg.ImageElement, repetition : String) : CanvasPattern {} )
	@:overload( function( image : CanvasElement, repetition : String) : CanvasPattern {} )
	@:overload( function( image : VideoElement, repetition : String) : CanvasPattern {} )
	@:overload( function( image : ImageBitmap, repetition : String) : CanvasPattern {} )
	function createPattern( image : ImageElement, repetition : String ) : CanvasPattern;
	/** @throws DOMError */
	function addHitRegion( ?options : HitRegionOptions ) : Void;
	function removeHitRegion( id : String ) : Void;
	function clearHitRegions() : Void;
	/** @throws DOMError */
	@:overload( function( sw : Float, sh : Float ) : ImageData {} )
	function createImageData( imagedata : ImageData ) : ImageData;
	/** @throws DOMError */
	function getImageData( sx : Float, sy : Float, sw : Float, sh : Float ) : ImageData;
	/** @throws DOMError */
	@:overload( function( imagedata : ImageData, dx : Float, dy : Float ) : Void {} )
	function putImageData( imagedata : ImageData, dx : Float, dy : Float, dirtyX : Float, dirtyY : Float, dirtyWidth : Float, dirtyHeight : Float ) : Void;
	/** @throws DOMError */
	function setLineDash( segments : Array<Float> ) : Void;
	function getLineDash() : Array<Float>;
	function closePath() : Void;
	function moveTo( x : Float, y : Float ) : Void;
	function lineTo( x : Float, y : Float ) : Void;
	function quadraticCurveTo( cpx : Float, cpy : Float, x : Float, y : Float ) : Void;
	function bezierCurveTo( cp1x : Float, cp1y : Float, cp2x : Float, cp2y : Float, x : Float, y : Float ) : Void;
	/** @throws DOMError */
	function arcTo( x1 : Float, y1 : Float, x2 : Float, y2 : Float, radius : Float ) : Void;
	function rect( x : Float, y : Float, w : Float, h : Float ) : Void;
	/** @throws DOMError */
	function arc( x : Float, y : Float, radius : Float, startAngle : Float, endAngle : Float, anticlockwise : Bool = false ) : Void;
	/** @throws DOMError */
	function ellipse( x : Float, y : Float, radiusX : Float, radiusY : Float, rotation : Float, startAngle : Float, endAngle : Float, anticlockwise : Bool = false ) : Void;
	function clearRect( x : Float, y : Float, w : Float, h : Float ) : Void;
	function fillRect( x : Float, y : Float, w : Float, h : Float ) : Void;
	function strokeRect( x : Float, y : Float, w : Float, h : Float ) : Void;
	function save() : Void;
	function restore() : Void;
	/** @throws DOMError */
	function fillText( text : String, x : Float, y : Float, ?maxWidth : Float ) : Void;
	/** @throws DOMError */
	function strokeText( text : String, x : Float, y : Float, ?maxWidth : Float ) : Void;
	/** @throws DOMError */
	function measureText( text : String ) : TextMetrics;
	/** @throws DOMError */
	function scale( x : Float, y : Float ) : Void;
	/** @throws DOMError */
	function rotate( angle : Float ) : Void;
	/** @throws DOMError */
	function translate( x : Float, y : Float ) : Void;
	/** @throws DOMError */
	function transform( a : Float, b : Float, c : Float, d : Float, e : Float, f : Float ) : Void;
	/** @throws DOMError */
	function setTransform( a : Float, b : Float, c : Float, d : Float, e : Float, f : Float ) : Void;
	/** @throws DOMError */
	function resetTransform() : Void;
	/** @throws DOMError */
	function drawFocusIfNeeded( element : Element ) : Void;
	function drawCustomFocusRing( element : Element ) : Bool;
}