Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 54 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,52 @@

本文件记录 MoonSprite 的用户可见变化。格式参考 Keep a Changelog;开发阶段使用 `DEV`,正式发布时再归入具体 SemVer。

## DEV.1
## DEV.2

### 交互改进
- 工具栏主按钮和顶部属性栏会立即显示当前选区或形状子工具的图标、名称与描述;全部子工具图标提前解码,并修正矩形、矩形填充、椭圆和椭圆填充图标对应关系。
- 多边形套索在中键或 `Space` 平移画布期间保持边界预览;选区工具按住 `Shift` 或右键时,顶部组合模式临时显示加选或减选,松开后恢复原设置。
- 首选项新增独立“工具预览”分类;“使用本地指针”明确为开启时使用系统指针、特殊场景回退 MoonSprite 指针。图层属性颜色预设改用与透明背景颜色一致的普通设置布局。
- 文件拖入同时监听 Tauri Webview 与 Window 原生通道,单一通道失效时仍可打开 `.moonsprite`、`.ase`、`.aseprite` 和支持的图片格式。
- 框选四角角标改为固定 CSS 线宽并保持至少 `8 x 8 px` 的视觉范围,视图缩放或悬停画布外时仍清晰显示;多边形套索使用指针源工程第 4 列第 6 行图标,并支持点击起点、双击或 `Enter` 闭合,`Esc` 取消。
- 图层和组支持混合 `Ctrl`/`Shift` 多选及一次 `Delete` 批量删除;组与普通图层按各自选择上下文粘贴到正确层级,所有粘贴对象置于目标容器顶部。
- 首选项新增默认开启的“直线算法优化”,Shift 连接画笔两点或建立多边形套索边界时生成长度相近的像素阶梯,预览与最终结果保持一致。
- 所有主工具、选区子工具和形状子工具统一使用包含名称、简短用法和当前快捷键的自定义悬浮提示;多边形套索默认快捷键改为 `Shift+Q`,并一次性迁移旧版空快捷键。
- 形状子工具替换为指针源工程第 5 行第 3 至 6 列的新图标;首选项新增全局“图层属性颜色预设”,支持新增、编辑、删除和恢复默认,所有工程共用。
- 修复未闭合的多边形套索在中键或 `Space` 平移画布后丢失顶点的问题;修复 `Shift` 加选和右键减选期间旧蚂蚁线被隐藏的问题,单击取消只在松开且确认没有拖动后执行。
- 修复矩形和椭圆框选按住 `Shift` 无法固定等宽高、拖动期间提前显示蚂蚁线、画布外错误显示预览像素及多边形套索双击偶发无法闭合的问题。
- 形状固定比例保存值最多保留一位小数;大画布预览改为在最终显示阶段按主画布规则绘制棋盘格,避免降采样产生密集纹理。
- 前景色和背景色改为所有打开工程共享;调色板选色后切换项目不再回退。颜色编辑器标题明确标注前景色/背景色,未移动时失焦关闭,拖动后常驻,并支持独立八向缩放和尺寸记忆。
- 修复描边弹窗按 `Enter` 时全局选区命令抢先执行而导致未写入像素的问题;非矩形选区内不连续油漆桶不再越界。`Ctrl+H` 只隐藏蚂蚁线并保留八个变换点,选区拖到视口边缘时会自动平移画布。
- 框选默认只显示当前像素四角角标;首选项可改为同时显示真正的鼠标十字指针。按住 `Shift` 加选时保持角标,进入变换命中区时隐藏角标。选区第一次移动后保持浮动,后续多次移动持续复用首次捕获的内容和背景,不污染经过区域。
- 复制图层组后粘贴到当前选中对象的父级并与其同层,内部嵌套结构保持;多选后普通单击恢复单选。锁定对象仍可编辑名称、显示颜色和描述,但混合模式与不透明度保持冻结;未锁定组显示正确的解锁图标。
- 图层栏标题移除“向下合并”和“解组”按钮;最末项为组时,其紧凑下边缘可作为根层最底部落点,蓝线与实际排序一致。
- 选区工具新增当前像素格四角角标;减选和交集在已有选区内部保持选区指针。新建模式只有真实拖动才建立选区,画布内外单击不再误生成边缘 1 像素选区。
- 新增 `Ctrl+Shift+I` 反选选区和 `Ctrl+H` 隐藏/显示蚂蚁线,分别加入“编辑”和“图层”菜单;蚂蚁线显隐不删除选区,也不进入撤销历史。
- 前景色和背景色编辑器可同时常驻、独立拖动与关闭;通道滑条与数值框等高,尺寸限制在合理范围,关闭后重新打开回到默认位置。调整弹窗连续滑块预览按动画帧合并,减少拖动时的重复计算。
- 修复图层拖到栏目顶部时蓝线仍显示在底部、首项为组时无法置顶、无选择新建组误收纳图层、新图层未继承当前组,以及祖先组锁定后后代仍可单独解锁的问题。
- 修复半透明图层打开画布大小预览后视觉变亮;快捷键录入框优先接收完整多修饰键组合,不再被 MoonSprite 应用命令提前截断。
- 图层栏移除“移到最外层”专用放置区;空组与非空组都可和普通图层统一排序并持久保持位置,新建项置顶,拖出栏目上下边界可直接移动到首尾,插入线按最终层级对齐。组和图层使用一致选中样式,眼睛、锁和组文件夹交互不再误开属性。
- 图层属性改为操作即实时保存,关闭、遮罩或 `Esc` 不再回滚;图层选择改为 `Ctrl` 离散多选、`Shift` 连续范围选择。
- 选区移动框只命中真实蚂蚁线;新增多边形套索、套索闭合预览偏好和右键减选,按住 `Shift` 开始选择时可绕过已有变换继续加选。
- 形状工具新增空心矩形、空心椭圆和宽、高双输入的固定比例;自动选层移动在透明位置回退当前选中图层。
- 亮度/对比度、色相/饱和度、色彩平衡和曲线会动态跟随选区或多选图层变化,预览切换目标时不累积旧结果,并作为一次撤销提交。
- 所有正式弹窗统一支持拖动、边框外侧八向缩放、合理最小/最大尺寸和独立位置记忆;调整、画布大小和图像大小默认位于视图中心与右边缘之间,状态提示移到视图上方,并移除外壳的多余滚动条。外侧把手不再被弹窗裁切或把拖拽穿透到画布。
- 修正调整、画布大小和图像大小弹窗的旧位置记忆,使弹窗中心准确落在目标点;弹窗缩小时不再出现外壳滚动条,状态提示下移以避开顶部工具属性栏。
- 图层栏空白处可清除多选;空图层组支持 `Delete` 删除,锁定图层、锁定组及其后代禁止编辑、删除和拖动。插入预览线按实际目标父组层级缩进,拖到栏目首尾安全带可稳定放到最上方或最下方。
- 快捷键录入支持完整多修饰键组合,不再在第一个修饰键按下时提前保存;套索新建模式区分单击取消和同像素格拖动,减选、交集可在已有选区内部直接开始,移动图层时选区同步移动。
- 首选项将“套索选区预览闭合”默认设为关闭,并新增默认关闭的“吸管取色后切回铅笔”;色相/饱和度新增独立 HSL 明度,颜色值弹窗支持拖动和关闭,形状固定比例可交换宽高。
- 画布最终合成改为单张连续表面输出,小中型文档按脏矩形局部刷新,超大文档按可见区域连续合成,从根源移除非整数缩放、连续绘制和半透明图层中的 128px 分块切割线;更新油漆桶工具图标。
- 首页工程列表改为先显示文件行,再以最多 3 项并发渐进加载缩略图,并在会话内复用未变化的预览;读取失败的最近记录可单独移除且不会删除原文件,画廊删除工程继续要求二次确认。
- `Delete`、`Ctrl+C` 和 `Ctrl+V` 现在根据最后点击或键盘聚焦的画布、图层、调色板区域执行,不再被遗留选区抢占;删除嵌套图层组会完整移除组结构并可一次撤销,拒绝删除最后一层时不再误标未保存。
- 支持跨项目复制和粘贴多个图层及嵌套图层组,保留顺序、偏移、可见性、锁定、透明度、混合模式、显示颜色和描述,整批操作可一次撤销。
- 弹窗 `Esc` 改为每次只关闭最上层界面;调整弹窗取消时恢复打开前状态,图层属性关闭时保留实时修改,快捷键设置只有点击“完成”才保存草稿。
- “编辑 > 选择性粘贴”新增粘贴为新项目和粘贴为新图层;新图层默认使用 `Ctrl+Shift+V`,来源位置仍在可见视图时原位粘贴,否则放到当前视图中心。
- 修复自由套索和多边形套索在非等长路径上进入死循环导致界面卡住的问题,已有选区内部按住 `Shift` 时同步显示组合预览。
- 非整数缩放改为始终使用一致的分块合成路径,修复 313% 等倍率下落笔瞬间已有像素局部抖动。
- “另存为”会读取首选项中的默认保存格式,选择 PNG、JPEG 或 WebP 时明确提示不会保留图层和工程结构。
- 首选项重置增加统一危险确认,只清除软件配置,不删除用户创建的工程、笔刷、色板、工作区或其他磁盘文件;未完成的英语入口暂时隐藏。
- 自定义笔刷三种模式改用统一主题下拉并补充平铺/盖章说明,详情预览恢复显示笔刷原始多色像素。
- 调色板颜色格恢复为两套明确状态:前景色右上角、背景色左下角角标永久保留;左键或右键点击的颜色格显示临时蓝色描边,颜色格失焦后仅隐藏描边。
- 修复热更新或焦点切换漏掉修饰键释放后,所有工具指针错误保持为吸管的问题;画布指针事件现在会重新校正 `Alt/Ctrl` 状态。
- 修复图层栏目漏掉 `Alt` 释放事件后持续显示复制指针的问题;图层栏现在会用最新鼠标事件校正复制状态。
Expand Down Expand Up @@ -66,8 +109,6 @@
- 固定前端依赖版本,避免 `latest` 引入不可预测升级。
- 建立本地 Git 基线和 GitHub 持续集成流程。
- 增加隔离运行的 Windows 桌面回归测试,覆盖启动、工具切换、旋转视图、高级模式、菜单与无效撤销。
## DEV

