Skip to content

Latest commit

 

History

History
209 lines (145 loc) · 19.3 KB

File metadata and controls

209 lines (145 loc) · 19.3 KB

LCD

LCD 是 Lantern 漫画作品的结构协议。本文解释稳定的产品语义、对象归属和写入不变量,不承担源码导航或实现说明。

1. 协议职责

LCD 保存一话漫画已经确认或正在编辑的作品事实,供工作台编辑、候选预览、阅读、导出、保存快照和复制漫画共同使用。

故事层:StoryboardBeat(讲什么)
作品层:PresentationUnit → PageSurface → Frame(怎样组织给读者看)
画面层:Frame → Layer → Element(画格里怎样呈现)
工作流层:Candidate / AgentDraft → ChangeSet → ChangeProposal → WorkingRevision / SavedSnapshot

这些层可以互相引用,不能互相替代。LCD 不保存对话消息、任务进度、选择状态、临时预览、画布图片卡摆放或签名资源 URL。

2. 核心对象

用户概念 协议对象 规则
单格画面 / 分镜条目 StoryboardBeat 叙事计划,保存简短标题和自然语言描述,不是页面元素。
展示单元 PresentationUnit 一次共同阅读与编排的坐标空间。
纸面 PageSurface 最终导出的一张物理页或条漫切片。
画格 Frame 页面上的漫画格容器,拥有形状、位置、层级、阅读关系和格内图层。
格内成稿 ArtElement 固定资产版本在画格中的视觉实例,拥有局部变换与取景。
对白 Dialogue 谁说什么的语义事实。
气泡 BalloonElement 对白在画面中的视觉实例。
文字 TextElement 旁白、说明和拟声字等独立文字实例。

一个 StoryboardBeat 可以尚未进入页面、被多个画格表现,或与其他条目共同进入蒙太奇画格。一个 Frame 最多有一个 primary 叙事引用,并可带多个连续性引用。对白独立于 StoryboardBeat 和气泡,因此修改台词不破坏气泡位置,移动气泡也不改写叙事内容。

3. 作品结构

ComicDocument
├─ reading
├─ resources[]
├─ dialogues[]
└─ units[]
   ├─ surfaces[]
   ├─ frames[]
   │  └─ layers[]
   │     └─ elements[]
   ├─ overlayLayers[]
   └─ readingSequence[]

PresentationUnitPageSurfaceFrame 分别解决共同阅读空间、最终输出切片和画格容器,不能合并成一个通用 Canvas。

展示单元与纸面

  • 单页:一个展示单元包含一张纸面。
  • 真正双页:一个共享坐标空间包含左右两张纸面。跨页对象只保存一次,导出时按纸面裁切。
  • 条漫段:使用纵向长画布;相邻普通段可合并为包含多个 segment 纸面的复合滚动段。跨段对象在共享坐标空间只保存一次,各物理段仍可独立导出。
  • 固定四格:复用页面、画格和阅读顺序协议,不建立另一套元素模型,也不纳入产品推进与验收范围。

展示单元可以保存可选名称;名称为空时,界面根据类型和阅读顺序生成默认名称。修改条漫段比例只改变画布与纸面的底部高度,不缩放或移动既有内容;目标高度不能裁掉任何 Frame。删除展示单元同时删除其阅读顺序项,但一话至少保留一个展示单元。

阅读器把两个相邻单页并排显示只是查看方式,不会自动制造真正双页。真正双页在任何查看模式下都保持完整;相邻普通页和滚动段只有经过显式合并,才获得共享坐标空间。页面角色为 storycoverinterlude:封面至多一个且固定在一话首位,不占用正文物理页码并保持单页;只有同角色的正文页或过场页可合并为真正双页,角色创建后不可更改。

4. 画格、图层与元素

