Remove support of Go 1.13 and Go 1.14

Updates #1258
Updates #1415
Updates #1462
This commit is contained in:
Hajime Hoshi 2021-06-07 21:43:25 +09:00
parent 4276e2964e
commit a627c41217
7 changed files with 30 additions and 83 deletions

View File

@ -7,7 +7,7 @@ jobs:
strategy: strategy:
matrix: matrix:
os: [ubuntu-latest, macos-latest, windows-latest] os: [ubuntu-latest, macos-latest, windows-latest]
go: ['1.13.15', '1.14.15', '1.15.13', '1.16.5'] go: ['1.15.13', '1.16.5']
name: Test with Go ${{ matrix.go }} on ${{ matrix.os }} name: Test with Go ${{ matrix.go }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
env: env:

View File

@ -24,7 +24,6 @@ import (
"unsafe" "unsafe"
"github.com/hajimehoshi/ebiten/v2/audio/internal/go2cpp" "github.com/hajimehoshi/ebiten/v2/audio/internal/go2cpp"
"github.com/hajimehoshi/ebiten/v2/internal/jsutil"
) )
func IsAvailable() bool { func IsAvailable() bool {
@ -206,7 +205,7 @@ func (p *player) appendBufferImpl(audioBuffer js.Value) {
// appendBuffer is called as the 'ended' callback of a buffer. // appendBuffer is called as the 'ended' callback of a buffer.
// 'this' is an AudioBufferSourceNode that already finishes its playing. // 'this' is an AudioBufferSourceNode that already finishes its playing.
for i, n := range p.bufferSourceNodes { for i, n := range p.bufferSourceNodes {
if jsutil.Equal(n, audioBuffer) { if n.Equal(audioBuffer) {
p.bufferSourceNodes = append(p.bufferSourceNodes[:i], p.bufferSourceNodes[i+1:]...) p.bufferSourceNodes = append(p.bufferSourceNodes[:i], p.bufferSourceNodes[i+1:]...)
break break
} }

View File

@ -42,27 +42,27 @@ type (
) )
func (t textureNative) equal(rhs textureNative) bool { func (t textureNative) equal(rhs textureNative) bool {
return jsutil.Equal(js.Value(t), js.Value(rhs)) return js.Value(t).Equal(js.Value(rhs))
} }
func (f framebufferNative) equal(rhs framebufferNative) bool { func (f framebufferNative) equal(rhs framebufferNative) bool {
return jsutil.Equal(js.Value(f), js.Value(rhs)) return js.Value(f).Equal(js.Value(rhs))
} }
func (s shader) equal(rhs shader) bool { func (s shader) equal(rhs shader) bool {
return jsutil.Equal(js.Value(s), js.Value(rhs)) return js.Value(s).Equal(js.Value(rhs))
} }
func (b buffer) equal(rhs buffer) bool { func (b buffer) equal(rhs buffer) bool {
return jsutil.Equal(js.Value(b), js.Value(rhs)) return js.Value(b).Equal(js.Value(rhs))
} }
func (u uniformLocation) equal(rhs uniformLocation) bool { func (u uniformLocation) equal(rhs uniformLocation) bool {
return jsutil.Equal(js.Value(u), js.Value(rhs)) return js.Value(u).Equal(js.Value(rhs))
} }
func (p program) equal(rhs program) bool { func (p program) equal(rhs program) bool {
return jsutil.Equal(p.value, rhs.value) && p.id == rhs.id return p.value.Equal(rhs.value) && p.id == rhs.id
} }
var InvalidTexture = textureNative(js.Null()) var InvalidTexture = textureNative(js.Null())
@ -107,9 +107,9 @@ func (c *context) initGL() {
gl = canvas.Call("getContext", "webgl2", attr) gl = canvas.Call("getContext", "webgl2", attr)
} else { } else {
gl = canvas.Call("getContext", "webgl", attr) gl = canvas.Call("getContext", "webgl", attr)
if jsutil.Equal(gl, js.Null()) { if !gl.Truthy() {
gl = canvas.Call("getContext", "experimental-webgl", attr) gl = canvas.Call("getContext", "experimental-webgl", attr)
if jsutil.Equal(gl, js.Null()) { if !gl.Truthy() {
panic("opengl: getContext failed") panic("opengl: getContext failed")
} }
} }
@ -166,7 +166,7 @@ func (c *context) scissor(x, y, width, height int) {
func (c *context) newTexture(width, height int) (textureNative, error) { func (c *context) newTexture(width, height int) (textureNative, error) {
gl := c.gl gl := c.gl
t := gl.createTexture.Invoke() t := gl.createTexture.Invoke()
if jsutil.Equal(t, js.Null()) { if !t.Truthy() {
return textureNative(js.Null()), errors.New("opengl: glGenTexture failed") return textureNative(js.Null()), errors.New("opengl: glGenTexture failed")
} }
gl.pixelStorei.Invoke(gles.UNPACK_ALIGNMENT, 4) gl.pixelStorei.Invoke(gles.UNPACK_ALIGNMENT, 4)
@ -287,7 +287,7 @@ func (c *context) newFragmentShader(source string) (shader, error) {
func (c *context) newShader(shaderType int, source string) (shader, error) { func (c *context) newShader(shaderType int, source string) (shader, error) {
gl := c.gl gl := c.gl
s := gl.createShader.Invoke(int(shaderType)) s := gl.createShader.Invoke(int(shaderType))
if jsutil.Equal(s, js.Null()) { if !s.Truthy() {
return shader(js.Null()), fmt.Errorf("opengl: glCreateShader failed: shader type: %d", shaderType) return shader(js.Null()), fmt.Errorf("opengl: glCreateShader failed: shader type: %d", shaderType)
} }
@ -309,7 +309,7 @@ func (c *context) deleteShader(s shader) {
func (c *context) newProgram(shaders []shader, attributes []string) (program, error) { func (c *context) newProgram(shaders []shader, attributes []string) (program, error) {
gl := c.gl gl := c.gl
v := gl.createProgram.Invoke() v := gl.createProgram.Invoke()
if jsutil.Equal(v, js.Null()) { if !v.Truthy() {
return program{}, errors.New("opengl: glCreateProgram failed") return program{}, errors.New("opengl: glCreateProgram failed")
} }

View File

@ -1,25 +0,0 @@
// Copyright 2019 The Ebiten Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build !go1.14
package jsutil
import (
"syscall/js"
)
func Equal(a, b js.Value) bool {
return a == b
}

View File

@ -1,25 +0,0 @@
// Copyright 2019 The Ebiten Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build go1.14
package jsutil
import (
"syscall/js"
)
func Equal(a, b js.Value) bool {
return a.Equal(b)
}

View File

@ -20,7 +20,6 @@ import (
"unicode" "unicode"
"github.com/hajimehoshi/ebiten/v2/internal/driver" "github.com/hajimehoshi/ebiten/v2/internal/driver"
"github.com/hajimehoshi/ebiten/v2/internal/jsutil"
) )
var ( var (
@ -48,7 +47,7 @@ func jsKeyToID(key js.Value) int {
// js.Value cannot be used as a map key. // js.Value cannot be used as a map key.
// As the number of keys is around 100, just a dumb loop should work. // As the number of keys is around 100, just a dumb loop should work.
for i, k := range jsKeys { for i, k := range jsKeys {
if jsutil.Equal(k, key) { if k.Equal(key) {
return i return i
} }
} }
@ -343,7 +342,7 @@ func (i *Input) updateFromEvent(e js.Value) {
// Avoid using js.Value.String() as String creates a Uint8Array via a TextEncoder and causes a heavy // Avoid using js.Value.String() as String creates a Uint8Array via a TextEncoder and causes a heavy
// overhead (#1437). // overhead (#1437).
switch t := e.Get("type"); { switch t := e.Get("type"); {
case jsutil.Equal(t, stringKeydown): case t.Equal(stringKeydown):
c := e.Get("code") c := e.Get("code")
if c.Type() != js.TypeString { if c.Type() != js.TypeString {
code := e.Get("keyCode").Int() code := e.Get("keyCode").Int()
@ -358,20 +357,20 @@ func (i *Input) updateFromEvent(e js.Value) {
i.keyDownEdge(code) i.keyDownEdge(code)
return return
} }
if jsutil.Equal(c, driverKeyToJSKey[driver.KeyArrowUp]) || if c.Equal(driverKeyToJSKey[driver.KeyArrowUp]) ||
jsutil.Equal(c, driverKeyToJSKey[driver.KeyArrowDown]) || c.Equal(driverKeyToJSKey[driver.KeyArrowDown]) ||
jsutil.Equal(c, driverKeyToJSKey[driver.KeyArrowLeft]) || c.Equal(driverKeyToJSKey[driver.KeyArrowLeft]) ||
jsutil.Equal(c, driverKeyToJSKey[driver.KeyArrowRight]) || c.Equal(driverKeyToJSKey[driver.KeyArrowRight]) ||
jsutil.Equal(c, driverKeyToJSKey[driver.KeyBackspace]) || c.Equal(driverKeyToJSKey[driver.KeyBackspace]) ||
jsutil.Equal(c, driverKeyToJSKey[driver.KeyTab]) { c.Equal(driverKeyToJSKey[driver.KeyTab]) {
e.Call("preventDefault") e.Call("preventDefault")
} }
i.keyDown(c) i.keyDown(c)
case jsutil.Equal(t, stringKeypress): case t.Equal(stringKeypress):
if r := rune(e.Get("charCode").Int()); unicode.IsPrint(r) { if r := rune(e.Get("charCode").Int()); unicode.IsPrint(r) {
i.runeBuffer = append(i.runeBuffer, r) i.runeBuffer = append(i.runeBuffer, r)
} }
case jsutil.Equal(t, stringKeyup): case t.Equal(stringKeyup):
if e.Get("code").Type() != js.TypeString { if e.Get("code").Type() != js.TypeString {
// Assume that UA is Edge. // Assume that UA is Edge.
code := e.Get("keyCode").Int() code := e.Get("keyCode").Int()
@ -379,21 +378,21 @@ func (i *Input) updateFromEvent(e js.Value) {
return return
} }
i.keyUp(e.Get("code")) i.keyUp(e.Get("code"))
case jsutil.Equal(t, stringMousedown): case t.Equal(stringMousedown):
button := e.Get("button").Int() button := e.Get("button").Int()
i.mouseDown(button) i.mouseDown(button)
i.setMouseCursorFromEvent(e) i.setMouseCursorFromEvent(e)
case jsutil.Equal(t, stringMouseup): case t.Equal(stringMouseup):
button := e.Get("button").Int() button := e.Get("button").Int()
i.mouseUp(button) i.mouseUp(button)
i.setMouseCursorFromEvent(e) i.setMouseCursorFromEvent(e)
case jsutil.Equal(t, stringMousemove): case t.Equal(stringMousemove):
i.setMouseCursorFromEvent(e) i.setMouseCursorFromEvent(e)
case jsutil.Equal(t, stringWheel): case t.Equal(stringWheel):
// TODO: What if e.deltaMode is not DOM_DELTA_PIXEL? // TODO: What if e.deltaMode is not DOM_DELTA_PIXEL?
i.wheelX = -e.Get("deltaX").Float() i.wheelX = -e.Get("deltaX").Float()
i.wheelY = -e.Get("deltaY").Float() i.wheelY = -e.Get("deltaY").Float()
case jsutil.Equal(t, stringTouchstart) || jsutil.Equal(t, stringTouchend) || jsutil.Equal(t, stringTouchmove): case t.Equal(stringTouchstart) || t.Equal(stringTouchend) || t.Equal(stringTouchmove):
i.updateTouchesFromEvent(e) i.updateTouchesFromEvent(e)
} }
} }

View File

@ -22,7 +22,6 @@ import (
"github.com/hajimehoshi/ebiten/v2/internal/driver" "github.com/hajimehoshi/ebiten/v2/internal/driver"
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/opengl" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/opengl"
"github.com/hajimehoshi/ebiten/v2/internal/hooks" "github.com/hajimehoshi/ebiten/v2/internal/hooks"
"github.com/hajimehoshi/ebiten/v2/internal/jsutil"
"github.com/hajimehoshi/ebiten/v2/internal/restorable" "github.com/hajimehoshi/ebiten/v2/internal/restorable"
) )
@ -560,7 +559,7 @@ func (u *UserInterface) Run(context driver.UIContext) error {
if u.initFocused && window.Truthy() { if u.initFocused && window.Truthy() {
// Do not focus the canvas when the current document is in an iframe. // Do not focus the canvas when the current document is in an iframe.
// Otherwise, the parent page tries to focus the iframe on every loading, which is annoying (#1373). // Otherwise, the parent page tries to focus the iframe on every loading, which is annoying (#1373).
isInIframe := !jsutil.Equal(window.Get("location"), window.Get("parent").Get("location")) isInIframe := !window.Get("location").Equal(window.Get("parent").Get("location"))
if !isInIframe { if !isInIframe {
canvas.Call("focus") canvas.Call("focus")
} }
@ -602,7 +601,7 @@ func (u *UserInterface) SetScreenTransparent(transparent bool) {
func (u *UserInterface) IsScreenTransparent() bool { func (u *UserInterface) IsScreenTransparent() bool {
bodyStyle := document.Get("body").Get("style") bodyStyle := document.Get("body").Get("style")
return jsutil.Equal(bodyStyle.Get("backgroundColor"), stringTransparent) return bodyStyle.Get("backgroundColor").Equal(stringTransparent)
} }
func (u *UserInterface) ResetForFrame() { func (u *UserInterface) ResetForFrame() {