@neoanaloglabkk/lensfun-wasm 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +10 -0
- package/README.ja.md +318 -0
- package/README.md +320 -0
- package/README.zh-CN.md +318 -0
- package/THIRD_PARTY_LICENSES.md +20 -0
- package/UPSTREAM.md +23 -0
- package/dist/assets/lensfun-core.data +65868 -0
- package/dist/assets/lensfun-core.js +2 -0
- package/dist/assets/lensfun-core.wasm +0 -0
- package/dist/esm/index.js +290 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/types/src/index.d.ts +104 -0
- package/dist/types/src/index.d.ts.map +1 -0
- package/dist/types/tests/api-shape.test.d.ts +2 -0
- package/dist/types/tests/api-shape.test.d.ts.map +1 -0
- package/dist/umd/index.iife.js +313 -0
- package/dist/umd/index.iife.js.map +1 -0
- package/native/CMakeLists.txt +90 -0
- package/native/include/glib/gstdio.h +6 -0
- package/native/include/glib.h +215 -0
- package/native/include/lensfun_wasm_bridge.h +24 -0
- package/native/src/cpuid_stub.cpp +8 -0
- package/native/src/entrypoint.cpp +4 -0
- package/native/src/glib_compat.cpp +799 -0
- package/native/src/lensfun_wasm_bridge.cpp +487 -0
- package/package.json +54 -0
- package/scripts/build-wasm.sh +31 -0
- package/scripts/sync-upstream.sh +25 -0
- package/scripts/verify-release-tag.mjs +41 -0
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
# lensfun-wasm
|
|
2
|
+
|
|
3
|
+
语言: [English](./README.md) | **简体中文** | [日本語](./README.ja.md)
|
|
4
|
+
|
|
5
|
+
将 [Lensfun](https://github.com/lensfun/lensfun) 编译为 WebAssembly,并提供适合前端直接调用的 JavaScript API。
|
|
6
|
+
|
|
7
|
+
## 项目概览
|
|
8
|
+
|
|
9
|
+
`lensfun-wasm` 包含:
|
|
10
|
+
|
|
11
|
+
- 以固定 commit 方式接入的 `lensfun` 上游源码(git submodule)
|
|
12
|
+
- 完整官方镜头数据库(`data/db`,打包进 `.data`)
|
|
13
|
+
- 稳定的 C 层 wasm 导出接口
|
|
14
|
+
- 高层 TypeScript API
|
|
15
|
+
- 同时支持 npm(ESM)和 CDN(UMD)
|
|
16
|
+
|
|
17
|
+
## 能做什么
|
|
18
|
+
|
|
19
|
+
- 在浏览器内初始化 Lensfun 数据库
|
|
20
|
+
- 搜索镜头与机身
|
|
21
|
+
- 生成以下矫正映射(map):
|
|
22
|
+
- 几何/畸变
|
|
23
|
+
- TCA(横向色差)
|
|
24
|
+
- 暗角(vignetting)
|
|
25
|
+
|
|
26
|
+
输出数据可直接用于 WebGL/WebGPU/canvas 的重映射流程。
|
|
27
|
+
|
|
28
|
+
## 目录结构
|
|
29
|
+
|
|
30
|
+
- `third_party/lensfun`:上游源码子模块
|
|
31
|
+
- `native/`:wasm bridge、GLib 兼容层、CMake 构建
|
|
32
|
+
- `src/`:TS 对外 API
|
|
33
|
+
- `scripts/build-wasm.sh`:wasm 构建入口
|
|
34
|
+
- `dist/assets/`:生成的 `lensfun-core.js/.wasm/.data`
|
|
35
|
+
|
|
36
|
+
## 环境要求
|
|
37
|
+
|
|
38
|
+
### 运行时(仅使用包)
|
|
39
|
+
|
|
40
|
+
- 支持 WebAssembly 的现代浏览器
|
|
41
|
+
|
|
42
|
+
### 源码构建
|
|
43
|
+
|
|
44
|
+
- Node.js 22+
|
|
45
|
+
- npm 10+
|
|
46
|
+
- CMake 3.20+
|
|
47
|
+
- Emscripten(`emcc`、`emcmake` 可用)
|
|
48
|
+
|
|
49
|
+
## 安装
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install @neoanaloglabkk/lensfun-wasm
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 快速开始(打包器)
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
import { createLensfun } from '@neoanaloglabkk/lensfun-wasm';
|
|
59
|
+
import createLensfunCoreModule from '@neoanaloglabkk/lensfun-wasm/core';
|
|
60
|
+
import wasmUrl from '@neoanaloglabkk/lensfun-wasm/core-wasm?url';
|
|
61
|
+
import dataUrl from '@neoanaloglabkk/lensfun-wasm/core-data?url';
|
|
62
|
+
|
|
63
|
+
const client = await createLensfun({
|
|
64
|
+
moduleFactory: createLensfunCoreModule,
|
|
65
|
+
wasmUrl,
|
|
66
|
+
dataUrl
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const lenses = client.searchLenses({
|
|
70
|
+
lensModel: 'pEntax 50-200 ED'
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
console.log(lenses[0]);
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 快速开始(CDN)
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<script src="https://cdn.jsdelivr.net/npm/@neoanaloglabkk/lensfun-wasm@0.1.0/dist/assets/lensfun-core.js"></script>
|
|
80
|
+
<script src="https://cdn.jsdelivr.net/npm/@neoanaloglabkk/lensfun-wasm@0.1.0/dist/umd/index.iife.js"></script>
|
|
81
|
+
<script>
|
|
82
|
+
(async () => {
|
|
83
|
+
const client = await LensfunWasm.createLensfun();
|
|
84
|
+
const lenses = client.searchLenses({ lensModel: 'pEntax 50-200 ED' });
|
|
85
|
+
console.log(lenses[0]);
|
|
86
|
+
})();
|
|
87
|
+
</script>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## API 说明
|
|
91
|
+
|
|
92
|
+
## `createLensfun(options?) => Promise<LensfunClient>`
|
|
93
|
+
|
|
94
|
+
`options`(`LensfunInitOptions`)字段:
|
|
95
|
+
|
|
96
|
+
- `moduleFactory?: (opts) => Promise<LensfunModule>`
|
|
97
|
+
- 打包器场景推荐。通常来自 `import createLensfunCoreModule from '@neoanaloglabkk/lensfun-wasm/core'`。
|
|
98
|
+
- `moduleJsUrl?: string`
|
|
99
|
+
- 动态加载 `lensfun-core.js` 的备用方式。
|
|
100
|
+
- `wasmUrl?: string`
|
|
101
|
+
- 显式指定 `lensfun-core.wasm` 地址。
|
|
102
|
+
- `dataUrl?: string`
|
|
103
|
+
- 显式指定 `lensfun-core.data` 地址。
|
|
104
|
+
- `locateFile?: (path, prefix) => string`
|
|
105
|
+
- 完整覆盖 Emscripten 资源定位逻辑。
|
|
106
|
+
- `dbPath?: string`
|
|
107
|
+
- Emscripten 文件系统中的数据库路径,默认 `/lensfun-db`。
|
|
108
|
+
- `autoInitDb?: boolean`
|
|
109
|
+
- 默认 `true`,设为 `false` 可跳过初始化。
|
|
110
|
+
|
|
111
|
+
## `LensfunClient`
|
|
112
|
+
|
|
113
|
+
### `searchLenses(input) => LensMatch[]`
|
|
114
|
+
|
|
115
|
+
`SearchLensesInput`:
|
|
116
|
+
|
|
117
|
+
- `lensModel`(必填)
|
|
118
|
+
- `lensMaker?`
|
|
119
|
+
- `cameraMaker?`
|
|
120
|
+
- `cameraModel?`
|
|
121
|
+
- `searchFlags?`(默认 `LF_SEARCH_SORT_AND_UNIQUIFY`)
|
|
122
|
+
|
|
123
|
+
返回 `LensMatch[]`:
|
|
124
|
+
|
|
125
|
+
- `handle`(后续生成 map 需要)
|
|
126
|
+
- `maker`、`model`、`score`
|
|
127
|
+
- `minFocal`、`maxFocal`、`minAperture`、`maxAperture`、`cropFactor`
|
|
128
|
+
|
|
129
|
+
### `searchCameras(input) => CameraMatch[]`
|
|
130
|
+
|
|
131
|
+
`SearchCamerasInput`:
|
|
132
|
+
|
|
133
|
+
- `maker?`
|
|
134
|
+
- `model?`
|
|
135
|
+
- `searchFlags?`
|
|
136
|
+
|
|
137
|
+
返回 `CameraMatch[]`,字段包含 `maker/model/variant/mount/cropFactor/score`。
|
|
138
|
+
|
|
139
|
+
### `getAvailableModifications(lensHandle, crop) => number`
|
|
140
|
+
|
|
141
|
+
返回 Lensfun 的 `LF_MODIFY_*` 位标志。
|
|
142
|
+
|
|
143
|
+
### `buildCorrectionMaps(input) => CorrectionMaps`
|
|
144
|
+
|
|
145
|
+
`CorrectionInput`:
|
|
146
|
+
|
|
147
|
+
- `lensHandle`(必填)
|
|
148
|
+
- `width`、`height`(必填,正整数)
|
|
149
|
+
- `focal`、`crop`(必填)
|
|
150
|
+
- `step?`(默认 `1`)
|
|
151
|
+
- `reverse?`(默认 `false`)
|
|
152
|
+
- `includeTca?`(默认 `false`)
|
|
153
|
+
- `includeVignetting?`(默认 `false`)
|
|
154
|
+
- `aperture?`(当 `includeVignetting = true` 时必填)
|
|
155
|
+
- `distance?`(默认 `1000`)
|
|
156
|
+
|
|
157
|
+
`CorrectionMaps`:
|
|
158
|
+
|
|
159
|
+
- `gridWidth`、`gridHeight`、`step`
|
|
160
|
+
- `geometry: Float32Array` 长度 = `gridW * gridH * 2`
|
|
161
|
+
- 布局:`[x0, y0, x1, y1, ...]`
|
|
162
|
+
- `tca?: Float32Array` 长度 = `gridW * gridH * 6`
|
|
163
|
+
- 布局:`[rx, ry, gx, gy, bx, by, ...]`
|
|
164
|
+
- `vignetting?: Float32Array` 长度 = `gridW * gridH * 3`
|
|
165
|
+
- 布局:`[rGain, gGain, bGain, ...]`
|
|
166
|
+
|
|
167
|
+
### `dispose()`
|
|
168
|
+
|
|
169
|
+
释放原生数据库内存。完成后建议调用。
|
|
170
|
+
|
|
171
|
+
## 导出常量
|
|
172
|
+
|
|
173
|
+
搜索相关:
|
|
174
|
+
|
|
175
|
+
- `LF_SEARCH_LOOSE = 1`
|
|
176
|
+
- `LF_SEARCH_SORT_AND_UNIQUIFY = 2`
|
|
177
|
+
|
|
178
|
+
矫正能力位标志:
|
|
179
|
+
|
|
180
|
+
- `LF_MODIFY_TCA = 0x00000001`
|
|
181
|
+
- `LF_MODIFY_VIGNETTING = 0x00000002`
|
|
182
|
+
- `LF_MODIFY_DISTORTION = 0x00000008`
|
|
183
|
+
- `LF_MODIFY_GEOMETRY = 0x00000010`
|
|
184
|
+
- `LF_MODIFY_SCALE = 0x00000020`
|
|
185
|
+
- `LF_MODIFY_PERSPECTIVE = 0x00000040`
|
|
186
|
+
|
|
187
|
+
## 从源码构建
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# 1) 安装依赖
|
|
191
|
+
npm install
|
|
192
|
+
|
|
193
|
+
# 2) 确保 emcc/emcmake 可用
|
|
194
|
+
# 例如:source /path/to/emsdk/emsdk_env.sh
|
|
195
|
+
|
|
196
|
+
# 3) 构建 wasm + js + 类型声明
|
|
197
|
+
npm run build
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
`npm run build` 包含:
|
|
201
|
+
|
|
202
|
+
1. `npm run build:wasm`
|
|
203
|
+
2. `npm run build:js`
|
|
204
|
+
3. `npm run build:types`
|
|
205
|
+
|
|
206
|
+
输出产物:
|
|
207
|
+
|
|
208
|
+
- `dist/assets/lensfun-core.js`
|
|
209
|
+
- `dist/assets/lensfun-core.wasm`
|
|
210
|
+
- `dist/assets/lensfun-core.data`
|
|
211
|
+
- `dist/esm/index.js`
|
|
212
|
+
- `dist/umd/index.iife.js`
|
|
213
|
+
- `dist/types/index.d.ts`
|
|
214
|
+
|
|
215
|
+
## 本地检查
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
npm run check
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
包含:
|
|
222
|
+
|
|
223
|
+
- JS 打包
|
|
224
|
+
- 类型声明生成
|
|
225
|
+
- Vitest 单测
|
|
226
|
+
|
|
227
|
+
## 自动发布(npm + jsDelivr)
|
|
228
|
+
|
|
229
|
+
仓库已配置为:推送 `v*` tag 后由 GitHub Actions 自动发布到 npmjs.org。
|
|
230
|
+
对应工作流:`.github/workflows/release.yml`
|
|
231
|
+
|
|
232
|
+
已启用的发布保护:
|
|
233
|
+
|
|
234
|
+
1. tag 与版本一致性校验(`vX.Y.Z` 必须等于 `package.json` 的 `version`)
|
|
235
|
+
2. 构建与测试
|
|
236
|
+
3. `npm pack --dry-run` 打包校验
|
|
237
|
+
4. 发布到 npmjs.org(带 provenance)
|
|
238
|
+
|
|
239
|
+
一次性配置:
|
|
240
|
+
|
|
241
|
+
1. 在 npm 创建可发布的 Automation Token
|
|
242
|
+
2. 在 GitHub 仓库 Secrets 中添加 `NPM_TOKEN`
|
|
243
|
+
|
|
244
|
+
发布命令:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
git checkout main
|
|
248
|
+
git pull --ff-only
|
|
249
|
+
|
|
250
|
+
# package.json 版本需已设置(示例:0.1.0)
|
|
251
|
+
git tag v0.1.0
|
|
252
|
+
git push origin v0.1.0
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
发布后校验:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
npm view @neoanaloglabkk/lensfun-wasm version dist-tags --json
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
CDN 说明:
|
|
262
|
+
|
|
263
|
+
- jsDelivr 只会自动同步 npmjs.org 的包。
|
|
264
|
+
|
|
265
|
+
## 上游同步策略
|
|
266
|
+
|
|
267
|
+
- Lensfun 通过 submodule 固定 commit 管理。
|
|
268
|
+
- 手动升级,不自动追踪。
|
|
269
|
+
|
|
270
|
+
同步命令:
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
scripts/sync-upstream.sh origin/master
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
升级后请执行:
|
|
277
|
+
|
|
278
|
+
1. 重新构建 wasm
|
|
279
|
+
2. 跑测试
|
|
280
|
+
3. 更新 `UPSTREAM.md`
|
|
281
|
+
|
|
282
|
+
## 常见问题
|
|
283
|
+
|
|
284
|
+
### `emcc not found`
|
|
285
|
+
|
|
286
|
+
未安装或未激活 emsdk。请在当前 shell 中激活后再构建。
|
|
287
|
+
|
|
288
|
+
### `module factory not found`
|
|
289
|
+
|
|
290
|
+
没有提供 `moduleFactory`,也没有预加载 `dist/assets/lensfun-core.js`。
|
|
291
|
+
|
|
292
|
+
### `lfw_init failed with code ...`
|
|
293
|
+
|
|
294
|
+
数据库文件路径或 `.data` 加载不正确。
|
|
295
|
+
|
|
296
|
+
- 检查 `dataUrl` 是否指向 `lensfun-core.data`
|
|
297
|
+
- 检查 `dbPath` 是否与预加载路径一致(默认 `/lensfun-db`)
|
|
298
|
+
|
|
299
|
+
### `native map builder failed with code ...`
|
|
300
|
+
|
|
301
|
+
通常是输入参数问题或镜头标定数据不匹配。
|
|
302
|
+
|
|
303
|
+
- `lensHandle` 必须来自当前实例的 `searchLenses`
|
|
304
|
+
- `width/height/step` 需合法
|
|
305
|
+
- 请求暗角 map 时必须提供 `aperture`
|
|
306
|
+
|
|
307
|
+
## 许可证
|
|
308
|
+
|
|
309
|
+
- Lensfun 核心库:LGPL-3.0-or-later
|
|
310
|
+
- Lensfun 数据库:CC BY-SA 3.0
|
|
311
|
+
- tinyxml2:zlib
|
|
312
|
+
- utf8proc:MIT
|
|
313
|
+
|
|
314
|
+
详见:
|
|
315
|
+
|
|
316
|
+
- [NOTICE.md](./NOTICE.md)
|
|
317
|
+
- [THIRD_PARTY_LICENSES.md](./THIRD_PARTY_LICENSES.md)
|
|
318
|
+
- [UPSTREAM.md](./UPSTREAM.md)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Third-Party Licenses
|
|
2
|
+
|
|
3
|
+
## Lensfun
|
|
4
|
+
|
|
5
|
+
- Repository: https://github.com/lensfun/lensfun
|
|
6
|
+
- Library license: GNU LGPL v3.0 or later
|
|
7
|
+
- Database license: Creative Commons Attribution-ShareAlike 3.0
|
|
8
|
+
- Copyright: Lensfun contributors
|
|
9
|
+
|
|
10
|
+
## tinyxml2
|
|
11
|
+
|
|
12
|
+
- Repository: https://github.com/leethomason/tinyxml2
|
|
13
|
+
- License: zlib
|
|
14
|
+
- Copyright: Lee Thomason
|
|
15
|
+
|
|
16
|
+
## utf8proc
|
|
17
|
+
|
|
18
|
+
- Repository: https://github.com/JuliaStrings/utf8proc
|
|
19
|
+
- License: MIT
|
|
20
|
+
- Copyright: utf8proc contributors
|
package/UPSTREAM.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Upstream Tracking
|
|
2
|
+
|
|
3
|
+
## Source of truth
|
|
4
|
+
|
|
5
|
+
- Upstream repo: https://github.com/lensfun/lensfun.git
|
|
6
|
+
- Integration mode: git submodule (`third_party/lensfun`)
|
|
7
|
+
- Current pinned commit: `655a9c4e3e53c25bc04843c853e7e7a0121359e7`
|
|
8
|
+
- Commit date: `2026-02-28`
|
|
9
|
+
- Commit subject: `Add tca data for Meike SL 35mm F1.8 STM PRO`
|
|
10
|
+
|
|
11
|
+
## Update policy
|
|
12
|
+
|
|
13
|
+
- Pin exact commits.
|
|
14
|
+
- Upgrade manually via PR.
|
|
15
|
+
- Run full build/test after each bump.
|
|
16
|
+
|
|
17
|
+
## Update steps
|
|
18
|
+
|
|
19
|
+
1. `scripts/sync-upstream.sh origin/master`
|
|
20
|
+
2. Review upstream diff impact (API, DB changes, compile behavior)
|
|
21
|
+
3. Rebuild wasm assets
|
|
22
|
+
4. Run tests
|
|
23
|
+
5. Update this file with new commit metadata
|