11import ChibiRay
2- import JavaScriptKit
32import JavaScriptEventLoop
3+ import JavaScriptKit
44
55JavaScriptEventLoop . installGlobalExecutor ( )
66WebWorkerTaskExecutor . installGlobalExecutor ( )
77
88func renderInCanvas( ctx: JSObject , image: ImageView ) {
99 let imageData = ctx. createImageData!( image. width, image. height) . object!
1010 let data = imageData. data. object!
11-
11+ 1212 for y in 0 ..< image. height {
1313 for x in 0 ..< image. width {
1414 let index = ( y * image. width + x) * 4
1515 let pixel = image [ x, y]
16- data [ index] = . number( Double ( pixel. red * 255 ) )
16+ data [ index] = . number( Double ( pixel. red * 255 ) )
1717 data [ index + 1 ] = . number( Double ( pixel. green * 255 ) )
1818 data [ index + 2 ] = . number( Double ( pixel. blue * 255 ) )
1919 data [ index + 3 ] = . number( Double ( 255 ) )
@@ -57,7 +57,13 @@ struct Work: Sendable {
5757 }
5858}
5959
60- func render( scene: Scene , ctx: JSObject , renderTimeElement: JSObject , concurrency: Int , executor: ( some TaskExecutor ) ? ) async {
60+ func render(
61+ scene: Scene ,
62+ ctx: JSObject ,
63+ renderTimeElement: JSObject ,
64+ concurrency: Int ,
65+ executor: ( some TaskExecutor ) ?
66+ ) async {
6167
6268 let imageBuffer = UnsafeMutableBufferPointer< Color> . allocate( capacity: scene. width * scene. height)
6369 // Initialize the buffer with black color
@@ -73,12 +79,15 @@ func render(scene: Scene, ctx: JSObject, renderTimeElement: JSObject, concurrenc
7379 }
7480
7581 var checkTimer : JSValue ?
76- checkTimer = JSObject . global. setInterval!( JSClosure { _ in
77- print ( " Checking thread work... " )
78- renderInCanvas ( ctx: ctx, image: imageView)
79- updateRenderTime ( )
80- return . undefined
81- } , 250 )
82+ checkTimer = JSObject . global. setInterval!(
83+ JSClosure { _ in
84+ print ( " Checking thread work... " )
85+ renderInCanvas ( ctx: ctx, image: imageView)
86+ updateRenderTime ( )
87+ return . undefined
88+ } ,
89+ 250
90+ )
8291
8392 await withTaskGroup ( of: Void . self) { group in
8493 let yStride = scene. height / concurrency
@@ -117,10 +126,16 @@ func onClick() async throws {
117126
118127 let scene = createDemoScene ( size: size)
119128 let executor = background ? try await WebWorkerTaskExecutor ( numberOfThreads: concurrency) : nil
120- canvasElement. width = . number( Double ( scene. width) )
129+ canvasElement. width = . number( Double ( scene. width) )
121130 canvasElement. height = . number( Double ( scene. height) )
122131
123- await render ( scene: scene, ctx: ctx, renderTimeElement: renderTimeElement, concurrency: concurrency, executor: executor)
132+ await render (
133+ scene: scene,
134+ ctx: ctx,
135+ renderTimeElement: renderTimeElement,
136+ concurrency: concurrency,
137+ executor: executor
138+ )
124139 executor? . terminate ( )
125140 print ( " Render done " )
126141}
@@ -130,19 +145,21 @@ func main() async throws {
130145 let concurrencyElement = JSObject . global. document. getElementById ( " concurrency " ) . object!
131146 concurrencyElement. value = JSObject . global. navigator. hardwareConcurrency
132147
133- _ = renderButtonElement. addEventListener!( " click " , JSClosure { _ in
134- Task {
135- try await onClick ( )
148+ _ = renderButtonElement. addEventListener!(
149+ " click " ,
150+ JSClosure { _ in
151+ Task {
152+ try await onClick ( )
153+ }
154+ return JSValue . undefined
136155 }
137- return JSValue . undefined
138- } )
156+ )
139157}
140158
141159Task {
142160 try await main ( )
143161}
144162
145- 146163#if canImport(wasi_pthread)
147164import wasi_pthread
148165import WASILibc
0 commit comments