import { fabric } from 'fabric';
import type { FabricTexture } from '../fabric-texture.class';
import type { Texture } from '../texture.class';
import BaseMode from './base.class';
/**
 * 贴图变形区域的顶点类型枚举
 *
 * 用于标识变形区域四个角的位置。
 *
 * @enum {string}
 */
export declare enum VertexType {
    /** 左上角顶点 */
    TOP_LEFT = "tl",
    /** 右上角顶点 */
    TOP_RIGHT = "tr",
    /** 左下角顶点 */
    BOTTOM_LEFT = "bl",
    /** 右下角顶点 */
    BOTTOM_RIGHT = "br"
}
/**
 * 倾斜模式配置
 */
interface SkewOptions {
    /**
     * 是否启用空白区域拖拽调整功能
     *
     * 启用后：
     * - 可以在画布空白处拖拽来调整变形区域
     * - 最小拖拽区域为 50x50 像素
     *
     * @default true
     */
    enableDragResize?: boolean;
}
/**
 * 倾斜变形模式类
 *
 * 提供图像的倾斜变形功能，通过四个边的拖拽控制点实现自由倾斜效果。
 *
 * 主要特性：
 * - 四边独立控制：每条边都有独立的拖拽控制点
 * - 智能吸附：拖拽时自动吸附到合适的倾斜角度
 * - 实时预览：拖拽过程中实时显示变形效果
 * - 防止变形过度：内置边界检查机制
 *
 * 交互方式：
 * - 拖拽边缘控制点：调整单边倾斜角度
 * - 空白处拖拽：快速调整整体大小
 * - 支持撤销/重做
 *
 * @example
 * ```typescript
 * // 1. 基础用法
 * const canvas = new fabric.Canvas('canvas');
 * const fabricTexture = new FabricTexture(canvas);
 *
 * // 创建倾斜模式并应用到图像
 * const skew = new Skew('#FF0000');  // 使用红色主题
 * fabricTexture.enterEditing(image, null, skew);
 *
 * // 2. 自定义拖拽图标样式
 * const skew = new Skew()
 *   .setStyleSetters({
 *     dragIcon: (icon) => {
 *       icon.set({ opacity: 0.8 });
 *       return icon;
 *     }
 *   });
 *
 * // 3. 隐藏原始对象（可选）
 * image.set({ visible: false });
 * canvas.renderAll();
 * ```
 *
 * @remarks 原始对象默认保持可见，需要手动隐藏
 *
 * @see
 * - {@link BaseMode} 变形模式基类
 * - {@link FabricTexture} 主要功能类
 */
