react-native-mask-segment-canvas 0.1.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.
Files changed (95) hide show
  1. package/README.md +904 -0
  2. package/dist/components/MaskSegmentCanvas.d.ts +6 -0
  3. package/dist/components/MaskSegmentCanvas.d.ts.map +1 -0
  4. package/dist/components/MaskSegmentCanvas.js +2012 -0
  5. package/dist/components/MaskSegmentCanvas.js.map +1 -0
  6. package/dist/components/MaskSegmentCanvas.types.d.ts +189 -0
  7. package/dist/components/MaskSegmentCanvas.types.d.ts.map +1 -0
  8. package/dist/components/MaskSegmentCanvas.types.js +2 -0
  9. package/dist/components/MaskSegmentCanvas.types.js.map +1 -0
  10. package/dist/index.d.ts +6 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +5 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/shaders/regionPaint.sksl.d.ts +3 -0
  15. package/dist/shaders/regionPaint.sksl.d.ts.map +1 -0
  16. package/dist/shaders/regionPaint.sksl.js +72 -0
  17. package/dist/shaders/regionPaint.sksl.js.map +1 -0
  18. package/dist/utils/compositePaintedImage.d.ts +44 -0
  19. package/dist/utils/compositePaintedImage.d.ts.map +1 -0
  20. package/dist/utils/compositePaintedImage.js +146 -0
  21. package/dist/utils/compositePaintedImage.js.map +1 -0
  22. package/dist/utils/exportUtils.d.ts +20 -0
  23. package/dist/utils/exportUtils.d.ts.map +1 -0
  24. package/dist/utils/exportUtils.js +32 -0
  25. package/dist/utils/exportUtils.js.map +1 -0
  26. package/dist/utils/freqLayerPrep.d.ts +23 -0
  27. package/dist/utils/freqLayerPrep.d.ts.map +1 -0
  28. package/dist/utils/freqLayerPrep.js +168 -0
  29. package/dist/utils/freqLayerPrep.js.map +1 -0
  30. package/dist/utils/maskSegmentRuntime.d.ts +43 -0
  31. package/dist/utils/maskSegmentRuntime.d.ts.map +1 -0
  32. package/dist/utils/maskSegmentRuntime.js +181 -0
  33. package/dist/utils/maskSegmentRuntime.js.map +1 -0
  34. package/dist/utils/maskSegmentation.d.ts +133 -0
  35. package/dist/utils/maskSegmentation.d.ts.map +1 -0
  36. package/dist/utils/maskSegmentation.js +1600 -0
  37. package/dist/utils/maskSegmentation.js.map +1 -0
  38. package/dist/utils/maskSemanticPalette.d.ts +31 -0
  39. package/dist/utils/maskSemanticPalette.d.ts.map +1 -0
  40. package/dist/utils/maskSemanticPalette.js +125 -0
  41. package/dist/utils/maskSemanticPalette.js.map +1 -0
  42. package/dist/utils/opencvAdapter.d.ts +116 -0
  43. package/dist/utils/opencvAdapter.d.ts.map +1 -0
  44. package/dist/utils/opencvAdapter.js +353 -0
  45. package/dist/utils/opencvAdapter.js.map +1 -0
  46. package/dist/utils/paintColorMapTexture.d.ts +5 -0
  47. package/dist/utils/paintColorMapTexture.d.ts.map +1 -0
  48. package/dist/utils/paintColorMapTexture.js +203 -0
  49. package/dist/utils/paintColorMapTexture.js.map +1 -0
  50. package/dist/utils/paintShaderRuntime.d.ts +40 -0
  51. package/dist/utils/paintShaderRuntime.d.ts.map +1 -0
  52. package/dist/utils/paintShaderRuntime.js +76 -0
  53. package/dist/utils/paintShaderRuntime.js.map +1 -0
  54. package/dist/utils/pickMapTexture.d.ts +4 -0
  55. package/dist/utils/pickMapTexture.d.ts.map +1 -0
  56. package/dist/utils/pickMapTexture.js +24 -0
  57. package/dist/utils/pickMapTexture.js.map +1 -0
  58. package/dist/utils/pngImage.d.ts +49 -0
  59. package/dist/utils/pngImage.d.ts.map +1 -0
  60. package/dist/utils/pngImage.js +438 -0
  61. package/dist/utils/pngImage.js.map +1 -0
  62. package/dist/utils/resolveAssetPath.d.ts +3 -0
  63. package/dist/utils/resolveAssetPath.d.ts.map +1 -0
  64. package/dist/utils/resolveAssetPath.js +56 -0
  65. package/dist/utils/resolveAssetPath.js.map +1 -0
  66. package/dist/utils/resolveImageUrl.d.ts +3 -0
  67. package/dist/utils/resolveImageUrl.d.ts.map +1 -0
  68. package/dist/utils/resolveImageUrl.js +51 -0
  69. package/dist/utils/resolveImageUrl.js.map +1 -0
  70. package/dist/utils/skiaImage.d.ts +4 -0
  71. package/dist/utils/skiaImage.d.ts.map +1 -0
  72. package/dist/utils/skiaImage.js +12 -0
  73. package/dist/utils/skiaImage.js.map +1 -0
  74. package/package.json +100 -0
  75. package/patches/react-native-fast-opencv+0.4.8.patch +122 -0
  76. package/src/components/MaskSegmentCanvas.tsx +2832 -0
  77. package/src/components/MaskSegmentCanvas.types.ts +216 -0
  78. package/src/globals.d.ts +19 -0
  79. package/src/index.ts +45 -0
  80. package/src/shaders/regionPaint.sksl.ts +71 -0
  81. package/src/upng-js.d.ts +33 -0
  82. package/src/utils/compositePaintedImage.ts +201 -0
  83. package/src/utils/exportUtils.ts +40 -0
  84. package/src/utils/freqLayerPrep.ts +267 -0
  85. package/src/utils/maskSegmentRuntime.ts +257 -0
  86. package/src/utils/maskSegmentation.ts +2294 -0
  87. package/src/utils/maskSemanticPalette.ts +187 -0
  88. package/src/utils/opencvAdapter.ts +539 -0
  89. package/src/utils/paintColorMapTexture.ts +239 -0
  90. package/src/utils/paintShaderRuntime.tsx +150 -0
  91. package/src/utils/pickMapTexture.ts +37 -0
  92. package/src/utils/pngImage.ts +591 -0
  93. package/src/utils/resolveAssetPath.ts +64 -0
  94. package/src/utils/resolveImageUrl.ts +63 -0
  95. package/src/utils/skiaImage.ts +25 -0
