@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
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var LensfunWasm = (() => {
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/index.ts
|
|
22
|
+
var src_exports = {};
|
|
23
|
+
__export(src_exports, {
|
|
24
|
+
LF_MODIFY_DISTORTION: () => LF_MODIFY_DISTORTION,
|
|
25
|
+
LF_MODIFY_GEOMETRY: () => LF_MODIFY_GEOMETRY,
|
|
26
|
+
LF_MODIFY_PERSPECTIVE: () => LF_MODIFY_PERSPECTIVE,
|
|
27
|
+
LF_MODIFY_SCALE: () => LF_MODIFY_SCALE,
|
|
28
|
+
LF_MODIFY_TCA: () => LF_MODIFY_TCA,
|
|
29
|
+
LF_MODIFY_VIGNETTING: () => LF_MODIFY_VIGNETTING,
|
|
30
|
+
LF_SEARCH_LOOSE: () => LF_SEARCH_LOOSE,
|
|
31
|
+
LF_SEARCH_SORT_AND_UNIQUIFY: () => LF_SEARCH_SORT_AND_UNIQUIFY,
|
|
32
|
+
LensfunClient: () => LensfunClient,
|
|
33
|
+
createLensfun: () => createLensfun
|
|
34
|
+
});
|
|
35
|
+
var LF_SEARCH_LOOSE = 1;
|
|
36
|
+
var LF_SEARCH_SORT_AND_UNIQUIFY = 2;
|
|
37
|
+
var LF_MODIFY_TCA = 1;
|
|
38
|
+
var LF_MODIFY_VIGNETTING = 2;
|
|
39
|
+
var LF_MODIFY_DISTORTION = 8;
|
|
40
|
+
var LF_MODIFY_GEOMETRY = 16;
|
|
41
|
+
var LF_MODIFY_SCALE = 32;
|
|
42
|
+
var LF_MODIFY_PERSPECTIVE = 64;
|
|
43
|
+
var globalScope = globalThis;
|
|
44
|
+
function requiredString(value, field) {
|
|
45
|
+
if (!value || value.trim().length === 0) {
|
|
46
|
+
throw new Error(`[lensfun-wasm] ${field} is required`);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
function toFlag(value) {
|
|
51
|
+
return value ? 1 : 0;
|
|
52
|
+
}
|
|
53
|
+
function toGrid(size, step) {
|
|
54
|
+
return Math.floor((size - 1) / step) + 1;
|
|
55
|
+
}
|
|
56
|
+
function requirePositiveInt(value, field) {
|
|
57
|
+
if (!Number.isInteger(value) || value <= 0) {
|
|
58
|
+
throw new Error(`[lensfun-wasm] ${field} must be a positive integer`);
|
|
59
|
+
}
|
|
60
|
+
return value;
|
|
61
|
+
}
|
|
62
|
+
async function loadScript(url) {
|
|
63
|
+
if (typeof document === "undefined") {
|
|
64
|
+
throw new Error("[lensfun-wasm] moduleJsUrl in non-browser runtime requires moduleFactory instead");
|
|
65
|
+
}
|
|
66
|
+
await new Promise((resolve, reject) => {
|
|
67
|
+
const script = document.createElement("script");
|
|
68
|
+
script.src = url;
|
|
69
|
+
script.async = true;
|
|
70
|
+
script.onload = () => resolve();
|
|
71
|
+
script.onerror = () => reject(new Error(`[lensfun-wasm] failed to load ${url}`));
|
|
72
|
+
document.head.appendChild(script);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
async function resolveFactory(options) {
|
|
76
|
+
if (options.moduleFactory) {
|
|
77
|
+
return options.moduleFactory;
|
|
78
|
+
}
|
|
79
|
+
const existing = globalScope.createLensfunCoreModule;
|
|
80
|
+
if (typeof existing === "function") {
|
|
81
|
+
return existing;
|
|
82
|
+
}
|
|
83
|
+
if (options.moduleJsUrl) {
|
|
84
|
+
if (typeof document !== "undefined") {
|
|
85
|
+
await loadScript(options.moduleJsUrl);
|
|
86
|
+
const globalFactory = globalScope.createLensfunCoreModule;
|
|
87
|
+
if (typeof globalFactory === "function") {
|
|
88
|
+
return globalFactory;
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
const imported = await import(
|
|
92
|
+
/* @vite-ignore */
|
|
93
|
+
options.moduleJsUrl
|
|
94
|
+
);
|
|
95
|
+
const loaded = imported.default ?? imported.createLensfunCoreModule;
|
|
96
|
+
if (typeof loaded === "function") {
|
|
97
|
+
return loaded;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
throw new Error(
|
|
102
|
+
"[lensfun-wasm] module factory not found. Provide moduleFactory or preload dist/assets/lensfun-core.js (global createLensfunCoreModule)."
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
function makeLocateFile(options) {
|
|
106
|
+
return (path, prefix) => {
|
|
107
|
+
if (options.locateFile) {
|
|
108
|
+
return options.locateFile(path, prefix);
|
|
109
|
+
}
|
|
110
|
+
if (path.endsWith(".wasm") && options.wasmUrl) {
|
|
111
|
+
return options.wasmUrl;
|
|
112
|
+
}
|
|
113
|
+
if (path.endsWith(".data") && options.dataUrl) {
|
|
114
|
+
return options.dataUrl;
|
|
115
|
+
}
|
|
116
|
+
return `${prefix}${path}`;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function parseJsonPtr(module, freePtr, ptr) {
|
|
120
|
+
if (!ptr) {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
const raw = module.UTF8ToString(ptr);
|
|
124
|
+
freePtr(ptr);
|
|
125
|
+
if (!raw) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
return JSON.parse(raw);
|
|
129
|
+
}
|
|
130
|
+
function bindFns(module) {
|
|
131
|
+
return {
|
|
132
|
+
init: module.cwrap("lfw_init", "number", ["string"]),
|
|
133
|
+
dispose: module.cwrap("lfw_dispose", null, []),
|
|
134
|
+
findLensesJson: module.cwrap("lfw_find_lenses_json", "number", ["string", "string", "string", "string", "number"]),
|
|
135
|
+
findCamerasJson: module.cwrap("lfw_find_cameras_json", "number", ["string", "string", "number"]),
|
|
136
|
+
availableMods: module.cwrap("lfw_available_mods", "number", ["number", "number"]),
|
|
137
|
+
buildGeometryMap: module.cwrap("lfw_build_geometry_map", "number", [
|
|
138
|
+
"number",
|
|
139
|
+
"number",
|
|
140
|
+
"number",
|
|
141
|
+
"number",
|
|
142
|
+
"number",
|
|
143
|
+
"number",
|
|
144
|
+
"number",
|
|
145
|
+
"number",
|
|
146
|
+
"number"
|
|
147
|
+
]),
|
|
148
|
+
buildTcaMap: module.cwrap("lfw_build_tca_map", "number", [
|
|
149
|
+
"number",
|
|
150
|
+
"number",
|
|
151
|
+
"number",
|
|
152
|
+
"number",
|
|
153
|
+
"number",
|
|
154
|
+
"number",
|
|
155
|
+
"number",
|
|
156
|
+
"number",
|
|
157
|
+
"number"
|
|
158
|
+
]),
|
|
159
|
+
buildVignettingMap: module.cwrap("lfw_build_vignetting_map", "number", [
|
|
160
|
+
"number",
|
|
161
|
+
"number",
|
|
162
|
+
"number",
|
|
163
|
+
"number",
|
|
164
|
+
"number",
|
|
165
|
+
"number",
|
|
166
|
+
"number",
|
|
167
|
+
"number",
|
|
168
|
+
"number",
|
|
169
|
+
"number",
|
|
170
|
+
"number"
|
|
171
|
+
]),
|
|
172
|
+
freePtr: module.cwrap("lfw_free", null, ["number"])
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
var LensfunClient = class {
|
|
176
|
+
constructor(module, fns) {
|
|
177
|
+
this.disposed = false;
|
|
178
|
+
this.module = module;
|
|
179
|
+
this.fns = fns;
|
|
180
|
+
}
|
|
181
|
+
dispose() {
|
|
182
|
+
if (this.disposed) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
this.fns.dispose();
|
|
186
|
+
this.disposed = true;
|
|
187
|
+
}
|
|
188
|
+
searchLenses(input) {
|
|
189
|
+
this.ensureAlive();
|
|
190
|
+
const lensModel = requiredString(input.lensModel, "lensModel");
|
|
191
|
+
const ptr = this.fns.findLensesJson(
|
|
192
|
+
input.cameraMaker ?? "",
|
|
193
|
+
input.cameraModel ?? "",
|
|
194
|
+
input.lensMaker ?? "",
|
|
195
|
+
lensModel,
|
|
196
|
+
input.searchFlags ?? LF_SEARCH_SORT_AND_UNIQUIFY
|
|
197
|
+
);
|
|
198
|
+
return parseJsonPtr(this.module, this.fns.freePtr, ptr);
|
|
199
|
+
}
|
|
200
|
+
searchCameras(input) {
|
|
201
|
+
this.ensureAlive();
|
|
202
|
+
const ptr = this.fns.findCamerasJson(
|
|
203
|
+
input.maker ?? "",
|
|
204
|
+
input.model ?? "",
|
|
205
|
+
input.searchFlags ?? 0
|
|
206
|
+
);
|
|
207
|
+
return parseJsonPtr(this.module, this.fns.freePtr, ptr);
|
|
208
|
+
}
|
|
209
|
+
getAvailableModifications(lensHandle, crop) {
|
|
210
|
+
this.ensureAlive();
|
|
211
|
+
return this.fns.availableMods(lensHandle, crop);
|
|
212
|
+
}
|
|
213
|
+
buildCorrectionMaps(input) {
|
|
214
|
+
this.ensureAlive();
|
|
215
|
+
const width = requirePositiveInt(input.width, "width");
|
|
216
|
+
const height = requirePositiveInt(input.height, "height");
|
|
217
|
+
const step = requirePositiveInt(input.step ?? 1, "step");
|
|
218
|
+
const gridWidth = toGrid(width, step);
|
|
219
|
+
const gridHeight = toGrid(height, step);
|
|
220
|
+
const geometry = this.runFloatMap(
|
|
221
|
+
gridWidth * gridHeight * 2,
|
|
222
|
+
this.fns.buildGeometryMap,
|
|
223
|
+
input.lensHandle,
|
|
224
|
+
input.focal,
|
|
225
|
+
input.crop,
|
|
226
|
+
width,
|
|
227
|
+
height,
|
|
228
|
+
toFlag(input.reverse),
|
|
229
|
+
step
|
|
230
|
+
);
|
|
231
|
+
const result = {
|
|
232
|
+
gridWidth,
|
|
233
|
+
gridHeight,
|
|
234
|
+
step,
|
|
235
|
+
geometry
|
|
236
|
+
};
|
|
237
|
+
if (input.includeTca) {
|
|
238
|
+
result.tca = this.runFloatMap(
|
|
239
|
+
gridWidth * gridHeight * 6,
|
|
240
|
+
this.fns.buildTcaMap,
|
|
241
|
+
input.lensHandle,
|
|
242
|
+
input.focal,
|
|
243
|
+
input.crop,
|
|
244
|
+
width,
|
|
245
|
+
height,
|
|
246
|
+
toFlag(input.reverse),
|
|
247
|
+
step
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
if (input.includeVignetting) {
|
|
251
|
+
if (typeof input.aperture !== "number") {
|
|
252
|
+
throw new Error("[lensfun-wasm] aperture is required for vignetting map");
|
|
253
|
+
}
|
|
254
|
+
result.vignetting = this.runFloatMap(
|
|
255
|
+
gridWidth * gridHeight * 3,
|
|
256
|
+
this.fns.buildVignettingMap,
|
|
257
|
+
input.lensHandle,
|
|
258
|
+
input.focal,
|
|
259
|
+
input.crop,
|
|
260
|
+
input.aperture,
|
|
261
|
+
input.distance ?? 1e3,
|
|
262
|
+
width,
|
|
263
|
+
height,
|
|
264
|
+
toFlag(input.reverse),
|
|
265
|
+
step
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
runFloatMap(size, fn, ...args) {
|
|
271
|
+
const bytes = size * 4;
|
|
272
|
+
const ptr = this.module._malloc(bytes);
|
|
273
|
+
try {
|
|
274
|
+
const rc = fn(...args, ptr, size);
|
|
275
|
+
if (rc !== 0) {
|
|
276
|
+
throw new Error(`[lensfun-wasm] native map builder failed with code ${rc}`);
|
|
277
|
+
}
|
|
278
|
+
const start = ptr >> 2;
|
|
279
|
+
const end = start + size;
|
|
280
|
+
const out = new Float32Array(size);
|
|
281
|
+
out.set(this.module.HEAPF32.subarray(start, end));
|
|
282
|
+
return out;
|
|
283
|
+
} finally {
|
|
284
|
+
this.module._free(ptr);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
ensureAlive() {
|
|
288
|
+
if (this.disposed) {
|
|
289
|
+
throw new Error("[lensfun-wasm] LensfunClient is disposed");
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
async function createLensfun(options = {}) {
|
|
294
|
+
const factory = await resolveFactory(options);
|
|
295
|
+
if (!factory) {
|
|
296
|
+
throw new Error("[lensfun-wasm] failed to resolve module factory");
|
|
297
|
+
}
|
|
298
|
+
const module = await factory({
|
|
299
|
+
locateFile: makeLocateFile(options)
|
|
300
|
+
});
|
|
301
|
+
const fns = bindFns(module);
|
|
302
|
+
if (options.autoInitDb ?? true) {
|
|
303
|
+
const dbPath = options.dbPath ?? "/lensfun-db";
|
|
304
|
+
const rc = fns.init(dbPath);
|
|
305
|
+
if (rc !== 0) {
|
|
306
|
+
throw new Error(`[lensfun-wasm] lfw_init failed with code ${rc} for ${dbPath}`);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return new LensfunClient(module, fns);
|
|
310
|
+
}
|
|
311
|
+
return __toCommonJS(src_exports);
|
|
312
|
+
})();
|
|
313
|
+
//# sourceMappingURL=index.iife.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export const LF_SEARCH_LOOSE = 1;\nexport const LF_SEARCH_SORT_AND_UNIQUIFY = 2;\n\nexport const LF_MODIFY_TCA = 0x00000001;\nexport const LF_MODIFY_VIGNETTING = 0x00000002;\nexport const LF_MODIFY_DISTORTION = 0x00000008;\nexport const LF_MODIFY_GEOMETRY = 0x00000010;\nexport const LF_MODIFY_SCALE = 0x00000020;\nexport const LF_MODIFY_PERSPECTIVE = 0x00000040;\n\nexport interface LensfunModule {\n cwrap: (ident: string, returnType: string | null, argTypes: string[]) => (...args: unknown[]) => unknown;\n UTF8ToString: (ptr: number) => string;\n _malloc: (size: number) => number;\n _free: (ptr: number) => void;\n HEAPF32: Float32Array;\n}\n\nexport interface LensfunInitOptions {\n moduleFactory?: (options?: Record<string, unknown>) => Promise<LensfunModule>;\n moduleJsUrl?: string;\n wasmUrl?: string;\n dataUrl?: string;\n locateFile?: (path: string, prefix: string) => string;\n dbPath?: string;\n autoInitDb?: boolean;\n}\n\nexport interface LensMatch {\n handle: number;\n maker: string;\n model: string;\n score: number;\n minFocal: number;\n maxFocal: number;\n minAperture: number;\n maxAperture: number;\n cropFactor: number;\n}\n\nexport interface CameraMatch {\n maker: string;\n model: string;\n variant: string;\n mount: string;\n cropFactor: number;\n score: number;\n}\n\nexport interface SearchLensesInput {\n lensMaker?: string;\n lensModel: string;\n cameraMaker?: string;\n cameraModel?: string;\n searchFlags?: number;\n}\n\nexport interface SearchCamerasInput {\n maker?: string;\n model?: string;\n searchFlags?: number;\n}\n\nexport interface CorrectionInput {\n lensHandle: number;\n width: number;\n height: number;\n focal: number;\n crop: number;\n step?: number;\n reverse?: boolean;\n includeTca?: boolean;\n includeVignetting?: boolean;\n aperture?: number;\n distance?: number;\n}\n\nexport interface CorrectionMaps {\n gridWidth: number;\n gridHeight: number;\n step: number;\n geometry: Float32Array;\n tca?: Float32Array;\n vignetting?: Float32Array;\n}\n\ntype CFn = (...args: unknown[]) => unknown;\n\ninterface NativeFns {\n init: CFn;\n dispose: CFn;\n findLensesJson: CFn;\n findCamerasJson: CFn;\n availableMods: CFn;\n buildGeometryMap: CFn;\n buildTcaMap: CFn;\n buildVignettingMap: CFn;\n freePtr: CFn;\n}\n\nconst globalScope = globalThis as Record<string, unknown>;\n\nfunction requiredString(value: string | undefined, field: string): string {\n if (!value || value.trim().length === 0) {\n throw new Error(`[lensfun-wasm] ${field} is required`);\n }\n return value;\n}\n\nfunction toFlag(value: boolean | undefined): number {\n return value ? 1 : 0;\n}\n\nfunction toGrid(size: number, step: number): number {\n return Math.floor((size - 1) / step) + 1;\n}\n\nfunction requirePositiveInt(value: number, field: string): number {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`[lensfun-wasm] ${field} must be a positive integer`);\n }\n return value;\n}\n\nasync function loadScript(url: string): Promise<void> {\n if (typeof document === 'undefined') {\n throw new Error('[lensfun-wasm] moduleJsUrl in non-browser runtime requires moduleFactory instead');\n }\n\n await new Promise<void>((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(`[lensfun-wasm] failed to load ${url}`));\n document.head.appendChild(script);\n });\n}\n\nasync function resolveFactory(options: LensfunInitOptions): Promise<LensfunInitOptions['moduleFactory']> {\n if (options.moduleFactory) {\n return options.moduleFactory;\n }\n\n const existing = globalScope.createLensfunCoreModule;\n if (typeof existing === 'function') {\n return existing as LensfunInitOptions['moduleFactory'];\n }\n\n if (options.moduleJsUrl) {\n if (typeof document !== 'undefined') {\n await loadScript(options.moduleJsUrl);\n const globalFactory = globalScope.createLensfunCoreModule;\n if (typeof globalFactory === 'function') {\n return globalFactory as LensfunInitOptions['moduleFactory'];\n }\n } else {\n const imported = await import(/* @vite-ignore */ options.moduleJsUrl);\n const loaded =\n (imported as Record<string, unknown>).default ??\n (imported as Record<string, unknown>).createLensfunCoreModule;\n if (typeof loaded === 'function') {\n return loaded as LensfunInitOptions['moduleFactory'];\n }\n }\n }\n\n throw new Error(\n '[lensfun-wasm] module factory not found. Provide moduleFactory or preload dist/assets/lensfun-core.js (global createLensfunCoreModule).'\n );\n}\n\nfunction makeLocateFile(options: LensfunInitOptions): (path: string, prefix: string) => string {\n return (path: string, prefix: string) => {\n if (options.locateFile) {\n return options.locateFile(path, prefix);\n }\n\n if (path.endsWith('.wasm') && options.wasmUrl) {\n return options.wasmUrl;\n }\n\n if (path.endsWith('.data') && options.dataUrl) {\n return options.dataUrl;\n }\n\n return `${prefix}${path}`;\n };\n}\n\nfunction parseJsonPtr<T>(module: LensfunModule, freePtr: CFn, ptr: number): T[] {\n if (!ptr) {\n return [];\n }\n\n const raw = module.UTF8ToString(ptr);\n freePtr(ptr);\n if (!raw) {\n return [];\n }\n return JSON.parse(raw) as T[];\n}\n\nfunction bindFns(module: LensfunModule): NativeFns {\n return {\n init: module.cwrap('lfw_init', 'number', ['string']),\n dispose: module.cwrap('lfw_dispose', null, []),\n findLensesJson: module.cwrap('lfw_find_lenses_json', 'number', ['string', 'string', 'string', 'string', 'number']),\n findCamerasJson: module.cwrap('lfw_find_cameras_json', 'number', ['string', 'string', 'number']),\n availableMods: module.cwrap('lfw_available_mods', 'number', ['number', 'number']),\n buildGeometryMap: module.cwrap('lfw_build_geometry_map', 'number', [\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number'\n ]),\n buildTcaMap: module.cwrap('lfw_build_tca_map', 'number', [\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number'\n ]),\n buildVignettingMap: module.cwrap('lfw_build_vignetting_map', 'number', [\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number',\n 'number'\n ]),\n freePtr: module.cwrap('lfw_free', null, ['number'])\n };\n}\n\nexport class LensfunClient {\n private readonly module: LensfunModule;\n private readonly fns: NativeFns;\n private disposed = false;\n\n constructor(module: LensfunModule, fns: NativeFns) {\n this.module = module;\n this.fns = fns;\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n this.fns.dispose();\n this.disposed = true;\n }\n\n searchLenses(input: SearchLensesInput): LensMatch[] {\n this.ensureAlive();\n const lensModel = requiredString(input.lensModel, 'lensModel');\n const ptr = this.fns.findLensesJson(\n input.cameraMaker ?? '',\n input.cameraModel ?? '',\n input.lensMaker ?? '',\n lensModel,\n input.searchFlags ?? LF_SEARCH_SORT_AND_UNIQUIFY\n ) as number;\n return parseJsonPtr<LensMatch>(this.module, this.fns.freePtr, ptr);\n }\n\n searchCameras(input: SearchCamerasInput): CameraMatch[] {\n this.ensureAlive();\n const ptr = this.fns.findCamerasJson(\n input.maker ?? '',\n input.model ?? '',\n input.searchFlags ?? 0\n ) as number;\n return parseJsonPtr<CameraMatch>(this.module, this.fns.freePtr, ptr);\n }\n\n getAvailableModifications(lensHandle: number, crop: number): number {\n this.ensureAlive();\n return this.fns.availableMods(lensHandle, crop) as number;\n }\n\n buildCorrectionMaps(input: CorrectionInput): CorrectionMaps {\n this.ensureAlive();\n\n const width = requirePositiveInt(input.width, 'width');\n const height = requirePositiveInt(input.height, 'height');\n const step = requirePositiveInt(input.step ?? 1, 'step');\n\n const gridWidth = toGrid(width, step);\n const gridHeight = toGrid(height, step);\n\n const geometry = this.runFloatMap(\n gridWidth * gridHeight * 2,\n this.fns.buildGeometryMap,\n input.lensHandle,\n input.focal,\n input.crop,\n width,\n height,\n toFlag(input.reverse),\n step\n );\n\n const result: CorrectionMaps = {\n gridWidth,\n gridHeight,\n step,\n geometry\n };\n\n if (input.includeTca) {\n result.tca = this.runFloatMap(\n gridWidth * gridHeight * 6,\n this.fns.buildTcaMap,\n input.lensHandle,\n input.focal,\n input.crop,\n width,\n height,\n toFlag(input.reverse),\n step\n );\n }\n\n if (input.includeVignetting) {\n if (typeof input.aperture !== 'number') {\n throw new Error('[lensfun-wasm] aperture is required for vignetting map');\n }\n result.vignetting = this.runFloatMap(\n gridWidth * gridHeight * 3,\n this.fns.buildVignettingMap,\n input.lensHandle,\n input.focal,\n input.crop,\n input.aperture,\n input.distance ?? 1000,\n width,\n height,\n toFlag(input.reverse),\n step\n );\n }\n\n return result;\n }\n\n private runFloatMap(size: number, fn: CFn, ...args: number[]): Float32Array {\n const bytes = size * 4;\n const ptr = this.module._malloc(bytes);\n try {\n const rc = fn(...args, ptr, size) as number;\n if (rc !== 0) {\n throw new Error(`[lensfun-wasm] native map builder failed with code ${rc}`);\n }\n\n const start = ptr >> 2;\n const end = start + size;\n const out = new Float32Array(size);\n out.set(this.module.HEAPF32.subarray(start, end));\n return out;\n } finally {\n this.module._free(ptr);\n }\n }\n\n private ensureAlive(): void {\n if (this.disposed) {\n throw new Error('[lensfun-wasm] LensfunClient is disposed');\n }\n }\n}\n\nexport async function createLensfun(options: LensfunInitOptions = {}): Promise<LensfunClient> {\n const factory = await resolveFactory(options);\n if (!factory) {\n throw new Error('[lensfun-wasm] failed to resolve module factory');\n }\n\n const module = await factory({\n locateFile: makeLocateFile(options)\n });\n\n const fns = bindFns(module);\n\n if (options.autoInitDb ?? true) {\n const dbPath = options.dbPath ?? '/lensfun-db';\n const rc = fns.init(dbPath) as number;\n if (rc !== 0) {\n throw new Error(`[lensfun-wasm] lfw_init failed with code ${rc} for ${dbPath}`);\n }\n }\n\n return new LensfunClient(module, fns);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.20)
|
|
2
|
+
project(lensfun_wasm_bridge C CXX)
|
|
3
|
+
|
|
4
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
5
|
+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
6
|
+
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
7
|
+
|
|
8
|
+
set(LENSFUN_ROOT "${CMAKE_SOURCE_DIR}/../third_party/lensfun")
|
|
9
|
+
set(TINYXML2_ROOT "${CMAKE_SOURCE_DIR}/../third_party/tinyxml2")
|
|
10
|
+
set(UTF8PROC_ROOT "${CMAKE_SOURCE_DIR}/../third_party/utf8proc")
|
|
11
|
+
|
|
12
|
+
set(VERSION_MAJOR 0)
|
|
13
|
+
set(VERSION_MINOR 3)
|
|
14
|
+
set(VERSION_MICRO 99)
|
|
15
|
+
set(VERSION_BUGFIX 0)
|
|
16
|
+
set(LENSFUN_DB_VERSION 2)
|
|
17
|
+
set(LENSFUN_GLIB_REQUIREMENT_MACRO "GLIB_VERSION_2_26")
|
|
18
|
+
|
|
19
|
+
set(CMAKE_INSTALL_FULL_DATAROOTDIR "/usr/local/share")
|
|
20
|
+
set(CMAKE_INSTALL_LOCALSTATEDIR "var")
|
|
21
|
+
set(CMAKE_INSTALL_DATAROOTDIR "share")
|
|
22
|
+
|
|
23
|
+
configure_file(
|
|
24
|
+
"${LENSFUN_ROOT}/include/lensfun/config.h.in.cmake"
|
|
25
|
+
"${CMAKE_BINARY_DIR}/config.h"
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
configure_file(
|
|
29
|
+
"${LENSFUN_ROOT}/include/lensfun/lensfun.h.in"
|
|
30
|
+
"${CMAKE_BINARY_DIR}/lensfun.h"
|
|
31
|
+
@ONLY
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
set(LENSFUN_SOURCES
|
|
35
|
+
"${LENSFUN_ROOT}/libs/lensfun/auxfun.cpp"
|
|
36
|
+
"${LENSFUN_ROOT}/libs/lensfun/camera.cpp"
|
|
37
|
+
"${LENSFUN_ROOT}/libs/lensfun/database.cpp"
|
|
38
|
+
"${LENSFUN_ROOT}/libs/lensfun/lens.cpp"
|
|
39
|
+
"${LENSFUN_ROOT}/libs/lensfun/mount.cpp"
|
|
40
|
+
"${LENSFUN_ROOT}/libs/lensfun/mod-color.cpp"
|
|
41
|
+
"${LENSFUN_ROOT}/libs/lensfun/mod-coord.cpp"
|
|
42
|
+
"${LENSFUN_ROOT}/libs/lensfun/mod-pc.cpp"
|
|
43
|
+
"${LENSFUN_ROOT}/libs/lensfun/mod-subpix.cpp"
|
|
44
|
+
"${LENSFUN_ROOT}/libs/lensfun/modifier.cpp"
|
|
45
|
+
"${CMAKE_SOURCE_DIR}/src/cpuid_stub.cpp"
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
set(COMPAT_SOURCES
|
|
49
|
+
"${CMAKE_SOURCE_DIR}/src/glib_compat.cpp"
|
|
50
|
+
"${TINYXML2_ROOT}/tinyxml2.cpp"
|
|
51
|
+
"${UTF8PROC_ROOT}/utf8proc.c"
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
add_library(lensfun_runtime STATIC
|
|
55
|
+
${LENSFUN_SOURCES}
|
|
56
|
+
${COMPAT_SOURCES}
|
|
57
|
+
"${CMAKE_SOURCE_DIR}/src/lensfun_wasm_bridge.cpp"
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
target_include_directories(lensfun_runtime PRIVATE
|
|
61
|
+
"${CMAKE_BINARY_DIR}"
|
|
62
|
+
"${CMAKE_SOURCE_DIR}/include"
|
|
63
|
+
"${LENSFUN_ROOT}/libs/lensfun"
|
|
64
|
+
"${LENSFUN_ROOT}/include/lensfun"
|
|
65
|
+
"${TINYXML2_ROOT}"
|
|
66
|
+
"${UTF8PROC_ROOT}"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
target_compile_definitions(lensfun_runtime PRIVATE
|
|
70
|
+
CONF_LENSFUN_STATIC
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
if(EMSCRIPTEN)
|
|
74
|
+
add_executable(lensfun-core "${CMAKE_SOURCE_DIR}/src/entrypoint.cpp")
|
|
75
|
+
target_link_libraries(lensfun-core PRIVATE lensfun_runtime)
|
|
76
|
+
target_link_options(lensfun-core PRIVATE
|
|
77
|
+
"-O3"
|
|
78
|
+
"-sMODULARIZE=1"
|
|
79
|
+
"-sEXPORT_NAME=createLensfunCoreModule"
|
|
80
|
+
"-sALLOW_MEMORY_GROWTH=1"
|
|
81
|
+
"-sFILESYSTEM=1"
|
|
82
|
+
"-sFORCE_FILESYSTEM=1"
|
|
83
|
+
"-sENVIRONMENT=web,worker"
|
|
84
|
+
"-sEXPORTED_FUNCTIONS=['_malloc','_free','_lfw_init','_lfw_dispose','_lfw_find_lenses_json','_lfw_find_cameras_json','_lfw_available_mods','_lfw_build_geometry_map','_lfw_build_tca_map','_lfw_build_vignetting_map','_lfw_free']"
|
|
85
|
+
"-sEXPORTED_RUNTIME_METHODS=['cwrap','UTF8ToString','stringToUTF8','lengthBytesUTF8']"
|
|
86
|
+
"--preload-file"
|
|
87
|
+
"${LENSFUN_ROOT}/data/db@/lensfun-db"
|
|
88
|
+
)
|
|
89
|
+
set_target_properties(lensfun-core PROPERTIES SUFFIX ".js")
|
|
90
|
+
endif()
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#ifndef LFW_GLIB_COMPAT_H
|
|
2
|
+
#define LFW_GLIB_COMPAT_H
|
|
3
|
+
|
|
4
|
+
#include <stdarg.h>
|
|
5
|
+
#include <stddef.h>
|
|
6
|
+
#include <stdint.h>
|
|
7
|
+
#include <float.h>
|
|
8
|
+
|
|
9
|
+
#ifdef __cplusplus
|
|
10
|
+
#include <mutex>
|
|
11
|
+
extern "C" {
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
typedef int gboolean;
|
|
15
|
+
typedef int gint;
|
|
16
|
+
typedef unsigned int guint;
|
|
17
|
+
typedef uint32_t guint32;
|
|
18
|
+
typedef uint64_t guint64;
|
|
19
|
+
typedef size_t gsize;
|
|
20
|
+
typedef char gchar;
|
|
21
|
+
typedef unsigned char guchar;
|
|
22
|
+
typedef const void *gconstpointer;
|
|
23
|
+
typedef void *gpointer;
|
|
24
|
+
typedef uint32_t gunichar;
|
|
25
|
+
typedef double gdouble;
|
|
26
|
+
typedef float gfloat;
|
|
27
|
+
typedef ptrdiff_t gssize;
|
|
28
|
+
|
|
29
|
+
#ifndef TRUE
|
|
30
|
+
#define TRUE 1
|
|
31
|
+
#endif
|
|
32
|
+
#ifndef FALSE
|
|
33
|
+
#define FALSE 0
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
#define GLIB_CHECK_VERSION(major, minor, micro) (1)
|
|
37
|
+
#define GLIB_VERSION_2_26 22600
|
|
38
|
+
#define GLIB_VERSION_2_32 23200
|
|
39
|
+
#define GLIB_VERSION_2_40 24000
|
|
40
|
+
|
|
41
|
+
typedef struct _GError
|
|
42
|
+
{
|
|
43
|
+
gint domain;
|
|
44
|
+
gint code;
|
|
45
|
+
gchar *message;
|
|
46
|
+
} GError;
|
|
47
|
+
|
|
48
|
+
typedef struct _GString
|
|
49
|
+
{
|
|
50
|
+
gchar *str;
|
|
51
|
+
gsize len;
|
|
52
|
+
gsize allocated_len;
|
|
53
|
+
} GString;
|
|
54
|
+
|
|
55
|
+
typedef struct _GPtrArray
|
|
56
|
+
{
|
|
57
|
+
gpointer *pdata;
|
|
58
|
+
guint len;
|
|
59
|
+
guint allocated_len;
|
|
60
|
+
} GPtrArray;
|
|
61
|
+
|
|
62
|
+
typedef gint (*GCompareFunc)(gconstpointer a, gconstpointer b);
|
|
63
|
+
typedef void (*GDestroyNotify)(gpointer data);
|
|
64
|
+
|
|
65
|
+
typedef struct _GDir GDir;
|
|
66
|
+
typedef struct _GPatternSpec GPatternSpec;
|
|
67
|
+
|
|
68
|
+
typedef enum
|
|
69
|
+
{
|
|
70
|
+
G_FILE_TEST_IS_DIR = 1 << 2
|
|
71
|
+
} GFileTest;
|
|
72
|
+
|
|
73
|
+
#define G_FILE_ERROR 1
|
|
74
|
+
#define G_FILE_ERROR_ACCES 13
|
|
75
|
+
#define G_FILE_ERROR_NOENT 2
|
|
76
|
+
|
|
77
|
+
typedef enum
|
|
78
|
+
{
|
|
79
|
+
G_MARKUP_ERROR = 2,
|
|
80
|
+
G_MARKUP_ERROR_INVALID_CONTENT = 3,
|
|
81
|
+
G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE = 4
|
|
82
|
+
} GMarkupError;
|
|
83
|
+
|
|
84
|
+
typedef struct _GMarkupParseContext GMarkupParseContext;
|
|
85
|
+
typedef int GMarkupParseFlags;
|
|
86
|
+
|
|
87
|
+
typedef void (*GMarkupParserStartElementFunc)(
|
|
88
|
+
GMarkupParseContext *context,
|
|
89
|
+
const gchar *element_name,
|
|
90
|
+
const gchar **attribute_names,
|
|
91
|
+
const gchar **attribute_values,
|
|
92
|
+
gpointer user_data,
|
|
93
|
+
GError **error);
|
|
94
|
+
|
|
95
|
+
typedef void (*GMarkupParserEndElementFunc)(
|
|
96
|
+
GMarkupParseContext *context,
|
|
97
|
+
const gchar *element_name,
|
|
98
|
+
gpointer user_data,
|
|
99
|
+
GError **error);
|
|
100
|
+
|
|
101
|
+
typedef void (*GMarkupParserTextFunc)(
|
|
102
|
+
GMarkupParseContext *context,
|
|
103
|
+
const gchar *text,
|
|
104
|
+
gsize text_len,
|
|
105
|
+
gpointer user_data,
|
|
106
|
+
GError **error);
|
|
107
|
+
|
|
108
|
+
typedef void (*GMarkupParserPassthroughFunc)(
|
|
109
|
+
GMarkupParseContext *context,
|
|
110
|
+
const gchar *passthrough_text,
|
|
111
|
+
gsize text_len,
|
|
112
|
+
gpointer user_data,
|
|
113
|
+
GError **error);
|
|
114
|
+
|
|
115
|
+
typedef void (*GMarkupParserErrorFunc)(
|
|
116
|
+
GMarkupParseContext *context,
|
|
117
|
+
GError *error,
|
|
118
|
+
gpointer user_data);
|
|
119
|
+
|
|
120
|
+
typedef struct _GMarkupParser
|
|
121
|
+
{
|
|
122
|
+
GMarkupParserStartElementFunc start_element;
|
|
123
|
+
GMarkupParserEndElementFunc end_element;
|
|
124
|
+
GMarkupParserTextFunc text;
|
|
125
|
+
GMarkupParserPassthroughFunc passthrough;
|
|
126
|
+
GMarkupParserErrorFunc error;
|
|
127
|
+
} GMarkupParser;
|
|
128
|
+
|
|
129
|
+
#ifdef __cplusplus
|
|
130
|
+
typedef struct _GMutex
|
|
131
|
+
{
|
|
132
|
+
std::mutex lock;
|
|
133
|
+
} GMutex;
|
|
134
|
+
|
|
135
|
+
typedef struct _GStaticMutex
|
|
136
|
+
{
|
|
137
|
+
std::mutex lock;
|
|
138
|
+
} GStaticMutex;
|
|
139
|
+
#else
|
|
140
|
+
typedef struct _GMutex
|
|
141
|
+
{
|
|
142
|
+
int unused;
|
|
143
|
+
} GMutex;
|
|
144
|
+
|
|
145
|
+
typedef struct _GStaticMutex
|
|
146
|
+
{
|
|
147
|
+
int unused;
|
|
148
|
+
} GStaticMutex;
|
|
149
|
+
#endif
|
|
150
|
+
|
|
151
|
+
#define G_STATIC_MUTEX_INIT {}
|
|
152
|
+
|
|
153
|
+
#define g_new(type, count) ((type *)g_malloc(sizeof(type) * (count)))
|
|
154
|
+
#define g_ptr_array_index(array, index_) ((array)->pdata[(index_)])
|
|
155
|
+
|
|
156
|
+
void g_assertion_message(const char *expr, const char *file, int line);
|
|
157
|
+
#define g_assert(expr) ((expr) ? (void)0 : g_assertion_message(#expr, __FILE__, __LINE__))
|
|
158
|
+
|
|
159
|
+
void *g_malloc(gsize n_bytes);
|
|
160
|
+
void *g_realloc(gpointer mem, gsize n_bytes);
|
|
161
|
+
void g_free(gpointer mem);
|
|
162
|
+
gchar *g_strdup(const gchar *str);
|
|
163
|
+
|
|
164
|
+
void g_mutex_lock(GMutex *mutex);
|
|
165
|
+
void g_mutex_unlock(GMutex *mutex);
|
|
166
|
+
void g_static_mutex_lock(GStaticMutex *mutex);
|
|
167
|
+
void g_static_mutex_unlock(GStaticMutex *mutex);
|
|
168
|
+
|
|
169
|
+
gchar *g_build_filename(const gchar *first_element, ...);
|
|
170
|
+
const gchar *g_get_user_data_dir(void);
|
|
171
|
+
|
|
172
|
+
int g_open(const char *filename, int flags, int mode);
|
|
173
|
+
|
|
174
|
+
gboolean g_file_test(const gchar *filename, GFileTest test);
|
|
175
|
+
gboolean g_file_get_contents(const gchar *filename, gchar **contents, gsize *length, GError **error);
|
|
176
|
+
|
|
177
|
+
GDir *g_dir_open(const gchar *path, guint flags, GError **error);
|
|
178
|
+
const gchar *g_dir_read_name(GDir *dir);
|
|
179
|
+
void g_dir_close(GDir *dir);
|
|
180
|
+
|
|
181
|
+
GPatternSpec *g_pattern_spec_new(const gchar *pattern);
|
|
182
|
+
gboolean g_pattern_match(GPatternSpec *pspec, gsize string_length, const gchar *string, const gchar *string_reversed);
|
|
183
|
+
void g_pattern_spec_free(GPatternSpec *pspec);
|
|
184
|
+
|
|
185
|
+
GString *g_string_sized_new(gsize dfl_size);
|
|
186
|
+
GString *g_string_append(GString *string, const gchar *val);
|
|
187
|
+
gchar *g_string_free(GString *string, gboolean free_segment);
|
|
188
|
+
|
|
189
|
+
GPtrArray *g_ptr_array_new(void);
|
|
190
|
+
void g_ptr_array_set_size(GPtrArray *array, gint length);
|
|
191
|
+
gpointer *g_ptr_array_free(GPtrArray *array, gboolean free_segment);
|
|
192
|
+
|
|
193
|
+
void g_warning(const gchar *format, ...);
|
|
194
|
+
void g_set_error(GError **err, gint domain, gint code, const gchar *format, ...);
|
|
195
|
+
|
|
196
|
+
gunichar g_utf8_get_char(const gchar *p);
|
|
197
|
+
const gchar *g_utf8_next_char(const gchar *p);
|
|
198
|
+
gchar *g_utf8_casefold(const gchar *str, gssize len);
|
|
199
|
+
gboolean g_unichar_isspace(gunichar c);
|
|
200
|
+
gunichar g_unichar_tolower(gunichar c);
|
|
201
|
+
|
|
202
|
+
GMarkupParseContext *g_markup_parse_context_new(const GMarkupParser *parser, GMarkupParseFlags flags, gpointer user_data, GDestroyNotify user_data_dnotify);
|
|
203
|
+
gboolean g_markup_parse_context_parse(GMarkupParseContext *context, const gchar *text, gssize text_len, GError **error);
|
|
204
|
+
void g_markup_parse_context_free(GMarkupParseContext *context);
|
|
205
|
+
const gchar *g_markup_parse_context_get_element(GMarkupParseContext *context);
|
|
206
|
+
void g_markup_parse_context_get_position(GMarkupParseContext *context, gint *line_number, gint *char_number);
|
|
207
|
+
|
|
208
|
+
gchar *g_markup_vprintf_escaped(const gchar *format, va_list args);
|
|
209
|
+
gchar *g_markup_printf_escaped(const gchar *format, ...);
|
|
210
|
+
|
|
211
|
+
#ifdef __cplusplus
|
|
212
|
+
}
|
|
213
|
+
#endif
|
|
214
|
+
|
|
215
|
+
#endif
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#ifndef LFW_BRIDGE_H
|
|
2
|
+
#define LFW_BRIDGE_H
|
|
3
|
+
|
|
4
|
+
#include <stdint.h>
|
|
5
|
+
|
|
6
|
+
#ifdef __cplusplus
|
|
7
|
+
extern "C" {
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
int32_t lfw_init(const char *db_dir);
|
|
11
|
+
void lfw_dispose(void);
|
|
12
|
+
char *lfw_find_lenses_json(const char *camera_maker, const char *camera_model, const char *lens_maker, const char *lens_model, int32_t search_flags);
|
|
13
|
+
char *lfw_find_cameras_json(const char *maker, const char *model, int32_t search_flags);
|
|
14
|
+
int32_t lfw_available_mods(uint32_t lens_handle, float crop);
|
|
15
|
+
int32_t lfw_build_geometry_map(uint32_t lens_handle, float focal, float crop, int32_t width, int32_t height, int32_t reverse, int32_t step, float *out_xy, int32_t out_len);
|
|
16
|
+
int32_t lfw_build_tca_map(uint32_t lens_handle, float focal, float crop, int32_t width, int32_t height, int32_t reverse, int32_t step, float *out_rgbxy, int32_t out_len);
|
|
17
|
+
int32_t lfw_build_vignetting_map(uint32_t lens_handle, float focal, float crop, float aperture, float distance, int32_t width, int32_t height, int32_t reverse, int32_t step, float *out_rgb_gain, int32_t out_len);
|
|
18
|
+
void lfw_free(void *p);
|
|
19
|
+
|
|
20
|
+
#ifdef __cplusplus
|
|
21
|
+
}
|
|
22
|
+
#endif
|
|
23
|
+
|
|
24
|
+
#endif
|