schema1_of_y = function(editor, y) -- return line/pos of screen line starting near a given y offset, -- and the (negative) offset remaining after the calculation -- invariants: -- - 0 >= y_offset >= -Line_height -- - let loc, y_offset = schema1_of_y(pane, y) -- y + y_offset == y_of_schema1(pane, loc) assert(y >= 0) local y_offset = y for i=1,#editor.lines do Text.populate_screen_line_starting_pos(editor, i) local height = line_height(editor, i) if y_offset < height then local line = editor.lines[i] local nlines = math.floor(y_offset/editor.line_height) assert(nlines >= 0 and nlines < #editor.line_cache[i].screen_line_starting_pos) local pos = editor.line_cache[i].screen_line_starting_pos[nlines+1] -- switch to 1-indexing y_offset = y_offset - nlines*editor.line_height return {line=i, pos=pos}, -y_offset end y_offset = y_offset - height end -- y is below the pane return {line=#editor.lines+1, pos=1}, y_offset -- positive value end