97 lines
1.9 KiB
Go
97 lines
1.9 KiB
Go
//go:build js && wasm
|
|
|
|
package gl
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
"syscall/js"
|
|
"unsafe"
|
|
)
|
|
|
|
func sliceToBytes[T comparable](s []T) []byte {
|
|
size := 0
|
|
if len(s) > 0 {
|
|
size = int(unsafe.Sizeof(s[0]))
|
|
}
|
|
return unsafe.Slice((*byte)(unsafe.Pointer(&s[0])), len(s)*size)
|
|
}
|
|
|
|
func sliceToJSArray[T comparable](arrayType string, s []T) js.Value {
|
|
a := js.Global().Get(arrayType).New(len(s))
|
|
js.CopyBytesToJS(a, sliceToBytes(s))
|
|
runtime.KeepAlive(s)
|
|
return a
|
|
}
|
|
|
|
func int8ToJSArray(s []int8) js.Value {
|
|
return sliceToJSArray("Int8Array", s)
|
|
}
|
|
|
|
func int16ToJSArray(s []int16) js.Value {
|
|
return sliceToJSArray("Int16Array", s)
|
|
}
|
|
|
|
func int32ToJSArray(s []int32) js.Value {
|
|
return sliceToJSArray("Int32Array", s)
|
|
}
|
|
|
|
func int64ToJSArray(s []int64) js.Value {
|
|
return sliceToJSArray("Int64Array", s)
|
|
}
|
|
|
|
func uint8ToJSArray(s []uint8) js.Value {
|
|
return sliceToJSArray("Uint8Array", s)
|
|
}
|
|
|
|
func uint16ToJSArray(s []uint16) js.Value {
|
|
return sliceToJSArray("Uint16Array", s)
|
|
}
|
|
|
|
func uint32ToJSArray(s []uint32) js.Value {
|
|
return sliceToJSArray("Uint32Array", s)
|
|
}
|
|
|
|
func uint64ToJSArray(s []uint64) js.Value {
|
|
return sliceToJSArray("Uint64Array", s)
|
|
}
|
|
|
|
func float32ToJSArray(s []float32) js.Value {
|
|
return sliceToJSArray("Float32Array", s)
|
|
}
|
|
|
|
func float64ToJSArray(s []float64) js.Value {
|
|
return sliceToJSArray("Float64Array", s)
|
|
}
|
|
|
|
func SliceToTypedArray(s any) js.Value {
|
|
if s == nil {
|
|
return js.Null()
|
|
}
|
|
|
|
switch s := s.(type) {
|
|
case []int8:
|
|
return int8ToJSArray(s)
|
|
case []int16:
|
|
return int16ToJSArray(s)
|
|
case []int32:
|
|
return int32ToJSArray(s)
|
|
case []int64:
|
|
return int64ToJSArray(s)
|
|
case []uint8:
|
|
return uint8ToJSArray(s)
|
|
case []uint16:
|
|
return uint16ToJSArray(s)
|
|
case []uint32:
|
|
return uint32ToJSArray(s)
|
|
case []uint64:
|
|
return uint64ToJSArray(s)
|
|
case []float32:
|
|
return float32ToJSArray(s)
|
|
case []float64:
|
|
return float64ToJSArray(s)
|
|
default:
|
|
panic(fmt.Sprintf("jsutil: unexpected value at SliceToTypedArray: %T", s))
|
|
}
|
|
}
|