shithub: mycel

Download patch

ref: fb1e925b765b0f39437eec9df8938ebf8670056a
parent: 36ab9e8b4b71c5af9808b48abdbc114a70136dcb
author: Philip Silva <[email protected]>
date: Mon Feb 15 17:28:17 EST 2021

fast scroll

--- a/browser/browser.go
+++ b/browser/browser.go
@@ -100,13 +100,6 @@
 	edit := &duit.Edit{
 		Font: Style.Font(),
 	}
-	/*edit.Keys = func(k rune, m draw.Mouse) (e duit.Event) {
-		//log.Printf("k=%v (c %v    p %v)", k, unicode.IsControl(k), unicode.IsPrint(k))
-		if unicode.IsPrint(k) {
-			e.Consumed = true
-		}
-		return
-	}*/
 	formatted := ""
 	lines := strings.Split(s, "\n")
 	for _, line := range lines {
--- a/browser/scroll.go
+++ b/browser/scroll.go
@@ -136,7 +136,7 @@
 		if ui.Kid.R.Dx() == 0 || ui.Kid.R.Dy() == 0 {
 			return
 		}
-		ui.img, err = dui.Display.AllocImage(ui.Kid.R, draw.ARGB32, false, dui.BackgroundColor)
+		ui.img, err = dui.Display.AllocImage(ui.drawRect(), draw.ARGB32, false, dui.BackgroundColor)
 		if duitError(dui, err, "allocimage") {
 			return
 		}
@@ -152,6 +152,29 @@
 		ui.Kid.Draw = duit.Clean
 	}
 	img.Draw(ui.childR.Add(orig), ui.img, nil, image.Pt(0, ui.Offset))
+}
+
+// Allocate only an image buffer of view size ui.r
+// - which is translated by scroll offset ui.Offset - instead
+// of whole Kid view size ui.Kid.R which leads to much
+// faster render times sometimes. Add same size rectangles
+// above/below to decrease flickering.
+func (ui *Scroll) drawRect() image.Rectangle {
+	if 2*ui.r.Dy() > ui.Kid.R.Dy() {
+		return ui.Kid.R
+	}
+	r := image.Rectangle{
+		Min: ui.r.Min,
+		Max: image.Point{
+			ui.r.Max.X,
+			2*ui.r.Max.Y,
+		},
+	}
+	r = r.Add(image.Point{X:0, Y:ui.Offset})
+	if r.Min.Y > ui.Offset {
+		r.Min.Y -= ui.Offset
+	}
+	return r
 }
 
 func (ui *Scroll) scroll(delta int) bool {