sequenceDiagram
participant V as RawViewport
participant C as Tauri Command
participant R as Rust RAW Engine
participant G as WebGL2
V->>V: 计算可见区域与 LOD
V->>C: 请求 256×256 RGBA 瓦片
C->>R: 使用文档快照解码/聚合
R-->>C: 二进制 RGBA
C-->>V: ArrayBuffer
V->>G: 上传 NEAREST 纹理
G-->>V: 按源图像坐标合成
- L0 一个纹素对应一个源像素。
- L1 及以上一个纹素覆盖
2^L × 2^L的源区域。 - 瓦片固定为 256×256 RGBA;边缘超出图像的部分保持透明。
- WebGL2 使用全局图像坐标和整数
texelFetch选择瓦片纹素;100% 视图将相机对齐实际帧缓冲像素,避免瓦片边缘落在像素中心并触发栅格化相位错位。 - 纹理使用最近邻过滤,确保高倍率像素格清晰。
- R/G/B 单通道瓦片携带灰度重建强度;WebGL 根据设置使用
[1,0,0]、[0,1,0]、[0,0,1]或[1,1,1]完成最终着色。切换无需重算瓦片。 - 所有显示模式的瓦片请求携带同一组显式黑点
B与白点W,要求0 ≤ B < W ≤ 2^bitDepth−1。后端在各模式完成 RAW 读取、Remosaic 或 Demosaic/通道重建后,把产生的 u16 DN 钳制到[B,W],再以整数四舍五入映射到 0–255;黑白点属于纹理缓存键,修改后会重新请求瓦片,但不进入或改变处理算法。 - 所有显示模式在最终呈现阶段共用
2^EV增益,范围-8.0~+8.0 EV。调整只更新 WebGL uniform 并重绘,不清理纹理或重新请求瓦片;高倍率文字仍显示原始/处理 DN,文字对比度则按当前显示窗口和曝光选择。 - “P1–P99”使用独立可取消任务精确扫描当前整帧 L0 原始 All DN,缺失像素只计数、不进入 Histogram。优先用 P1/P99,二者相同时回退 Min/Max;仍无跨度时保持当前显示窗口。结果作为所有模式共用的显示窗口;它是一次性设置操作,不持续跟踪后续帧,也不读取 ROI、处理后 DN 或完整统计结果。
- 后端把图像范围内无法读取的像素编码为 alpha 254,图像边界外区域保持 alpha 0。着色器在通道着色前识别该标记,并以全局图像纹素坐标生成连续的深色/浅色棋盘格,或使用用户选择的纯色;切换外观只触发重绘,不清除纹理缓存。
- 画布监听
webglcontextlost/webglcontextrestored。上下文丢失时暂停绘制并废弃 GPU 资源引用,恢复后重建 program、buffer 与 uniform,清空旧 revision 的请求并重新绘制当前视图;恢复成功同时清除对应实时诊断。
| 模式 | 聚合方式 | 层级过渡 |
|---|---|---|
| 彩色 CFA 的 RAW 强度 | 同 CFA 站点 DN 平均,以灰度显示 | 单一结构层级 + 迟滞 |
| CFA 点阵 | 同站点平均,只点亮对应 R/G/B 通道 | 单一结构层级 + 迟滞 |
| Remosaic | 按处理后的标准 Bayer 站点平均 | 单一结构层级 + 迟滞 |
| MONO RAW | 覆盖区域普通平均 | 相邻层级平滑混合 |
| Demosaic / RGB 通道 | 覆盖区域按通道平均 | 相邻层级平滑混合 |
结构预览不能混合两套不同尺度的 CFA 网格,否则 L2 以上会趋近 Demosaic 的平滑效果。Quad CFA 在 L1 将一个原生 2×2 同色块归并为一个标准 Bayer 站点;更高层继续按站点聚合,而不是跨 R/G/B 混色。
极度缩小时无法真实呈现每个源像素。此时显示的是“保留阵列结构的局部统计预览”,不是对单个源像素的伪装。
ViewportTransform 是所有坐标换算的唯一来源:
screen = camera + image × zoom
image = (screen - camera) / zoom
pixel = floor(image)
- 缩放范围由适应窗口比例的 8%(最低 0.0005×)至 64×。
- 滚轮和手动输入均为连续缩放;LOD 只是后台采样层级。
- 滚轮缩放固定指针下的图像位置。
- 适应窗口被限制为 100%、手动切换实际像素,以及窗口或全屏尺寸变化后仍为 100% 时,相机都会重新对齐物理像素;最多移动半个物理像素。
- 图像允许自由拖动,但始终至少保留一部分在视口中。
- 十字准星按当前像素中心绘制,状态栏坐标随指针更新。
- 坐标定位会切换到 64×并将目标像素置于画布中央。
- 缩放达到 12×后,画布指针所在像素以独立 HTML 叠加层显示整行与整列柔光边框,并同步 Row/Column Profile 的精确坐标;“定位像素”的坐标作为鼠标离开后的后备点。统计图表反向悬停只显示对应行或列。该联动不自动平移或缩放任何视图,低于阈值时完全隐藏。
- 高倍率像素网格和数值使用独立 Canvas 2D;达到像素格能完整容纳数值的倍率后启用。关闭数值显示时只绘制网格边界,不请求像素 DN;网格颜色由用户配置,保留固定透明度以避免遮挡图像。
- RAW/CFA 显示源 DN,Remosaic 显示处理后的 Bayer DN;R/G/B 显示对应的重建通道 DN,不受彩色或灰度着色偏好影响;Demosaic 可显示源 DN 或三行插值 RGB。
- 数字颜色根据像素亮度自动反色,并保留像素格边界。
- 像素检查一次最多请求 65536 个像素,并缓存可见区域外 3 像素保护带。
- 通道着色、像素值显示策略和缺失数据外观集中在侧边栏“画面呈现”,修改后直接更新画布并持久化;统一的显示黑白点与曝光位于同一区域,但只属于当前文件且不持久化。参数跨帧、RAW/CFA/Remosaic/Demosaic/R/G/B 模式共用,打开新文件时恢复全量程与
0 EV。
内部矩形选区保存在原图坐标中,使用半开区间 [x, x + width) × [y, y + height)。工具栏可启用持续右键框选,也可输入包含式起止坐标;从图像外的画布背景开始拖动时,端点钳制到图像边缘。短距离右键单击继续打开画布菜单,超过屏幕移动阈值才创建 ROI。缩放、平移、模式切换和同尺寸帧切换不会改变选区;图像尺寸变化时清除。RAW 强度和 CFA 点阵视图使用独立高对比 HTML 叠加层显示边框,并按同一坐标变换更新。
- 当前画面抓拍按画布物理像素合成主题背景、WebGL 图像、像素网格/数值、图像边界、十字准星和滚动条;不包含临时的行列联动柔光,也不包含画布外的工具栏、参数栏、帧栏和状态栏。
- 完整预览复用
render_raw_tile和当前文档世代、渲染 revision、帧、显示模式及处理参数,按 256×256 瓦片拼接,不包含画布背景或 UI 叠加层。 - 完整预览选择长边不超过 4096 px 的最高分辨率 LOD;统一显示窗口与曝光、通道着色和缺失像素外观均与当前画面一致。
- 保存和复制先生成同一张 Canvas,再分别编码 PNG 或写入系统图像剪贴板。生成期间视图失效时取消任务,不输出混合状态结果。
可见瓦片优先按离视口中心的距离排序。状态栏显示当前 LOD、已加载瓦片和始终可见的 loading 数量,并提供最近、平均和最慢瓦片耗时;计时每个瓦片只读取两次 performance.now(),不是性能基准。
过期任务协作取消,失败瓦片在当前 revision 内停止重试,避免不完整帧或错误参数造成无限错误循环。