Commit Graph
7 Commits
Author SHA1 Message Date
im0o a72014e419 perf: 抬高对象缓存上限,预览放大时文字和形状锐利到约 6 倍
fabric 给每个对象缓存一张离屏画布,面积超过 perfLimitSizeTotal 时不是裁剪而是
降采样,再放大贴屏,于是边缘发虚。默认 2 Mpx 下一个 960x75 的文本框在 12 倍
缩放时 zoomX 从 12 掉到 3.5。

面积和边长是两道独立的闸:只把面积抬到 8 Mpx,zoomX 只从 3.5 涨到 3.9,紧接着
撞上 maxCacheSideLimit 的 4096。两道一起抬(边长 6144 / 面积 8 Mpx)之后实测
4 倍锐利、6 倍以上封顶在 5.92,覆盖了实际会用到的缩放区间。

只影响预览。导出按画板逻辑尺寸重新渲染,与视口缩放无关。
2026-09-05 18:19:32 +08:00
im0o 40f8acb623 fix: 超过纹理上限的图加滤镜后缺右边和下边
fabric 的 WebGL 滤镜后端建的是一张 config.textureSize 见方(v7 默认 4096)的 GL
画布,copyGLTo2D 却按**图片自然尺寸**去拷源矩形。图片比 4096 大时源矩形超出 GL
画布边界,超出的部分画不出来。

实测:6000x3150 的图加亮度滤镜后只剩左边 683/1078 = 0.683 的宽度,
正好是 4096/6000 = 0.6827。

调大 textureSize 不是办法——GL 画布是正方形且一次性分配,8192 就是 268 MB,
本机 GPU 上限 16384 是 1 GB,而且更大的图照样溢出。改成导入时把长边压到
运行时的 config.textureSize:这个工具导出 1200x630 量级的封面,4096 的长边
远超需要,成品里看不出差别,还顺带省内存和导出耗时。
2026-09-05 18:15:11 +08:00
im0o 19c8c604cb chore: 本轮改造的共享契约与占位——ToolId/ShapeKind/LayerKind 扩充、Dropdown 壳、形状表、三个菜单与两个 composable 的桩 2026-09-05 17:56:10 +08:00
Jz0ojiang a61eeb590d fix: 选中变化也要发 revision 信号
syncSelection 只更新 activeObject,不 bump revision。于是在画布上点选
另一个对象时,所有从 revision 推导选中态的视图会停在旧值——图层面板的
高亮首当其冲。T6 在自己文件里绕过去了,根因在内核。
2026-09-05 02:39:25 +08:00
Jz0ojiang 8934f374bb feat: Figma 式外壳与编辑器内核
布局改成 顶部工具栏 / 左图层 / 中画布 / 右属性 / 底部悬浮胶囊。

新内核:
- 图层模型:fabric 对象是唯一真源,LayerInfo 是只读投影;
  id/名字/锁定挂在 customProperties 上,随 toJSON 持久化
- 视口:zoom/pan 走 viewportTransform,只影响显示;
  导出改为按视口裁剪(artboardExportOptions),旧的「multiplier 恒为 1」
  在画布铺满工作区之后不再成立
- 历史:快照式撤销重做,30 步上限,带重入保护
- 命令表:快捷键 / 右键菜单 / 工具栏三个入口共用一份注册表
  键位取自 Penpot 快捷键表
- 画板用 backgroundImage 画(跟随视口且不进 getObjects)

两个 fabric 陷阱已在注释里记下:
- Rect 默认原点是中心,left:0/top:0 不写 originX/originY 会画错位置
- canvas.clipPath 不吃 viewportTransform,不能用来裁画板
2026-09-05 02:18:20 +08:00
Jz0ojiangandim0o 5b46e84a44 fix: 背景图沉到最底层,否则盖住先加的文字
addImage 用 canvas.add() 追加,图片落在最上层。浏览器验收时发现
先加文本框再装背景,文字被整块盖住。

(cherry picked from commit 822fd79e1ca2df76c49c1dff33fa5cc0fa01cc93)
2026-09-04 16:38:56 +08:00
Jz0ojiang 95eeb69ff8 feat: 骨架——Vite + Vue3 + Fabric v7,左工作区右侧栏
共享外壳与类型契约,四条并行开发线在此之上各自填空:
- types.ts 是唯一的跨线接口,并行期间冻结
- editor/ 画布单例、选中态、尺寸预设与比例锁
- Sidebar 按选中对象切换面板,五个面板位已接好
- fonts/ filters/ sources/ io/ 留桩,各线只改自己目录

导出定 WebP:实测 540x287 PNG 134KB vs 1200x630 WebP 23KB。
字体接口挂在 Vite 中间件上,工具只在 dev 下完整可用。
2026-09-04 15:42:27 +08:00