declare class Skew extends BaseMode<{
    /**
     * 可配置拖动图标样式的方法
     * @param object - 默认的拖动图标对象
     * @returns 作为拖动图标对象的fabric元素对象，可使用默认对象以外的新对象
     */
    dragIcon: (object: fabric.Group) => fabric.Object;
}> {
    /**
     * 变形模式的唯一标识名称
     */
    name: string;
    /**
     * 模式配置
     */
    options: Required<SkewOptions>;
    /**
     * 样式设置器集合
     *
     * 用于自定义倾斜变形模式中各种元素的样式：
     * - texture: 配置变形后的贴图样式
     * - path: 配置网格边界线的样式
     * - dragIcon: 配置拖拽控制点的样式
     *
     * @example
     * ```typescript
     * skew.setStyleSetters({
     *   // 自定义拖拽图标样式
     *   dragIcon: (icon) => {
     *     icon.set({
     *       opacity: 0.8,
     *       scaleX: 1.2,
     *       scaleY: 1.2
     *     });
     *     return icon;
     *   }
     * });
     * ```
     *
     * @protected 仅供子类访问和修改
     */
    protected _styleSetters: {
        texture: () => void;
        path: () => void;
        dragIcon: (object: fabric.Group) => fabric.Group;
    };
    /**
     * 控制点映射表
     *
     * 存储控制点与其相关数据的映射关系，包括：
     * - curve: 控制点所在的贝塞尔曲线
     * - rowIndex: 控制点所在的网格行索引
     * - colIndex: 控制点所在的网格列索引
     * - vertexTypes: 控制点影响的顶点类型数组
     *
     * @internal 仅供内部使用
     */
    private _objectControlMap;
    /**
     * 构造函数
     *
     * 创建一个倾斜变形模式实例。
     *
     * @param themeColor - 主题色，用于控制点的背景色，默认为 THEME_COLOR
     * @param subThemeColor - 副主题色，用于辅助元素的颜色，默认为 SUB_THEME_COLOR
     */
    constructor(themeColor?: string, subThemeColor?: string, options?: SkewOptions);
    /**
     * 创建拖拽控制图标
     *
     * 创建一个双向箭头的拖拽控制图标，用于调整倾斜角度。图标包含：
     * - 圆角矩形背景
     * - 双向箭头图标
     * - 自适应旋转
     *
     * 样式特点：
     * - 背景：46x18 像素，圆角 10px
     * - 箭头：白色填充
     * - 边框：2px 白色描边
     * - 缩放：整体缩放到 0.8 倍
     * - 定位：居中对齐
     *
     * @param themeColor - 控制图标的背景颜色
     * @returns {fabric.Group} 返回组合的 Fabric 对象
     *
     * @example
     * ```typescript
     * // 创建一个红色背景的控制图标
     * const icon = Skew.createDragIcon('#FF0000');
     * canvas.add(icon);
     * ```
     */
    static createDragIcon(themeColor: string): fabric.Group;
    /**
     * 执行倾斜变形的网格分割算法
     *
     * 根据贴图的网格线计算所有交点坐标，生成变形后的网格点阵。
     *
     * 算法步骤：
     * 1. 遍历网格的行和列
     * 2. 计算每个网格单元的垂直和水平线段
     * 3. 计算所有线段的交点坐标
     * 4. 生成最终的分割点数组
     *
     * @param texture - 需要进行倾斜变形的贴图对象
     * @returns {Coord[][][]} 返回三维数组，表示网格的分割点坐标：
     * - 第一维：行索引
     * - 第二维：列索引
     * - 第三维：点的坐标 {x, y}
     *
     * @example
     * ```typescript
     * const points = Skew.execute(texture);
     * // points[0][0][0] 表示左上角第一个分割点的坐标
     * ```
     */
    static execute(texture: Texture): Coord[][][];
    /**
     * 获取所有控制点对象
     *
     * 返回当前倾斜变形模式中的所有控制点对象。用于：
     * - 批量修改控制点样式
     * - 控制点的显示/隐藏
     * - 获取控制点位置信息
     *
     * @returns {fabric.Object[]} 所有控制点对象的数组
     */
    get controlObjects(): fabric.Object[];
    /**
     * 执行倾斜变形计算
     *
     * 代理方法，调用静态方法 {@link Skew.execute} 进行实际的倾斜变形计算。
     *
     * @param texture - 需要进行倾斜变形的贴图对象
     * @returns 返回计算后的网格分割点坐标数组
     * @see {@link Skew.execute} 具体实现细节
     */
    execute(texture: Texture): Coord[][][];
    /**
     * 渲染倾斜变形的交互界面
     *
     * 在画布上创建并管理倾斜变形的交互控制界面。主要功能：
     *
     * 1. 控制点管理
     * - 为每条边创建双向箭头控制点
     * - 自动计算控制点位置和角度
     * - 保持控制点始终在最上层
     *
     * 2. 交互功能
     * - 拖拽边缘控制点：调整单边倾斜角度
     * - 空白处拖拽：快速调整整体大小
     * - 智能吸附：自动对齐到水平或垂直位置
     *
     * 3. 数据同步
     * - 实时更新贴图顶点坐标
     * - 自动记录可撤销的操作历史
     * - 防止无效的变形操作
     *
     * @param fabricTexture - FabricTexture 实例
     * @returns {Function} 返回清理函数，用于移除所有控制点和事件监听器
     *
     * @example
     * ```typescript
     * // 进入倾斜编辑模式
     * const cleanup = skew.dirtyRender(fabricTexture);
     *
     * // 退出编辑模式时清理
     * cleanup();
     * ```
     *
     * @remarks
     * 1. 控制点样式可通过 setStyleSetters 自定义
     * 2. 拖拽区域小于 50x50 像素时不会触发变形
     * 3. 变形操作会自动记录到历史栈中
     */
    dirtyRender(fabricTexture: FabricTexture): (() => void) | undefined;
}
export default Skew;
