tiny-skia-path

    tiny-skia's path geometry (Path / PathBuilder / segments) ported to MoonBit

    skia
    2d
    path
    geometry
    Download zip
    Version
    0.1.0
    License
    BSD-3-Clause
    Last updated
    4 hours ago
    Downloads
    3

    No dependencies

    #tiny-skia-path · MoonBit

    把 tiny-skia 的 path 子集移植到 MoonBit。 渲染管线、渐变、pattern、png 编解码不在本仓范围内。

    状态:0.1.0 可发。lib/path 一个实现包(数值 + 几何 + 路径 + 曲线几何 + 描边 + 虚线)齐了,lib 只做门面;语义面一律 Float;公开面按上游 lib.rs 收口(pub fn 321 → 239,内部助手全部 priv;宽高/长度按上游 u32/usize 用 UInt32, 上游 unwrap() 的 7 处转换不再折成 Option);门禁 22 绿 / 1 跳过(同门仓缺席)、moon test 170 条过。真值三层:上游源码里的字面量、上游现跑的 262 条读数 (tests/baselines/upstream_golden.mbt,生成物)、上游实现的逐行推导。现状、能力边界与 代码怎么分看 P0 · 现状与结构, 范围、判据、与上游的差异和踩过的坑看 P1 · 移植与对拍。

    #安装

    moon add TryAndRun-TvT/tiny-skia-path

    然后在 moon.pkg 里按需 import:lib/path 拿全套方法形 API;只做门面转发时 import lib。 版本与后端承诺见 moon.mod(+wasm+wasm-gc,首选 wasm-gc)。

    #用之前要知道的三件事

    1. 方法形 API 只有 import lib/path 拿得到。 只 import lib 时你能拿到 17 个类型 与 11 个自由函数(path_bounds / path_stroke / …);p.bounds() 这种调用要 @path 那个包。原因是 MoonBit 的 pub using 只带类型名、不带方法。
    2. Stroke 不可变:改参数用 with_width / with_line_cap / with_dash 这一族 (上游是可变的公开字段,本仓没有借用)。
    3. 只承诺 wasm 与 wasm-gc(首选 wasm-gc);native / js 不在承诺内。

    发版面为什么是 0.1.0 而不是 1.0、以及「还剩哪 26 条零用例入口(都不是欠账)」,见 P0 §1.1 能不能发版。

    #快速开始

    ///|
    test "库门面可用:画一条曲线、量它、再描边" {
    // ① 一条拱形二次曲线:控制点 (50, 0) 远在弦外
    let pb = @lib.path_builder_new()
    @lib.PathBuilder::move_to(pb, 10.0, 50.0)
    @lib.PathBuilder::quad_to(pb, 50.0, 0.0, 90.0, 50.0)
    let path = @lib.path_builder_finish(pb).unwrap()

    // ② 两个包围盒不是一回事:控制点包围盒的 top 是控制点的 0,
    // 而曲线本身最高只到 25 —— 这就是 `compute_tight_bounds` 存在的理由
    let loose = @lib.path_bounds(path)
    assert_eq(loose.top(), 0.0, msg="控制点包围盒把控制点算进去了")
    let tight = @lib.path_tight_bounds(path).unwrap()
    assert_eq(tight.top(), 25.0, msg="紧包围盒是曲线真正到达的地方")

    // ③ 描边:默认 width = 1,改成 4 再描
    let stroke = @lib.stroke_with_width(@lib.stroke_new(), 4.0)
    let outlined = @lib.path_stroke(path, stroke, 1.0).unwrap()
    assert_true(outlined.verbs().length() > 0, msg="描边结果非空")
    }

    #目录

    路径是什么
    lib/库门面。rexport.mbt 导类型,facade.mbt 补自由函数转发
    lib/path/几何 + 路径 + 曲线几何 + 描边 + 虚线(不含光栅)。方法形 API 在这里;文件怎么分见 P0 §3.1
    lib/path/scalar.mbt 等数值面:SCALAR_*、饱和转换、浮点包装、有限性判据(原独立 num 包已并回)
    tests/黑盒测试与夹具:path_tests(21 条)· facade(1 条)· baselines(262 条上游读数,生成物);白盒 148 条在 lib/path/*_wbtest.mbt
    scripts/环境初始化与门禁。一条命令跑全量:bash scripts/gates.sh
    docs/导航面 + 两篇正文:现状与结构 P0 · 移植与对拍 P1
    AGENTS.md改代码前的硬性约定,先读这个

    #环境与门禁

    bash scripts/setup-toolchain.sh # 装齐 moon / python3 / cc+cargo(已装的跳过,幂等) bash scripts/gates.sh # 全量门禁 STAGES="check test" bash scripts/gates.sh # 只跑指定阶段

    gates.sh 的阶段清单、每条判据量的是什么,见 P0 §5。 其中四条是本仓独有的:float-gate 要求全仓 Double 计数为 0(除在册例外,理由逐条写); upstream-ledger 要求 P1 的两张账本表是现算的(两个检出范围:path/src + src/path64); upstream-golden 现跑一遍上游、与 tests/baselines/upstream_golden.mbt 里的 262 条读数逐行比; api-coverage --verify-zero 要求 P1 §8 那张零用例入口表也是现算的。 生成物一律不许手改;缺上游或缺 cargo 时记跳过——跳过不是绿。

    许可与归属见 LICENSE / NOTICE——BSD-3-Clause,含改动声明。

    Powered by MoonBit

    Site sourceReport issueModulesSkillsBuild queueStatistics

    © 2026 mooncakes.io