hudly/app/app.go

108 lines
2.5 KiB
Go
Raw Normal View History

2024-10-22 18:49:14 -06:00
package main
2024-10-25 22:20:55 -06:00
import (
"github.com/haleyrom/skia-go"
"image/color"
"log"
"runtime"
"github.com/go-gl/gl/v3.3-core/gl"
"github.com/go-gl/glfw/v3.3/glfw"
)
func init() {
// GLFW event handling must run on the main OS thread
runtime.LockOSThread()
}
func main() {
// Initialize GLFW
if err := glfw.Init(); err != nil {
log.Fatalf("failed to initialize GLFW: %v", err)
}
defer glfw.Terminate()
// Create GLFW window
glfw.WindowHint(glfw.ContextVersionMajor, 3)
glfw.WindowHint(glfw.ContextVersionMinor, 3)
glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True)
window, err := glfw.CreateWindow(800, 600, "GLFW + Skia Demo", nil, nil)
if err != nil {
log.Fatalf("failed to create GLFW window: %v", err)
}
window.MakeContextCurrent()
// Initialize OpenGL
if err := gl.Init(); err != nil {
log.Fatalf("failed to initialize OpenGL: %v", err)
}
// Set up Skia surface
glInterface := skia.NewNativeGrGlinterface()
if glInterface == nil {
log.Fatalf("failed to create Skia OpenGL interface")
}
grContext := skia.NewGLGrContext(glInterface)
if grContext == nil {
log.Fatalf("failed to create Skia GrContext")
}
// Get framebuffer info
var framebufferInfo skia.GrGlFramebufferinfo
var fboID int32
gl.GetIntegerv(gl.FRAMEBUFFER_BINDING, &fboID)
framebufferInfo.FFBOID = uint32(fboID)
framebufferInfo.FFormat = gl.RGBA8
width, height := window.GetSize()
renderTarget := skia.NewGlGrBackendrendertarget(int32(width), int32(height), 1, 8, &framebufferInfo)
if renderTarget == nil {
log.Fatalf("failed to create Skia render target")
}
surface := skia.NewSurfaceBackendRenderTarget(grContext, renderTarget, skia.GR_SURFACE_ORIGIN_BOTTOM_LEFT, skia.SK_COLORTYPE_RGBA_8888, nil, nil)
if surface == nil {
log.Fatalf("failed to create Skia surface")
}
defer surface.Unref()
c := color.RGBA{R: 255, G: 100, B: 50, A: 255}
f := skia.NewColor4f(c)
colorWhite := f.ToColor()
for !window.ShouldClose() {
gl.ClearColor(0.3, 0.3, 0.3, 1.0)
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
canvas := surface.GetCanvas()
paint := skia.NewPaint()
paint.SetColor(0xffff0000)
// Clear the canvas with white color
canvas.Clear(colorWhite)
// Create a rectangle and draw it
rect := skia.Rect{
Left: 100,
Top: 100,
Right: 300,
Bottom: 300,
}
canvas.DrawRect(&rect, paint)
grContext.Flush()
// Swap OpenGL buffers
window.SwapBuffers()
// Poll for GLFW events
glfw.PollEvents()
}
// Cleanup
surface.Unref()
grContext.Unref()
}