@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.
@@ -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,6 @@
1
+ #ifndef LFW_GLIB_GSTDIO_H
2
+ #define LFW_GLIB_GSTDIO_H
3
+
4
+ #include "../glib.h"
5
+
6
+ #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
@@ -0,0 +1,8 @@
1
+ #include "config.h"
2
+ #include "lensfun.h"
3
+ #include "lensfunprv.h"
4
+
5
+ guint _lf_detect_cpu_features()
6
+ {
7
+ return 0;
8
+ }