将 Windows 鼠标指针主题包(zip:.cur / .ani + install.inf)转换为 macOS Mousecape 使用的 .cape 主题文件。
纯 Rust 实现,零第三方依赖(无 crates.io 依赖):ZIP 解析、DEFLATE 解压、ICO/CUR 解码、ANI(RIFF) 解码、BMP 解码、PNG 编解码、GBK 解码、plist(XML) 生成全部手写实现。
格式参考:
- mmemoo/capeify —— Python 参考实现
- wayou/Mousecape-TahoeSupport —— Mousecape 解析端源码
cargo build --release
# 产物:target/release/rustcapeify项目零第三方依赖、无平台特定代码,可直接在 macOS 上编译:
# Apple Silicon(M1/M2/M3…)或 Intel Mac 本机构建
./scripts/build-macos.sh
# 构建 universal2 二进制(同时支持 arm64 与 x86_64,可分发)
./scripts/build-macos.sh universal也可以直接用 cargo:
# Apple Silicon 本机
cargo build --release
# 显式指定目标(需 rustup target add aarch64-apple-darwin)
rustup target add aarch64-apple-darwin
cargo build --release --target aarch64-apple-darwin要求:macOS 11+、Xcode Command Line Tools、Rust 工具链(rustup)。生成产物为原生 Mach-O 二进制。
GitHub Actions(.github/workflows/build.yml)会在 macos-14(arm64 runner)上自动构建并跑测试,可直接下载 rustcapeify-macos-arm64 构件。
rustcapeify <输入主题包.zip> <输出.cape> [选项]
选项:
--inf <name> 指定 install.inf 文件名(默认自动查找)
-v, --verbose 输出详细转换日志
-h, --help 显示帮助示例:
rustcapeify MyCursorPack.zip MyCursorPack.cape -v转换完成后,在 macOS 上双击 .cape 文件即可导入 Mousecape,然后在 Mousecape 中应用该主题。
| 能力 | 说明 |
|---|---|
| ZIP 读取 | 支持 STORE / DEFLATE 压缩,UTF-8 与 GBK 文件名(中文主题包) |
| install.inf | 解析 [Strings] 变量、[DefaultInstall(.nt)]、AddReg 单槽位行与整方案(Schemes)行 |
.cur 解码 |
32/24/16/8/4/1 bpp BMP(含 AND mask 与调色板)以及内嵌 PNG 图像;热点取自 ICONDIR |
.ani 解码 |
RIFF/ACON:anih/fram/seq/rate 块;按播放顺序展开帧,帧时长取平均(1/60s 单位) |
| 动画限制 | Mousecape 单光标最多 24 帧;超过 24 帧的动画会被抽帧压缩(保持总时长) |
| macOS 映射 | Windows 槽位 → com.apple.* 标识符(含 SizeNS/WE/NWSE/NESW 的多分辨率光标) |
.cape 输出 |
XML plist v2 格式,Cursors 字典 + Representations(PNG 字节),动画帧竖直堆叠 |
| Windows 槽位 | macOS 标识符 |
|---|---|
| Arrow | com.apple.coregraphics.Arrow |
| Help | com.apple.cursor.40 |
| AppStarting | com.apple.cursor.4 |
| Wait | com.apple.coregraphics.Wait |
| Crosshair | com.apple.cursor.7/8/41 |
| IBeam | com.apple.coregraphics.IBeam |
| No | com.apple.cursor.3 |
| SizeNS | com.apple.cursor.32/21/22/23/31/36 |
| SizeWE | com.apple.cursor.28/17/18/19/27/38 |
| SizeNWSE | com.apple.cursor.34/33/35 |
| SizeNESW | com.apple.cursor.30/29/37 |
| SizeAll | com.apple.cursor.39 |
| UpArrow | com.apple.cursor.2 |
| Hand | com.apple.cursor.13 |
NWPen / Pin / Person 在 macOS 无对应,自动跳过。
cargo test集成测试使用 Python 脚本(tests/)生成真实的 .cur / .ani / install.inf 字节数据(含 32bpp 带 alpha 的 BMP、24bpp、8bpp 调色板、内嵌 PNG、带 seq/rate 的动画、两种 AddReg 布局),转换后用 plistlib + PIL 校验结构、元数据与像素。
MIT