GithubHelp home page GithubHelp logo

nanovgo's Introduction

NanoVGo

Pure golang implementation of NanoVG. NanoVG is a vector graphics engine inspired by HTML5 Canvas API.

DEMO

API Reference

See GoDoc

Porting Memo

  • Root folder .go files

    Ported from NanoVG.

  • fontstashmini/fontstash_mini.go

    Ported from fontstash. It includes only needed functions.

  • fontstashmini/truetype

    Copy from https://github.com/TheOnly92/fontstash.go (Public Domain)

License

zlib license

Original (NanoVG) Author

Author

Contribution

  • Moriyoshi Koizumi
  • @hnakamur2
  • @mattn_jp
  • @hagat
  • @h_doxas
  • FSX

nanovgo's People

Contributors

shibukawa avatar takuan-osho avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nanovgo's Issues

Creating multiple windows with separate contexts

Hi,

Thanks for this great library!

I'd like to have two different windows with different stuff drawn on them. I'm struggling with this. Is there a small example of how to handle multiple windows/multiple contexts?

Here's what I'm trying to do looks like in pure OpenGL:


foreach w in windows:
    foreach ctx in w.contexts:
        ctx.make_current(w)
        do_opengl_stuff()
        glFlush()

It's not clear how to define multiple contexts. I assume NewContext() uses current current context, so I tried

w1, _ := glfw.CreateWindow(...)
ctx1, _ := nanovgo.NewContext()

w2, _ := glfw.CreateWindow(...)
ctx2, _ := nanovgo.NewContext()

for {
        for i := 0; i < len(windows); i++ {
                windows[i].MakeContextCurrent()
                gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT
                gl.ClearColor(255, 255, 255, 255)

                ctx[i].BeginFrame(...)
                drawText(ctx[i], "HELLO")
                ctx[i].EndFrame()

                windows[i].SwapBuffers()
        }
        glfw.WaitEvents()
}

But it didn't work. The text is drawn only in the first window.

Thanks

Opengl 3.2?

Hi, is this library on compatible with opengl 3.2?

I get this error when trying to set the opengl version other then 2.1

fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x0]

runtime stack:
runtime.throw(0x419f76c, 0x2a)
        /usr/local/Cellar/go/1.10.3/libexec/src/runtime/panic.go:616 +0x81
runtime.sigpanic()
        /usr/local/Cellar/go/1.10.3/libexec/src/runtime/signal_unix.go:372 +0x28e

goroutine 1 [syscall, locked to thread]:
runtime.cgocall(0x4110b60, 0xc420055b60, 0x0)
        /usr/local/Cellar/go/1.10.3/libexec/src/runtime/cgocall.go:128 +0x64 fp=0xc420055b30 sp=0xc420055af8 pc=0x4003d24
github.com/go-gl/gl/v2.1/gl._Cfunc_glowCreateProgram(0x0, 0x0)
        _cgo_gotypes.go:11517 +0x49 fp=0xc420055b60 sp=0xc420055b30 pc=0x40c37a9
github.com/go-gl/gl/v2.1/gl.CreateProgram(0x20)
        /Users/henrique/go/src/github.com/go-gl/gl/v2.1/gl/package.go:19927 +0x2d fp=0xc420055b80 sp=0xc420055b60 pc=0x40c6b5d
github.com/goxjs/gl.CreateProgram(0xc420055bf0)
        /Users/henrique/go/src/github.com/goxjs/gl/gl_opengl.go:244 +0x22 fp=0xc420055b98 sp=0xc420055b80 pc=0x40c80b2
github.com/shibukawa/nanovgo.(*glShader).createShader(0xc4200a6000, 0x4192b3b, 0x6, 0x41a0182, 0x33, 0x0, 0x0, 0x41a0ba0, 0x199, 0x41a0d39, ...)
        /Users/henrique/go/src/github.com/shibukawa/nanovgo/gl_backend.go:38 +0x34 fp=0xc420055c50 sp=0xc420055b98 pc=0x40e0224
github.com/shibukawa/nanovgo.(*glParams).renderCreate(0xc420010350, 0xc4200be000, 0x100)
        /Users/henrique/go/src/github.com/shibukawa/nanovgo/gl_backend.go:415 +0x212 fp=0xc420055cd0 sp=0xc420055c50 pc=0x40e2062
