import type { Matrix, IMatrix, IBoundsLike, IPointLike } from '@visactor/vutils';
import type { ICamera } from './camera';
import type { ICanvas } from './canvas';
import type { Releaseable } from './common';
import type { mat4, vec3 } from './matrix';
import type { IFillType, IStrokeType, ITransform } from './graphic';
export interface IConicalGradientData {
    addColorStop: (pos: number, color: string) => void;
    readonly stops: [number, string][];
    GetPattern: (minW: number, minH: number, deltaAngle?: number) => CanvasPattern | null;
}
export interface ICommonStyleParams {
    fill?: IFillType;
    fillOpacity?: number;
    shadowBlur?: number;
    shadowColor?: string;
    shadowOffsetX?: number;
    shadowOffsetY?: number;
    globalCompositeOperation?: CanvasRenderingContext2D['globalCompositeOperation'] | '';
    opacity?: number;
    blur?: number;
    filter?: string;
}
export interface IStrokeStyleParams {
    stroke?: IStrokeType | IStrokeType[];
    strokeOpacity?: number;
    lineDash?: number[];
    lineDashOffset?: number;
    lineWidth?: number;
    lineCap?: CanvasLineCap;
    lineJoin?: CanvasLineJoin;
    miterLimit?: number;
    opacity?: number;
    keepStrokeScale?: boolean;
}
export interface ITextStyleParams {
    font?: string;
    fontSize: number;
    fontFamily?: string;
    fontWeight?: string | number;
    textAlign?: CanvasTextAlign;
    textBaseline?: CanvasTextBaseline;
    scaleIn3d?: boolean;
}
export interface ISetCommonStyleParams {
    attribute: Partial<ICommonStyleParams & ITransform>;
    AABBBounds: IBoundsLike;
}
export interface ISetStrokeStyleParams {
    attribute: Partial<IStrokeStyleParams & ITransform>;
    AABBBounds: IBoundsLike;
}
export interface IContext2d extends Releaseable {
    stack: IMatrix[];
    inuse?: boolean;
    camera?: ICamera;
    modelMatrix?: mat4;
    drawPromise?: Promise<any>;
    baseGlobalAlpha?: number;
    fillStyle: string | CanvasGradient | CanvasPattern;
    disableFill?: boolean;
    disableStroke?: boolean;
    disableBeginPath?: boolean;
    font: string;
    globalAlpha: number;
    lineCap: string;
    lineDashOffset: number;
    lineJoin: string;
    lineWidth: number;
    miterLimit: number;
    shadowBlur: number;
    shadowColor: string;
    shadowOffsetX: number;
    shadowOffsetY: number;
    strokeStyle: string | CanvasGradient | CanvasPattern;
    dpr: number;
    textAlign: string;
    textBaseline: string;
    nativeContext: CanvasRenderingContext2D | any;
    canvas: ICanvas;
    [key: string]: any;
    getCanvas: () => ICanvas;
    getContext: () => any;
    setTransformForCurrent: (force?: boolean) => void;
    currentMatrix: IMatrix;
    clear: () => void;
    restore: () => void;
    highPerformanceRestore: () => void;
    rotate: (angle: number, setTransform?: boolean) => void;
    save: () => void;
    highPerformanceSave: () => void;
    project?: (x: number, y: number, z?: number) => IPointLike;
    view?: (x: number, y: number, z?: number) => vec3;
    scale: (x: number, y: number, setTransform?: boolean) => void;
    scalePoint: (sx: number, sy: number, px: number, py: number, setTransform?: boolean) => void;
    transform: (m11: number, m12: number, m21: number, m22: number, dx: number, dy: number, setTransform?: boolean) => void;
    transformFromMatrix: (matrix: Matrix, setTransform?: boolean) => void;
    setTransform: (m11: number, m12: number, m21: number, m22: number, dx: number, dy: number, setTransform?: boolean, dpr?: number) => void;
    setTransformFromMatrix: (matrix: Matrix, setTransform?: boolean, dpr?: number) => void;
    resetTransform: (setTransform?: boolean, dpr?: number) => void;
    translate: (x: number, y: number, setTransform?: boolean) => void;
    rotateDegrees: (deg: number, setTransform?: boolean) => void;
    rotateAbout: (rad: number, x: number, y: number, setTransform?: boolean) => void;
    rotateDegreesAbout: (deg: number, x: number, y: number, setTransform?: boolean) => void;
    beginPath: () => void;
    clip: ((fillRule?: CanvasFillRule) => void) & ((path: Path2D, fillRule?: CanvasFillRule) => void);
    arc: (x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean, z?: number) => void;
    arcTo: (x1: number, y1: number, x2: number, y2: number, radius: number) => void;
    bezierCurveTo: (cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) => void;
    closePath: () => void;
    ellipse: (x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean) => void;
    lineTo: (x: number, y: number, z?: number) => void;
    moveTo: (x: number, y: number, z?: number) => void;
    quadraticCurveTo: (cpx: number, cpy: number, x: number, y: number, z?: number) => void;
    rect: (x: number, y: number, w: number, h: number, z?: number) => void;
    createImageData: (imageDataOrSw: number | ImageData, sh?: number) => ImageData;
    createLinearGradient: (x0: number, y0: number, x1: number, y1: number) => CanvasGradient;
    createPattern: (image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ICanvas | any, repetition: string) => CanvasPattern | null;
    createRadialGradient: (x0: number, y0: number, r0: number, x1: number, y1: number, r1: number) => CanvasGradient;
    createConicGradient: (x: number, y: number, startAngle: number, endAngle: number) => IConicalGradientData | null;
    fill: (path?: Path2D, fillRule?: CanvasFillRule) => void;
    fillRect: (x: number, y: number, w: number, h: number) => void;
    clearRect: (x: number, y: number, w: number, h: number) => void;
    fillText: (text: string, x: number, y: number, z?: number) => void;
    getImageData: (sx: number, sy: number, sw: number, sh: number) => ImageData;
    getLineDash: () => number[];
    isPointInPath: (x: number, y: number) => boolean;
    isPointInStroke: (x: number, y: number) => boolean;
    measureText: (text: string, method?: 'native' | 'simple' | 'quick') => {
        width: number;
    };
    putImageData: (imagedata: ImageData, dx: number, dy: number) => void;
    setLineDash: (segments: number[]) => void;
    stroke: (path?: Path2D) => void;
    strokeRect: (x: number, y: number, w: number, h: number) => void;
    strokeText: (text: string, x: number, y: number, z?: number) => void;
    drawImage: ((image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any, dstX: number, dstY: number) => void) & ((image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any, dstX: number, dstY: number, dstW: number, dstH: number) => void) & ((image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | ICanvas | any, srcX: number, srcY: number, srcW: number, srcH: number, dstX: number, dstY: number, dstW: number, dstH: number) => void);
    setCommonStyle: (params: ISetCommonStyleParams, attribute: ICommonStyleParams, offsetX: number, offsetY: number, defultParams?: ICommonStyleParams | Partial<ICommonStyleParams>[]) => void;
    setShadowBlendStyle?: (params: ISetCommonStyleParams, attribute: ICommonStyleParams, defultParams?: ICommonStyleParams | Partial<ICommonStyleParams>[]) => void;
    setStrokeStyle: (params: ISetStrokeStyleParams, attribute: IStrokeStyleParams, offsetX: number, offsetY: number, defultParams?: Required<IStrokeStyleParams> | Partial<IStrokeStyleParams>[]) => void;
    setTextStyle: (params: Partial<ITextStyleParams>, defaultParams?: ITextStyleParams, z?: number) => void;
    setTextStyleWithoutAlignBaseline: (params: Partial<ITextStyleParams>, defaultParams?: ITextStyleParams, z?: number) => void;
    draw: (...params: any) => void;
    clearMatrix: (setTransform?: boolean, dpr?: number) => void;
    setClearMatrix: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
    onlyTranslate: (dpr?: number) => boolean;
}
export interface IContextLike {
    fillStyle: string | CanvasGradient | CanvasPattern;
    font: string;
    globalAlpha: number;
    lineCap: string;
    lineDashOffset: number;
    lineJoin: string;
    lineWidth: number;
    miterLimit: number;
    shadowBlur: number;
    shadowColor: string;
    shadowOffsetX: number;
    shadowOffsetY: number;
    strokeStyle: string | CanvasGradient | CanvasPattern;
    dpr: number;
    textAlign: string;
    textBaseline: string;
    nativeContext: CanvasRenderingContext2D | any;
    [key: string]: any;
    clear: () => void;
    restore: () => void;
    save: () => void;
    translate: (x: number, y: number) => void;
    beginPath: () => void;
    clip: ((fillRule?: CanvasFillRule) => void) & ((path: Path2D, fillRule?: CanvasFillRule) => void);
    arc: (x: number, y: number, radius: number, startAngle: number, endAngle: number, anticlockwise?: boolean) => void;
    arcTo: ((x1: number, y1: number, x2: number, y2: number, radius: number) => void) & ((x1: number, y1: number, x2: number, y2: number, radiusX: number, radiusY: number, rotation: number) => void);
    bezierCurveTo: (cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number) => void;
    closePath: () => void;
    ellipse: (x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, anticlockwise?: boolean) => void;
    lineTo: (x: number, y: number) => void;
    moveTo: (x: number, y: number) => void;
    quadraticCurveTo: (cpx: number, cpy: number, x: number, y: number) => void;
    rect: (x: number, y: number, w: number, h: number) => void;
    fill: (path?: Path2D, fillRule?: CanvasFillRule) => void;
    fillRect: (x: number, y: number, w: number, h: number) => void;
    clearRect: (x: number, y: number, w: number, h: number) => void;
    fillText: (text: string, x: number, y: number, maxWidth?: number) => void;
    getImageData: (sx: number, sy: number, sw: number, sh: number) => ImageData;
    getLineDash: () => number[];
    isPointInPath: (x: number, y: number) => boolean;
    isPointInStroke: (x: number, y: number) => boolean;
    measureText: (text: string, method?: 'native' | 'simple' | 'quick') => {
        width: number;
    };
    putImageData: (imagedata: ImageData, dx: number, dy: number, dirtyX?: number, dirtyY?: number, dirtyWidth?: number, dirtyHeight?: number) => void;
    setLineDash: (segments: number[]) => void;
    stroke: (path?: Path2D) => void;
    strokeRect: (x: number, y: number, w: number, h: number) => void;
    strokeText: (text: string, x: number, y: number, maxWidth?: number) => void;
    drawImage: ((image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any, dstX: number, dstY: number) => void) & ((image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any, dstX: number, dstY: number, dstW: number, dstH: number) => void) & ((image: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | ImageBitmap | any, srcX: number, srcY: number, srcW: number, srcH: number, dstX: number, dstY: number, dstW: number, dstH: number) => void);
    clearMatrix: () => void;
    onlyTranslate: () => boolean;
}
