Reduce depndencies on go-gl/gl

This commit is contained in:
Hajime Hoshi 2014-12-23 04:32:36 +09:00
parent 3e576c97f3
commit 27fe3d9ab8
7 changed files with 72 additions and 43 deletions

View File

@ -17,7 +17,6 @@ limitations under the License.
package ebiten package ebiten
import ( import (
"github.com/go-gl/gl"
"image" "image"
) )
@ -36,23 +35,12 @@ func IsMouseButtonPressed(mouseButton MouseButton) bool {
return currentUI.input.isMouseButtonPressed(mouseButton) return currentUI.input.isMouseButtonPressed(mouseButton)
} }
func glFilter(f Filter) int {
switch f {
case FilterNearest:
return gl.NEAREST
case FilterLinear:
return gl.LINEAR
default:
panic("not reached")
}
}
// NewImage returns an empty image. // NewImage returns an empty image.
func NewImage(width, height int, filter Filter) (*Image, error) { func NewImage(width, height int, filter Filter) (*Image, error) {
return currentUI.newImage(width, height, glFilter(filter)) return currentUI.newImage(width, height, filter)
} }
// NewImageFromImage creates a new image with the given image (img). // NewImageFromImage creates a new image with the given image (img).
func NewImageFromImage(img image.Image, filter Filter) (*Image, error) { func NewImageFromImage(img image.Image, filter Filter) (*Image, error) {
return currentUI.newImageFromImage(img, glFilter(filter)) return currentUI.newImageFromImage(img, filter)
} }

View File

@ -16,6 +16,10 @@ limitations under the License.
package ebiten package ebiten
import (
"github.com/hajimehoshi/ebiten/internal/opengl"
)
// A Rect represents a rectangle. // A Rect represents a rectangle.
type Rect struct { type Rect struct {
X float64 X float64
@ -40,10 +44,10 @@ func DrawWholeImage(target *Image, image *Image, geo GeometryMatrix, color Color
} }
// Filter represents the type of filter to be used when an image is maginified or minified. // Filter represents the type of filter to be used when an image is maginified or minified.
type Filter int type Filter opengl.Filter
// Filters // Filters
const ( const (
FilterNearest Filter = iota FilterNearest = Filter(opengl.FilterNearest)
FilterLinear FilterLinear = Filter(opengl.FilterLinear)
) )

View File

@ -17,7 +17,6 @@ limitations under the License.
package ebiten package ebiten
import ( import (
"github.com/go-gl/gl"
"github.com/hajimehoshi/ebiten/internal/opengl" "github.com/hajimehoshi/ebiten/internal/opengl"
) )
@ -27,11 +26,11 @@ func newGraphicsContext(screenWidth, screenHeight, screenScale int) (*graphicsCo
return nil, err return nil, err
} }
texture, err := opengl.NewTexture(screenWidth, screenHeight, gl.NEAREST) texture, err := opengl.NewTexture(screenWidth, screenHeight, opengl.Filter(FilterNearest))
if err != nil { if err != nil {
return nil, err return nil, err
} }
screen, err := newInnerImage(texture, gl.NEAREST) screen, err := newInnerImage(texture)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -79,6 +78,6 @@ func (c *graphicsContext) postUpdate() error {
return err return err
} }
gl.Flush() opengl.Flush()
return nil return nil
} }

View File

