- New magneticLasso module: Sobel energy map + Dijkstra shortest-path + Douglas-Peucker - New activeContour module: greedy snake + balloon force for polygon-to-edge refinement - wallTextureSplit: edge barrier mask, morphological mask hole closing, Moore boundary tracing, simplified polygon contours, manual pick map patching, gap absorption - MaskSegmentCanvas: full lasso gesture pipeline (tap vertices, drag, magnetic paths, close polygon, endLasso/cancelLasso/deleteLasso) - New maskConfig options: splitWallsEdgeBarrierThreshold, splitWallsCloseMaskRadius, manualSplitWalls, manualSplitWallsMaxCount, manualSplitWallsGapAbsorbDilatePx, magneticLasso, activeContourRefine - New ref methods: startLasso, endLasso, cancelLasso, getManualRegions, deleteLasso - New exported types: LassoPolygon, ManualWallPartition - RegionMaskData carries indexToName and wallSemanticIdx through downsample - Simplify README to point to documentation site - Update documentation site (EN + ZH-CN) with all new APIs and interaction guide - Example app: lasso mode toggles and operation buttons Co-authored-by: Cursor <cursoragent@cursor.com>
2 lines
16 KiB
JavaScript
2 lines
16 KiB
JavaScript
"use strict";var Rn=Object.create;var v=Object.defineProperty;var Sn=Object.getOwnPropertyDescriptor;var Pn=Object.getOwnPropertyNames;var kn=Object.getPrototypeOf,Un=Object.prototype.hasOwnProperty;var wn=(t,n)=>{for(var e in n)v(t,e,{get:n[e],enumerable:!0})},on=(t,n,e,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let r of Pn(n))!Un.call(t,r)&&r!==e&&v(t,r,{get:()=>n[r],enumerable:!(o=Sn(n,r))||o.enumerable});return t};var Bn=(t,n,e)=>(e=t!=null?Rn(kn(t)):{},on(n||!t||!t.__esModule?v(e,"default",{value:t,enumerable:!0}):e,t)),In=t=>on(v({},"__esModule",{value:!0}),t);var mt={};wn(mt,{appendLabelMaskToPathBuilder:()=>Fn,appendMaskBinaryToPathBuilder:()=>On,buildAllRegionMaskPaths:()=>Wn,buildAllRegionOutlinePaths:()=>L.buildAllRegionOutlinePaths,buildBaseboardBinaryFromMask:()=>Kn,buildRegionOutlinePathForRegion:()=>L.buildRegionOutlinePathForRegion,buildRegionOutlinePolygons:()=>Tn,downsampleMaskDataForPaths:()=>Qn,extractRegionsFromMask:()=>st,extractRegionsFromMaskBuffer:()=>ut,extractRegionsFromMaskBufferSync:()=>Z,getMaskQuantKey:()=>zn,isBaseboardMaskPixel:()=>$n,isBaseboardPixel:()=>An.isStrictBaseboardPixel,isKickPlatePixel:()=>Gn,upscaleBinaryMask:()=>Jn});module.exports=In(mt);var P=Bn(require("./opencvAdapter")),Mn=require("@shopify/react-native-skia"),S=require("./maskSemanticPalette"),U=require("./maskSegmentRuntime"),L=require("./maskOutlinePaths"),An=require("./maskSemanticPalette");function M(){return(0,U.getMaskSegmentRuntimeConfig)().mask}const an=5,Cn=10;function un(t){return[{x:t.x,y:t.y},{x:t.x+t.w,y:t.y},{x:t.x+t.w,y:t.y+t.h},{x:t.x,y:t.y+t.h}]}function Tn(t){return t.outlinePolygons&&t.outlinePolygons.length>0?t.outlinePolygons:t.thinStrip||t.polygons.length<=Cn?t.polygons:[un(t.bbox)]}function Nn(t){return t.name===S.BASEBOARD_SEMANTIC_NAME}function En(t,n,e){const o=new Uint8Array(t),r=M().kickBridgeHalfWPx;for(let i=0;i<e;i++)for(let u=0;u<n;u++)if(t[i*n+u])for(let a=-r;a<=r;a++){const s=u+a;s<0||s>=n||(o[i*n+s]=255)}return o}function H(t,n,e){return t.map(o=>[{x:o.minX/n,y:o.y/e},{x:(o.maxX+1)/n,y:o.y/e},{x:(o.maxX+1)/n,y:(o.y+1)/e},{x:o.minX/n,y:(o.y+1)/e}])}function q(t){const n=Math.min(255,Math.round(t/M().quantStep)*M().quantStep);return n>=192?n===255?4:3:n>=128?2:n>=64?1:0}function sn(t,n,e){return q(t)*25+q(n)*5+q(e)}function Ln(){const t=(0,U.getMaskRuntimeRevision)();return mn===t&&j||(j=new Set([...(0,S.getBaseboardStripQuantKeys)()].map(n=>{const[e,o,r]=n.split(",").map(i=>Number(i));return sn(e,o,r)})),mn=t),j}let mn=-1,j=null,ln=-1,O=null;function Yn(t){const n=new Uint8Array(256);for(let e=0;e<256;e++){const o=Math.min(255,Math.round(e/t)*t);o>=192?n[e]=o===255?4:3:o>=128?n[e]=2:o>=64?n[e]=1:n[e]=0}return n}function _n(){const t=(0,U.getMaskRuntimeRevision)();return ln===t&&O||(O=Yn(M().quantStep),ln=t),O}function V(t){return t>=4?255:t>=3?192:t>=2?128:t>=1?64:0}function Xn(t){const n=t/25|0,e=t%25/5|0,o=t%5;return[V(n),V(e),V(o)]}let cn=-1,K=null,J=null,bn=-1;function vn(){const t=(0,U.getMaskRuntimeRevision)();if(bn===t&&J)return J;const n=new Uint8Array(125);for(const e of Ln())n[e]=1;return J=n,bn=t,n}function jn(t,n,e){let o=n,r=e,i=-1,u=-1;for(let a=0;a<e;a++){const s=a*n;for(let m=0;m<n;m++)t[s+m]&&(m<o&&(o=m),m>i&&(i=m),a<r&&(r=a),a>u&&(u=a))}return i<0?null:{x:o/n,y:r/e,w:(i-o+1)/n,h:(u-r+1)/e}}function On(t,n,e,o,r,i=M().baseboardMinRunPx){for(let u=0;u<e;u++){let a=-1;const s=u/e,m=(u+1)/e,c=o.y+s*o.h,l=o.y+m*o.h;for(let b=0;b<=n;b++){const y=b<n&&t[u*n+b]>0;if(y&&a<0&&(a=b),!y&&a>=0){if(b-a>=i){const f=a/n,g=b/n;r.moveTo(o.x+f*o.w,c),r.lineTo(o.x+g*o.w,c),r.lineTo(o.x+g*o.w,l),r.lineTo(o.x+f*o.w,l),r.close()}a=-1}}}}function Fn(t,n,e,o,r,i,u=M().baseboardMinRunPx){for(let a=0;a<o;a++){let s=-1;const m=a*e,c=a/o,l=(a+1)/o,b=r.y+c*r.h,y=r.y+l*r.h;for(let f=0;f<=e;f++){const g=f<e&&t[m+f]===n;if(g&&s<0&&(s=f),!g&&s>=0){if(f-s>=u){const p=s/e,A=f/e;i.moveTo(r.x+p*r.w,b),i.lineTo(r.x+A*r.w,b),i.lineTo(r.x+A*r.w,y),i.lineTo(r.x+p*r.w,y),i.close()}s=-1}}}}function fn(t,n,e,o,r,i,u,a){if(n-t<a)return;const s=e/r,m=(e+1)/r,c=i.y+s*i.h,l=i.y+m*i.h,b=t/o,y=n/o;u.moveTo(i.x+b*i.w,c),u.lineTo(i.x+y*i.w,c),u.lineTo(i.x+y*i.w,l),u.lineTo(i.x+b*i.w,l),u.close()}function Qn(t,n){const{labels:e,baseboardBinary:o,cols:r,rows:i,wallSubLabels:u,indexToName:a,wallSemanticIdx:s}=t,m=Math.max(r,i);if(m<=n)return t;const c=n/m,l=Math.max(1,Math.floor(r*c)),b=Math.max(1,Math.floor(i*c)),y=new Uint8Array(l*b),f=new Uint8Array(l*b),g=u!=null?new Uint8Array(l*b):void 0;g&&g.fill(255);for(let p=0;p<b;p++){const k=Math.min(i-1,Math.floor(p*i/b))*r,x=p*l;for(let d=0;d<l;d++){const h=Math.min(r-1,Math.floor(d*r/l)),B=k+h,I=x+d;y[I]=e[B],f[I]=o[B],g&&u&&(g[I]=u[B])}}return{labels:y,baseboardBinary:f,cols:l,rows:b,wallSubLabels:g,indexToName:a,wallSemanticIdx:s}}function Wn(t,n,e){const{labels:o,baseboardBinary:r,cols:i,rows:u}=n,a=new Map,s=(0,U.getMaskSegmentRuntimeConfig)().mask.semanticColors,m=new Int32Array(s.length);m.fill(-1);let c=null;for(const f of t){if(a.set(f.id,Mn.Skia.Path.Make()),f.thinStrip){c=f.id;continue}const g=s.findIndex(p=>p.name===f.name);g>=0&&(m[g]=f.id)}const l=s.length,b=M().baseboardMinRunPx;for(let f=0;f<u;f++){let g=-1,p=-1,A=-1;const k=f*i;for(let x=0;x<=i;x++){if(c!=null){const h=x<i&&r[k+x]>0;h&&g<0&&(g=x),!h&&g>=0&&(fn(g,x,f,i,u,e,a.get(c),b),g=-1)}let d=-1;if(x<i){const h=o[k+x];h<l&&m[h]>=0&&(d=h)}if(d!==A){if(A>=0&&p>=0){const h=m[A];fn(p,x,f,i,u,e,a.get(h),b)}A=d,p=d>=0?x:-1}}}const y=new Map;for(const[f,g]of a)y.set(f,g);return y}function $(t,n,e,o){const r=[];for(let i=0;i<e;i++){let u=-1;for(let a=0;a<=n;a++){const s=a<n&&t[i*n+a]>0;s&&u<0&&(u=a),!s&&u>=0&&(a-u>=o&&r.push({minX:u,maxX:a-1,y:i}),u=-1)}}return r}function Dn(t){if(t.length===0)return null;let n=1,e=1,o=0,r=0;for(const i of t)for(const u of i)n=Math.min(n,u.x),e=Math.min(e,u.y),o=Math.max(o,u.x),r=Math.max(r,u.y);return{x:n,y:e,w:o-n,h:r-e}}function bt(t,n,e){let o=0;for(let c=0;c<t.length;c++)t[c]&&(o+=1);const r=$(t,n,e,M().baseboardMinRunPx),i=H(r,n,e),u=En(t,n,e),a=$(u,n,e,M().baseboardMinRunPx),s=H(a,n,e),m=Dn(i);return{polygons:i,hitPolygons:s,totalArea:o,bbox:m}}function ft(t){return new Uint8Array(t)}function yt(t,n){for(let e=0;e<t.length;e++)n[e]&&(t[e]=0)}function Hn(t,n){return Math.max(300,Math.floor(t*n/2e3))}function qn(t,n,e){const o=Hn(n,e);return M().secondarySemanticNames.has(t)?Math.max(o,Math.floor(n*e*M().secondaryMinPixelRatio)):o}function z(t){return Math.min(255,Math.round(t/M().quantStep)*M().quantStep)}function F(t,n,e){return`${z(t)},${z(n)},${z(e)}`}function yn(t,n,e,o,r){const i=new Uint8Array(t.length),u=new Uint8Array(t.length);for(let a=0;a<e;a++)for(let s=0;s<n;s++){if(!t[a*n+s])continue;const m=Math.max(0,s-o),c=Math.min(n-1,s+o);for(let l=m;l<=c;l++)i[a*n+l]=255}for(let a=0;a<e;a++)for(let s=0;s<n;s++){if(!i[a*n+s])continue;const m=Math.max(0,a-r),c=Math.min(e-1,a+r);for(let l=m;l<=c;l++)u[l*n+s]=255}return u}function xn(t,n,e){const o=new Uint8Array(n*e),r=new Uint8Array(n*e);for(let s=0;s<n*e;s++){const m=s*3,c=t[m],l=t[m+1],b=t[m+2];if(Q(c,l,b))continue;const y=F(c,l,b);(0,S.getWallQuantKeys)().has(y)&&(o[s]=255),(0,S.getCabinetQuantKeys)().has(y)&&(r[s]=255)}const i=yn(o,n,e,M().junctionHRadiusPx,M().junctionVRadiusPx),u=yn(r,n,e,M().junctionHRadiusPx,M().junctionVRadiusPx),a=new Uint8Array(n*e);for(let s=0;s<a.length;s++)i[s]&&u[s]&&(a[s]=255);return a}function gn(t,n,e){let o=e,r=-1;for(let i=0;i<e;i++){const u=i*n;for(let a=0;a<n;a++)t[u+a]&&(i<o&&(o=i),i>r&&(r=i))}return r<0?null:{minY:o,maxY:r}}function dn(t,n,e,o,r){if(!r)return!1;const i=t%e,u=(t-i)/e;if(u<r.minY-M().baseboardJunctionRowMarginPx||u>r.maxY+M().baseboardJunctionRowMarginPx)return!1;const a=M().kickBridgeHalfWPx;for(let s=-M().baseboardJunctionVReachPx;s<=M().baseboardJunctionVReachPx;s++){const m=u+s;if(m<0||m>=o)continue;const c=m*e;for(let l=-a;l<=a;l++){const b=i+l;if(!(b<0||b>=e)&&n[c+b])return!0}}return!1}function Vn(t,n,e,o){const r=new Uint8Array(n*e),i=o??xn(t,n,e);for(let a=0;a<e;a++)for(let s=0;s<n;s++){const m=a*n+s,c=m*3,l=t[c],b=t[c+1],y=t[c+2];Q(l,b,y)||(0,S.isStrictBaseboardPixel)(l,b,y)&&(r[m]=255)}const u=gn(r,n,e);for(let a=0;a<e;a++)for(let s=0;s<n;s++){const m=a*n+s;if(r[m])continue;const c=m*3,l=t[c],b=t[c+1],y=t[c+2];if(Q(l,b,y))continue;const f=F(l,b,y);(0,S.getBaseboardStripQuantKeys)().has(f)&&i[m]&&dn(m,r,n,e,u)&&(r[m]=255)}return r}function Kn(t,n,e){return Vn(t,n,e)}function Jn(t,n,e,o,r){const i=new Uint8Array(o*r);for(let u=0;u<r;u++){const s=Math.min(e-1,Math.floor(u*e/r))*n,m=u*o;for(let c=0;c<o;c++){const l=Math.min(n-1,Math.floor(c*n/o));i[m+c]=t[s+l]}}return i}function xt(t,n,e){return H($(t,n,e,M().baseboardMinRunPx),n,e)}function $n(t,n,e,o,r,i){if(o<0||r<0||o>=n||r>=e)return!1;if(i)return i[r*n+o]>0;const u=(r*n+o)*3,a=t[u],s=t[u+1],m=t[u+2];if(Q(a,s,m))return!1;if((0,S.isStrictBaseboardPixel)(a,s,m))return!0;const c=F(a,s,m);return(0,S.getBaseboardStripQuantKeys)().has(c)?xn(t,n,e)[r*n+o]>0:!1}function zn(t,n,e){return F(t,n,e)}function Gn(t,n,e){return(0,S.isStrictBaseboardPixel)(t,n,e)}function hn(t,n){const e=Math.min(t.x,n.x),o=Math.min(t.y,n.y),r=Math.max(t.x+t.w,n.x+n.w),i=Math.max(t.y+t.h,n.y+n.h);return{x:e,y:o,w:r-e,h:i-o}}function Q(t,n,e){const o=M().blackThreshold;return t<o&&n<o&&e<o}function gt(t){let n=0;for(let e=0;e<t.length;e++)t[e]&&(n+=1);return n}const E=255;let pn=-1,W=null;function G(){const t=(0,U.getMaskRuntimeRevision)();if(pn===t&&W)return W;const n=(0,U.getMaskSegmentRuntimeConfig)().mask.semanticColors;return W=new Map(n.map((e,o)=>[e.name,o])),pn=t,W}function Zn(){const t=(0,U.getMaskRuntimeRevision)();if(cn===t&&K)return K;const n=new Uint8Array(125);n.fill(E);const e=(0,U.getMaskSegmentRuntimeConfig)().mask.semanticColors,o=G();for(const r of e){const i=o.get(r.name);if(i===void 0)continue;const{b:u,g:a,r:s}=r.bgr;n[sn(u,a,s)]=i}for(let r=0;r<125;r++){if(n[r]!==E)continue;const[i,u,a]=Xn(r),s=(0,S.classifyBgrPixelToSemantic)(i,u,a);n[r]=o.get(s)??E}return K=n,cn=t,n}function nt(t,n,e){const o=n*e,r=new Uint8Array(o);r.fill(E);const i=new Map,u=new Map,a=Zn(),s=G(),m=(0,U.getMaskSegmentRuntimeConfig)().mask.semanticColors.map(R=>R.name),c=m.length,l=M().blackThreshold,b=_n(),y=vn(),f=new Int32Array(c),g=new Int32Array(c),p=new Int32Array(c),A=new Int32Array(c),k=new Uint8Array(c),x=new Int32Array(c),d=[],h=new Uint8Array(o);let B=0;const I=s.get(S.BASEBOARD_SEMANTIC_NAME);f.fill(n),g.fill(e),p.fill(-1),A.fill(-1);const N=t;for(let R=0;R<e;R++){const _=R*n;for(let T=0;T<n;T++){const X=_+T,D=X*3,nn=N[D],tn=N[D+1],en=N[D+2];if(nn<l&&tn<l&&en<l)continue;const rn=b[nn]*25+b[tn]*5+b[en];y[rn]&&d.push(X);const w=a[rn];w!==E&&(r[X]=w,k[w]=1,x[w]+=1,w===I&&(h[X]=255,B+=1),T<f[w]&&(f[w]=T),T>p[w]&&(p[w]=T),R<g[w]&&(g[w]=R),R>A[w]&&(A[w]=R))}}const C=1/n,Y=1/e;for(let R=0;R<c;R++){if(!k[R])continue;const _=m[R];i.set(_,x[R]),u.set(_,{x:f[R]*C,y:g[R]*Y,w:(p[R]-f[R]+1)*C,h:(A[R]-g[R]+1)*Y})}return{labels:r,counts:i,bboxes:u,stripIndices:d,strictBaseboard:h,strictBaseboardCount:B}}function tt(t,n,e,o){const r=new Uint8Array(e*o),i=[],u=G(),a=u.get("wall"),s=u.get("cabinet"),m=M().junctionHRadiusPx,c=M().junctionVRadiusPx;if(a===void 0||s===void 0||n.length===0)return{junction:r,junctionIndices:i};for(const l of n){const b=l%e,y=(l-b)/e;let f=!1,g=!1;const p=Math.max(0,y-c),A=Math.min(o-1,y+c),k=Math.max(0,b-m),x=Math.min(e-1,b+m);for(let d=p;d<=A&&!(f&&g);d++){const h=d*e;for(let B=k;B<=x&&!(f&&g);B++){const I=t[h+B];I===a?f=!0:I===s&&(g=!0)}}f&&g&&(r[l]=255,i.push(l))}return{junction:r,junctionIndices:i}}function et(t,n,e,o,r){const i=new Uint8Array(t),u=gn(i,o,r);let a=n;for(const s of e)dn(s,i,o,r,u)&&(i[s]||(a+=1),i[s]=255);return{binary:i,pixelCount:a}}function rt(t,n,e,o,r,i){const u=r*i,a=new Uint8Array(u),s=new Map,m=S.BASEBOARD_SEMANTIC_NAME,c=e.get(m),l=c===void 0?0:c+1;for(let b=0;b<u;b++){if(o[b]){l>0&&(a[b]=l),s.set(m,(s.get(m)??0)+1);continue}const y=t[b];if(y===E)continue;const f=n[y];if(!f)continue;const g=e.get(f);g!==void 0&&(a[b]=g+1),s.set(f,(s.get(f)??0)+1)}return{pick:a,workAreas:s}}function ot(t,n,e){const o=n*e,r=new Uint8Array(o);r.set(t);for(let i=1;i<e-1;i++)for(let u=1;u<n-1;u++){const a=i*n+u;if(t[a]!==0)continue;const s=[t[(i-1)*n+(u-1)],t[(i-1)*n+u],t[(i-1)*n+(u+1)],t[i*n+(u-1)],t[i*n+(u+1)],t[(i+1)*n+(u-1)],t[(i+1)*n+u],t[(i+1)*n+(u+1)]],m={};for(let c=0;c<8;c++){const l=s[c];l!==0&&(m[l]=(m[l]??0)+1)}for(const c of Object.keys(m)){const l=Number(c);if(m[l]>=4){r[a]=l;break}}}return r}function it(t,n,e){const o=(0,U.getMaskSegmentRuntimeConfig)().mask.semanticColors.map(r=>r.name);return o.map(r=>{if((t.get(r)??0)<qn(r,n,e))return null;const u=(0,S.getSemanticColorByName)(r);return{label:o.indexOf(r),name:r,hex:u.hex,color:{...u.bgr}}}).filter(r=>r!=null).sort((r,i)=>(t.get(i.name)??0)-(t.get(r.name)??0)).slice(0,M().maxRegionColors)}async function at(t,n,e,o,r){const i=await P.default.contourArea(t);if(i<o)return null;const u=await P.default.boundingRect(t),a=await P.default.arcLength(t,!0),s=Math.max(n,e)*.01,m=Math.min(u.width,u.height),c=Math.max(1.5,Math.min(a*r,s,Math.max(2,m*.12))),l=await P.default.approxPolyDP(t,c,!0);if(l.length<3)return null;let b=n,y=e,f=0,g=0;return{polygon:l.map(A=>(b=Math.min(b,A.x),f=Math.max(f,A.x),y=Math.min(y,A.y),g=Math.max(g,A.y),{x:A.x/n,y:A.y/e})),area:i,bbox:{x:b/n,y:y/e,w:(f-b+1)/n,h:(g-y+1)/e}}}function dt(t,n,e,o){const r=new Uint8Array(n*e),i=[];let u=0,a=null;for(let s=0;s<e;s++)for(let m=0;m<n;m++){const c=s*n+m;if(!t[c]||r[c])continue;let l=m,b=m,y=s,f=s,g=0;const p=[[m,s]];for(r[c]=1;p.length>0;){const[x,d]=p.pop();if(g+=1,l=Math.min(l,x),b=Math.max(b,x),y=Math.min(y,d),f=Math.max(f,d),x>0){const h=d*n+(x-1);t[h]&&!r[h]&&(r[h]=1,p.push([x-1,d]))}if(x+1<n){const h=d*n+(x+1);t[h]&&!r[h]&&(r[h]=1,p.push([x+1,d]))}if(d>0){const h=(d-1)*n+x;t[h]&&!r[h]&&(r[h]=1,p.push([x,d-1]))}if(d+1<e){const h=(d+1)*n+x;t[h]&&!r[h]&&(r[h]=1,p.push([x,d+1]))}}if(g<o)continue;const A=[{x:l/n,y:y/e},{x:(b+1)/n,y:y/e},{x:(b+1)/n,y:(f+1)/e},{x:l/n,y:(f+1)/e}],k={x:l/n,y:y/e,w:(b-l+1)/n,h:(f-y+1)/e};i.push(A),u+=g,a=a?hn(a,k):k}return{polygons:i,totalArea:u,bbox:a}}async function ht(t,n,e,o,r){const i=P.default.binaryBufferToMat(t,n,e),u=P.default.createMat(n,e,1);try{const a=await P.default.getStructuringElement(P.default.MORPH_ELLIPSE,{width:an,height:an});try{await P.default.morphologyEx(i,u,P.default.MORPH_OPEN,a)}finally{a.release()}const s=await P.default.findContours(u,P.default.RETR_EXTERNAL,P.default.CHAIN_APPROX_SIMPLE),m=[];let c=0,l=null;for(const b of s)try{const y=await at(b,n,e,o,r);if(!y)continue;m.push(y.polygon),c+=y.area,l=l?hn(l,y.bbox):y.bbox}finally{b.release()}return{polygons:m,totalArea:c,bbox:l}}finally{i.release(),u.release()}}async function ut(t,n,e,o){return Z(t,n,e,o)}function Z(t,n,e,o){const r=nt(t,n,e),i=__DEV__?performance.now():0,{junctionIndices:u}=tt(r.labels,r.stripIndices,n,e),{binary:a,pixelCount:s}=et(r.strictBaseboard,r.strictBaseboardCount,u,n,e);r.counts.set(S.BASEBOARD_SEMANTIC_NAME,s);const m=it(r.counts,n,e);if(m.length===0)return{regions:[],pickMap:{buffer:new Uint8Array(n*e),cols:n,rows:e},labels:r.labels,baseboardBinary:a,segCols:n,segRows:e};const c=(0,U.getMaskSegmentRuntimeConfig)().mask.semanticColors.map(x=>x.name),b=m.map(x=>{const{label:d,name:h,hex:B,color:I}=x,N=Nn(x);try{const C=N?jn(a,n,e):r.bboxes.get(h);if(!C)return __DEV__&&console.warn(`[MaskSegment] ${h} no valid contour, skipped`),null;const Y=[un(C)];return{id:d,name:h,hex:B,color:I,area:r.counts.get(h)??0,bbox:C,polygons:Y,outlinePolygons:Y,thinStrip:N}}catch(C){return __DEV__&&console.warn(`[MaskSegment] Color #${d} extraction failed:`,C instanceof Error?C.message:String(C)),null}}).filter(x=>x!=null);b.sort((x,d)=>d.area-x.area),b.forEach((x,d)=>{x.id=d});const y=b.slice(0,M().maxRegionColors),f=new Map(y.map(x=>[x.name,x.id])),g=__DEV__?performance.now():0,{pick:p,workAreas:A}=rt(r.labels,c,f,a,n,e),k=ot(p,n,e);for(const x of y){const d=A.get(x.name);d!=null&&(x.area=d)}return{regions:y,pickMap:{buffer:k,cols:n,rows:e},labels:r.labels,baseboardBinary:a,segCols:n,segRows:e}}async function st(t,n){const{buffer:e,cols:o,rows:r}=P.default.matToBuffer(t);return Z(e,o,r,n).regions}
|