react-native-mask-segment-c.../dist/utils/maskSemanticPalette.js
a1518 acd6d3a73d feat: add MaskSegmentApp source code and config
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-26 00:27:28 -07:00

125 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { getMaskRuntimeRevision, getMaskSegmentRuntimeConfig, } from './maskSegmentRuntime';
/** 掩码语义色表(与后端分区颜色参考一致) */
export const MASK_SEMANTIC_COLORS = [
{ name: 'door', hex: '#E6194B', bgr: { b: 75, g: 25, r: 230 } },
{ name: 'ceiling', hex: '#3CB44B', bgr: { b: 75, g: 180, r: 60 } },
{ name: 'cabinet', hex: '#FFE119', bgr: { b: 25, g: 225, r: 255 } },
{ name: 'wall', hex: '#4363D8', bgr: { b: 216, g: 99, r: 67 } },
{ name: 'baseboard', hex: '#F58231', bgr: { b: 49, g: 130, r: 245 } },
{ name: 'windowFrame', hex: '#911EB4', bgr: { b: 180, g: 30, r: 145 } },
{ name: 'garageDoor', hex: '#46F0F0', bgr: { b: 240, g: 240, r: 70 } },
{ name: 'roof', hex: '#F032E6', bgr: { b: 230, g: 50, r: 240 } },
{ name: 'eave', hex: '#BCF60C', bgr: { b: 12, g: 246, r: 188 } },
];
export const BASEBOARD_SEMANTIC_NAME = 'baseboard';
let contextRevision = -1;
let cachedContext = null;
function buildSemanticRgb(colors) {
return colors.map(entry => ({
name: entry.name,
rgb: {
r: entry.bgr.r,
g: entry.bgr.g,
b: entry.bgr.b,
},
}));
}
function getSemanticContext() {
const revision = getMaskRuntimeRevision();
if (contextRevision === revision && cachedContext) {
return cachedContext;
}
const mask = getMaskSegmentRuntimeConfig().mask;
const semanticRgb = buildSemanticRgb(mask.semanticColors);
const baseboardRgb = semanticRgb.find(entry => entry.name === BASEBOARD_SEMANTIC_NAME);
const cabinetRgb = semanticRgb.find(entry => entry.name === 'cabinet');
const wallRgb = semanticRgb.find(entry => entry.name === 'wall');
const maxDist = mask.baseboardMaxColorDist;
cachedContext = {
baseboardMaxColorDistSq: maxDist * maxDist,
semanticRgb,
baseboardRgb,
cabinetRgb,
wallRgb,
};
contextRevision = revision;
return cachedContext;
}
function colorDistanceSq(a, b) {
const dr = a.r - b.r;
const dg = a.g - b.g;
const db = a.b - b.b;
return dr * dr + dg * dg + db * db;
}
/** 将掩码像素归类到最近的语义色baseboard 仅严格橙色命中) */
export function classifyBgrPixelToSemantic(b, g, r) {
const ctx = getSemanticContext();
const pixel = { r, g, b };
const distToBaseboard = colorDistanceSq(pixel, ctx.baseboardRgb.rgb);
const distToCabinet = colorDistanceSq(pixel, ctx.cabinetRgb.rgb);
const distToWall = colorDistanceSq(pixel, ctx.wallRgb.rgb);
if (distToBaseboard <= ctx.baseboardMaxColorDistSq &&
distToBaseboard < distToCabinet &&
distToBaseboard < distToWall) {
return BASEBOARD_SEMANTIC_NAME;
}
let best = ctx.semanticRgb[0];
let bestDist = Number.POSITIVE_INFINITY;
for (const entry of ctx.semanticRgb) {
if (entry.name === BASEBOARD_SEMANTIC_NAME) {
continue;
}
const dist = colorDistanceSq(pixel, entry.rgb);
if (dist < bestDist) {
bestDist = dist;
best = entry;
}
}
return best.name;
}
export function getSemanticColorByName(name) {
const colors = getMaskSegmentRuntimeConfig().mask.semanticColors;
return colors.find(entry => entry.name === name);
}
/**
* 踢脚线须更接近 #F58231 且明显优于黄柜 / 蓝墙,避免整块黄区被误判。
*/
export function isStrictBaseboardPixel(b, g, r) {
const ctx = getSemanticContext();
const pixel = { r, g, b };
const distToBaseboard = colorDistanceSq(pixel, ctx.baseboardRgb.rgb);
const distToCabinet = colorDistanceSq(pixel, ctx.cabinetRgb.rgb);
const distToWall = colorDistanceSq(pixel, ctx.wallRgb.rgb);
return (distToBaseboard <= ctx.baseboardMaxColorDistSq &&
distToBaseboard < distToCabinet &&
distToBaseboard < distToWall);
}
export function isBaseboardPixel(b, g, r) {
return isStrictBaseboardPixel(b, g, r);
}
/** 掩码上墙/柜交界细条的量化色 */
export const BASEBOARD_STRIP_QUANT_KEYS = new Set(['0,255,255', '64,255,255']);
/** 掩码上墙面量化色 */
export const WALL_QUANT_KEYS = new Set([
'192,128,64',
'192,64,64',
'128,64,64',
'192,192,128',
'128,128,64',
]);
/** 掩码上柜/地面量化色 */
export const CABINET_QUANT_KEYS = new Set([
'0,192,255',
'64,192,255',
'128,192,255',
]);
export function getBaseboardStripQuantKeys() {
return getMaskSegmentRuntimeConfig().mask.baseboardStripQuantKeys;
}
export function getWallQuantKeys() {
return getMaskSegmentRuntimeConfig().mask.wallQuantKeys;
}
export function getCabinetQuantKeys() {
return getMaskSegmentRuntimeConfig().mask.cabinetQuantKeys;
}
//# sourceMappingURL=maskSemanticPalette.js.map