22
33import React , { useState , useEffect , useMemo , useRef } from "react"
44
5- import mmgc from "mmgc1-cpp"
6-
7- console . log ( mmgc )
5+ import MMGC_INIT from "mmgc1-cpp"
86
97export default ( {
108 classPoints,
119 regionClsList,
1210 imageSrc,
1311 imagePosition,
1412 opacity = 0.5 ,
15- zIndex = 999 ,
13+ zIndex = 2 ,
1614 position = "absolute" ,
1715} ) => {
16+ if ( ! window . mmgc ) window . mmgc = MMGC_INIT ( )
17+ const mmgc = window . mmgc
1818 const [ canvasRef , setCanvasRef ] = useState ( null )
19-
20- const lastTimeMMGCRun = useRef ( 0 ) ;
19+
20+ const lastTimeMMGCRun = useRef ( 0 )
2121 const superPixelsGenerated = useRef ( false )
2222 const [ sampleImageData , setSampleImageData ] = useState ( )
23-
23+
2424 useEffect ( ( ) => {
25- if ( ! imageSrc ) return ;
26- const canvas = document . querySelector ( "canvas" ) ;
27- const ctx = canvas . getContext ( "2d" ) ;
28-
29- const image = new Image ( ) ;
30- image . src = imageSrc ;
25+ if ( ! imageSrc ) return
26+ const canvas = document . createElement ( "canvas" )
27+ const ctx = canvas . getContext ( "2d" )
28+
29+ const image = new Image ( )
30+ image . src = imageSrc
3131 image . onload = ( ) => {
3232 ctx . width = image . naturalWidth
3333 ctx . height = image . naturalHeight
34- ctx . drawImage ( image , 0 , 0 ) ;
35- const imageData = ctx . getImageData ( 0 , 0 , image . naturalWidth , image . naturalHeight )
36- superPixelsGenerated . current = false ;
34+ ctx . drawImage ( image , 0 , 0 )
35+ const imageData = ctx . getImageData (
36+ 0 ,
37+ 0 ,
38+ image . naturalWidth ,
39+ image . naturalHeight
40+ )
41+ superPixelsGenerated . current = false
3742 setSampleImageData ( imageData )
3843 }
3944 } , [ imageSrc ] )
40-
4145
4246 useEffect ( ( ) => {
4347 if ( ! canvasRef ) return
4448 if ( ! sampleImageData ) return
49+ if ( classPoints . filter ( ( cp ) => cp . cls ) . length < 3 ) return
4550 if ( ! mmgc . setImage ) return
4651 // NEEDS DEBOUNCE
4752 if ( Date . now ( ) < lastTimeMMGCRun . current + 500 ) return
4853 lastTimeMMGCRun . current = Date . now ( )
4954 const context = canvasRef . getContext ( "2d" )
50-
55+
5156 console . log ( "got the sample image data and ready to mmgc!" )
52-
57+
5358 if ( ! superPixelsGenerated . current ) {
5459 console . log ( "generating super pixels..." )
55- mmgc . setImage ( sampleImageData . data , sampleImageData . width , sampleImageData . height ) ;
60+ mmgc . setImage (
61+ sampleImageData . data ,
62+ sampleImageData . width ,
63+ sampleImageData . height
64+ )
5665 mmgc . computeSuperPixels ( )
5766 superPixelsGenerated . current = true
5867 }
59-
68+
6069 // mmgc.setClassColor(0, 0xffffffff)
6170 // mmgc.setClassColor(1, 0x00000000)
6271 console . log ( "generating mask..." )
@@ -66,45 +75,49 @@ export default ({
6675 if ( classPoint . x < 0 ) continue
6776 ///etc...
6877 console . log (
69- regionClsList . indexOf ( classPoint . cls ) , Math . floor (
70- classPoint . y * sampleImageData . height
71- ) , Math . floor ( classPoint . x * sampleImageData . width
72- )
78+ regionClsList . indexOf ( classPoint . cls ) ,
79+ Math . floor ( classPoint . y * sampleImageData . height ) ,
80+ Math . floor ( classPoint . x * sampleImageData . width )
81+ )
82+ mmgc . addClassPoint (
83+ regionClsList . indexOf ( classPoint . cls ) ,
84+ Math . floor ( classPoint . y * sampleImageData . height ) ,
85+ Math . floor ( classPoint . x * sampleImageData . width )
7386 )
74- mmgc . addClassPoint ( regionClsList . indexOf ( classPoint . cls ) , Math . floor (
75- classPoint . y * sampleImageData . height
76- ) , Math . floor ( classPoint . x * sampleImageData . width
77- ) )
7887 }
7988 // mmgc.addClassPoint(0, 100, 125)
8089 // mmgc.addClassPoint(1, 10, 10)
8190 // mmgc.addClassPoint(1, 240, 300)
8291 mmgc . computeMasks ( )
8392 const maskAddress = mmgc . getColoredMask ( )
84- const cppImDataUint8 = new Uint8Array (
93+ const cppImDataUint8 = new Uint8ClampedArray (
8594 mmgc . HEAPU8 . buffer ,
8695 maskAddress ,
8796 sampleImageData . data . length
8897 // sampleImageData.width * sampleImageData.height * 4
8998 )
90- const clampedArray = Uint8ClampedArray . from ( cppImDataUint8 )
91-
92- window . uint8Arrays = ( window . uint8Arrays || [ ] ) . concat ( [ cppImDataUint8 ] )
93-
94- const maskImageData = new ImageData ( clampedArray , sampleImageData . width , sampleImageData . height )
99+ const maskImageData = new ImageData (
100+ cppImDataUint8 ,
101+ sampleImageData . width ,
102+ sampleImageData . height
103+ )
95104
96105 // for (const i = 0; i < cppImDataUint8.length;i++){
97106 // sampleImageData.data[i] = cppImDataUint8[i]
98107 // }
99- console . log ( maskImageData . data )
100- context . clearRect ( 0 , 0 , sampleImageData . width , sampleImageData . height )
108+ context . clearRect ( 0 , 0 , sampleImageData . width , sampleImageData . height )
101109 context . putImageData ( maskImageData , 0 , 0 )
102- } , [ canvasRef , sampleImageData , JSON . stringify ( classPoints . map ( c => [ c . x , c . y , c . cls ] ) ) ] )
110+ } , [
111+ canvasRef ,
112+ sampleImageData ,
113+ JSON . stringify ( classPoints . map ( ( c ) => [ c . x , c . y , c . cls ] ) ) ,
114+ ] )
103115
104116 const style = useMemo ( ( ) => {
105117 let width = imagePosition . bottomRight . x - imagePosition . topLeft . x
106118 let height = imagePosition . bottomRight . y - imagePosition . topLeft . y
107119 return {
120+ // imageRendering: "pixelated",
108121 left : imagePosition . topLeft . x ,
109122 top : imagePosition . topLeft . y ,
110123 width : isNaN ( width ) ? 0 : width ,
@@ -123,7 +136,7 @@ export default ({
123136 position ,
124137 opacity ,
125138 ] )
126-
139+
127140 return (
128141 < canvas
129142 style = { style }
0 commit comments