translime-plugin-hdr-capture 1.0.0
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/dist/bin/index.d.ts +118 -0
- package/dist/bin/index.js +324 -0
- package/dist/bin/index.win32-x64-msvc.node +0 -0
- package/dist/main.cjs.js +1396 -0
- package/dist/overlay-preload.cjs.js +54 -0
- package/dist/overlay.css +1 -0
- package/dist/overlay.html +24 -0
- package/dist/overlay.js +1 -0
- package/dist/ui.esm.js +939 -0
- package/package.json +73 -0
- package/readme.md +3 -0
- package/src/assets/icon.png +0 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/* auto-generated by NAPI-RS */
|
|
5
|
+
|
|
6
|
+
/** 显示器信息 */
|
|
7
|
+
export interface DisplayInfo {
|
|
8
|
+
/** 显示器索引 */
|
|
9
|
+
id: number
|
|
10
|
+
/** 显示器名称 */
|
|
11
|
+
name: string
|
|
12
|
+
/** 左边界 */
|
|
13
|
+
x: number
|
|
14
|
+
/** 上边界 */
|
|
15
|
+
y: number
|
|
16
|
+
/** 宽度 */
|
|
17
|
+
width: number
|
|
18
|
+
/** 高度 */
|
|
19
|
+
height: number
|
|
20
|
+
/** 是否主显示器 */
|
|
21
|
+
isPrimary: boolean
|
|
22
|
+
}
|
|
23
|
+
/** 窗口信息结构 */
|
|
24
|
+
export interface WindowInfo {
|
|
25
|
+
/** 窗口句柄 (HWND) */
|
|
26
|
+
handle: number
|
|
27
|
+
/** 窗口标题 */
|
|
28
|
+
title: string
|
|
29
|
+
/** 窗口类名 */
|
|
30
|
+
className: string
|
|
31
|
+
/** 左边界 */
|
|
32
|
+
left: number
|
|
33
|
+
/** 上边界 */
|
|
34
|
+
top: number
|
|
35
|
+
/** 右边界 */
|
|
36
|
+
right: number
|
|
37
|
+
/** 下边界 */
|
|
38
|
+
bottom: number
|
|
39
|
+
/** 窗口宽度 */
|
|
40
|
+
width: number
|
|
41
|
+
/** 窗口高度 */
|
|
42
|
+
height: number
|
|
43
|
+
}
|
|
44
|
+
/** 矩形区域 */
|
|
45
|
+
export interface Rect {
|
|
46
|
+
x: number
|
|
47
|
+
y: number
|
|
48
|
+
width: number
|
|
49
|
+
height: number
|
|
50
|
+
}
|
|
51
|
+
/** Tone Mapping 选项 */
|
|
52
|
+
export interface ToneMappingOptions {
|
|
53
|
+
/** 曝光值调整 */
|
|
54
|
+
exposure?: number
|
|
55
|
+
/** 是否保留 HDR 元数据 */
|
|
56
|
+
preserveHdrMetadata?: boolean
|
|
57
|
+
}
|
|
58
|
+
/** HDR 映射配置选项 */
|
|
59
|
+
export interface HdrMappingOptions {
|
|
60
|
+
/** 是否启用自定义 HDR 映射 */
|
|
61
|
+
enabled?: boolean
|
|
62
|
+
/** SDR 白点亮度 (nits),默认 203 */
|
|
63
|
+
sdrWhiteNits?: number
|
|
64
|
+
/** HDR 峰值亮度 (nits),默认 1000 */
|
|
65
|
+
hdrMaxNits?: number
|
|
66
|
+
/** 是否同时保留原始 HDR 数据(用于后续保存 HDR 原始文件) */
|
|
67
|
+
preserveRaw?: boolean
|
|
68
|
+
}
|
|
69
|
+
/** 屏幕捕获结果 */
|
|
70
|
+
export interface CaptureResult {
|
|
71
|
+
/** 图像数据 (RGBA,经过 Tone Mapping) */
|
|
72
|
+
buffer: Buffer
|
|
73
|
+
/** 实际图像宽度 (物理像素) */
|
|
74
|
+
width: number
|
|
75
|
+
/** 实际图像高度 (物理像素) */
|
|
76
|
+
height: number
|
|
77
|
+
/** 是否为 HDR 源数据(经过 Tonemap) */
|
|
78
|
+
isHdr: boolean
|
|
79
|
+
/**
|
|
80
|
+
* 原始 HDR 数据 (可选,仅当 preserve_raw 为 true 且为 HDR 屏幕时存在)
|
|
81
|
+
* 保存为 RGBA Float16 或 10bit 原始格式的字节流
|
|
82
|
+
*/
|
|
83
|
+
rawHdrBuffer?: Buffer
|
|
84
|
+
}
|
|
85
|
+
/** 获取所有顶层窗口 */
|
|
86
|
+
export declare function getTopLevelWindows(): Array<WindowInfo>
|
|
87
|
+
/** 获取指定坐标处的窗口 */
|
|
88
|
+
export declare function getWindowAtPoint(x: number, y: number, ignoreHandle?: number | undefined | null): WindowInfo | null
|
|
89
|
+
/**
|
|
90
|
+
* 捕获指定显示器的屏幕 (返回 RGBA 结果对象)
|
|
91
|
+
*
|
|
92
|
+
* `hdr_options` - 可选的 HDR 映射配置,用于自定义色调映射参数
|
|
93
|
+
*/
|
|
94
|
+
export declare function captureDisplay(displayId: number, hdrOptions?: HdrMappingOptions | undefined | null): Promise<CaptureResult>
|
|
95
|
+
/** 获取显示器列表 */
|
|
96
|
+
export declare function getDisplays(): Array<DisplayInfo>
|
|
97
|
+
/** 裁剪图像 */
|
|
98
|
+
export declare function cropImage(buffer: Buffer, width: number, height: number, rect: Rect): Promise<Buffer>
|
|
99
|
+
/** HDR 到 SDR 的 Tone Mapping */
|
|
100
|
+
export declare function toneMap(hdrBuffer: Buffer, width: number, height: number, options?: ToneMappingOptions | undefined | null): Promise<Buffer>
|
|
101
|
+
/** 编码图像为指定格式 */
|
|
102
|
+
export declare function encodeImage(buffer: Buffer, width: number, height: number, format: string): Promise<Buffer>
|
|
103
|
+
/** 调整图像大小 */
|
|
104
|
+
export declare function resizeImage(buffer: Buffer, width: number, height: number, newWidth: number, newHeight: number): Promise<Buffer>
|
|
105
|
+
/**
|
|
106
|
+
* 将原始 HDR F16 数据编码为 EXR 格式
|
|
107
|
+
*
|
|
108
|
+
* 输入: RGBA F16 格式的原始 HDR 数据 (每像素 8 字节)
|
|
109
|
+
* 输出: OpenEXR 文件字节流
|
|
110
|
+
*/
|
|
111
|
+
export declare function encodeHdrToExr(rawBuffer: Buffer, width: number, height: number): Promise<Buffer>
|
|
112
|
+
/**
|
|
113
|
+
* 裁剪 HDR F16 格式的原始数据
|
|
114
|
+
*
|
|
115
|
+
* 输入: RGBA F16 格式的原始 HDR 数据 (每像素 8 字节)
|
|
116
|
+
* 输出: 裁剪后的 RGBA F16 数据
|
|
117
|
+
*/
|
|
118
|
+
export declare function cropHdrF16(rawBuffer: Buffer, width: number, height: number, rect: Rect): Promise<Buffer>
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
/* prettier-ignore */
|
|
4
|
+
|
|
5
|
+
/* auto-generated by NAPI-RS */
|
|
6
|
+
|
|
7
|
+
const { existsSync, readFileSync } = require('fs')
|
|
8
|
+
const { join } = require('path')
|
|
9
|
+
|
|
10
|
+
const { platform, arch } = process
|
|
11
|
+
|
|
12
|
+
let nativeBinding = null
|
|
13
|
+
let localFileExisted = false
|
|
14
|
+
let loadError = null
|
|
15
|
+
|
|
16
|
+
function isMusl() {
|
|
17
|
+
// For Node 10
|
|
18
|
+
if (!process.report || typeof process.report.getReport !== 'function') {
|
|
19
|
+
try {
|
|
20
|
+
const lddPath = require('child_process').execSync('which ldd').toString().trim()
|
|
21
|
+
return readFileSync(lddPath, 'utf8').includes('musl')
|
|
22
|
+
} catch (e) {
|
|
23
|
+
return true
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
const { glibcVersionRuntime } = process.report.getReport().header
|
|
27
|
+
return !glibcVersionRuntime
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
switch (platform) {
|
|
32
|
+
case 'android':
|
|
33
|
+
switch (arch) {
|
|
34
|
+
case 'arm64':
|
|
35
|
+
localFileExisted = existsSync(join(__dirname, 'index.android-arm64.node'))
|
|
36
|
+
try {
|
|
37
|
+
if (localFileExisted) {
|
|
38
|
+
nativeBinding = require('./index.android-arm64.node')
|
|
39
|
+
} else {
|
|
40
|
+
nativeBinding = require('hdr-capture-native-android-arm64')
|
|
41
|
+
}
|
|
42
|
+
} catch (e) {
|
|
43
|
+
loadError = e
|
|
44
|
+
}
|
|
45
|
+
break
|
|
46
|
+
case 'arm':
|
|
47
|
+
localFileExisted = existsSync(join(__dirname, 'index.android-arm-eabi.node'))
|
|
48
|
+
try {
|
|
49
|
+
if (localFileExisted) {
|
|
50
|
+
nativeBinding = require('./index.android-arm-eabi.node')
|
|
51
|
+
} else {
|
|
52
|
+
nativeBinding = require('hdr-capture-native-android-arm-eabi')
|
|
53
|
+
}
|
|
54
|
+
} catch (e) {
|
|
55
|
+
loadError = e
|
|
56
|
+
}
|
|
57
|
+
break
|
|
58
|
+
default:
|
|
59
|
+
throw new Error(`Unsupported architecture on Android ${arch}`)
|
|
60
|
+
}
|
|
61
|
+
break
|
|
62
|
+
case 'win32':
|
|
63
|
+
switch (arch) {
|
|
64
|
+
case 'x64':
|
|
65
|
+
localFileExisted = existsSync(
|
|
66
|
+
join(__dirname, 'index.win32-x64-msvc.node')
|
|
67
|
+
)
|
|
68
|
+
try {
|
|
69
|
+
if (localFileExisted) {
|
|
70
|
+
nativeBinding = require('./index.win32-x64-msvc.node')
|
|
71
|
+
} else {
|
|
72
|
+
nativeBinding = require('hdr-capture-native-win32-x64-msvc')
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {
|
|
75
|
+
loadError = e
|
|
76
|
+
}
|
|
77
|
+
break
|
|
78
|
+
case 'ia32':
|
|
79
|
+
localFileExisted = existsSync(
|
|
80
|
+
join(__dirname, 'index.win32-ia32-msvc.node')
|
|
81
|
+
)
|
|
82
|
+
try {
|
|
83
|
+
if (localFileExisted) {
|
|
84
|
+
nativeBinding = require('./index.win32-ia32-msvc.node')
|
|
85
|
+
} else {
|
|
86
|
+
nativeBinding = require('hdr-capture-native-win32-ia32-msvc')
|
|
87
|
+
}
|
|
88
|
+
} catch (e) {
|
|
89
|
+
loadError = e
|
|
90
|
+
}
|
|
91
|
+
break
|
|
92
|
+
case 'arm64':
|
|
93
|
+
localFileExisted = existsSync(
|
|
94
|
+
join(__dirname, 'index.win32-arm64-msvc.node')
|
|
95
|
+
)
|
|
96
|
+
try {
|
|
97
|
+
if (localFileExisted) {
|
|
98
|
+
nativeBinding = require('./index.win32-arm64-msvc.node')
|
|
99
|
+
} else {
|
|
100
|
+
nativeBinding = require('hdr-capture-native-win32-arm64-msvc')
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {
|
|
103
|
+
loadError = e
|
|
104
|
+
}
|
|
105
|
+
break
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`Unsupported architecture on Windows: ${arch}`)
|
|
108
|
+
}
|
|
109
|
+
break
|
|
110
|
+
case 'darwin':
|
|
111
|
+
localFileExisted = existsSync(join(__dirname, 'index.darwin-universal.node'))
|
|
112
|
+
try {
|
|
113
|
+
if (localFileExisted) {
|
|
114
|
+
nativeBinding = require('./index.darwin-universal.node')
|
|
115
|
+
} else {
|
|
116
|
+
nativeBinding = require('hdr-capture-native-darwin-universal')
|
|
117
|
+
}
|
|
118
|
+
break
|
|
119
|
+
} catch {}
|
|
120
|
+
switch (arch) {
|
|
121
|
+
case 'x64':
|
|
122
|
+
localFileExisted = existsSync(join(__dirname, 'index.darwin-x64.node'))
|
|
123
|
+
try {
|
|
124
|
+
if (localFileExisted) {
|
|
125
|
+
nativeBinding = require('./index.darwin-x64.node')
|
|
126
|
+
} else {
|
|
127
|
+
nativeBinding = require('hdr-capture-native-darwin-x64')
|
|
128
|
+
}
|
|
129
|
+
} catch (e) {
|
|
130
|
+
loadError = e
|
|
131
|
+
}
|
|
132
|
+
break
|
|
133
|
+
case 'arm64':
|
|
134
|
+
localFileExisted = existsSync(
|
|
135
|
+
join(__dirname, 'index.darwin-arm64.node')
|
|
136
|
+
)
|
|
137
|
+
try {
|
|
138
|
+
if (localFileExisted) {
|
|
139
|
+
nativeBinding = require('./index.darwin-arm64.node')
|
|
140
|
+
} else {
|
|
141
|
+
nativeBinding = require('hdr-capture-native-darwin-arm64')
|
|
142
|
+
}
|
|
143
|
+
} catch (e) {
|
|
144
|
+
loadError = e
|
|
145
|
+
}
|
|
146
|
+
break
|
|
147
|
+
default:
|
|
148
|
+
throw new Error(`Unsupported architecture on macOS: ${arch}`)
|
|
149
|
+
}
|
|
150
|
+
break
|
|
151
|
+
case 'freebsd':
|
|
152
|
+
if (arch !== 'x64') {
|
|
153
|
+
throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
|
|
154
|
+
}
|
|
155
|
+
localFileExisted = existsSync(join(__dirname, 'index.freebsd-x64.node'))
|
|
156
|
+
try {
|
|
157
|
+
if (localFileExisted) {
|
|
158
|
+
nativeBinding = require('./index.freebsd-x64.node')
|
|
159
|
+
} else {
|
|
160
|
+
nativeBinding = require('hdr-capture-native-freebsd-x64')
|
|
161
|
+
}
|
|
162
|
+
} catch (e) {
|
|
163
|
+
loadError = e
|
|
164
|
+
}
|
|
165
|
+
break
|
|
166
|
+
case 'linux':
|
|
167
|
+
switch (arch) {
|
|
168
|
+
case 'x64':
|
|
169
|
+
if (isMusl()) {
|
|
170
|
+
localFileExisted = existsSync(
|
|
171
|
+
join(__dirname, 'index.linux-x64-musl.node')
|
|
172
|
+
)
|
|
173
|
+
try {
|
|
174
|
+
if (localFileExisted) {
|
|
175
|
+
nativeBinding = require('./index.linux-x64-musl.node')
|
|
176
|
+
} else {
|
|
177
|
+
nativeBinding = require('hdr-capture-native-linux-x64-musl')
|
|
178
|
+
}
|
|
179
|
+
} catch (e) {
|
|
180
|
+
loadError = e
|
|
181
|
+
}
|
|
182
|
+
} else {
|
|
183
|
+
localFileExisted = existsSync(
|
|
184
|
+
join(__dirname, 'index.linux-x64-gnu.node')
|
|
185
|
+
)
|
|
186
|
+
try {
|
|
187
|
+
if (localFileExisted) {
|
|
188
|
+
nativeBinding = require('./index.linux-x64-gnu.node')
|
|
189
|
+
} else {
|
|
190
|
+
nativeBinding = require('hdr-capture-native-linux-x64-gnu')
|
|
191
|
+
}
|
|
192
|
+
} catch (e) {
|
|
193
|
+
loadError = e
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
break
|
|
197
|
+
case 'arm64':
|
|
198
|
+
if (isMusl()) {
|
|
199
|
+
localFileExisted = existsSync(
|
|
200
|
+
join(__dirname, 'index.linux-arm64-musl.node')
|
|
201
|
+
)
|
|
202
|
+
try {
|
|
203
|
+
if (localFileExisted) {
|
|
204
|
+
nativeBinding = require('./index.linux-arm64-musl.node')
|
|
205
|
+
} else {
|
|
206
|
+
nativeBinding = require('hdr-capture-native-linux-arm64-musl')
|
|
207
|
+
}
|
|
208
|
+
} catch (e) {
|
|
209
|
+
loadError = e
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
localFileExisted = existsSync(
|
|
213
|
+
join(__dirname, 'index.linux-arm64-gnu.node')
|
|
214
|
+
)
|
|
215
|
+
try {
|
|
216
|
+
if (localFileExisted) {
|
|
217
|
+
nativeBinding = require('./index.linux-arm64-gnu.node')
|
|
218
|
+
} else {
|
|
219
|
+
nativeBinding = require('hdr-capture-native-linux-arm64-gnu')
|
|
220
|
+
}
|
|
221
|
+
} catch (e) {
|
|
222
|
+
loadError = e
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
break
|
|
226
|
+
case 'arm':
|
|
227
|
+
if (isMusl()) {
|
|
228
|
+
localFileExisted = existsSync(
|
|
229
|
+
join(__dirname, 'index.linux-arm-musleabihf.node')
|
|
230
|
+
)
|
|
231
|
+
try {
|
|
232
|
+
if (localFileExisted) {
|
|
233
|
+
nativeBinding = require('./index.linux-arm-musleabihf.node')
|
|
234
|
+
} else {
|
|
235
|
+
nativeBinding = require('hdr-capture-native-linux-arm-musleabihf')
|
|
236
|
+
}
|
|
237
|
+
} catch (e) {
|
|
238
|
+
loadError = e
|
|
239
|
+
}
|
|
240
|
+
} else {
|
|
241
|
+
localFileExisted = existsSync(
|
|
242
|
+
join(__dirname, 'index.linux-arm-gnueabihf.node')
|
|
243
|
+
)
|
|
244
|
+
try {
|
|
245
|
+
if (localFileExisted) {
|
|
246
|
+
nativeBinding = require('./index.linux-arm-gnueabihf.node')
|
|
247
|
+
} else {
|
|
248
|
+
nativeBinding = require('hdr-capture-native-linux-arm-gnueabihf')
|
|
249
|
+
}
|
|
250
|
+
} catch (e) {
|
|
251
|
+
loadError = e
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
break
|
|
255
|
+
case 'riscv64':
|
|
256
|
+
if (isMusl()) {
|
|
257
|
+
localFileExisted = existsSync(
|
|
258
|
+
join(__dirname, 'index.linux-riscv64-musl.node')
|
|
259
|
+
)
|
|
260
|
+
try {
|
|
261
|
+
if (localFileExisted) {
|
|
262
|
+
nativeBinding = require('./index.linux-riscv64-musl.node')
|
|
263
|
+
} else {
|
|
264
|
+
nativeBinding = require('hdr-capture-native-linux-riscv64-musl')
|
|
265
|
+
}
|
|
266
|
+
} catch (e) {
|
|
267
|
+
loadError = e
|
|
268
|
+
}
|
|
269
|
+
} else {
|
|
270
|
+
localFileExisted = existsSync(
|
|
271
|
+
join(__dirname, 'index.linux-riscv64-gnu.node')
|
|
272
|
+
)
|
|
273
|
+
try {
|
|
274
|
+
if (localFileExisted) {
|
|
275
|
+
nativeBinding = require('./index.linux-riscv64-gnu.node')
|
|
276
|
+
} else {
|
|
277
|
+
nativeBinding = require('hdr-capture-native-linux-riscv64-gnu')
|
|
278
|
+
}
|
|
279
|
+
} catch (e) {
|
|
280
|
+
loadError = e
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
break
|
|
284
|
+
case 's390x':
|
|
285
|
+
localFileExisted = existsSync(
|
|
286
|
+
join(__dirname, 'index.linux-s390x-gnu.node')
|
|
287
|
+
)
|
|
288
|
+
try {
|
|
289
|
+
if (localFileExisted) {
|
|
290
|
+
nativeBinding = require('./index.linux-s390x-gnu.node')
|
|
291
|
+
} else {
|
|
292
|
+
nativeBinding = require('hdr-capture-native-linux-s390x-gnu')
|
|
293
|
+
}
|
|
294
|
+
} catch (e) {
|
|
295
|
+
loadError = e
|
|
296
|
+
}
|
|
297
|
+
break
|
|
298
|
+
default:
|
|
299
|
+
throw new Error(`Unsupported architecture on Linux: ${arch}`)
|
|
300
|
+
}
|
|
301
|
+
break
|
|
302
|
+
default:
|
|
303
|
+
throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!nativeBinding) {
|
|
307
|
+
if (loadError) {
|
|
308
|
+
throw loadError
|
|
309
|
+
}
|
|
310
|
+
throw new Error(`Failed to load native binding`)
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const { getTopLevelWindows, getWindowAtPoint, captureDisplay, getDisplays, cropImage, toneMap, encodeImage, resizeImage, encodeHdrToExr, cropHdrF16 } = nativeBinding
|
|
314
|
+
|
|
315
|
+
module.exports.getTopLevelWindows = getTopLevelWindows
|
|
316
|
+
module.exports.getWindowAtPoint = getWindowAtPoint
|
|
317
|
+
module.exports.captureDisplay = captureDisplay
|
|
318
|
+
module.exports.getDisplays = getDisplays
|
|
319
|
+
module.exports.cropImage = cropImage
|
|
320
|
+
module.exports.toneMap = toneMap
|
|
321
|
+
module.exports.encodeImage = encodeImage
|
|
322
|
+
module.exports.resizeImage = resizeImage
|
|
323
|
+
module.exports.encodeHdrToExr = encodeHdrToExr
|
|
324
|
+
module.exports.cropHdrF16 = cropHdrF16
|
|
Binary file
|