import { Graph } from "../../graph";
import { Emitter } from "../../utils/Emitter";
import { TRect } from "../../utils/types/shapes";
export type TCameraState = {
    x: number;
    y: number;
    width: number;
    height: number;
    scale: number;
    scaleMin: number;
    scaleMax: number;
    relativeX: number;
    relativeY: number;
    relativeWidth: number;
    relativeHeight: number;
};
export declare enum ECameraScaleLevel {
    Minimalistic = 100,
    Schematic = 200,
    Detailed = 300
}
export declare const getInitCameraState: () => TCameraState;
export type ICamera = Interface<CameraService>;
export declare class CameraService extends Emitter {
    protected graph: Graph;
    protected state: TCameraState;
    protected unstable: boolean;
    isUnstable(): boolean;
    protected makeUnstable(): void;
    protected unsetUnstable: import("lodash").DebouncedFunc<() => void>;
    constructor(graph: Graph, state?: TCameraState);
    resize(newState: Partial<TCameraState>): void;
    set(newState: Partial<TCameraState>): void;
    private updateRelative;
    getCameraRect(): TRect;
    getCameraScale(): number;
    getCameraBlockScaleLevel(cameraScale?: number): ECameraScaleLevel;
    getCameraState(): TCameraState;
    move(dx?: number, dy?: number): void;
    getRelative(n: number, scale?: number): number;
    getRelativeXY(x: number, y: number): number[];
    /**
     * Converts relative coordinate to absolute (screen space)
     * Inverse of getRelative
     */
    getAbsolute(n: number, scale?: number): number;
    /**
     * Converts relative coordinates to absolute (screen space)
     * Inverse of getRelativeXY
     */
    getAbsoluteXY(x: number, y: number): number[];
    /**
     * Zoom to point
     *  */
    zoom(x: number, y: number, scale: number): void;
    getScaleRelativeDimensionsBySide(size: number, axis: "width" | "height"): number;
    getScaleRelativeDimensions(width: number, height: number): number;
    getXYRelativeCenterDimensions(dimensions: TRect, scale: number): {
        x: number;
        y: number;
    };
    isRectVisible(x: number, y: number, w: number, h: number): boolean;
    isLineVisible(x1: number, y1: number, x2: number, y2: number): boolean;
    applyToPoint(x: number, y: number): [number, number];
    applyToRect(...arg: number[]): number[];
}
