文档 v1.0 desktop/wallpaper.md

壁纸管理器设计

壁纸解码、多显示器布局、轮换,以及为主题自适应提供采样数据的完整管线。

壁纸管理器负责壁纸解码、上传、多显示器布局、轮换,并为主题自适应提供采样数据。全链路 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 中间步骤

渲染管线

  1. 解码得到像素 → 按源色彩空间做 EOTF 转换进入线性域。
  2. 上传 GPU,格式 R16G16B16A16_SFLOAT(HDR 源保留 PQ 编码与元数据)。
  3. 作为合成树根节点(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% 可调,用于亮壁纸下的护眼;不影响主题判定(见采样管线一节)。