assume starty can be nil in update
commitab5ba3f3e5f4f1f1583d798ace26683cb572ed18
authorKartik K. Agaram <vc@akkartik.com>
Fri, 15 Sep 2023 18:13:04 +0000 (15 11:13 -0700)
committerKartik K. Agaram <vc@akkartik.com>
Fri, 15 Sep 2023 18:13:04 +0000 (15 11:13 -0700)
tree416b908f23462cf8eb38467eb5b57598f8acafa8
parentbafc45b028ad8db3d8be51cf1a09b7f118d75503
assume starty can be nil in update

This is a backport of a bugfix in pensieve.love. It's not _technically_
a bug here in lines.love, but it seems worth establishing an
architectural invariant (or rather lack of invariant).

LÖVE's standard event loop performs the following sequence of operations
in a single frame:
  * process events
  * update
  * draw

Ideally any mutations to global state happen during the first two
phases, while drawing includes no mutation.

However, there is a special case: `starty`, the top y coordinate for
each each line in the editor. This is used all over the place, and the
cheapest way to compute it is to simply save it while drawing.

However, draw by definition only updates `starty` for lines that are
drawn on screen. To avoid stale data on lines off screen, say after
scrolling, events often clear `starty` for all lines, leaving it to the
next draw phase to repopulate the right lines.

Sandwiched between the above two "however"s, the update phase needs to
gracefully handle `starty` being nil in the occasional frame right after
an event.

I think I've audited all our uses of `starty`, and this commit fixes the
only place that violates this rule.
drawing.lua