From 2a7caf7755eb76719beeed986bb14ab40e8282a2 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 4 Nov 2018 19:06:13 +0900 Subject: [PATCH] opengl: Move ensureFramebuffer to opengl.Image --- internal/graphicscommand/command.go | 18 ++++------- internal/graphicscommand/image.go | 14 --------- internal/opengl/context.go | 2 +- internal/opengl/framebuffer.go | 6 ++-- internal/opengl/image.go | 46 ++++++++++++++++++++++++++++- 5 files changed, 54 insertions(+), 32 deletions(-) diff --git a/internal/graphicscommand/command.go b/internal/graphicscommand/command.go index 76f2148c5..45be7da50 100644 --- a/internal/graphicscommand/command.go +++ b/internal/graphicscommand/command.go @@ -228,21 +228,18 @@ func (c *drawImageCommand) String() string { // Exec executes the drawImageCommand. func (c *drawImageCommand) Exec(indexOffsetInBytes int) error { - f, err := c.dst.ensureFramebuffer() - if err != nil { - return err - } - // On some environments, viewport size must be within the framebuffer size. // e.g. Edge (#71), Chrome on GPD Pocket (#420), macOS Mojave (#691). // Use the same size of the framebuffer here. - opengl.GetContext().SetViewport(f) + if err := c.dst.image.SetViewport(); err != nil { + return err + } opengl.GetContext().BlendFunc(c.mode) if c.nindices == 0 { return nil } - proj := f.ProjectionMatrix() + proj := c.dst.image.ProjectionMatrix() dw, dh := c.dst.Size() sw, sh := c.src.Size() opengl.UseProgram(proj, c.src.image, dw, dh, sw, sh, c.color, c.filter) @@ -340,12 +337,7 @@ type pixelsCommand struct { // Exec executes a pixelsCommand. func (c *pixelsCommand) Exec(indexOffsetInBytes int) error { - f, err := c.img.ensureFramebuffer() - if err != nil { - return err - } - w, h := c.img.Size() - p, err := opengl.GetContext().FramebufferPixels(f, w, h) + p, err := c.img.image.Pixels() if err != nil { return err } diff --git a/internal/graphicscommand/image.go b/internal/graphicscommand/image.go index 1b33aaa13..f53672866 100644 --- a/internal/graphicscommand/image.go +++ b/internal/graphicscommand/image.go @@ -17,7 +17,6 @@ package graphicscommand import ( "github.com/hajimehoshi/ebiten/internal/affine" "github.com/hajimehoshi/ebiten/internal/graphics" - "github.com/hajimehoshi/ebiten/internal/math" "github.com/hajimehoshi/ebiten/internal/opengl" ) @@ -115,16 +114,3 @@ func (i *Image) ReplacePixels(p []byte, x, y, width, height int) { func (i *Image) IsInvalidated() bool { return i.image.IsInvalidated() } - -func (i *Image) ensureFramebuffer() (*opengl.Framebuffer, error) { - if i.image.Framebuffer != nil { - return i.image.Framebuffer, nil - } - w, h := i.image.Size() - f, err := opengl.NewFramebufferFromTexture(i.image.Texture, math.NextPowerOf2Int(w), math.NextPowerOf2Int(h)) - if err != nil { - return nil, err - } - i.image.Framebuffer = f - return i.image.Framebuffer, nil -} diff --git a/internal/opengl/context.go b/internal/opengl/context.go index 7afb3c2f0..e0f66d295 100644 --- a/internal/opengl/context.go +++ b/internal/opengl/context.go @@ -96,7 +96,7 @@ func (c *Context) bindFramebuffer(f framebufferNative) { c.lastFramebuffer = f } -func (c *Context) SetViewport(f *Framebuffer) { +func (c *Context) setViewport(f *Framebuffer) { c.bindFramebuffer(f.native) if c.lastViewportWidth != f.width || c.lastViewportHeight != f.height { c.setViewportImpl(f.width, f.height) diff --git a/internal/opengl/framebuffer.go b/internal/opengl/framebuffer.go index e4dd06670..66abf2996 100644 --- a/internal/opengl/framebuffer.go +++ b/internal/opengl/framebuffer.go @@ -46,12 +46,12 @@ func NewScreenFramebuffer(width, height int) *Framebuffer { } } -// ProjectionMatrix returns a projection matrix of the framebuffer. +// projectionMatrix returns a projection matrix of the framebuffer. // // A projection matrix converts the coodinates on the framebuffer // (0, 0) - (viewport width, viewport height) // to the normalized device coodinates (-1, -1) - (1, 1) with adjustment. -func (f *Framebuffer) ProjectionMatrix() []float32 { +func (f *Framebuffer) projectionMatrix() []float32 { if f.proMatrix != nil { return f.proMatrix } @@ -59,7 +59,7 @@ func (f *Framebuffer) ProjectionMatrix() []float32 { return f.proMatrix } -func (f *Framebuffer) Delete() { +func (f *Framebuffer) delete() { if f.native != theContext.getScreenFramebuffer() { theContext.deleteFramebuffer(f.native) } diff --git a/internal/opengl/image.go b/internal/opengl/image.go index a3601f2f2..a68b0fc99 100644 --- a/internal/opengl/image.go +++ b/internal/opengl/image.go @@ -14,6 +14,10 @@ package opengl +import ( + "github.com/hajimehoshi/ebiten/internal/math" +) + type Image struct { Texture Texture Framebuffer *Framebuffer @@ -38,9 +42,49 @@ func (i *Image) IsInvalidated() bool { func (i *Image) Delete() { if i.Framebuffer != nil { - i.Framebuffer.Delete() + i.Framebuffer.delete() } if i.Texture != *new(Texture) { theContext.deleteTexture(i.Texture) } } + +func (i *Image) SetViewport() error { + if err := i.ensureFramebuffer(); err != nil { + return err + } + theContext.setViewport(i.Framebuffer) + return nil +} + +func (i *Image) Pixels() ([]byte, error) { + if err := i.ensureFramebuffer(); err != nil { + return nil, err + } + w, h := i.Size() + p, err := theContext.FramebufferPixels(i.Framebuffer, w, h) + if err != nil { + return nil, err + } + return p, nil +} + +func (i *Image) ProjectionMatrix() []float32 { + if i.Framebuffer == nil { + panic("not reached") + } + return i.Framebuffer.projectionMatrix() +} + +func (i *Image) ensureFramebuffer() error { + if i.Framebuffer != nil { + return nil + } + w, h := i.Size() + f, err := NewFramebufferFromTexture(i.Texture, math.NextPowerOf2Int(w), math.NextPowerOf2Int(h)) + if err != nil { + return err + } + i.Framebuffer = f + return nil +}