@@ -0,0 +1,146 @@
1
+ import { Buffer } from 'buffer';
2
+ import RNFS from 'react-native-fs';
3
+ // upng-js: used for PNG encode of CPU recolor.
4
+ import UPNG from 'upng-js';
5
+ import { renderPaintedImageOffscreen } from './paintShaderRuntime';
6
+ import { writePngBase64ToFile, writePngBytesToFile } from './exportUtils';
7
+ /**
8
+ * CPU recolor: directly map pick codes to painted BGR colors (or copy origin).
9
+ * Produces RGBA PNG bytes via upng-js. This is the *fallback* path when rich shader offscreen
10
+ * is not available or fails. It produces flat colors without the editor's lighting + freq texture.
11
+ */
12
+ function cpuRecolorToPngBytes(originBgr, pickBuffer, paintedRegions, cols, rows) {
13
+ const pixelCount = cols * rows;
14
+ const rgba = new Uint8Array(pixelCount * 4);
15
+ const colorByPickCode = new Map();
16
+ for (const [regionId, color] of paintedRegions) {
17
+ colorByPickCode.set(regionId + 1, color);
18
+ }
19
+ for (let i = 0; i < pixelCount; i++) {
20
+ const code = pickBuffer[i];
21
+ const color = code > 0 ? colorByPickCode.get(code) : undefined;
22
+ const d = i * 4;
23
+ if (color) {
24
+ rgba[d] = color.r;
25
+ rgba[d + 1] = color.g;
26
+ rgba[d + 2] = color.b;
27
+ rgba[d + 3] = 255;
28
+ }
29
+ else {
30
+ const s = i * 3;
31
+ rgba[d] = originBgr[s + 2]; // RGB <- BGR
32
+ rgba[d + 1] = originBgr[s + 1];
33
+ rgba[d + 2] = originBgr[s];
34
+ rgba[d + 3] = 255;
35
+ }
36
+ }
37
+ const png = UPNG.encode([rgba.buffer], cols, rows, 0);
38
+ return new Uint8Array(png);
39
+ }
40
+ /** 将上色区域导出为 recolored PNG。
41
+ * 优先级(从好到保底):
42
+ * 1. exportPngBytes(调用方用 makeImageSnapshot 在高分辨率 Canvas 上捕获的完整 shader 结果)—— 推荐的“保存快照”路径,无 CPU 逐像素,无二次 drawAsImage。
43
+ * 2. shaderTextures + render*(通过 renderPaintedImageOffscreen / drawAsImage 重建同一套 PaintShaderLayer + SkSL)。
44
+ * 3. CPU 逐像素 recolor(flat,无光照/纹理,仅作最后兜底,保证保存不中断)。
45
+ */
46
+ export async function compositePaintedImage(input) {
47
+ const { originBuffer, cols, rows, pickBuffer, paintedRegions, destDir, exportPngBase64, exportPngBytes, shaderTextures, renderWidth, renderHeight, } = input;
48
+ if (paintedRegions.size === 0) {
49
+ throw new Error('No painted regions, cannot save');
50
+ }
51
+ if (pickBuffer.length !== cols * rows) {
52
+ const msg = 'pickMap size does not match image';
53
+ console.error('[VIZ-SAVE] composite will throw:', msg, { pickLen: pickBuffer.length, expected: cols * rows, cols, rows });
54
+ throw new Error(msg);
55
+ }
56
+ if (originBuffer.length !== cols * rows * 3) {
57
+ const msg = 'Original buffer size does not match image';
58
+ console.error('[VIZ-SAVE] composite will throw:', msg, { originLen: originBuffer.length, expected: cols * rows * 3, cols, rows });
59
+ throw new Error(msg);
60
+ }
61
+ let pngBytesForWrite;
62
+ let pngBase64ForWrite;
63
+ let usedSnapshot = false;
64
+ let usedRichShader = false;
65
+ // 1) Highest priority: pre-encoded PNG base64 from makeImageSnapshot (no extra conversion).
66
+ if (exportPngBase64 && exportPngBase64.length > 0) {
67
+ pngBase64ForWrite = exportPngBase64;
68
+ usedSnapshot = true;
69
+ }
70
+ // 1b) Snapshot bytes fallback (legacy callers).
71
+ else if (exportPngBytes && exportPngBytes.length > 0) {
72
+ pngBytesForWrite = exportPngBytes;
73
+ usedSnapshot = true;
74
+ }
75
+ // 2) 回退 rich:用 live 纹理 + drawAsImage 重建与编辑器一致的 shader 结果(带光照 + 频率纹理)。
76
+ else if (shaderTextures && renderWidth && renderHeight) {
77
+ try {
78
+ const offImg = await renderPaintedImageOffscreen({
79
+ originImage: shaderTextures.originImage,
80
+ paintColorMap: shaderTextures.paintColorMap,
81
+ lowFreqImage: shaderTextures.lowFreqImage,
82
+ highFreqImage: shaderTextures.highFreqImage,
83
+ width: renderWidth,
84
+ height: renderHeight,
85
+ showOrigin: false,
86
+ });
87
+ if (offImg) {
88
+ let b64 = '';
89
+ try {
90
+ const enc = offImg.encodeToBase64;
91
+ if (typeof enc === 'function') {
92
+ b64 = enc.call(offImg) || '';
93
+ }
94
+ }
95
+ catch (encErr) {
96
+ console.warn('[VIZ-SAVE] offscreen encodeToBase64 failed:', encErr);
97
+ }
98
+ if (b64 && b64.length > 0) {
99
+ pngBytesForWrite = new Uint8Array(Buffer.from(b64, 'base64'));
100
+ usedRichShader = true;
101
+ }
102
+ try {
103
+ const disp = offImg.dispose;
104
+ if (typeof disp === 'function')
105
+ disp.call(offImg);
106
+ }
107
+ catch { }
108
+ }
109
+ }
110
+ catch (e) {
111
+ console.warn('[VIZ-SAVE] rich shader offscreen for export failed (will fallback):', e);
112
+ }
113
+ }
114
+ // 3) 最后兜底:CPU 逐像素(flat 颜色,无 editor 质感)。
115
+ if (!pngBase64ForWrite && !pngBytesForWrite) {
116
+ try {
117
+ pngBytesForWrite = cpuRecolorToPngBytes(originBuffer, pickBuffer, paintedRegions, cols, rows);
118
+ }
119
+ catch (e) {
120
+ throw new Error('CPU recolor PNG decoding failed');
121
+ }
122
+ }
123
+ const dir = destDir ?? RNFS.CachesDirectoryPath;
124
+ const filePath = `${dir}/painted_${Date.now()}.png`;
125
+ try {
126
+ if (pngBase64ForWrite) {
127
+ await writePngBase64ToFile(filePath, pngBase64ForWrite);
128
+ }
129
+ else {
130
+ await writePngBytesToFile(filePath, pngBytesForWrite);
131
+ }
132
+ void usedSnapshot;
133
+ void usedRichShader;
134
+ }
135
+ catch (e) {
136
+ console.error('[VIZ-SAVE] composite writeFile threw:', e, { filePath, dir });
137
+ throw e;
138
+ }
139
+ return {
140
+ filePath,
141
+ width: cols,
142
+ height: rows,
143
+ paintedCount: paintedRegions.size,
144
+ };
145
+ }
146
+ //# sourceMappingURL=compositePaintedImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compositePaintedImage.js","sourceRoot":"","sources":["../../src/utils/compositePaintedImage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { BgrColor } from '../components/MaskSegmentCanvas.types';
2
+ /** Stable fingerprint for painted region colors — used to reuse cached exports. */
3
+ export declare function paintedRegionsFingerprint(painted: Map<number, BgrColor>): string;
4
+ export declare function writePngBase64ToFile(filePath: string, base64: string): Promise<void>;
5
+ export declare function writePngBytesToFile(filePath: string, bytes: Uint8Array): Promise<void>;
6
+ export declare function stripFilePrefix(uri: string): string;
7
+ export declare function resolveExportResultForDestDir(cached: {
8
+ filePath: string;
9
+ width: number;
10
+ height: number;
11
+ paintedCount: number;
12
+ previewPath?: string;
13
+ }, destDir?: string): Promise<{
14
+ filePath: string;
15
+ width: number;
16
+ height: number;
17
+ paintedCount: number;
18
+ previewPath?: string;
19
+ }>;
20
+ //# sourceMappingURL=exportUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportUtils.d.ts","sourceRoot":"","sources":["../../src/utils/exportUtils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AAEtE,mFAAmF;AACnF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,MAAM,CAMhF;AAED,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1F;AAED,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,EACvG,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAW1G"}
@@ -0,0 +1,32 @@
1
+ import { Buffer } from 'buffer';
2
+ import RNFS from 'react-native-fs';
3
+ /** Stable fingerprint for painted region colors — used to reuse cached exports. */
4
+ export function paintedRegionsFingerprint(painted) {
5
+ if (painted.size === 0) {
6
+ return '';
7
+ }
8
+ const entries = [...painted.entries()].sort((a, b) => a[0] - b[0]);
9
+ return entries.map(([id, c]) => `${id}:${c.r},${c.g},${c.b}`).join('|');
10
+ }
11
+ export async function writePngBase64ToFile(filePath, base64) {
12
+ await RNFS.writeFile(filePath, base64, 'base64');
13
+ }
14
+ export async function writePngBytesToFile(filePath, bytes) {
15
+ await RNFS.writeFile(filePath, Buffer.from(bytes).toString('base64'), 'base64');
16
+ }
17
+ export function stripFilePrefix(uri) {
18
+ return uri.startsWith('file://') ? uri.slice('file://'.length) : uri;
19
+ }
20
+ export async function resolveExportResultForDestDir(cached, destDir) {
21
+ if (!destDir) {
22
+ return cached;
23
+ }
24
+ const src = stripFilePrefix(cached.filePath);
25
+ if (src.startsWith(destDir)) {
26
+ return cached;
27
+ }
28
+ const filePath = `${destDir}/painted_${Date.now()}.png`;
29
+ await RNFS.copyFile(src, filePath);
30
+ return { ...cached, filePath };
31
+ }
32
+ //# sourceMappingURL=exportUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportUtils.js","sourceRoot":"","sources":["../../src/utils/exportUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,IAAI,MAAM,iBAAiB,CAAC;AAGnC,mFAAmF;AACnF,MAAM,UAAU,yBAAyB,CAAC,OAA8B;IACtE,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE;QACtB,OAAO,EAAE,CAAC;KACX;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,MAAc;IACzE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAAiB;IAC3E,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,MAAuG,EACvG,OAAgB;IAEhB,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,MAAM,CAAC;KACf;IACD,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;QAC3B,OAAO,MAAM,CAAC;KACf;IACD,MAAM,QAAQ,GAAG,GAAG,OAAO,YAAY,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;IACxD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACnC,OAAO,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { type WrappedMat } from './opencvAdapter';
2
+ import type { SkImage } from '@shopify/react-native-skia';
3
+ export type FreqLayerImages = {
4
+ lowFreqImage: SkImage;
5
+ highFreqImage: SkImage;
6
+ };
7
+ export type PaintResourceBatch = {
8
+ originImage: SkImage;
9
+ layers: FreqLayerImages;
10
+ };
11
+ /** OpenCV 8-bit Lab L 通道(BGR 输入,供单测与近似对照) */
12
+ export declare function bgrToLabL(b: number, g: number, r: number): number;
13
+ export declare function bgrBufferToRgbaBuffer(bgr: Uint8Array, cols: number, rows: number): Uint8Array;
14
+ export declare function releaseFreqLayerImages(layers: FreqLayerImages | null): void;
15
+ /** 复用已上传的 BGR Mat,避免重复 bufferToMat + JS↔原生往返 */
16
+ export declare function prepareFreqLayersFromWorkMat(workMat: WrappedMat, cols: number, rows: number): Promise<FreqLayerImages | null>;
17
+ /** 单次 Mat 上传 → 高低频 + 原图 Skia(并行,高低频先就绪时可回调) */
18
+ export declare function preparePaintResourcesFromWorkBuffer(bgrBuffer: Uint8Array, cols: number, rows: number, onFreqLayersReady?: (layers: FreqLayerImages) => void): Promise<PaintResourceBatch | null>;
19
+ /** @deprecated 测试兼容;生产路径请用 preparePaintResourcesFromWorkBuffer */
20
+ export declare function prepareFreqLayersFromBgrBuffer(bgrBuffer: Uint8Array, cols: number, rows: number): Promise<FreqLayerImages | null>;
21
+ /** 原图 BGR → Skia RGBA(OpenCV cvtColor,与 freq 并行) */
22
+ export declare function originBgrBufferToSkiaImage(bgrBuffer: Uint8Array, cols: number, rows: number): Promise<SkImage | null>;
23
+ //# sourceMappingURL=freqLayerPrep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freqLayerPrep.d.ts","sourceRoot":"","sources":["../../src/utils/freqLayerPrep.ts"],"names":[],"mappings":"AAAA,OAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAG1D,MAAM,MAAM,eAAe,GAAG;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CA2BjE;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,UAAU,CAYZ;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,QAGpE;AAyDD,gDAAgD;AAChD,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAyEjC;AAED,+CAA+C;AAC/C,wBAAsB,mCAAmC,CACvD,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GACpD,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA8BpC;AAED,kEAAkE;AAClE,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAWjC;AAED,oDAAoD;AACpD,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAEzB"}
@@ -0,0 +1,168 @@
1
+ import cv from './opencvAdapter';
2
+ import { getMaskSegmentRuntimeConfig } from './maskSegmentRuntime';
3
+ /** OpenCV 8-bit Lab L 通道(BGR 输入,供单测与近似对照) */
4
+ export function bgrToLabL(b, g, r) {
5
+ let rf = r / 255;
6
+ let gf = g / 255;
7
+ let bf = b / 255;
8
+ rf = rf > 0.04045 ? Math.pow((rf + 0.055) / 1.055, 2.4) : rf / 12.92;
9
+ gf = gf > 0.04045 ? Math.pow((gf + 0.055) / 1.055, 2.4) : gf / 12.92;
10
+ bf = bf > 0.04045 ? Math.pow((bf + 0.055) / 1.055, 2.4) : bf / 12.92;
11
+ const x = rf * 0.412453 + gf * 0.35758 + bf * 0.180423;
12
+ const y = rf * 0.212671 + gf * 0.71516 + bf * 0.072169;
13
+ const z = rf * 0.019334 + gf * 0.119193 + bf * 0.950227;
14
+ const xn = 0.950456;
15
+ const yn = 1;
16
+ const zn = 1.088754;
17
+ const delta = 6 / 29;
18
+ const delta3 = delta * delta * delta;
19
+ let fx = x / xn;
20
+ let fy = y / yn;
21
+ let fz = z / zn;
22
+ fx = fx > delta3 ? Math.cbrt(fx) : fx / (3 * delta * delta) + 4 / 29;
23
+ fy = fy > delta3 ? Math.cbrt(fy) : fy / (3 * delta * delta) + 4 / 29;
24
+ fz = fz > delta3 ? Math.cbrt(fz) : fz / (3 * delta * delta) + 4 / 29;
25
+ const L = fy * 116 - 16;
26
+ return Math.max(0, Math.min(255, Math.round((L * 255) / 100)));
27
+ }
28
+ export function bgrBufferToRgbaBuffer(bgr, cols, rows) {
29
+ const pixelCount = cols * rows;
30
+ const rgba = new Uint8Array(pixelCount * 4);
31
+ for (let i = 0; i < pixelCount; i++) {
32
+ const s = i * 3;
33
+ const d = i * 4;
34
+ rgba[d] = bgr[s + 2];
35
+ rgba[d + 1] = bgr[s + 1];
36
+ rgba[d + 2] = bgr[s];
37
+ rgba[d + 3] = 255;
38
+ }
39
+ return rgba;
40
+ }
41
+ export function releaseFreqLayerImages(layers) {
42
+ layers?.lowFreqImage.dispose();
43
+ layers?.highFreqImage.dispose();
44
+ }
45
+ /** 16-bit 有符号差分 → 8-bit 高频层(detail * gain + 128) */
46
+ async function buildHighFreqMatNative(lMat, lLowMat, cols, rows, gain) {
47
+ const l16 = cv.createMat(cols, rows, 1);
48
+ const lLow16 = cv.createMat(cols, rows, 1);
49
+ const diff16 = cv.createMat(cols, rows, 1);
50
+ const high8 = cv.createMat(cols, rows, 1);
51
+ try {
52
+ cv.convertTo(lMat, l16, cv.CV_16SC1);
53
+ cv.convertTo(lLowMat, lLow16, cv.CV_16SC1);
54
+ await cv.subtract(l16, lLow16, diff16);
55
+ await cv.addWeighted(diff16, gain, null, 0, 128, diff16);
56
+ cv.convertTo(diff16, high8, cv.CV_8UC1);
57
+ return high8;
58
+ }
59
+ finally {
60
+ l16.release();
61
+ lLow16.release();
62
+ diff16.release();
63
+ }
64
+ }
65
+ async function downscaleMatForFreq(workMat, cols, rows) {
66
+ const maxLongSide = getMaskSegmentRuntimeConfig().pipeline.paintFreqMaxLongSide;
67
+ const longSide = Math.max(cols, rows);
68
+ if (longSide <= maxLongSide) {
69
+ return { mat: workMat, cols, rows, owned: false };
70
+ }
71
+ const scale = maxLongSide / longSide;
72
+ const freqCols = Math.floor(cols * scale);
73
+ const freqRows = Math.floor(rows * scale);
74
+ const resized = cv.createMat(freqCols, freqRows, 3);
75
+ await cv.resize(workMat, resized, { width: freqCols, height: freqRows }, cv.INTER_LINEAR);
76
+ return { mat: resized, cols: freqCols, rows: freqRows, owned: true };
77
+ }
78
+ /** 复用已上传的 BGR Mat,避免重复 bufferToMat + JS↔原生往返 */
79
+ export async function prepareFreqLayersFromWorkMat(workMat, cols, rows) {
80
+ const paintCfg = getMaskSegmentRuntimeConfig().paint;
81
+ const blurStart = __DEV__ ? performance.now() : 0;
82
+ const scaled = await downscaleMatForFreq(workMat, cols, rows);
83
+ const freqMat = scaled.mat;
84
+ const freqCols = scaled.cols;
85
+ const freqRows = scaled.rows;
86
+ let labMat = null;
87
+ let lMat = null;
88
+ let lLowMat = null;
89
+ let lHighMat = null;
90
+ try {
91
+ labMat = cv.cvtColorBgr(freqMat, cv.COLOR_BGR2Lab);
92
+ lMat = cv.createMat(freqCols, freqRows, 1);
93
+ cv.extractChannel(labMat, lMat, 0);
94
+ labMat.release();
95
+ labMat = null;
96
+ lLowMat = cv.createMat(freqCols, freqRows, 1);
97
+ const kernel = paintCfg.lLowBlurKernel;
98
+ await cv.GaussianBlur(lMat, lLowMat, { width: kernel, height: kernel }, 0);
99
+ lHighMat = await buildHighFreqMatNative(lMat, lLowMat, freqCols, freqRows, paintCfg.lHighGain);
100
+ await cv.addWeighted(lLowMat, paintCfg.lLowContrast, null, 0, 128 * (1 - paintCfg.lLowContrast), lLowMat);
101
+ await cv.addWeighted(lLowMat, paintCfg.lLowBrightness, null, 0, 128 * (1 - paintCfg.lLowBrightness), lLowMat);
102
+ const lowFreqImage = cv.grayMatToSkiaImage(lLowMat);
103
+ const highFreqImage = cv.grayMatToSkiaImage(lHighMat);
104
+ if (!lowFreqImage || !highFreqImage) {
105
+ lowFreqImage?.dispose();
106
+ highFreqImage?.dispose();
107
+ return null;
108
+ }
109
+ return { lowFreqImage, highFreqImage };
110
+ }
111
+ finally {
112
+ if (scaled.owned) {
113
+ freqMat.release();
114
+ }
115
+ labMat?.release();
116
+ lMat?.release();
117
+ lLowMat?.release();
118
+ lHighMat?.release();
119
+ }
120
+ }
121
+ /** 单次 Mat 上传 → 高低频 + 原图 Skia(并行,高低频先就绪时可回调) */
122
+ export async function preparePaintResourcesFromWorkBuffer(bgrBuffer, cols, rows, onFreqLayersReady) {
123
+ const pixelCount = cols * rows;
124
+ if (bgrBuffer.length !== pixelCount * 3) {
125
+ return null;
126
+ }
127
+ const prepStart = __DEV__ ? performance.now() : 0;
128
+ const workMat = cv.bgrBufferToMat(bgrBuffer, cols, rows);
129
+ try {
130
+ const originPromise = cv.matToSkiaImage(workMat);
131
+ const freqPromise = prepareFreqLayersFromWorkMat(workMat, cols, rows);
132
+ const layers = await freqPromise;
133
+ if (!layers) {
134
+ const originImage = await originPromise;
135
+ originImage?.dispose();
136
+ return null;
137
+ }
138
+ onFreqLayersReady?.(layers);
139
+ const originImage = await originPromise;
140
+ if (!originImage) {
141
+ releaseFreqLayerImages(layers);
142
+ return null;
143
+ }
144
+ return { originImage, layers };
145
+ }
146
+ finally {
147
+ workMat.release();
148
+ }
149
+ }
150
+ /** @deprecated 测试兼容;生产路径请用 preparePaintResourcesFromWorkBuffer */
151
+ export async function prepareFreqLayersFromBgrBuffer(bgrBuffer, cols, rows) {
152
+ const pixelCount = cols * rows;
153
+ if (bgrBuffer.length !== pixelCount * 3) {
154
+ return null;
155
+ }
156
+ const workMat = cv.bgrBufferToMat(bgrBuffer, cols, rows);
157
+ try {
158
+ return await prepareFreqLayersFromWorkMat(workMat, cols, rows);
159
+ }
160
+ finally {
161
+ workMat.release();
162
+ }
163
+ }
164
+ /** 原图 BGR → Skia RGBA(OpenCV cvtColor,与 freq 并行) */
165
+ export async function originBgrBufferToSkiaImage(bgrBuffer, cols, rows) {
166
+ return cv.bgrBufferToSkiaImage(bgrBuffer, cols, rows);
167
+ }
168
+ //# sourceMappingURL=freqLayerPrep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freqLayerPrep.js","sourceRoot":"","sources":["../../src/utils/freqLayerPrep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type MaskSemanticColor } from './maskSemanticPalette';
2
+ import type { InteractionConfig, MaskSegmentConfig, PaintConfig, PipelineConfig, PipelinePreset } from '../components/MaskSegmentCanvas.types';
3
+ /** high */
4
+ export declare const PIPELINE_HIGH: Required<PipelineConfig>;
5
+ /** middle */
6
+ export declare const PIPELINE_MEDIUM: Required<PipelineConfig>;
7
+ /** low */
8
+ export declare const PIPELINE_LOW: Required<PipelineConfig>;
9
+ export declare const PIPELINE_PRESETS: Record<PipelinePreset, Required<PipelineConfig>>;
10
+ export declare const DEFAULT_PIPELINE_CONFIG: Required<PipelineConfig>;
11
+ export declare function resolvePipelineConfig(preset?: PipelinePreset, overrides?: PipelineConfig): Required<PipelineConfig>;
12
+ export declare const DEFAULT_PAINT_CONFIG: Required<PaintConfig>;
13
+ export declare const DEFAULT_INTERACTION_CONFIG: Required<InteractionConfig>;
14
+ export declare const DEFAULT_MASK_CONFIG: Required<Omit<MaskSegmentConfig, 'baseboardStripQuantKeys' | 'wallQuantKeys' | 'cabinetQuantKeys' | 'secondarySemanticNames'>> & {
15
+ baseboardStripQuantKeys: Set<string>;
16
+ wallQuantKeys: Set<string>;
17
+ cabinetQuantKeys: Set<string>;
18
+ secondarySemanticNames: Set<string>;
19
+ semanticColors: MaskSemanticColor[];
20
+ };
21
+ export type ResolvedMaskSegmentRuntime = {
22
+ pipeline: Required<PipelineConfig>;
23
+ mask: typeof DEFAULT_MASK_CONFIG;
24
+ paint: Required<PaintConfig>;
25
+ interaction: Required<InteractionConfig>;
26
+ };
27
+ export declare function mergeMaskConfig(partial?: MaskSegmentConfig): typeof DEFAULT_MASK_CONFIG;
28
+ export declare function createRuntimeConfig(input?: {
29
+ pipelineConfig?: PipelineConfig;
30
+ maskConfig?: MaskSegmentConfig;
31
+ paintConfig?: PaintConfig;
32
+ interactionConfig?: InteractionConfig;
33
+ }): ResolvedMaskSegmentRuntime;
34
+ export declare function getMaskRuntimeRevision(): number;
35
+ export declare function setMaskSegmentRuntimeConfig(input?: {
36
+ pipelineConfig?: PipelineConfig;
37
+ maskConfig?: MaskSegmentConfig;
38
+ paintConfig?: PaintConfig;
39
+ interactionConfig?: InteractionConfig;
40
+ }): ResolvedMaskSegmentRuntime;
41
+ export declare function getMaskSegmentRuntimeConfig(): ResolvedMaskSegmentRuntime;
42
+ export declare function resetMaskSegmentRuntimeConfig(): ResolvedMaskSegmentRuntime;
43
+ //# sourceMappingURL=maskSegmentRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maskSegmentRuntime.d.ts","sourceRoot":"","sources":["../../src/utils/maskSegmentRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,cAAc,EAEf,MAAM,uCAAuC,CAAC;AAC/C,WAAW;AACX,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,cAAc,CAQlD,CAAC;AAEF,aAAa;AACb,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,cAAc,CAQpD,CAAC;AAEF,UAAU;AACV,eAAO,MAAM,YAAY,EAAE,QAAQ,CAAC,cAAc,CAQjD,CAAC;AACF,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,cAAc,CAAC,CAI7E,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CAAiB,CAAC;AAE/E,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,cAAc,EACvB,SAAS,CAAC,EAAE,cAAc,GACzB,QAAQ,CAAC,cAAc,CAAC,CAI1B;AAWD,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAkBtD,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,iBAAiB,CAOlE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CACxC,IAAI,CACF,iBAAiB,EACf,yBAAyB,GACzB,eAAe,GACf,kBAAkB,GAClB,wBAAwB,CAC3B,CACF,GAAG;IACF,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,sBAAsB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,iBAAiB,EAAE,CAAC;CAkBrC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,QAAQ,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACnC,IAAI,EAAE,OAAO,mBAAmB,CAAC;IACjC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,WAAW,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;CAC1C,CAAC;AAMF,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,mBAAmB,CA2C5B;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE;IAC1C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,GAAG,0BAA0B,CAiB7B;AAKD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,wBAAgB,2BAA2B,CAAC,KAAK,CAAC,EAAE;IAClD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC,GAAG,0BAA0B,CAiB7B;AAED,wBAAgB,2BAA2B,IAAI,0BAA0B,CAExE;AAED,wBAAgB,6BAA6B,IAAI,0BAA0B,CAI1E"}