Frame 是格内内容的父容器。每个 Frame 可以包含:

  • ArtLayer:成稿、背景、前景、人物和道具图片。
  • TextLayer:气泡、旁白、说明和拟声文字。
  • EffectLayer:速度线、网点、聚焦和其他画格内效果。

图层具有明确的 zIndex、显示、锁定和 overflow 语义;元素只能进入与类型匹配的图层。画格形状、边框、遮罩与内容分离,无框、矩形、多边形和椭圆都不需要改变格内元素结构。

页边出血仍是普通 Frame。bleedEdges 分别记录上、右、下、左是否延伸到所属 PageSurface 边界;开启某边时 geometry 覆盖至该边界,mask.modebleed,格内内容继续按画格形状裁切,仅省略对应页边的边框。四边可独立组合,未开启的边保持原边框;真双页的普通画格以所属 surface 为边界,跨页格以完整展示单元为边界。

普通矩形画格可以直接调整为四角多边形。四个点按左上、右上、右下、左下顺时针保存为 Frame.shape.points,使用画格包围盒内的归一化坐标;Frame.geometry 始终保存实际四边形的包围盒。一次角点调整只沿横轴或纵轴移动一个点,向外移动时重新计算包围盒并归一化其他点,不改写格内元素、阅读顺序或层级。格内裁切、边框、工作台、预览和导出都读取同一形状。

展示单元还可以拥有 Unit Overlay。它用于不属于普通格内裁切的对象:

  • Frame 锚定:对象跟随画格移动,但在展示单元层合成,用于人物破框或气泡破框。
  • Unit 锚定:对象属于整页或双页共同空间;page_content 承载无格图和纸面对白,narration 承载不绑定 Frame 或单一 PageSurface 的纸面旁白,其他用途区分跨格、跨页、全页效果和装饰。

统一归属与合成约定

漫画对象不使用任意嵌套树解释视觉关系,而是分别声明归属、锚定、合成、裁切和顺序。归属决定对象属于 Frame 还是 PresentationUnit;锚定决定对象随画格还是随展示单元移动;合成决定对象进入格内图层还是 Unit Overlay;裁切决定对象受画格、纸面或不受局部边界裁切;Frame 与 Unit Overlay 的 zIndex 共享同一视觉层级空间,格内图层只决定画格内部顺序;视觉 zIndex 与阅读顺序始终独立。

PageSurface 只定义最终输出切片,不建立新的对象父子层级。普通画格的 surfaceScope 默认为 surface,显式设为 unit 时成为跨页格;Unit 锚定的普通纸面对象用可选 surfaceId 声明移动与缩放边界,cross_pagecross_segment 不设置 surfaceId。标准状态如下:

状态 归属与合成规则
画格 属于 PresentationUnit,使用 Unit 坐标;默认完整位于一个 PageSurface,画格遮罩只作用于其格内元素。
跨页格 只存在于真正双页,surfaceScope: unit 允许画格跨越中缝;其主图仍属于 Frame 并按画格遮罩裁切。
普通格内图片、气泡、文字或效果 属于并锚定 Frame,在 Frame 内合成,按画格规则裁切。
破格对象 属于并锚定来源 Frame,在 Unit Overlay 合成,不受来源画格裁切。
绑定真出格前景 是 Frame 锚定的 breakout 图片投影,通过 projection 引用来源 Frame 内的一张图片;透明前景在画格外合成,取景和局部变换由源图统一控制。
无格图、纸面对白、旁白或装饰 属于并锚定 PresentationUnit,在 Unit Overlay 合成。
跨格对象 在 Unit Overlay 合成;需要跟随来源画格时使用 Frame 锚点,否则使用 Unit 锚点。
跨页对象 只存在于真正双页的共享 PresentationUnit;跨页图片和气泡位于 cross_page 覆盖层,保存一次并由左右 PageSurface 分别裁切。
跨段对象 只存在于复合滚动段的共享 PresentationUnit,保存一次并由各 segment PageSurface 分别裁切。

