Skip to content

Instantly share code, notes, and snippets.

@acsellers
Last active May 15, 2018 20:14
Show Gist options
  • Save acsellers/5c7fecd1eb75dec6f04219422b6d54a4 to your computer and use it in GitHub Desktop.
Save acsellers/5c7fecd1eb75dec6f04219422b6d54a4 to your computer and use it in GitHub Desktop.
SDL Surface from image.RGBA
package main
import (
"image"
"image/png"
"log"
"os"
"time"
"unsafe"
"github.com/veandco/go-sdl2/sdl"
)
func main() {
sdl.Init(sdl.INIT_EVERYTHING)
window, render, err := sdl.CreateWindowAndRenderer(1024, 768, sdl.WINDOW_SHOWN)
if err != nil {
log.Fatal(err)
}
f, err := os.Open("rocket.png")
if err != nil {
log.Fatal(err)
}
img, err := png.Decode(f)
if err != nil {
log.Fatal(err)
}
ir, ok := img.(*image.RGBA)
if !ok {
log.Fatal("Not RGBA")
}
width := int32(ir.Bounds().Dx())
height := int32(ir.Bounds().Dy())
surf, err := sdl.CreateRGBSurfaceWithFormatFrom(
unsafe.Pointer(&ir.Pix[0]),
width,
height,
32,
int32(ir.Bounds().Dx()*4),
// this has confused me in the past, must be ABGR, at least on Intel 64 bit
sdl.PIXELFORMAT_ABGR8888,
)
if err != nil {
log.Fatal(err)
}
tex, err := render.CreateTextureFromSurface(surf)
if err != nil {
log.Fatal(err)
}
t := time.Tick(16 * time.Millisecond)
window.Show()
y := 768 - height/2
for {
<-t
render.Copy(
tex,
&sdl.Rect{0, 0, width, height},
&sdl.Rect{1024/2, y, width/2, height/2},
)
y = y - 5
if y <= 0-height/2 {
return
}
render.Present()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment