@@ -7,7 +7,7 @@ import { useDebounce } from "react-use"
77import MMGC_INIT from "mmgc1-cpp"
88
99export const ImageMask = ( {
10- classPoints ,
10+ regions ,
1111 regionClsList,
1212 imageSrc,
1313 imagePosition,
@@ -49,7 +49,7 @@ export const ImageMask = ({
4949 if ( hide ) return
5050 if ( ! canvasRef ) return
5151 if ( ! sampleImageData ) return
52- if ( classPoints . filter ( ( cp ) => cp . cls ) . length < 3 ) return
52+ if ( regions . filter ( ( cp ) => cp . cls ) . length < 3 ) return
5353 if ( ! mmgc . setImageSize ) return
5454 const context = canvasRef . getContext ( "2d" )
5555
@@ -79,9 +79,11 @@ export const ImageMask = ({
7979 )
8080 return
8181 }
82- mmgc . clearClassPoints ( )
82+ mmgc . clearClassElements ( )
83+ const classPoints = regions
84+ . filter ( ( r ) => r . type === "point" )
85+ . filter ( ( r ) => r . cls )
8386 for ( const classPoint of classPoints ) {
84- if ( ! classPoint . cls ) continue
8587 if ( classPoint . x < 0 || classPoint . x >= 1 ) continue
8688 if ( classPoint . y < 0 || classPoint . y >= 1 ) continue
8789 const clsIndex = regionClsList . indexOf ( classPoint . cls )
@@ -96,13 +98,32 @@ export const ImageMask = ({
9698 Math . floor ( classPoint . x * sampleImageData . width )
9799 )
98100 }
101+ const classPolygons = regions
102+ . filter ( ( r ) => r . type === "polygon" )
103+ . filter ( ( r ) => r . cls )
104+ for ( const polygon of classPolygons ) {
105+ const { points } = polygon
106+ const clsIndex = regionClsList . indexOf ( polygon . cls )
107+ const pi = mmgc . addPolygon ( clsIndex )
108+ const pointPairs = points . map ( ( p , i ) => [
109+ p ,
110+ points [ ( i + 1 ) % points . length ] ,
111+ ] )
112+ for ( const [ p1 , p2 ] of pointPairs ) {
113+ const ri1 = Math . round ( p1 [ 1 ] * sampleImageData . height )
114+ const ci1 = Math . round ( p1 [ 0 ] * sampleImageData . width )
115+ const ri2 = Math . round ( p2 [ 1 ] * sampleImageData . height )
116+ const ci2 = Math . round ( p2 [ 0 ] * sampleImageData . width )
117+ mmgc . addLineToPolygon ( pi , ri1 , ci1 , ri2 , ci2 )
118+ }
119+ }
120+
99121 mmgc . computeMasks ( )
100122 const maskAddress = mmgc . getColoredMask ( )
101123 const cppImDataUint8 = new Uint8ClampedArray (
102124 mmgc . HEAPU8 . buffer ,
103125 maskAddress ,
104126 sampleImageData . data . length
105- // sampleImageData.width * sampleImageData.height * 4
106127 )
107128 const maskImageData = new ImageData (
108129 cppImDataUint8 ,
@@ -114,7 +135,7 @@ export const ImageMask = ({
114135 context . putImageData ( maskImageData , 0 , 0 )
115136 } ,
116137 1000 ,
117- [ canvasRef , sampleImageData , classPoints , hide ]
138+ [ canvasRef , sampleImageData , regions , hide ]
118139 )
119140
120141 const style = useMemo ( ( ) => {
0 commit comments