narration 是 Unit 锚定的 TextElement,不设置 surfaceId、不关联 Dialogue,也不持久化对象编号;它统一承载旁白、说明字与无气泡对白,具体语义由文案和使用位置表达。编辑器按当前展示单元顺序派生两位编号。它可以跨越画格、纸面中缝或滚动段边界,视觉合成固定高于普通画格和覆盖对象;拆分复合展示单元时,跨越分隔线的旁白与其他跨面对象一样阻止无损拆分。拆分以实际几何范围为准:完整位于单一 PageSurfacecross_pagecross_segment 对象随该纸面拆出并转为普通 page_content,不因原有用途标签单独阻塞。基础样式为透明背景、20 号黑字和白色描边,横排默认约 6 字 × 1 行。切换横竖排时直接对调当前文字框的宽高并保持中心位置,因此默认竖排约为 1 列 × 6 字;列内从上到下,存在多列时从右到左,数字和英文逐字正立。 | 叠格 | Frame 仍是同级对象,只改变重叠许可与 zIndex,不形成父子关系。 |

无框画面仍是 Frame,只是边框为 none;无格图才是直接属于 PresentationUnit 的图片对象。自由分组、嵌套画格和完整图层树属于专业能力,不能成为普通破格、跨格或叠格的前置条件。

5. 坐标与合成

  • Frame.geometry 使用展示单元坐标。
  • Frame 内元素使用相对画格的局部坐标;0,0,1,1 表示填满画格。
  • Unit 锚定的覆盖元素使用展示单元坐标;Frame 锚定的覆盖元素保持相对画格的稳定关系。
  • 移动画格只修改 Frame,不同步改写任何格内元素。
  • 调整格内取景只修改 ArtElement.crop
  • 在格内移动人物或道具只修改元素的局部 transform

普通移动只修改当前坐标空间内的位置,不能隐式改变归属、锚点、合成层或裁切。跨层变化必须使用显式能力;Frame 锚定对象提升到 Unit Overlay、收回 Frame 或改为 Unit 锚定时必须保持视觉位置,并作为一次可撤销变更提交。

绑定真出格使用两份不可变图片版本表达同一构图:Frame 内源图提供完整画面,覆盖层前景提供透明主体。前景 ArtElement.projection.kindframe_image_breakoutsourceElementId 必须指向锚定 Frame 内的图片;前景只允许使用 PNG 或 WebP,不能复用源图版本。源图与前景的像素尺寸在资源尺寸可知时必须相同,前景保留完整画布原点,不允许为了减小文件而裁紧主体。

绑定期间,前景的 transformcrop 必须与源图一致。移动或缩放画格由共同 Frame 锚点自然同步;调整源图局部变换或取景时原子更新前景。前景不能独立修改这两项属性,替换源图前必须先移除绑定;删除源图同时删除所绑定前景。把前景显式转换为普通纸面图片时,先固化当时的变换与取景并清除 projection,之后它才成为独立对象。LCD 不保存抠图选区、生成参数或临时遮罩,透明通道属于固定前景资源本身。

画格默认保持在纸面内且禁止重叠;允许叠格时必须显式改变布局策略并确定 zIndex。不得通过复制对象、同步两套绝对坐标或 CSS 偏移伪造破格、叠格和跨页关系。两个相邻单页的并排查看不是共享坐标空间,不能承载一个跨页对象。

6. 阅读顺序

reading.unitOrder 是展示单元顺序,PresentationUnit.readingSequence 是画格顺序,画格内的 textOrder 可以进一步确定气泡与文字顺序。

数组位置、视觉坐标和 zIndex 都不能代替阅读顺序。日漫从右到左、不规则页面、叠格和跨页仍使用同一套显式序列。跨页画格只出现一次,不在左右纸面复制 ID。

漫画级默认阅读方向只用于初始化新建一话;一话创建后,以该话 LCD 的 reading.direction 为实际阅读与导出依据。修改漫画默认值不会静默改写已有工作稿或保存快照。