### 维护性改进

- 提取快捷键和编辑器首选项的类型化持久化边界,集中处理默认值、非法值和范围限制。
Expand All @@ -93,7 +134,16 @@
- 新增 128、512、1024 画布的自动交互性能基准;统一画布渲染几何、缓存舞台尺寸并减少分块绘制的重复变换,连续绘制开始不再触发冗余全局刷新。
- 性能基准新增按区域 React 提交测量;颜色、色板、图层和预览栏目改为按实际数据变化刷新,1024 画布平移、旋转后缩放和连续绘制的 React 提交耗时中位数分别下降约 24%、33% 和 18%。
- 将文档标签、工具栏、工具属性栏、状态栏、画布主机和编辑器布局外壳从 `App.tsx` 拆分为独立刷新边界;1024 画布平移、旋转后缩放和连续绘制的 React 提交耗时相对上一阶段进一步下降约 82%、93% 和 66%。
## 未发布
### 本次补充修复

- 修复已经通过 `Ctrl` 复制出的浮动选区无法继续复制移动的问题;每次新复制先确认当前副本,再从当前位置重新捕获内容,支持连续重复复制和逐次撤销。
- 所有支持 `Delete` 的画布、图层、图层组和调色板删除操作同时支持 `Backspace`,文本输入中的退格不受影响。
- 文件拖入改为统一平台服务,HTML、Webview、Window 和 Rust 通道独立订阅、统一去重;单通道失败不再拖垮其他入口,并在窗口重新获得焦点时自动重试。
- 子工具图标改为工具栏挂载时常驻预载,选择子工具后主按钮立即切换;首选项尺寸、倍率和图层颜色预设改用组件库统一删除图标按钮,颜色框与按钮等高。
- 修复选区描边弹窗焦点仍在画布时按 `Enter` 无响应的问题,并将描边参数作为工程设置随 `.moonsprite` 保存和恢复。
- 修复多边形套索预览被折成矩形路径的问题,顶点之间恢复为像素直线;选区创建路径只在有效画布内显示,松开前不显示新蚂蚁线。
- 多选图层创建组时保留最上方成员的原位置和成员顺序;粘贴图层组后同时选中全部新增组与图层。
- 修复大画布在预览栏目缩小时透明棋盘格产生密集条纹和摩尔纹的问题。

