From 01386616aad0547e672671bfcd6009c79aed9547 Mon Sep 17 00:00:00 2001 From: Herve Nicol <12008875+hervenicol@users.noreply.github.com> Date: Sun, 4 Sep 2022 18:11:38 +0200 Subject: [PATCH] menu: faster background drawing using FastHLines --- menu.go | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 6 deletions(-) diff --git a/menu.go b/menu.go index 9289a13..52f81af 100644 --- a/menu.go +++ b/menu.go @@ -11,6 +11,75 @@ import ( "tinygo.org/x/tinyfont/proggy" ) +// FilledTriangle draws a filled triangle given three points +// Code from tinydraw, but faster and may not work on all displays +func FilledTriangle(x0 int16, y0 int16, x1 int16, y1 int16, x2 int16, y2 int16, color color.RGBA) { + if y0 > y1 { + x0, y0, x1, y1 = x1, y1, x0, y0 + } + if y1 > y2 { + x1, y1, x2, y2 = x2, y2, x1, y1 + } + if y0 > y1 { + x0, y0, x1, y1 = x1, y1, x0, y0 + } + + if y0 == y2 { // y0 = y1 = y2 : it's a line + a := x0 + b := x0 + if x1 < a { + a = x1 + } else if x1 > b { + b = x1 + } + if x2 < a { + a = x2 + } else if x2 > b { + b = x2 + } + // Line(display, a, y0, b, y0, color) + display.DrawFastHLine(a, b, y0, color) + return + } + + dx01 := x1 - x0 + dy01 := y1 - y0 + dx02 := x2 - x0 + dy02 := y2 - y0 + dx12 := x2 - x1 + dy12 := y2 - y1 + + sa := int16(0) + sb := int16(0) + a := int16(0) + b := int16(0) + + last := y1 - 1 + if y1 == y2 { + last = y1 + } + + y := y0 + for ; y <= last; y++ { + a = x0 + sa/dy01 + b = x0 + sb/dy02 + sa += dx01 + sb += dx02 + display.DrawFastHLine(a, b, y, color) + } + + sa = dx12 * (y - y1) + sb = dx02 * (y - y0) + + for ; y <= y2; y++ { + a = x1 + sa/dy12 + b = x0 + sb/dy02 + sa += dx12 + sb += dx02 + display.DrawFastHLine(a, b, y, color) + } +} + func menu() int16 { display.FillScreen(color.RGBA{0, 0, 0, 255}) options := []string{ @@ -23,12 +92,12 @@ func menu() int16 { bgColor := color.RGBA{0, 40, 70, 255} display.FillScreen(bgColor) - tinydraw.FilledTriangle(&display, 0, 128, 0, 45, 45, 0, color.RGBA{255, 255, 255, 255}) - tinydraw.FilledTriangle(&display, 45, 0, 0, 128, 145, 0, color.RGBA{255, 255, 255, 255}) - tinydraw.FilledTriangle(&display, 0, 128, 15, 128, 145, 0, color.RGBA{255, 255, 255, 255}) - for i := int16(0); i < 8; i++ { - tinydraw.Line(&display, 0, 110+i, 110+i, 0, bgColor) - } + FilledTriangle(0, 128, 0, 45, 45, 0, color.RGBA{255, 255, 255, 255}) + FilledTriangle(45, 0, 0, 128, 145, 0, color.RGBA{255, 255, 255, 255}) + FilledTriangle(0, 128, 15, 128, 145, 0, color.RGBA{255, 255, 255, 255}) + + FilledTriangle(0, 110, 110, 0, 117, 0, bgColor) + FilledTriangle(0, 110, 0, 117, 117, 0, bgColor) selected := int16(0) numOpts := int16(len(options))