// 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. // +build darwin linux windows // Package debug provides GL-based debugging tools for apps. package debug // import "golang.org/x/mobile/exp/app/debug" import ( "image" "image/color" "image/draw" "time" "golang.org/x/mobile/event/size" "golang.org/x/mobile/exp/gl/glutil" "golang.org/x/mobile/geom" ) // FPS draws a count of the frames rendered per second. type FPS struct { sz size.Event images *glutil.Images m *glutil.Image lastDraw time.Time // TODO: store *gl.Context } // NewFPS creates an FPS tied to the current GL context. func NewFPS(images *glutil.Images) *FPS { return &FPS{ lastDraw: time.Now(), images: images, } } // Draw draws the per second framerate in the bottom-left of the screen. func (p *FPS) Draw(sz size.Event) { const imgW, imgH = 7*(fontWidth+1) + 1, fontHeight + 2 if sz.WidthPx == 0 && sz.HeightPx == 0 { return } if p.sz != sz { p.sz = sz if p.m != nil { p.m.Release() } p.m = p.images.NewImage(imgW, imgH) } display := [7]byte{ 4: 'F', 5: 'P', 6: 'S', } now := time.Now() f := 0 if dur := now.Sub(p.lastDraw); dur > 0 { f = int(time.Second / dur) } display[2] = '0' + byte((f/1e0)%10) display[1] = '0' + byte((f/1e1)%10) display[0] = '0' + byte((f/1e2)%10) draw.Draw(p.m.RGBA, p.m.RGBA.Bounds(), image.White, image.Point{}, draw.Src) for i, c := range display { glyph := glyphs[c] if len(glyph) != fontWidth*fontHeight { continue } for y := 0; y < fontHeight; y++ { for x := 0; x < fontWidth; x++ { if glyph[fontWidth*y+x] == ' ' { continue } p.m.RGBA.SetRGBA((fontWidth+1)*i+x+1, y+1, color.RGBA{A: 0xff}) } } } p.m.Upload() p.m.Draw( sz, geom.Point{0, sz.HeightPt - imgH}, geom.Point{imgW, sz.HeightPt - imgH}, geom.Point{0, sz.HeightPt}, p.m.RGBA.Bounds(), ) p.lastDraw = now } func (f *FPS) Release() { if f.m != nil { f.m.Release() f.m = nil f.images = nil } } const ( fontWidth = 5 fontHeight = 7 ) // glyphs comes from the 6x10 fixed font from the plan9port: // https://github.com/9fans/plan9port/tree/master/font/fixed // // 6x10 becomes 5x7 because each glyph has a 1-pixel margin plus space for // descenders. // // Its README file says that those fonts were converted from XFree86, and are // in the public domain. var glyphs = [256]string{ '0': "" + " X " + " X X " + "X X" + "X X" + "X X" + " X X " + " X ", '1': "" + " X " + " XX " + "X X " + " X " + " X " + " X " + "XXXXX", '2': "" + " XXX " + "X X" + " X" + " XX " + " X " + "X " + "XXXXX", '3': "" + "XXXXX" + " X" + " X " + " XX " + " X" + "X X" + " XXX ", '4': "" + " X " + " XX " + " X X " + "X X " + "XXXXX" + " X " + " X ", '5': "" + "XXXXX" + "X " + "X XX " + "XX X" + " X" + "X X" + " XXX ", '6': "" + " XX " + " X " + "X " + "X XX " + "XX X" + "X X" + " XXX ", '7': "" + "XXXXX" + " X" + " X " + " X " + " X " + " X " + " X ", '8': "" + " XXX " + "X X" + "X X" + " XXX " + "X X" + "X X" + " XXX ", '9': "" + " XXX " + "X X" + "X XX" + " XX X" + " X" + " X " + " XX ", 'F': "" + "XXXXX" + "X " + "X " + "XXXX " + "X " + "X " + "X ", 'P': "" + "XXXX " + "X X" + "X X" + "XXXX " + "X " + "X " + "X ", 'S': "" + " XXX " + "X X" + "X " + " XXX " + " X" + "X X" + " XXX ", }