- 所有统一数值输入框支持 `+ - * /` 和括号表达式,提交后自动计算并遵守原字段范围。
- “窗口 > 旋转视图”改为顺时针/逆时针旋转 90°,两项命令可在快捷键设置中自定义。
Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
- [架构概览](architecture/overview.md):模块职责和依赖方向。
- [状态与历史](architecture/state-history.md):会话、dirty、撤销和视图状态。
- [坐标与渲染](architecture/coordinates-rendering.md):屏幕、视图、画布和图层坐标。
- [文件格式](file-format.md):`.moonsprite` v1 容器。
- [文件格式](file-format.md):`.moonsprite` v2 容器。

## 交互契约

Expand Down
4 changes: 3 additions & 1 deletion docs/architecture/coordinates-rendering.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ layer -> canvas -> view rotation -> viewport -> screen
- 视图变换的正向顺序固定为“绕同一枢轴旋转,再执行水平/垂直镜像”;缩放锚点补偿必须复用该顺序,不能在组件内自行交换矩阵步骤。
- 像素写入使用向下取整后的文档坐标;选区手柄、边缘和旋转区命中使用未取整的连续文档坐标,禁止先取整再判断屏幕距离。输入命中与预览必须共享同一视图逆变换。
- 画布旋转后不得出现像素内部描边、白线或图块接缝。
- 高 DPI 工具预览的相邻文档像素必须共享同一设备像素边界;矩形边界按 `devicePixelRatio` 对齐后再换回 CSS 坐标。旋转离屏画布回绘时使用实际 backing 尺寸除以 DPR,不得把向上取整后的设备像素再次压回理论 CSS 尺寸。
- 蚂蚁线和变换手柄使用屏幕像素绘制,缩放后保持清晰,不参与像素图层合成。
- 画布左下角尺寸和镜像提示共用同一前景色;根据提示位置下方的合成像素、透明棋盘或工作区背景亮度选择深色或浅色,不写入文档像素。
- 曲线调整器的直方图只从调整开始时的活动图层快照统计,作为半透明编辑辅助,不写入文档、不参与调整结果。
Expand All @@ -34,7 +35,8 @@ layer -> canvas -> view rotation -> viewport -> screen
- `core/canvas-render-plan.ts` 统一计算反解旋转与水平/垂直镜像后的可见范围、离屏场景边界、画布原点和可见文档像素;组件不得再复制这些计算。镜像枢轴偏离视口中心时,离屏场景也必须覆盖镜像后的完整视口。
- 调整画布尺寸预览固定按“新增区域棋盘、图层内容、旧画布外黑色遮罩、边界线”绘制,确保原本位于画布外的图层像素可见但仍明确标识为新增画布区域。
- `CanvasStage` 的绘制尺寸由 `ResizeObserver` 缓存。指针命中仍读取实时屏幕边界,避免停靠布局变化后坐标失真。
- `CanvasCompositeCache` 在一次分块绘制中只应用一次平移和缩放变换,tile 只负责缓存像素和提交 `drawImage`。
- `CanvasCompositeCache` 的最终显示来源必须是一张连续表面,禁止把 128 px tile 分别缩放后直接提交到主画布。小中型文档复用完整表面并按脏矩形局部更新;超出完整表面上限的文档先把当前可见文档区域合成为单张临时表面,再用一次 `drawImage` 输出。
- 非整数缩放、连续绘制和半透明图层必须经过同一连续表面路径。缓存分块可以作为内部计算策略,但不得成为最终显示边界,也不得在邻接处重复叠加透明像素。
- 画布性能探针默认不工作,只有自动基准注入 `window.__moonSpriteCanvasProbe` 时才记录主绘制和指针处理耗时。