页漫双页查看按 unitOrder 自动分组:封面独立显示且不参与计算;其后的第一张 storyinterlude 单页独立显示,随后相邻的 storyinterlude 单页两两成组。双页分组中被真正双页、封面或章节结尾切断的普通单页,附带一个虚拟补位页;它只辅助工作台编排,不写入 LCD、快照或导出。每个非末尾展示组的末页是阅读器的自动翻页点;该点不改变页面坐标、对象或单页导出,也不限制真正双页合并。真正双页始终作为独立展示组。

7. 资源、版本与读取模型

LCD 只保存稳定的素材与版本标识、媒体类型和必要尺寸,不保存临时访问地址或代理路径。工作台读取时再把协议与短期有效的资源地址组合。

独立 LCD JSON 仍然只表达作品协议,不嵌入图片二进制。完整 LCD 归档是 LCD 之外的一话传输容器:它固定组合一个 SavedSnapshot 的 LCD、分镜条目、资源清单和 LCD 引用的图片文件。导入时资源与分镜标识重新映射到目标创作空间,所有引用必须同时更新并重新通过 LCD 校验;归档不能成为另一份运行时作品事实源。完整归档的导出与导入共用同一格式版本、清单结构和校验规则;LCD 对象、分镜、固定资源版本或媒体类型变化时,必须在同一次交付中同步两个方向,导出端不得生成当前导入端无法完整接受的归档。

工作稿、候选、保存快照、导出和复制漫画都必须固定资源版本。资源产生新版本时,不自动替换其他画格、章节、候选或快照已经引用的版本。

BalloonElementTextElement 可以通过可选 appearance 引用一个已经声明的图像资源版本,用于表现型气泡轮廓和复杂拟声字。引用只包含稳定的资产与版本标识,不保存 SVG 路径、生成提示词或编辑器参数。缺少外观引用时按原生形状与文字样式渲染;存在引用时,气泡仍保留 Dialogue、位置和文字样式,文字仍保留内容与角色语义。编辑、预览、导出、快照和复制必须读取同一个固定版本。

原生切角对白使用 shape: cut_corner,并在 cutCorners 中保存四个角沿水平和垂直方向的八个归一化基础参数,视觉投影使用其两倍切入幅度。每次主动切换到该形状时生成一组新的参数,随后不随文字、字号、边框、缩放、保存或重新渲染变化;主体固定为无尾八边形,并保留足够长的上下左右边,不把矩形压缩成菱形。

画布图片卡属于工作台辅助层,不进入 LCD。把图片放入成稿时,必须在目标 Frame 图层或 Unit Overlay 中创建元素并固定引用资源版本。

8. 强类型写入

所有作品修改都通过 WorkspaceCommand,不开放任意 JSON Patch。写入词汇按对象层级分为:

  • 展示单元与编排:新增展示单元、替换当前单元布局、替换章节布局或完整呈现。
  • 画格:新增、删除、移动、缩放、调整样式和层级。
  • 格内内容:设置取景与变换,增删、复制元素和调整图层顺序。
  • 对白与气泡:修改对白内容、气泡形状、位置、尾巴、样式和可选外观引用。
  • 文字外观:为语义文字设置或清除固定版本的视觉外观。
  • 叙事条目:创建并绑定单格画面,更新或替换 StoryboardBeat。

页面重排只能改变展示结构,并按稳定 Frame ID 保留既有图层、成稿和对白。新增或删除画格必须显式表达;只有完整呈现替换才能替换格内内容。

手动界面和 AI 协作调用同一组命令与校验语义。一次 WorkspaceChangeSet

  • 固定 baseRevision
  • 包含一组同源命令;
  • 全部成功才推进其所属的 WorkingRevision 或 AgentDraft revision;
  • 任一命令失败则不写入;
  • 作为一次 Undo / Redo 的原子单位。

9. 候选、Agent 方案与保存快照