@ -17,7 +17,6 @@ limitations under the License.
package ebiten package ebiten
import ( import (
"github.com/go-gl/gl"
"github.com/hajimehoshi/ebiten/internal" "github.com/hajimehoshi/ebiten/internal"
"github.com/hajimehoshi/ebiten/internal/opengl" "github.com/hajimehoshi/ebiten/internal/opengl"
"github.com/hajimehoshi/ebiten/internal/opengl/internal/shader" "github.com/hajimehoshi/ebiten/internal/opengl/internal/shader"
@ -30,7 +29,7 @@ type innerImage struct {
texture *opengl.Texture texture *opengl.Texture
} }
func newInnerImage(texture *opengl.Texture, filter int) (*innerImage, error) { func newInnerImage(texture *opengl.Texture) (*innerImage, error) {
framebuffer, err := opengl.NewFramebufferFromTexture(texture) framebuffer, err := opengl.NewFramebufferFromTexture(texture)
if err != nil { if err != nil {
return nil, err return nil, err
@ -50,9 +49,8 @@ func (i *innerImage) Fill(clr color.Color) error {
if err := i.framebuffer.SetAsViewport(); err != nil { if err := i.framebuffer.SetAsViewport(); err != nil {
return err return err
} }
rf, gf, bf, af := internal.RGBA(clr) r, g, b, a := internal.RGBA(clr)
gl.ClearColor(gl.GLclampf(rf), gl.GLclampf(gf), gl.GLclampf(bf), gl.GLclampf(af)) opengl.Clear(r, g, b, a)
gl.Clear(gl.COLOR_BUFFER_BIT)
return nil return nil
} }

45
internal/opengl/gl.go Normal file
View File

@ -0,0 +1,45 @@
/*
Copyright 2014 Hajime Hoshi
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.
*/
package opengl
import (
"github.com/go-gl/gl"
)
type Filter int
const (
FilterNearest Filter = gl.NEAREST
FilterLinear = gl.LINEAR
)
func Init() {
gl.Init()
gl.Enable(gl.TEXTURE_2D)
// Textures' pixel formats are alpha premultiplied.
gl.Enable(gl.BLEND)
gl.BlendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)
}
func Clear(r, g, b, a float64) {
gl.ClearColor(gl.GLclampf(r), gl.GLclampf(g), gl.GLclampf(b), gl.GLclampf(a))
gl.Clear(gl.COLOR_BUFFER_BIT)
}
func Flush() {
gl.Flush()
}

View File

@ -61,7 +61,7 @@ func (t *Texture) Size() (width, height int) {
return t.width, t.height return t.width, t.height
} }
func createNativeTexture(textureWidth, textureHeight int, pixels []uint8, filter int) gl.Texture { func createNativeTexture(textureWidth, textureHeight int, pixels []uint8, filter Filter) gl.Texture {
nativeTexture := gl.GenTexture() nativeTexture := gl.GenTexture()
if nativeTexture < 0 { if nativeTexture < 0 {
panic("glGenTexture failed") panic("glGenTexture failed")
@ -70,15 +70,15 @@ func createNativeTexture(textureWidth, textureHeight int, pixels []uint8, filter
nativeTexture.Bind(gl.TEXTURE_2D) nativeTexture.Bind(gl.TEXTURE_2D)
defer gl.Texture(0).Bind(gl.TEXTURE_2D) defer gl.Texture(0).Bind(gl.TEXTURE_2D)
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, int(filter))
gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, int(filter))
gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, textureWidth, textureHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, textureWidth, textureHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
return nativeTexture return nativeTexture
} }
func NewTexture(width, height int, filter int) (*Texture, error) { func NewTexture(width, height int, filter Filter) (*Texture, error) {
w := internal.NextPowerOf2Int(width) w := internal.NextPowerOf2Int(width)
h := internal.NextPowerOf2Int(height) h := internal.NextPowerOf2Int(height)
if w < 4 { if w < 4 {
@ -91,7 +91,7 @@ func NewTexture(width, height int, filter int) (*Texture, error) {
return &Texture{native, width, height}, nil return &Texture{native, width, height}, nil
} }
func NewTextureFromImage(img image.Image, filter int) (*Texture, error) { func NewTextureFromImage(img image.Image, filter Filter) (*Texture, error) {
origSize := img.Bounds().Size() origSize := img.Bounds().Size()
if origSize.X < 4 { if origSize.X < 4 {
return nil, errors.New("width must be equal or more than 4.") return nil, errors.New("width must be equal or more than 4.")

19
ui.go
View File

@ -18,7 +18,6 @@ package ebiten
import ( import (
"fmt" "fmt"
"github.com/go-gl/gl"
glfw "github.com/go-gl/glfw3" glfw "github.com/go-gl/glfw3"
"github.com/hajimehoshi/ebiten/internal/opengl" "github.com/hajimehoshi/ebiten/internal/opengl"
"image" "image"
@ -50,11 +49,7 @@ func init() {
} }
currentUI.run() currentUI.run()
currentUI.use(func() { currentUI.use(func() {
gl.Init() opengl.Init()
gl.Enable(gl.TEXTURE_2D)
// Textures' pixel formats are alpha premultiplied.
gl.Enable(gl.BLEND)
gl.BlendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)
}) })
} }
@ -134,16 +129,16 @@ func (u *ui) draw(f func(*Image) error) (err error) {
return return
} }
func (u *ui) newImageFromImage(img image.Image, filter int) (*Image, error) { func (u *ui) newImageFromImage(img image.Image, filter Filter) (*Image, error) {
var innerImage *innerImage var innerImage *innerImage
var err error var err error
u.use(func() { u.use(func() {
var texture *opengl.Texture var texture *opengl.Texture
texture, err = opengl.NewTextureFromImage(img, filter) texture, err = opengl.NewTextureFromImage(img, opengl.Filter(filter))
if err != nil { if err != nil {
return return
} }
innerImage, err = newInnerImage(texture, filter) innerImage, err = newInnerImage(texture)
}) })
if err != nil { if err != nil {
return nil, err return nil, err
@ -151,16 +146,16 @@ func (u *ui) newImageFromImage(img image.Image, filter int) (*Image, error) {
return &Image{syncer: u, inner: innerImage}, nil return &Image{syncer: u, inner: innerImage}, nil
} }
func (u *ui) newImage(width, height int, filter int) (*Image, error) { func (u *ui) newImage(width, height int, filter Filter) (*Image, error) {
var innerImage *innerImage var innerImage *innerImage
var err error var err error
u.use(func() { u.use(func() {
var texture *opengl.Texture var texture *opengl.Texture
texture, err = opengl.NewTexture(width, height, filter) texture, err = opengl.NewTexture(width, height, opengl.Filter(filter))
if err != nil { if err != nil {
return return
} }
innerImage, err = newInnerImage(texture, filter) innerImage, err = newInnerImage(texture)
innerImage.Clear() innerImage.Clear()
}) })
if err != nil { if err != nil {