任何坐标 Bug 修复都应包含未旋转、旋转、不同缩放、图层偏移和画布外内容五类测试。
10 changes: 8 additions & 2 deletions docs/architecture/state-history.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,14 @@ MoonSprite 状态分为四类:
| --- | --- | --- | --- |
| 文档内容 | 像素、图层、调色板、项目笔刷 | 工程文件 | 是 |
| 临时编辑 | 浮动粘贴、正在绘制、变换预览 | 仅会话 | 确认后一次进入 |
| 视图状态 | 平移、缩放、旋转、镜像、网格 | 工作区或本地设置 | 否 |
| 视图状态 | 平移、缩放、旋转、镜像、网格、蚂蚁线显隐 | 工作区或本地设置 | 否 |
| 应用状态 | 当前工具、弹窗、栏目布局、首页栏目 | 本地设置或工作区 | 否 |

## 历史规则

- 每个历史条目必须包含恢复前后状态所需的最小数据。
- 连续拖动、画笔笔划、复制并移动等一次手势只产生一个历史条目。
- 移动工具同时移动图层与已有选区时,两者属于同一次手势和同一个历史条目;Undo/Redo 必须同步恢复图层偏移和选区位置。
- 取消操作不得产生历史条目或 dirty 状态。
- Undo/Redo 仅改变文档历史,不能撤销平移、缩放、旋转、镜像或工具切换。
- 保存成功后记录当前历史位置为保存点;回到保存点时 dirty 应恢复为 false。
Expand All @@ -23,9 +24,14 @@ MoonSprite 状态分为四类:
## 临时状态提交

