-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
61 lines (45 loc) · 1.75 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package main // mainでないとダメそう, TODO: 調査する
import (
"strconv"
"syscall/js"
"github.com/shilfol/generate-natural-harmony/pkg/nh"
)
func main() {
document := js.Global().Get("document")
cb := func(this js.Value, arg []js.Value) interface{} {
// 読み書きを行うcanvasとcontextの取得
outputCanvas := document.Call("getElementById", "outputNaturalHarmony")
ctx := outputCanvas.Call("getContext", "2d")
cvWidth := outputCanvas.Get("width")
cvHeight := outputCanvas.Get("height")
if cvHeight.Int() == 0 || cvWidth.Int() == 0 {
return "canvas is empty"
}
// canvasのbyte列をuint8の形で読み込む
data := ctx.Call("getImageData", 0, 0, cvWidth, cvHeight).Get("data")
uarr := js.Global().Get("Uint8ClampedArray").New(data)
garr := make([]byte, data.Get("length").Int())
// Go空間に読み込む
_ = js.CopyBytesToGo(garr, uarr)
// rangeの値からパラメータ取得
rv := document.Call("getElementById", "range")
p, _ := strconv.ParseFloat(rv.Get("value").String(), 64)
nhp := nh.NaturalHarmonyParam{
P: 0.8 * p, // TODO: 適切な値にする
}
// ナチュラルハーモニーする
nh.ConvertNaturalHarmonyFromBytes(garr, cvWidth.Int(), cvHeight.Int(), &nhp)
// objectを再利用してjs空間に戻す
_ = js.CopyBytesToJS(uarr, garr)
// canvasに書き戻す
imageData := js.Global().Get("ImageData").New(uarr, cvWidth, cvHeight)
ctx.Call("putImageData", imageData, 0, 0)
println("enjoy Natural Harmony!")
return "wasm value"
}
// rangeの変更に追従するcbとして登録
inputElement := document.Call("getElementById", "range")
inputElement.Call("addEventListener", "change", js.FuncOf(cb))
// listenerに登録した関数を終了させない
select {}
}