decimen-optical-transfer 的 vendored 解码器:decimen-codec WASM 构建的许可证构成与运行时身份 前端通信【免费下载链接】decimen-optical-transfer项目地址https://gitcode.com/gh_mirrors/de/decimen-optical-transfer点击查看免费下载decimen-codec 是 decimen-optical-transfer 项目内置vendored的 QR 解码引擎一份基于 zxing-cpp 定制编译的 WebAssembly 二进制配套 embind 胶水与类型声明一起被提交在仓库的vendor/decimen-codec/目录下。它的NOTICE.md用十几行文字交代了这个构建的出处、身份标识和许可证构成而它在仓库中的真实角色——一条被“跟踪”tracked的快速解码路径以及两条被编译进 WASM 的读取 API——正是整个接收端吞吐设计的核心。本文以该 NOTICE 为骨架结合仓库源码展开这份构建的身份、接入方式与许可证边界帮助你快速判断能否在自己的项目里复用这份 vendored 制品。一、它是什么QR-only、reader-only 的定制 zxing-cpp 构建NOTICE.md开门见山给出了三层定义compiled decoder仓库 vendored 的不是源码而是编译产物即vendor/decimen-codec/decimen_codec.wasmQR-only、reader-only只保留 QR 码的读取decode能力二维码生成encoder等无关能力被编译掉custom WebAssembly build of zxing-cpp它基于 zxing-cpp 定制构建且带有tracked decode path——一个为屏幕→相机这种“已知码大致位置”场景优化的快速解码路径small embind wrapper通过 Emscripten 的 embind 导出一小组 JavaScript API供上层调用。在 decimen-optical-transfer 仓库里这个构建不是可选依赖而是接收端工作的核心receive/worker.ts顶部注释明确写着“QR decode worker: the decimen-codec engine (a custom zxing-cpp build) compiled to WASM”并解释了为什么要走 WASMSafari 从未实现过BarcodeDetectorWebKit bug 281848因此 WASM 是唯一可移植的 QR 解码途径。二、它放在哪里vendored 目录的四个文件vendor/decimen-codec/目录下共四个文件职责划分清晰文件职责decimen_codec.wasm编译产物本体解码引擎的二进制decimen_codec.jsEmscripten 生成的 embind 胶水层负责加载 WASM、导出 APIdecimen_codec.d.ts手工编写的 TypeScript 类型声明描述 embind API 的形状NOTICE.md本篇文章的骨架文档构建出处、身份与许可证构成LICENSE.zxing-cpp上游 zxing-cpp 的 Apache-2.0 许可证全文其中decimen_codec.d.ts开头注明“Source of truth:decimen-codec/wrapper/decimen_codec.cpp”即类型声明的权威来源是 decimen-codec 上游仓库中的 C 包装器源码本仓库这份.d.ts需要与其保持同步。两个运行时身份标识version() 与 build()NOTICE 指出“banner on the first line ofdecimen_codec.js”和模块的version()/build()运行时导出共同标识这个构建。类型声明给出了二者的确切语义version(): string—— 构建时的 decimen-codec package.json 版本号例如0.1.0build(): string—— 构建标识git 短哈希若从未提交dirty的源码树构建则带-dirty后缀。这两个导出让接收端或任何接入方可以在运行时精确报告“我正在运行哪个版本的解码器”这在诊断与回归定位中非常有用——docs/technical/diagnostics.md中的诊断运行报告会记录完整环境信息其中就包括这类构建身份。三、它如何被接入两种 WASM 加载方式receive/wasm-url.ts展示了被托管构建served builds的加载方式import wasmUrl from ../vendor/decimen-codec/decimen_codec.wasm?url; export default wasmUrl;即把.wasm作为独立资源asset打包由 service worker 预缓存而独立单文件构建standalone builds则换成receive/wasm-url.inline.ts对应的内联方案。内联方案的实现位于build/inline-codec-wasm.ts由于 Vite 的?inline对.wasm不生效Vite 会接管该扩展名并让 Rollup 把二进制当 JavaScript 解析该 Vite 插件改用虚拟模块virtual:codec-wasm-data-url把vendor/decimen-codec/decimen_codec.wasm读入并编码为data:application/wasm;base64,的 Data URL 导出。这样独立页面可以完全自包含不依赖外部文件。在 worker 内部模块初始化通过locateFile把.wasm重定向到上述 URLconst ready: PromiseDecimenModule DecimenCodec({ locateFile: (path: string, prefix: string) (path.endsWith(.wasm) ? wasmUrl : prefix path), });四、它导出什么readFull 与 readTracked 双路径decimen_codec.d.ts完整描述了 embind 导出面除version()/build()外核心是两条读取 API 与若干调试 APIAPI签名要点用途readFull(ptr, width, height, tryHarder, maxSymbols, returnErrors) → DecimenResultVector全帧扫描完整检测流程可配置 tryHarder、符号数上限与是否返回错误结果readTracked(ptr, width, height, dim, x0..y3) → DecimenResult跟踪路径跳过检测用缓存的四边形 模块数直接重建变换、采样网格trackedMatrix同 readTracked 参数 →Uint8Array \| null调试原始采样的模块网格dim×dim行主序 0/1projectPoint四边形 模块空间点 →{x, y, valid}调试把模块空间点投影回图像坐标binarizedRow(ptr, width, height, y) → Uint8Array \| null调试二值化矩阵的某一行每像素 0/1相关数据结构包括DecimenPointx/y、DecimenQuad四个角点即 topLeft/topRight/bottomRight/bottomLeft、DecimenResultvalid、error、bytes、position、modules其中 modules 表示符号的模块数17 4·version未知时为 0以及DecimenResultVectorsize()/get()/delete()模拟 C 端返回的 vector。两条路径的协作跟踪优先全量兜底receive/worker.ts给出了两条路径的实际调用逻辑当裁剪区域crop带有上次解码成功的quad与模块数dim时先走readTracked——变换直接从四边形重建网格直接采样完全跳过检测阶段。注释记录基准测试结果在 V40版本 40 的 QR 码上单次解码比全量路径快2.0–2.6 倍这省下的是手机端的 CPU 与发热若跟踪命中失败回落到同一缓冲区上的readFull全量扫描同时用其结果重新锚定四边形。跟踪是机会主义的从不承担成败“Tracked is opportunistic, never load-bearing”。全量扫描的调用参数同样值得注意const vec zx.readFull(ptr, pw, ph, true, full ? 12 : 2, full);即 tryHarder 始终开启“real marginal captures are where it earns its keep”全帧扫描允许最多 12 个符号、裁剪扫描只允许 2 个因为错误结果也计入符号数上限见注释“error results COUNT against the symbol cap, hence the headroom above 9 codes”returnErrors在全帧模式下开启使 zxing 检测到但解码失败的符号仍返回位置信息——ChecksumError等错误结果里的位置依然像素级准确接收端据此在下一帧对准裁剪框实现“全帧失败处裁剪解码成功”。解码流程以 RGBA 像素为输入worker 通过_malloc在 WASM 堆分配width×height×4字节用HEAPU8.set拷入像素后调用读取 API结束后_free释放。像素可以来自两种捕获模式——跨线程传输的 ArrayBufferreadback 回退方案或 ImageBitmapGPU 侧裁剪Safari 17/现代浏览器后者的好处是主线程完全不碰像素。预热warm-up设计worker 启动后会用一块 8×8 的全白像素调用一次readFull再丢弃结果目的是完成 WASM 实例化与首次调用的 JIT避免真实第一帧为此付出延迟。池worker pool通过{id: -1}的 ping 消息忽略这次预热。五、许可证构成AGPL 主框架Apache-2.0 与 MIT 的夹层NOTICE 的许可证陈述可以拆成三层decimen-codec 自身AGPL-3.0-or-later与 decimen-optical-transfer 项目整体许可证一致见仓库根目录 LICENSE。这也意味着如果你要在自己的项目里复用这份 vendored 构建AGPL 的传染性条款需要纳入合规考量上游 zxing-cppApache License, Version 2.0NOTICE 特别注明 zxing-cpp 是“unmodified”未修改——在 decimen-codec 上游源码仓库中以固定版本pinned submodule引入。Apache-2.0 与 AGPL-3.0 可以并存但前者要求再分发时保留其 NOTICE 文本这正是仓库在vendor/decimen-codec/下保留 LICENSE.zxing-cpp 全文的原因Emscripten 运行时输出MIT-licensed。decimen_codec.js胶水由 Emscripten 生成Emscripten 的运行时输出以 MIT 许可发布这是构建链中最宽松的一层。仓库根目录的 NOTICE 文件对整份制品做了汇总vendored decimen-codec 构建位于vendor/decimen-codecAGPL-3.0-or-later源码维护在 decimen-codec 上游仓库zxing-cpp 以 Apache-2.0 并入。另外 README.md 的 License 一节还补充了一个项目层面的历史细节decimen-optical-transfer 自 v0.4.0 起采用 AGPL-3.0-or-laterv0.3.0 及之前的版本曾以 MIT 发布且仍保留原条款。六、对复用者的三点提示基于以上源码证据如果你打算在自己项目中接入这份 vendored 解码器有几点值得留意加载方式二选一被托管部署可用.wasm独立资源 service worker 预缓存单文件场景用build/inline-codec-wasm.ts的 Data URL 内联方案。两种方案在receive/下都有一一对应的实现可参考运行时身份可校验接入后调用version()与build()即可确认构建来源配合 banner 首行可做精确的版本审计许可证边界分发制品时需同时满足 AGPL-3.0-or-laterdecimen-codec 与项目整体、Apache-2.0zxing-cpp保留 NOTICE 文本与 MITEmscripten 运行时输出三套条款——这正是 vendor/decimen-codec/NOTICE.md 与 LICENSE.zxing-cpp 必须随制品一起分发的根本原因。如需进一步了解解码器在接收链路中的具体角色与基准测试方法可继续阅读 docs/technical/architecture.md、docs/technical/diagnostics.md 与receive/worker.ts。赞分享前端通信【免费下载链接】decimen-optical-transfer项目地址https://gitcode.com/gh_mirrors/de/decimen-optical-transfer点击查看免费下载相关推荐Aptos 执行器Executor深入解析从区块执行到状态提交的完整技术指南Aptos 执行器Executor深入解析从区块执行到状态提交的完整技术指南 导读 Aptos 是一条 Layer 1 区块链其核心架构是一个 复制状态前端通信Decimen Optical Transfer 架构解析三页面、共享核心与单用途构建插件的无框架设计Decimen Optical Transfer 架构解析三页面、共享核心与单用途构建插件的无框架设计 本篇技术指南围绕 docs/technical/arc前端通信如何快速切换游戏DLSS版本DLSS Swapper让升级降级回退一步到位如何快速切换游戏DLSS版本DLSS Swapper让升级降级回退一步到位 游戏更新后画面开始闪烁、帧数莫名下滑你折腾完驱动又调遍游戏内设置最后才发现是它桌面应用上一篇Pandoc 转 Typst 引文语法映射从 pandoc 引用到 Typst 引用标记下一篇AI_NovelGenerator 实战指南基于大语言模型的多章节长篇小说生成全流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考