- 浮动粘贴在切换文档、保存或开始不兼容操作前必须明确提交或取消。
- 实时预览只改变派生显示,不反复写入历史。
- 实时预览只改变派生显示,不反复写入历史。连续滑块输入按动画帧合并,同一帧最多计算一次,并在应用时使用最后一个输入值。
- 调整弹窗确认时写入一次历史;取消时恢复原数据。
- 调整快照可以包含多个目标图层及共享调色板;无选区时全部选中图层组成一个复合历史,有选区时只记录活动图层。预览期间切换选择目标必须先恢复旧快照再捕获新快照,禁止在预览结果上重复叠加。
- 带实时预览或草稿的调整弹窗必须区分提交与取消:`Enter` 或明确确认提交一次,`Esc`、关闭按钮和遮罩取消并恢复打开前状态。图层属性是实时提交面板,每次修改立即进入文档历史,`Esc`、关闭按钮和遮罩只关闭面板并保留当前值。全局 `Esc` 使用定向关闭事件,每次只关闭当前最上层弹窗或浮层;未命中的笔刷、工具、项目标签和栏目浮层不得被顺带关闭。
- 快捷键设置在弹窗内使用草稿;只有点击“完成”才持久化,关闭或 `Esc` 不得保存未确认修改。首选项的“应用”是唯一保存但不关闭窗口的设置命令。
- 图层 Alt 拖动复制与最终移动共同组成一个事务。
- 跨文档粘贴多层或嵌套图层组时,整批新增结构组成一个历史条目;一次撤销必须同时移除所有新图层和新图层组并恢复原选择。
- 所有图层组只要具有有效 `panelOrder`,都优先以该锚点参与图层栏排序,不因组内是否有子图层而改变。拖拽更新与撤销必须同时恢复父组、组顺序、图层顺序和该锚点。
- 从首页恢复草稿成功后必须进入对应文档会话;失败时保持恢复记录并停留在首页。
- 已有本地路径的普通保存直接完成,不显示进度弹窗;首次保存和另存为才显示紧凑进度反馈。

Expand Down
2 changes: 1 addition & 1 deletion docs/file-format.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

`.moonsprite` 是 ZIP 容器,包含:

- `manifest.json`:文档元数据、调色板、图层顺序、动画时间轴和格式版本
- `manifest.json`:文档元数据、调色板、图层顺序、动画时间轴、选区描边设置和格式版本
- `layers/<id>.rgba`:小端序 RGBA 字节,每像素四字节。
- `layers/<id>.idx32`:小端序无符号 32 位稳定调色板 ID。
- `preview.png`:可见图层合成后的预览图。
Expand Down
Loading
Loading