import type { IAABBBounds, IBounds, IBoundsLike, IMatrix } from '@visactor/vutils';
import type { IGraphic } from './graphic';
import type { IGroup } from './graphic/group';
import type { IColor } from './color';
import type { IDrawContext, IDrawContribution, IRenderService, IRenderServiceDrawParams } from './render';
import type { IStage } from './stage';
import type { Releaseable } from './common';
import type { IContext2d } from './context';
import type { IWindow } from './window';
export type LayerMode = 'static' | 'dynamic' | 'virtual';
export interface ILayerParams {
    main: boolean;
    zIndex?: number;
    layerMode: LayerMode;
    layerHandler: ILayerHandlerContribution;
    canvasId?: string;
}
export interface ILayerDrawParams {
    renderService: IRenderService;
    background?: string | IColor;
    updateBounds: boolean;
    viewBox: IAABBBounds;
    transMatrix: IMatrix;
}
export interface IDrawToParams {
    viewBox: IAABBBounds;
    transMatrix: IMatrix;
    clear?: boolean;
    renderService: IRenderService;
    background?: string | IColor;
    updateBounds: boolean;
}
export interface ILayer extends IGroup {
    parent: any;
    main: boolean;
    width: number;
    height: number;
    viewWidth: number;
    viewHeight: number;
    readonly layerMode: LayerMode;
    renderCount: number;
    offscreen: boolean;
    subLayers: Map<number, {
        layer: ILayer;
        group?: IGroup;
        zIndex: number;
        drawContribution?: IDrawContribution;
    }>;
    readonly dirtyBound: IAABBBounds;
    background: string;
    dpr: number;
    opacity: number;
    canvasId?: string;
    imageData?: ImageData;
    blendMode?: string;
    pickable: boolean;
    pick: (x: number, y: number) => {
        graphic?: IGraphic;
        group?: IGroup;
    } | false;
    render: (params: ILayerDrawParams, userParams?: Partial<IDrawContext>) => void;
    afterDraw: (cb: (l: this) => void) => void;
    resize: (w: number, h: number) => void;
    resizeView: (w: number, h: number) => void;
    setDpr: (dpr: number) => void;
    getNativeHandler: () => ILayerHandlerContribution;
    combineSubLayer: (removeIncrementalKey?: boolean) => void;
    startAnimate: (t: number) => void;
    setToFrame: (t: number) => void;
    prepare: (dirtyBounds: IBounds, params: ILayerHandlerDrawParams) => void;
    drawTo: (target: IWindow, params: IDrawToParams) => void;
}
export interface ILayerHandlerDrawParams extends ILayerDrawParams {
    layer: ILayer;
    stage: IStage;
    updateBounds: boolean;
}
export interface ILayerHandlerInitParams {
    main: boolean;
    canvasId?: string;
    width: number;
    height: number;
    zIndex: number;
    dpr?: number;
}
export interface ILayerHandlerContribution extends Releaseable {
    secondaryHandlers?: ILayerHandlerContribution[];
    mainHandler?: ILayerHandlerContribution;
    type: LayerMode;
    init: (layer: ILayer, window: IWindow, params: ILayerHandlerInitParams) => void;
    resize: (w: number, h: number) => void;
    resizeView: (w: number, h: number) => void;
    setDpr: (dpr: number) => void;
    render: (group: IGroup[], params: ILayerHandlerDrawParams, userParams?: Partial<IDrawContext>) => void;
    prepare: (dirtyBounds: IBoundsLike, params: IRenderServiceDrawParams) => void;
    drawTo: (target: IWindow, group: IGroup[], params: IDrawToParams & ILayerHandlerDrawParams) => void;
    merge: (layerHandlers: ILayerHandlerContribution[]) => void;
    getContext: () => IContext2d;
    offscreen: boolean;
    layer: ILayer;
}
