This doesn't quite work because Text.screen_line_index doesn't quite work for either side.
UDQBOVKKGKAYBTGCEOM33P3XXVJIOGO4DPKTDUBQDOCLQJKAFEYQC
return y < line_cache.starty + State.line_height*(num_screen_linesA)
local num_screen_linesB = 0
if line.dataB and #line.dataB > 0 then
Text.populate_screen_line_starting_posB(State, line_index)
num_screen_linesB = #line_cache.screen_line_starting_posB - Text.screen_line_index(line_cache.screen_line_starting_posB, line_cache.startposB) -- no +1; first screen line of B side overlaps with A side
end
return y < line_cache.starty + State.line_height*(num_screen_linesA+num_screen_linesB)