github.com/shibukawa/nanovgo.createInternal(0x41b2b00, 0xc420010350, 0x0, 0xc4200a2000, 0x4627770)
        /Users/henrique/go/src/github.com/shibukawa/nanovgo/nanovgo.go:1360 +0x3ca fp=0xc420055ee0 sp=0xc420055cd0 pc=0x40e68fa
github.com/shibukawa/nanovgo.NewContext(0x0, 0x1f4, 0x4192b2f, 0x6)
        /Users/henrique/go/src/github.com/shibukawa/nanovgo/gl_backend.go:25 +0x91 fp=0xc420055f20 sp=0xc420055ee0 pc=0x40e01b1
main.main()
        /Users/henrique/Documents/Dev/go/kitos_app/kitosMain.go:43 +0x159 fp=0xc420055f88 sp=0xc420055f20 pc=0x40e8769
runtime.main()
        /usr/local/Cellar/go/1.10.3/libexec/src/runtime/proc.go:198 +0x212 fp=0xc420055fe0 sp=0xc420055f88 pc=0x402ac72
runtime.goexit()
        /usr/local/Cellar/go/1.10.3/libexec/src/runtime/asm_amd64.s:2361 +0x1 fp=0xc420055fe8 sp=0xc420055fe0 pc=0x4050f81
