/**
 * Sigma.js Utils
 * ===============
 *
 * Various helper functions & classes used throughout the library.
 * @module
 */
import Graph from "graphology-types";
import { CameraState, Coordinates, Dimensions, Extent, PlainObject } from "../types";
/**
 * Checks whether the given value is a plain object.
 *
 * @param  {mixed}   value - Target value.
 * @return {boolean}
 */
export declare function isPlainObject(value: any): boolean;
/**
 * Helper to use Object.assign with more than two objects.
 *
 * @param  {object} target       - First object.
 * @param  {object} [...objects] - Objects to merge.
 * @return {object}
 */
export declare function assign<T>(target: Partial<T> | undefined, ...objects: Array<Partial<T | undefined>>): T;
/**
 * Very simple recursive Object.assign-like function.
 *
 * @param  {object} target       - First object.
 * @param  {object} [...objects] - Objects to merge.
 * @return {object}
 */
export declare function assignDeep<T>(target: Partial<T> | undefined, ...objects: Array<Partial<T | undefined>>): T;
/**
 * Just some dirty trick to make requestAnimationFrame and cancelAnimationFrame "work" in Node.js, for unit tests:
 */
export declare const requestFrame: (callback: FrameRequestCallback) => number;
export declare const cancelFrame: (requestID: number) => void;
/**
 * Function used to create DOM elements easily.
 *
 * @param  {string} tag        - Tag name of the element to create.
 * @param  {object} style      - Styles map.
 * @param  {object} attributes - Attributes map.
 * @return {HTMLElement}
 */
export declare function createElement<T extends HTMLElement>(tag: string, style?: Partial<CSSStyleDeclaration>, attributes?: PlainObject<string>): T;
/**
 * Function returning the browser's pixel ratio.
 *
 * @return {number}
 */
export declare function getPixelRatio(): number;
/**
 * Function returning the graph's node extent in x & y.
 *
 * @param  {Graph}
 * @return {object}
 */
export declare function graphExtent(graph: Graph): {
    x: Extent;
    y: Extent;
};
/**
 * Factory returning a function normalizing the given node's position & size.
 *
 * @param  {object}   extent  - Extent of the graph.
 * @return {function}
 */
export interface NormalizationFunction {
    (data: Coordinates): Coordinates;
    ratio: number;
    inverse(data: Coordinates): Coordinates;
    applyTo(data: Coordinates): void;
}
export declare function createNormalizationFunction(extent: {
    x: Extent;
    y: Extent;
}): NormalizationFunction;
/**
 * Function ordering the given elements in reverse z-order so they drawn
 * the correct way.
 *
 * @param  {number}   extent   - [min, max] z values.
 * @param  {function} getter   - Z attribute getter function.
 * @param  {array}    elements - The array to sort.
 * @return {array} - The sorted array.
 */
export declare function zIndexOrdering<T>(_extent: Extent, getter: (e: T) => number, elements: Array<T>): Array<T>;
type RGBAColor = {
    r: number;
    g: number;
    b: number;
    a: number;
};
export declare function parseColor(val: string): RGBAColor;
export declare function rgbaToFloat(r: number, g: number, b: number, a: number, masking?: boolean): number;
export declare function floatColor(val: string): number;
export declare function indexToColor(index: number): number;
export declare function colorToIndex(r: number, g: number, b: number, a: number): number;
/**
 * In sigma, the graph is normalized into a [0, 1], [0, 1] square, before being given to the various renderers. This
 * helps to deal with quadtree in particular.
 * But at some point, we need to rescale it so that it takes the best place in the screen, i.e. we always want to see two
 * nodes "touching" opposite sides of the graph, with the camera being at its default state.
 *
 * This function determines this ratio.
 */
export declare function getCorrectionRatio(viewportDimensions: {
    width: number;
    height: number;
}, graphDimensions: {
    width: number;
    height: number;
}): number;
/**
 * Function returning a matrix from the current state of the camera.
 */
export declare function matrixFromCamera(state: CameraState, viewportDimensions: {
    width: number;
    height: number;
}, graphDimensions: {
    width: number;
    height: number;
}, padding: number, inverse?: boolean): Float32Array;
/**
 * All these transformations we apply on the matrix to get it rescale the graph
 * as we want make it very hard to get pixel-perfect distances in WebGL. This
 * function returns a factor that properly cancels the matrix effect on lengths.
 *
 * [jacomyal]
 * To be fully honest, I can't really explain happens here... I notice that the
 * following ratio works (i.e. it correctly compensates the matrix impact on all
 * camera states I could try):
 * > `R = size(V) / size(M * V) / W`
 * as long as `M * V` is in the direction of W (ie. parallel to (Ox)). It works
 * as well with H and a vector that transforms into something parallel to (Oy).
 *
 * Also, note that we use `angle` and not `-angle` (that would seem logical,
 * since we want to anticipate the rotation), because the image is vertically
 * swapped in WebGL.
 */
export declare function getMatrixImpact(matrix: Float32Array, cameraState: CameraState, viewportDimensions: Dimensions): number;
/**
 * Function extracting the color at the given pixel.
 */
export declare function extractPixel(gl: WebGLRenderingContext, x: number, y: number, array: Uint8Array): Uint8Array;
/**
 * Check if the graph variable is a valid graph, and if sigma can render it.
 */
export declare function validateGraph(graph: Graph): void;
export {};