确定性手动编辑可以直接提交 ChangeSet。AI 生成、结构调整、多对象操作和其他高风险结果先成为 Candidate,记录基准 revision、影响范围和命令,不能静默覆盖工作稿。

候选预览组合“当前工作稿 + Candidate”,允许在适用时切换工作稿与候选结果、应用或取消预览。预览本身不创建 revision;应用后只创建一次原子 ChangeSet。Candidate 基于旧 revision 且无法安全应用时必须标记过期并拒绝写入。

SavedSnapshot 是用户显式保存后不可变的阅读和导出基线,后续编辑不能原地改写。回到历史版本通过复制其内容创建新的 WorkingRevision 与 SavedSnapshot,历史只向前增长;用户确认删除某个 SavedSnapshot 时,仅可回收已证明不再被任何作品版本、草稿、画布、资产或封面引用的固定图片版本。

外部 Agent 对一话的连续编辑属于独立 AgentDraft,不直接推进正式 WorkingRevision。AgentDraft 固定一个正式基线,并以不可变草稿 revision 保存每次 ChangeSet;任务完成后冻结为 ChangeProposal。ChangeProposal 不是 LCD 对象,也不是正式版本,只固定审查所需的草稿 revision、基线和资源引用。用户接受方案时,Lantern 在一个事务中创建新的正式 WorkingRevision 与 SavedSnapshot,并把冻结方案标记为已应用后继续保留,不能因生成正式版本而删除。当前工作稿已偏离基线时,方案标记为过期且不得静默合并;用户查看差异并确认覆盖风险后,仍可显式应用冻结的方案内容。正式 SavedSnapshot 只形成线性历史。

10. 校验不变量

  1. 所有作品对象 ID 在文档内唯一。
  2. unitOrderreadingSequence 完整且无重复,引用对象必须存在。
  3. 画格必须位于有效展示单元;重叠由 layoutPolicy 明确允许或禁止。
  4. 图层与元素类型匹配,层级、显示、锁定和 overflow 值有效。
  5. 图片和元素外观引用已声明的资源版本;外观必须是图像资源,气泡引用已声明的 Dialogue。
  6. 真正双页恰好拥有左右纸面;复合滚动段只包含 segment 纸面;跨页和跨段对象都只有一个事实来源。
  7. 局部坐标、Unit 坐标和纸面裁切不能混用。
  8. 命令只能影响声明的协议层、对象与作用范围。
  9. 编辑、预览和导出对同一文档得到一致的对象数量、层级、裁切、可见性和边框。

11. 常见场景映射

场景 协议表达
普通页漫 单页展示单元 + 显式画格阅读顺序
双页大图 双页展示单元 + 一个跨越两张纸面的 Frame 或 Unit Overlay 元素
条漫 多个纵向展示单元,以 unitOrder 连接
跨段长图 复合滚动段 + 一个 cross_segment Unit Overlay 图片
无框画面 Frame 边框为 none,内容仍属于 Frame
无格图 Unit 锚定的 Unit Overlay 图片元素
人物破框 Frame 锚定的 Unit Overlay 元素
纸面对白或旁白 Unit 锚定的 BalloonElement 或 TextElement
跨格拟声字 Unit 锚定的文字或效果元素
叠格 同级 Frame + 显式重叠许可 + 独立 zIndex 和阅读顺序
表现型气泡 BalloonElement 保留对白语义并引用固定版本的视觉外观
复杂拟声字 TextElement 保留文字语义并引用固定版本的视觉外观
格内取景 修改 ArtElement.crop
页面重排 替换布局并按 Frame ID 保留格内内容

12. 协议边界

LCD 不定义笔刷、像素级绘制、复杂矢量编辑、实时协作算法或完整出版印前规范。它只提供稳定的漫画结构、版本引用、确定性写入和渲染边界,使人类编辑、AI 候选、阅读与导出共享同一作品事实。