exit status 2``` 

thanks

panic: runtime error: index out of range

goroutine 1 [running, locked to thread]:
github.com/shibukawa/nanovgo/fontstashmini.(*Atlas).rectFits(0xc82023ccc0, 0x2a, 0x12, 0x12, 0xffffffffffffffff)
    github.com/shibukawa/nanovgo/fontstashmini/atlas.go:29 +0x14d
github.com/shibukawa/nanovgo/fontstashmini.(*Atlas).addRect(0xc82023ccc0, 0x12, 0x12, 0x1c4, 0x34, 0x0, 0x0)
    github.com/shibukawa/nanovgo/fontstashmini/atlas.go:96 +0x11c
github.com/shibukawa/nanovgo/fontstashmini.(*FontStash).getGlyph(0xc8202387e0, 0xc8201a5d40, 0x2713, 0xc8, 0x0, 0xbf800000)
    github.com/shibukawa/nanovgo/fontstashmini/fontstash_mini.go:454 +0x2d7
github.com/shibukawa/nanovgo/fontstashmini.(*FontStash).TextBoundsOfRunes(0xc8202387e0, 0x439a80c442380000, 0xc8212e3020, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0)
    github.com/shibukawa/nanovgo/fontstashmini/fontstash_mini.go:285 +0x345
github.com/shibukawa/nanovgo/fontstashmini.(*FontStash).TextIterForRunes(0xc8202387e0, 0x4397000042380000, 0xc8212e3020, 0x1, 0x2, 0x8)
    github.com/shibukawa/nanovgo/fontstashmini/fontstash_mini.go:338 +0x55b
github.com/shibukawa/nanovgo.(*Context).TextRune(0xc8201b4500, 0x4397000042380000, 0xc8212e3020, 0x1, 0x2, 0x2)
    github.com/shibukawa/nanovgo/nanovgo.go:890 +0x409
github.com/shibukawa/nanovgo.(*Context).Text(0xc8201b4500, 0x4397000042380000, 0xc82139d3d0, 0x3, 0xc82139d3d0)
    github.com/shibukawa/nanovgo/nanovgo.go:869 +0x8e
github.com/shibukawa/nanogui%2ego.(*CheckBox).Draw(0xc8202240d0, 0x5ec1e08, 0xc8202240d0, 0xc8201b4500)
    github.com/shibukawa/nanogui.go/checkbox.go:125 +0x9a4
github.com/shibukawa/nanogui%2ego.(*WidgetImplement).Draw(0xc8201be8c0, 0x5ec09c8, 0xc8201be8c0, 0xc8201b4500)

Help Needed: Android Port

I am trying to Port Nanovgo example to Android using andrioid-go and EGL

I modified Nanovgo to support GLES2 library from https://github.com/xlab/android-go/tree/master/gles2 , see modified version here nanovgo-gles

func init() {
	app.SetLogTag("GolangExample")
	// Initialise gl bindings using the current context.
	// err := gl.Init()
	// if err != nil {
	// 	log.Fatalln("gl.Init:", err)
	// }
}

func main() {
	log.Println("NativeActivity has started ^_^")
	log.Printf("Platform: %s %s", runtime.GOOS, runtime.GOARCH)
	nativeWindowEvents := make(chan app.NativeWindowEvent)
	var displayHandle *egl.DisplayHandle
	ctx, err := nanovgo.NewContext(0)
	if err != nil {
		panic(err)
	}

	//demoData = LoadDemo(ctx)
	app.Main(func(a app.NativeActivity) {
		a.HandleNativeWindowEvents(nativeWindowEvents)
		a.InitDone()
		for {
			select {
			case event := <-a.LifecycleEvents():
				switch event.Kind {
				case app.OnCreate:
					log.Println(event.Kind, "handled")
				default:
					log.Println(event.Kind, "event ignored")
				}
			case event := <-nativeWindowEvents:
				switch event.Kind {
				case app.NativeWindowRedrawNeeded:
					a.NativeWindowRedrawDone()
					draw(displayHandle, ctx)
					log.Println(event.Kind, "handled")
				case app.NativeWindowCreated:
					expectedSurface := map[int32]int32{
						egl.SurfaceType: egl.WindowBit,
						egl.RedSize:     8,
						egl.GreenSize:   8,
						egl.BlueSize:    8,
					}
					if handle, err := egl.NewDisplayHandle(event.Window, expectedSurface); err != nil {
						log.Fatalln("EGL error:", err)
					} else {
						displayHandle = handle
						log.Printf("EGL display res: %dx%d", handle.Width, handle.Height)
					}
					initGL()
				case app.NativeWindowDestroyed:
					displayHandle.Destroy()
				default:
					log.Println(event.Kind, "event ignored")
					//demoData.FreeData(ctx)
				}
			}
		}
	})
}

func initGL() {
	gl.Enable(gl.BLEND)
	gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
	gl.Enable(gl.CULL_FACE)
	gl.Disable(gl.DEPTH_TEST)
}

func draw(handle *egl.DisplayHandle, ctx *nanovgo.Context) {
	fmt.Println("draw")
	//fps := perfgraph.NewPerfGraph("Frame Time", "sans")

	//t, _ := fps.UpdateGraph()

	pixelRatio := float32(handle.Width) / float32(handle.Height)

	gl.Viewport(0, 0, int32(handle.Width), int32(handle.Height))
	fmt.Println("view port")

	gl.ClearColor(0, 0, 0, 0)
	fmt.Println("clear color")

	gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)

	ctx.BeginFrame(int32(handle.Width), int32(handle.Height), pixelRatio)
	fmt.Println("begin frame")

	demo.RenderDemo(ctx, 0, 0, 300, 600, 0, false, &demo.DemoData{})

	//fps.RenderGraph(ctx, 5, 5)

	ctx.EndFrame()

	//gl.Enable(gl.DEPTH_TEST)

	//glfw.PollEvents()

	handle.SwapBuffers()

}

demo.go :

func RenderDemo(ctx *nanovgo.Context, mx, my, width, height, t float32, blowup bool, data *DemoData) {
	// Widgets
	drawWindow(ctx, "Widgets `n Stuff", 50, 50, 300, 400)
	var x float32 = 60.0
	var y float32 = 95.0
	fmt.Println("Draw Window")
	drawSearchBox(ctx, "Search", x, y, 280, 25)
	y += 40
	fmt.Println("Draw Search")
	drawDropDown(ctx, "Effects", x, y, 280, 28)
	//popy := y + 14
	y += 45
	fmt.Println("Draw DropDown")
	// Form
	drawLabel(ctx, "Login", x, y, 280, 20)
	y += 25
	fmt.Println("Draw Label")
	drawEditBox(ctx, "Email", x, y, 280, 28)
	y += 35
	fmt.Println("Draw Edit Box")
	drawEditBox(ctx, "Password", x, y, 280, 28)
	y += 38
	fmt.Println("Draw Password")
	drawCheckBox(ctx, "Remember me", x, y, 140, 28)
	fmt.Println("Draw  Checkbox")
	drawButton(ctx, IconLOGIN, "Sign in", x+138, y, 140, 28, nanovgo.RGBA(0, 96, 128, 255))
	y += 45
	fmt.Println("Draw Button")

	// Slider
	drawLabel(ctx, "Diameter", x, y, 280, 20)
	y += 25
	drawEditBoxNum(ctx, "123.00", "px", x+180, y, 100, 28)
	drawSlider(ctx, 0.4, x, y, 170, 28)
	y += 55

	drawButton(ctx, IconTRASH, "Delete", x, y, 160, 28, nanovgo.RGBA(128, 16, 8, 255))
	drawButton(ctx, 0, "Cancel", x+170, y, 110, 28, nanovgo.RGBA(0, 0, 0, 0))

	fmt.Println("finished rendering")
	// Thumbnails box
	//drawThumbnails(ctx, 365, popy-30, 160, 300, data.Images, t)
}

