import { vec2 } from "gl-matrix";
import Texture from "./texture";
/**
 * Represents an image/texture stored on the atlas.
 *
 * @field **tl** The top left corner of the image on the atlas in pixels
 * @field **br** The bottom right corner of the image on the atlas in pixels
 * @field **texture** The texture stored
 */
export interface TextureAtlasImage {
    tl: vec2;
    br: vec2;
    texture: Texture;
}
/**
 * Combines {@link Texture}s into one single image using an offscreen canvas.
 *
 * If a {@link Texture} is added to the atlas that has no image then a 1x1 pixel is used with the color of the texture.
 *
 * The size of the atlas should be no larger than `MAX_TEXTURE_SIZE` to insure the atlas can be stored on the GPU.
 *
 * Also provides an api to get the locations of textures on the atlas.
 */
export default class TextureAtlas extends Texture {
    private size;
    private textures;
    private canvas;
    private ctx;
    constructor(size: number);
    /**
     * Adds the given images to the atlas and then refreshes the atlas.
     *
     * @param images The paths to the images to add
     * @returns Wether or not the images were added
     */
    addImages(...images: string[]): Promise<boolean>;
    /**
     * Adds a texture to the atlas.
     *
     * @param texture The texture to add
     * @param refreshAtlas Wether or not to refresh the atlas once the texture has been added
     * @returns Wether or not the texture was added to the atlas
     */
    addTexture(texture: Texture, refreshAtlas?: boolean): boolean;
    /**
     * Adds the given textures to the atlas and then refreshes the atlas.
     *
     * @param textures The textures to add.
     * @returns The promise returned by `this.refreshAtlas()`
     */
    addTextures(...textures: Texture[]): Promise<void>;
    /**
     * Removes a texture from the atlas.
     *
     * @param texture The texture to remove
     * @param refreshAtlas Wether or not to refresh the atlas once the texture has been removed
     * @returns Wether or not the texture was removed from the atlas
     */
    removeTexture(texture: Texture, refreshAtlas?: boolean): boolean;
    /**
     * Gets the location ({@link TextureAtlasImage}) of the texture on the atlas.
     *
     * @param texture The texture to find
     * @returns The {@link TextureAtlasImage} of the texture on the atlas or undefined
     */
    getTexture(texture: Texture): TextureAtlasImage;
    /**
     * Gets all the textures on the atlas as an array.
     *
     * @returns An array of all textures on the atlas
     */
    getAllTextures(): TextureAtlasImage[];
    /**
     * Packs all textures in the atlas together, draws them to the canvas and loads the canvas as a data URL to `this.image`.
     *
     * @returns A promise that resolves once the image has loaded or rejects if there is an error while loading the atlas image.
     */
    refreshAtlas(): Promise<void>;
    /**
     * Loads the atlas' canvas into `this.image`.
     *
     * @returns A promise that resolves once the image has loaded or rejects if there is an error while loading the image.
     */
    loadImage(): Promise<void>;
    /**
     * Packs all textures in the atlas onto it's canvas.
     *
     * It then loads the canvas as a data URL into `this.image` using `this.loadImage`.
     */
    packTextures(): void;
    /**
     * Draws all textures stored in the atlas onto the canvas.
     *
     * If `this.packTextures` has not been called beforehand then all textures will be drawn over each other or in undesired positions.
     */
    drawTexturesOnCanvas(): void;
    /**
     * Finds the tallest texture in the given list of textures.
     *
     * @param textures The list of textures to search
     * @returns The tallest texture and it's index in `textures`
     */
    private findTallestTexture;
    /**
     * Gets the size of the atlas image.
     *
     * @returns The size of the atlas image
     */
    getSize(): number;
}
