// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package debug provides GL-based debugging tools for apps. package debug // import "golang.org/x/mobile/app/debug" import ( "fmt" "image" "image/draw" "log" "math" "sync" "time" "code.google.com/p/freetype-go/freetype" "golang.org/x/mobile/font" "golang.org/x/mobile/geom" "golang.org/x/mobile/gl/glutil" ) var lastDraw = time.Now() var monofont = freetype.NewContext() var fps struct { sync.Once *glutil.Image } // TODO(crawshaw): It looks like we need a gl.RegisterInit feature. // TODO(crawshaw): The gldebug mode needs to complain loudly when GL functions // are called before init, because often they fail silently. func fpsInit() { b := font.Monospace() f, err := freetype.ParseFont(b) if err != nil { panic(err) } monofont.SetFont(f) monofont.SetSrc(image.Black) monofont.SetHinting(freetype.FullHinting) toPx := func(x geom.Pt) int { return int(math.Ceil(float64(geom.Pt(x).Px()))) } fps.Image = glutil.NewImage(toPx(50), toPx(12)) monofont.SetDst(fps.Image.RGBA) monofont.SetClip(fps.Bounds()) monofont.SetDPI(72 * float64(geom.PixelsPerPt)) monofont.SetFontSize(12) } // DrawFPS draws the per second framerate in the bottom-left of the screen. func DrawFPS() { fps.Do(fpsInit) now := time.Now() diff := now.Sub(lastDraw) str := fmt.Sprintf("%.0f FPS", float32(time.Second)/float32(diff)) draw.Draw(fps.Image, fps.Image.Rect, image.White, image.Point{}, draw.Src) ftpt12 := freetype.Pt(0, int(12*geom.PixelsPerPt)) if _, err := monofont.DrawString(str, ftpt12); err != nil { log.Printf("DrawFPS: %v", err) return } fps.Upload() fps.Draw( geom.Point{0, geom.Height - 12}, geom.Point{50, geom.Height - 12}, geom.Point{0, geom.Height}, fps.Bounds(), ) lastDraw = now }