13 三条 clip 规则
✅ 已验证 · 探针 probes/probe_clipping.py · probe_clipvector.py · probe_vecstack.py
clip 在 Krita 里叫 inherit alpha(node.setInheritAlpha(True))。它是本书整个叠层架构的支点,三条规则全部实测。
一、裁到「同组内下方各层的累积 alpha」
Group "Skin"
├─ Skin_Light (inherit alpha) ← 裁到组内下方各层的累积 alpha
├─ Skin_Shadow (inherit alpha)
└─ Skin_Flat ← 组内最底, 定义整个组的形状
实测(组内 base 红块 x∈[100,200)、top 绿条 x∈[20,380)):
| 条件 | 绿条可见跨度 |
|---|---|
| 未开 inherit | (20, 379) |
| 开 inherit | (100, 199) ← 精确裁到 base |
| base 再加一块蓝 x∈[280,340) | (100, 339) ← 累积,不是紧邻层 |
group 设 passThroughMode(True) | (20, 379) ← 裁剪失效 |
所以:Flat 必须在组内最底;group 不能 passthrough。
二、矢量层能做底,group 也能被 clip
这两条是第五版新验的,架构成立与否全看它们。
笔画层 clip 到矢量层(probe_clipvector.py,8192×12288,39 笔故意画出界):
| 状态 | 边界带偏差 | 溢出 | 内部均色 |
|---|---|---|---|
| ① 只有矢量层 | 0.0828 | 0.0% | (62,110,161) 矢量色 |
| ② 笔画层未 clip | 0.4804 | 100% | (227,122,64) 笔色 |
| ③ 笔画层 clip 到矢量层 | 0.0828 | 0.0% | (227,122,64) 笔色 |
| ④ 对照:clip 到二值光栅层 | 0.3791 | 0.0% | (227,122,64) 笔色 |
③ 与 ① 完全相同——inherit alpha 认矢量层做底,而且把矢量的分数 alpha 原样传给了上面的笔画层。比 ④ 好 4.6 倍,差别全在组底是曲线还是像素格。
group 本身可以 setInheritAlpha(probe_vecstack.py,部件组里是「比剪影大一圈的矢量 + 涂出界的笔画」):
| 状态 | 组的不透明像素 | 均色 |
|---|---|---|
| ① 只有剪影矢量 | 7,147,891 | 剪影色 |
| ② 部件组未 clip | 10,270,050 | 笔色 |
③ 部件组 setInheritAlpha(True) | 7,147,891 | 笔色 |
③ 与 ① 一模一样:裁的是整组的合成 alpha,只裁 alpha 不换内容。
三、判据必须同时看 alpha
机理是 KisLayer::disableAlphaChannel():合成时只写 R/G/B、不写 A。alpha=0 的地方 RGB 仍然是被写过的。同一次测量里,不看 alpha 的 RGB 跨度是 (64, 255)(tile 对齐),可见跨度只有 (100, 199)。只看 RGB 会得出「没裁剪」。
这条规则有一次历史:v1.0.0 把 base/top 建在根节点下,根下有一个全不透明的 Background,「下方累积 alpha」处处是 255,于是什么也没裁——那是正确行为,却被记成了「clipping 用不了」。复现实验:同样构造放根节点下,跨度确实还是 (20, 379)。
附:transparency mask
另一种裁法,挂在目标图层下才生效(挂到 rootNode 下是孤儿节点):
mask = doc.createTransparencyMask("M")
target_layer.addChildNode(mask, None)
mask.setSelection(sel)
实测挂上后绿条跨度 (20,379) → (120,199),精确。它比 inherit alpha 更适合交给画师:mask 本身可编辑。本书没用它,因为矢量层做底已经够了。