declare namespace Illusion {
    interface Illusion {
        /**
         * 当前画布
         *
         * @type {HTMLCanvasElement}
         * @memberof Illusion
         */
        canvas: HTMLCanvasElement;
        /**
         * 初始化 world 全局只有一个 world
         * 传入 zip，获取到滤镜
         *
         * @param {number} left
         * @param {number} top
         * @param {number} width
         * @param {number} height
         * @param {string} zipFilePath
         * @memberof Illusion
         */
        initStage(left: number, right: number, width: number, height: number, zipFilePath: string, debug: Boolean): void;
        /**
         * 创建窗口
         * @note 可以允许多个窗口
         * 但是不建议多个，需要管理多个窗口的资源
         *
         * @returns {number}
         * @memberof Illusion
         */
        createWindow(): number;
        /**
         * 销毁窗口，如果
         *
         * @returns {boolean}
         * @memberof Illusion
         */
        destroyWindow(windowId: number): boolean;
        /**
         * 创建实体，需要关联当前的 windowId
         *
         * @returns {number}
         * @memberof Illusion
         */
        createEntity(windowId: number): number;
        /**
         * 设置实体的宽高
         *
         * @param {number} width
         * @param {number} height
         * @memberof Illusion
         */
        setEntityRect(entityId: number, left: number, top: number, right: number, bottom: number): void;
        /**
         * 删除实体，成功则返回 true， 失败则返回 false
         *
         * @returns {boolean}
         * @memberof Illusion
         */
        destroyEntity(entityId: number): boolean;
        /**
         * 设置其他纹理作为混合
         *
         * @param {number} entityId
         * @param {string} filterIndex
         * @param {string} filepath
         * @param {number} input
         * @memberof Illusion
         */
        setEntityTextureIput(entityId: number, filterIndex: string, filepath: string, input: number): void;
        /**
         * 设置实体的纹理
         *
         * @param {string} filePath emscripten 中的虚拟文件路径
         * @memberof Illusion
         */
        setEntityTexture(entityId: number, filePath: string, rotation?: number, x?: number, y?: number, width?: number, height?: number): void;
        /**
         * 更新窗口大小
         *
         * @memberof Illusion
         */
        setWindowRect(windowId: number, left: number, top: number, width: number, height: number): void;
        /**
         * 获取当前上下文
         *
         * @returns {CanvasRenderingContext2D}
         * @memberof Illusion
         */
        getContext(): CanvasRenderingContext2D;
        /**
         * 设置实体中的滤镜效果
         *
         * @param {number} entityId
         * @param {string} filter
         * @memberof Illusion
         */
        setEntityFilter(entityId: number, filePath: string, filter: string): void;
        /**
         * 读取文件
         *
         * @param {string} filePath
         * @returns {string}
         * @memberof Illusion
         */
        readFile(filePath: string): string;
        /**
         * 加密文件
         *
         * @param {string} srcPath
         * @param {string} dstPath
         * @returns {string}
         * @memberof Illusion
         */
        encryptFile(srcPath: string, dstPath: string): void;
        /**
         * 设置层级
         *
         * @param {number} entityId
         * @param {number} order
         * @returns {string}
         * @memberof Illusion
         */
        setEntityZOrder(entityId: number, order: number): void;
        /**
         * 设置层级
         *
         * @param {string} filePath
         * @returns {string}
         * @memberof Illusion
         */
        setEntityBlend(entityId: number, fs: string, vs: string): void;
        /**
         * 设置实体是否显示
         *
         * @param {string} filePath
         * @returns {string}
         * @memberof Illusion
         */
        setEntityVisible(entityId: number, visible: boolean): void;
        /**
         * 添加滤镜链
         *
         * @param {number} entityId
         * @param {string} preIndex
         * @param {string} filePath
         * @param {string} filter
         * @memberof Illusion
         */
        addEntityFilter(entityId: number, preIndex: string, filePath: string, filter: string): void;
        /**
         * 删除滤镜链
         *
         * @param {number} entityId
         * @param {string} preIndex
         * @memberof Illusion
         */
        removeEntityFilter(entityId: number, preIndex: string): void;
        /**
         * 通过文件路径解密 json 字符串
         *
         * @param {string} filePath
         * @returns {string}
         * @memberof Illusion
         */
        decJsonFile(filePath: string): string;
        /**
         * 更新当前 entity 中的滤镜效果
         *
         * @param {string} filterIndex 滤镜当前的索引
         * @param {string} filterString 滤镜字符串
         * @memberof Illusion
         */
        updateEntityFilter(entityId: number, preIndex: number, filterIndex: number, filterString: string): void;
        /**
         * 更新强度
         *
         * @param {number} entityId
         * @param {number} strong
         * @memberof Illusion
         */
        updateFilterStrongValue(entityId: number, strong: number): void;
        /**
         * 创建 webgl 上下文
         *
         * @memberof Illusion
         */
        createWebGLContext(width: number, height: number, id: string, parent: HTMLElement): WebGLRenderingContext;
        /**
         * 清空 webgl 上下文绑定
         *
         * @memberof Illusion
         */
        clearContext(): void;
        /**
         * 释放内部资源和内存
         *
         * @memberof Illusion
         */
        destroyAllResource(): void;
        /**
         * 销毁所有，关闭渲染系统
         *
         * @memberof Illusion
         */
        destroy(): void;
        /**
         * 渲染回调
         *
         * @param {number} currentClockMS 上一帧到当前帧到时间，可以用来更新动画、粒子等使用
         * @memberof Illusion
         */
        renderFrame(currentClockMS: number): void;
        /**
         * 创建文件目录
         *
         * @param {string} parent
         * @param {string} dir
         * @returns {(string | null)}
         * @memberof Illusion
         */
        createFolder(parent: string, dir: string): string | null;
        /**
         * 将 buffer 写入内存中，获取到 emscripten 的虚拟文件路径
         *
         * @param {ArrayBuffer} buffer
         * @param {string} name 文件名
         * @returns {Promise<string>}
         * @memberof Illusion
         */
        writeFileToMemory(buffer: ArrayBuffer, name: string): string;
        /**
         * 更新混合参数
         *
         * @param {number} entity
         * @param {string} json
         * @memberof Illusion
         */
        updateBlendParameterValue(entity: number, json: string): void;
        /**
         * 解压 zip 包
         *
         * @param {File} file
         * @returns {Promise<any[]>}
         * @memberof Illusion
         */
        unCompressZip(file: File): Promise<any[]>;
        /**
         * 设置纯色矩形
         *
         * @memberof Illusion
         */
        setEntityTextureRect(entityId: number, rect: Illusion.IRect, rgba: Illusion.IRgba, input: number): void;
    }
    interface IParams {
        [propName: string]: any;
    }
    interface IRgba {
        r: number;
        g: number;
        b: number;
        a: number;
    }
    interface IRect {
        left: number;
        right: number;
        top: number;
        bottom: number;
    }
    interface IStrongItems {
        id: number;
        params: IParams[];
    }
    enum strongType {
        Default_Strong = 1,
        Map_Strong = 2
    }
    /**
     * 滤镜
     *
     * @param {enum} strongType 滤镜强度控制类型
     * @param {string} strongItems 容器保存的是自定义的滤镜强度参数
     * @param {string} items 滤镜组
     *
     * @export
     * @interface IFilter
     */
    interface IFilter {
        strongType: strongType;
        strongItems: IStrongItems;
        items: IFilterItems;
    }
    /**
     * 滤镜项
     *
     * @param {string} key 滤镜的 key 值
     * @param {string} vertexShader 顶点文件名
     * @param {string} fragmentShader 片元文件名
     * @param {string} params 参数
     *
     * @export
     * @interface IFilterItems
     */
    interface IFilterItems {
        key: string;
        vertexShader: string;
        fragmentShader: string;
        params: IParams;
    }
}
