mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
internal/graphicscommand: add attributes to images
This commit is contained in:
parent
4fa8265c58
commit
1488e5e685
@ -93,6 +93,8 @@ func (c *drawTrianglesCommand) String() string {
|
|||||||
dst := fmt.Sprintf("%d", c.dst.id)
|
dst := fmt.Sprintf("%d", c.dst.id)
|
||||||
if c.dst.screen {
|
if c.dst.screen {
|
||||||
dst += " (screen)"
|
dst += " (screen)"
|
||||||
|
} else if c.dst.attribute != "" {
|
||||||
|
dst += " (" + c.dst.attribute + ")"
|
||||||
}
|
}
|
||||||
|
|
||||||
var srcstrs [graphics.ShaderSrcImageCount]string
|
var srcstrs [graphics.ShaderSrcImageCount]string
|
||||||
@ -104,6 +106,8 @@ func (c *drawTrianglesCommand) String() string {
|
|||||||
srcstrs[i] = fmt.Sprintf("%d", src.id)
|
srcstrs[i] = fmt.Sprintf("%d", src.id)
|
||||||
if src.screen {
|
if src.screen {
|
||||||
srcstrs[i] += " (screen)"
|
srcstrs[i] += " (screen)"
|
||||||
|
} else if src.attribute != "" {
|
||||||
|
srcstrs[i] += " (" + src.attribute + ")"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,14 +339,19 @@ func (c *disposeShaderCommand) NeedsSync() bool {
|
|||||||
|
|
||||||
// newImageCommand represents a command to create an empty image with given width and height.
|
// newImageCommand represents a command to create an empty image with given width and height.
|
||||||
type newImageCommand struct {
|
type newImageCommand struct {
|
||||||
result *Image
|
result *Image
|
||||||
width int
|
width int
|
||||||
height int
|
height int
|
||||||
screen bool
|
screen bool
|
||||||
|
attribute string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *newImageCommand) String() string {
|
func (c *newImageCommand) String() string {
|
||||||
return fmt.Sprintf("new-image: result: %d, width: %d, height: %d, screen: %t", c.result.id, c.width, c.height, c.screen)
|
str := fmt.Sprintf("new-image: result: %d, width: %d, height: %d, screen: %t", c.result.id, c.width, c.height, c.screen)
|
||||||
|
if c.attribute != "" {
|
||||||
|
str += ", attribute: " + c.attribute
|
||||||
|
}
|
||||||
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exec executes a newImageCommand.
|
// Exec executes a newImageCommand.
|
||||||
|
@ -37,6 +37,9 @@ type Image struct {
|
|||||||
internalHeight int
|
internalHeight int
|
||||||
screen bool
|
screen bool
|
||||||
|
|
||||||
|
// attribute is used only for logs.
|
||||||
|
attribute string
|
||||||
|
|
||||||
// id is an identifier for the image. This is used only when dumping the information.
|
// id is an identifier for the image. This is used only when dumping the information.
|
||||||
//
|
//
|
||||||
// This is duplicated with graphicsdriver.Image's ID, but this id is still necessary because this image might not
|
// This is duplicated with graphicsdriver.Image's ID, but this id is still necessary because this image might not
|
||||||
@ -57,18 +60,20 @@ func genNextImageID() int {
|
|||||||
// NewImage returns a new image.
|
// NewImage returns a new image.
|
||||||
//
|
//
|
||||||
// Note that the image is not initialized yet.
|
// Note that the image is not initialized yet.
|
||||||
func NewImage(width, height int, screenFramebuffer bool) *Image {
|
func NewImage(width, height int, screenFramebuffer bool, attribute string) *Image {
|
||||||
i := &Image{
|
i := &Image{
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
screen: screenFramebuffer,
|
screen: screenFramebuffer,
|
||||||
id: genNextImageID(),
|
id: genNextImageID(),
|
||||||
|
attribute: attribute,
|
||||||
}
|
}
|
||||||
c := &newImageCommand{
|
c := &newImageCommand{
|
||||||
result: i,
|
result: i,
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
screen: screenFramebuffer,
|
screen: screenFramebuffer,
|
||||||
|
attribute: attribute,
|
||||||
}
|
}
|
||||||
theCommandQueueManager.enqueueCommand(c)
|
theCommandQueueManager.enqueueCommand(c)
|
||||||
return i
|
return i
|
||||||
|
@ -50,8 +50,8 @@ func quadVertices(w, h float32) []float32 {
|
|||||||
|
|
||||||
func TestClear(t *testing.T) {
|
func TestClear(t *testing.T) {
|
||||||
const w, h = 1024, 1024
|
const w, h = 1024, 1024
|
||||||
src := graphicscommand.NewImage(w/2, h/2, false)
|
src := graphicscommand.NewImage(w/2, h/2, false, "")
|
||||||
dst := graphicscommand.NewImage(w, h, false)
|
dst := graphicscommand.NewImage(w, h, false, "")
|
||||||
|
|
||||||
vs := quadVertices(w/2, h/2)
|
vs := quadVertices(w/2, h/2)
|
||||||
is := graphics.QuadIndices()
|
is := graphics.QuadIndices()
|
||||||
@ -81,9 +81,9 @@ func TestClear(t *testing.T) {
|
|||||||
|
|
||||||
func TestWritePixelsPartAfterDrawTriangles(t *testing.T) {
|
func TestWritePixelsPartAfterDrawTriangles(t *testing.T) {
|
||||||
const w, h = 32, 32
|
const w, h = 32, 32
|
||||||
clr := graphicscommand.NewImage(w, h, false)
|
clr := graphicscommand.NewImage(w, h, false, "")
|
||||||
src := graphicscommand.NewImage(w/2, h/2, false)
|
src := graphicscommand.NewImage(w/2, h/2, false, "")
|
||||||
dst := graphicscommand.NewImage(w, h, false)
|
dst := graphicscommand.NewImage(w, h, false, "")
|
||||||
vs := quadVertices(w/2, h/2)
|
vs := quadVertices(w/2, h/2)
|
||||||
is := graphics.QuadIndices()
|
is := graphics.QuadIndices()
|
||||||
dr := image.Rect(0, 0, w, h)
|
dr := image.Rect(0, 0, w, h)
|
||||||
@ -101,8 +101,8 @@ func TestWritePixelsPartAfterDrawTriangles(t *testing.T) {
|
|||||||
|
|
||||||
func TestShader(t *testing.T) {
|
func TestShader(t *testing.T) {
|
||||||
const w, h = 16, 16
|
const w, h = 16, 16
|
||||||
clr := graphicscommand.NewImage(w, h, false)
|
clr := graphicscommand.NewImage(w, h, false, "")
|
||||||
dst := graphicscommand.NewImage(w, h, false)
|
dst := graphicscommand.NewImage(w, h, false, "")
|
||||||
vs := quadVertices(w, h)
|
vs := quadVertices(w, h)
|
||||||
is := graphics.QuadIndices()
|
is := graphics.QuadIndices()
|
||||||
dr := image.Rect(0, 0, w, h)
|
dr := image.Rect(0, 0, w, h)
|
||||||
@ -136,7 +136,7 @@ func TestShader(t *testing.T) {
|
|||||||
// Issue #3036
|
// Issue #3036
|
||||||
func TestSuccessiveWritePixels(t *testing.T) {
|
func TestSuccessiveWritePixels(t *testing.T) {
|
||||||
const w, h = 32, 32
|
const w, h = 32, 32
|
||||||
dst := graphicscommand.NewImage(w, h, false)
|
dst := graphicscommand.NewImage(w, h, false, "")
|
||||||
|
|
||||||
dst.WritePixels(graphics.NewManagedBytes(4, func(bs []byte) {
|
dst.WritePixels(graphics.NewManagedBytes(4, func(bs []byte) {
|
||||||
for i := range bs {
|
for i := range bs {
|
||||||
|
@ -156,8 +156,13 @@ func NewImage(width, height int, imageType ImageType) *Image {
|
|||||||
panic("restorable: graphics driver must be ready at NewImage but not")
|
panic("restorable: graphics driver must be ready at NewImage but not")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var attribute string
|
||||||
|
switch imageType {
|
||||||
|
case ImageTypeVolatile:
|
||||||
|
attribute = "volatile"
|
||||||
|
}
|
||||||
i := &Image{
|
i := &Image{
|
||||||
image: graphicscommand.NewImage(width, height, imageType == ImageTypeScreen),
|
image: graphicscommand.NewImage(width, height, imageType == ImageTypeScreen, attribute),
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
imageType: imageType,
|
imageType: imageType,
|
||||||
@ -566,7 +571,7 @@ func (i *Image) restore(graphicsDriver graphicsdriver.Graphics) error {
|
|||||||
case ImageTypeScreen:
|
case ImageTypeScreen:
|
||||||
// The screen image should also be recreated because framebuffer might
|
// The screen image should also be recreated because framebuffer might
|
||||||
// be changed.
|
// be changed.
|
||||||
i.image = graphicscommand.NewImage(w, h, true)
|
i.image = graphicscommand.NewImage(w, h, true, "")
|
||||||
i.basePixels.Dispose()
|
i.basePixels.Dispose()
|
||||||
i.basePixels = Pixels{}
|
i.basePixels = Pixels{}
|
||||||
i.clearDrawTrianglesHistory()
|
i.clearDrawTrianglesHistory()
|
||||||
@ -574,7 +579,7 @@ func (i *Image) restore(graphicsDriver graphicsdriver.Graphics) error {
|
|||||||
i.staleRegions = i.staleRegions[:0]
|
i.staleRegions = i.staleRegions[:0]
|
||||||
return nil
|
return nil
|
||||||
case ImageTypeVolatile:
|
case ImageTypeVolatile:
|
||||||
i.image = graphicscommand.NewImage(w, h, false)
|
i.image = graphicscommand.NewImage(w, h, false, "volatile")
|
||||||
iw, ih := i.image.InternalSize()
|
iw, ih := i.image.InternalSize()
|
||||||
clearImage(i.image, image.Rect(0, 0, iw, ih))
|
clearImage(i.image, image.Rect(0, 0, iw, ih))
|
||||||
return nil
|
return nil
|
||||||
@ -584,7 +589,7 @@ func (i *Image) restore(graphicsDriver graphicsdriver.Graphics) error {
|
|||||||
panic("restorable: pixels must not be stale when restoring")
|
panic("restorable: pixels must not be stale when restoring")
|
||||||
}
|
}
|
||||||
|
|
||||||
gimg := graphicscommand.NewImage(w, h, false)
|
gimg := graphicscommand.NewImage(w, h, false, "")
|
||||||
// Clear the image explicitly.
|
// Clear the image explicitly.
|
||||||
iw, ih := gimg.InternalSize()
|
iw, ih := gimg.InternalSize()
|
||||||
clearImage(gimg, image.Rect(0, 0, iw, ih))
|
clearImage(gimg, image.Rect(0, 0, iw, ih))
|
||||||
|
Loading…
Reference in New Issue
Block a user