壁纸管理器负责壁纸解码、上传、多显示器布局、轮换,并为主题自适应提供采样数据。全链路 10.7 亿色(10bit),float 域处理,无调色板概念。
- 文档版本:1.0
- 定稿日期:2026-09-05
格式支持
| 类型 | 格式 | 解码途径 | 说明 |
|---|---|---|---|
| 静态 | PNG / JPEG / WebP / AVIF / HEIF | libpng / libjpeg-turbo / libwebp / dav1d + libheif | 8bit 源上采样至 16F |
| 视频 | VP9 / AV1 / H.264 | libvpx / dav1d 软解;Vulkan Video 硬解可用时优先 | 循环播放;电池供电时自动暂停为末帧,接通电源恢复 |
| 生成 | 纯色 / 双色渐变 / 噪声渐变 | 合成器程序化生成 | float 域直接生成,无 8bit 中间步骤 |
渲染管线
- 解码得到像素 → 按源色彩空间做 EOTF 转换进入线性域。
- 上传 GPU,格式
R16G16B16A16_SFLOAT(HDR 源保留 PQ 编码与元数据)。 - 作为合成树根节点(z 序第 0 层)参与合成, HDR 源由 compositord 做 tone mapping。
视频壁纸解码在独立解码执行体进行,逐帧提交,不阻塞合成线程;丢帧策略为跳帧不跳时间戳。
多显示器
| 模式 | 行为 |
|---|---|
| 每屏独立 | 各输出各自壁纸,可独立选择 |
| 镜像 | 全部输出同一壁纸,居中裁剪 |
| 跨屏拼接 | 一张壁纸按各输出几何拼接,覆盖全部屏幕 |
- 输出热插拔:新输出按当前模式补位,重排 2s 内完成;期间沿用旧帧,不出现黑屏闪烁。
- 缩放策略:按屏幕比例裁剪填充(cover),壁纸小于屏幕时禁用拉伸放大超过 2×,超出部分用模糊延展。
主题采样管线
壁纸层维护 64×64 mipmap 链,主题自适应的亮度中位数判定与强调色提取(见 visual-language.md)从该链读取,不重复解码:
- 采样对象是原壁纸,不含用户设置的压暗叠加层(压暗只影响观感,不影响主题判定)。
- 壁纸更换或轮换后 100ms 内完成重采样并触发主题重判定。
目录约定
| 路径 | 内容 |
|---|---|
| ~/Pictures/Wallpapers | 用户壁纸库 |
| ~/.config/wallpaper/ | 布局模式、轮换设置、各屏当前选择 |
| /usr/share/wallpapers/ | 系统出厂壁纸 |
轮换
- 间隔可选:5 分钟 / 30 分钟 / 1 小时 / 1 天 / 7 天 / 关闭。
- 轮换顺序:顺序循环;开启「随机」时 7 天内不重复。
- 轮换触发主题重采样与 600ms 交叉淡入(旧壁纸淡出新壁纸淡入,同一合成 pass 内完成)。
设置界面(设置应用内)
- 壁纸网格预览(缩略图延迟生成并缓存)。
- 每屏模式选择:每屏独立 / 镜像 / 拼接。
- 轮换间隔与随机开关。
- 压暗叠加:0–30% 可调,用于亮壁纸下的护眼;不影响主题判定(见采样管线一节)。