Reduce allocation of X buffers and canvases

This commit is contained in:
Sasha Koshka 2023-02-01 01:47:08 -05:00
parent b4a5bc7d03
commit 8f0f2be9e9
2 changed files with 39 additions and 11 deletions

View File

@ -195,9 +195,19 @@ func (window *Window) OnClose (callback func ()) {
} }
func (window *Window) reallocateCanvas () { func (window *Window) reallocateCanvas () {
window.canvas = tomo.NewBasicCanvas ( window.canvas.Reallocate(window.metrics.width, window.metrics.height)
window.metrics.width,
window.metrics.height) previousWidth, previousHeight := 0, 0
if window.xCanvas != nil {
previousWidth = window.xCanvas.Bounds().Dx()
previousHeight = window.xCanvas.Bounds().Dy()
}
newWidth := window.metrics.width
newHeight := window.metrics.height
larger := newWidth > previousWidth || newHeight > previousHeight
smaller := newWidth < previousWidth / 2 || newHeight < previousHeight / 2
if larger || smaller {
if window.xCanvas != nil { if window.xCanvas != nil {
window.xCanvas.Destroy() window.xCanvas.Destroy()
} }
@ -205,11 +215,13 @@ func (window *Window) reallocateCanvas () {
window.backend.connection, window.backend.connection,
image.Rect ( image.Rect (
0, 0, 0, 0,
window.metrics.width, (newWidth / 64) * 64 + 64,
window.metrics.height)) (newHeight / 64) * 64 + 64))
window.xCanvas.CreatePixmap() window.xCanvas.CreatePixmap()
} }
}
func (window *Window) redrawChildEntirely () { func (window *Window) redrawChildEntirely () {
window.pushRegion(window.paste(window.child)) window.pushRegion(window.paste(window.child))

View File

@ -61,6 +61,22 @@ func (canvas BasicCanvas) Buffer () (data []color.RGBA, stride int) {
return canvas.pix, canvas.stride return canvas.pix, canvas.stride
} }
// Reallocate efficiently reallocates the canvas. The data within will be
// garbage. This method will do nothing if this is a cut image.
func (canvas *BasicCanvas) Reallocate (width, height int) {
previousLen := len(canvas.pix)
newLen := width * height
bigger := newLen > previousLen
smaller := newLen < previousLen / 2
if bigger || smaller {
canvas.pix = make (
[]color.RGBA,
((height * width) / 4096) * 4096 + 4096)
}
canvas.stride = width
canvas.rect = image.Rect(0, 0, width, height)
}
// Cut returns a sub-canvas of a given canvas. // Cut returns a sub-canvas of a given canvas.
func Cut (canvas Canvas, bounds image.Rectangle) (reduced BasicCanvas) { func Cut (canvas Canvas, bounds image.Rectangle) (reduced BasicCanvas) {
// println(canvas.Bounds().String(), bounds.String()) // println(canvas.Bounds().String(), bounds.String())