BUG:

i am getting a blank screen with these errors

06-08 11:37:00.885 23648-23666/? I/GolangExample: NativeActivity has started ^_^
06-08 11:37:00.885 23648-23666/? I/GolangExample: Platform: android arm
06-08 11:37:00.887 23648-23666/? I/GolangExample: Shader shader/vert error:
06-08 11:37:00.888 23648-23667/? I/GolangExample: onCreate handled
06-08 11:37:00.890 23648-23666/? I/GolangExample: onStart event ignored
06-08 11:37:00.893 23648-23666/? I/GolangExample: onResume event ignored
06-08 11:37:00.894 23648-23648/? D/ActivityThread: EYE startEyeVerifyBroadcast packagename=com.go_android.minimal; ClassName=android.app.NativeActivity
06-08 11:37:00.903 23648-23648/? V/PhoneWindow: DecorView setVisiblity: visibility = 4, Parent = null, this = DecorView@2359018[],statusBarBackground visible =false,statusColor: 0xff000000->
06-08 11:37:00.919 23648-23648/? D/WindowClient: Add to mViews: DecorView@2359018[NativeActivity], this = android.view.WindowManagerGlobal@4cddbcf
06-08 11:37:00.934 23648-23648/? V/PhoneWindow: DecorView setVisiblity: visibility = 0, Parent = ViewRoot{5b9d95c com.go_android.minimal/android.app.NativeActivity,ident = 0}, this = DecorView@2359018[NativeActivity],statusBarBackground visible =false,statusColor: 0xff000000->
06-08 11:37:00.968 23648-23648/? I/lulingjie--screenshot--observer--: observer is rigistedDecorView@2359018[NativeActivity]
06-08 11:37:00.994 23648-23648/? V/InputMethodManager: onWindowFocus: null softInputMode=272 first=true flags=#10100
06-08 11:37:01.027 23648-23666/? D/Surface: Surface::setBuffersUserDimensions(this=0xe663a000,w=0,h=0)
06-08 11:37:01.040 23648-23666/? D/Surface: Surface::connect(this=0xe663a000,api=1)
06-08 11:37:01.042 23648-23666/? W/libEGL: [ANDROID_RECORDABLE] format: 2
06-08 11:37:01.047 23648-23666/? D/mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000
06-08 11:37:01.051 23648-23666/? I/GolangExample: EGL display res: 640x1070
06-08 11:37:01.052 23648-23664/? I/GolangExample: draw
06-08 11:37:01.052 23648-23664/? I/GolangExample: view port
06-08 11:37:01.052 23648-23664/? I/GolangExample: clear color
06-08 11:37:01.066 23648-23666/? D/GraphicBuffer: register, handle(0xe91913c0) (w:640 h:1070 s:640 f:0x2 u:0x000b00)
06-08 11:37:01.068 23648-23664/? I/GolangExample: begin frame
06-08 11:37:01.068 23648-23664/? I/GolangExample: Draw Window
06-08 11:37:01.068 23648-23664/? I/GolangExample: Draw Search
06-08 11:37:01.069 23648-23664/? I/GolangExample: Draw DropDown
06-08 11:37:01.069 23648-23664/? I/GolangExample: Draw Label
06-08 11:37:01.069 23648-23664/? I/GolangExample: Draw Edit Box
06-08 11:37:01.069 23648-23664/? I/GolangExample: Draw Password
06-08 11:37:01.069 23648-23664/? I/GolangExample: Draw  Checkbox
06-08 11:37:01.070 23648-23664/? I/GolangExample: Draw Button
06-08 11:37:01.070 23648-23666/? D/MALI: gles_state_set_error_internal:75: [MALI] GLES ctx: 0xa6680008, error code:0x502
06-08 11:37:01.070 23648-23666/? D/MALI: gles_state_set_error_internal:76: [MALI] GLES error info: OpenGL ES API version mismatch

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.