Manual tests rechecked for this fork.
TAOVHUDMSPGIUIYWRQAY7WOBPEKWXFI5BQW5DAIFXL3I3GP2QYYQC IO6IBU5SS23LBTOWAXHVFMW7JLAATOALJUALAJJ5QSKIXUDIUXCAC CA32MRE2G2SLFQIGKU2PW66JI45AFKDSZR277C3XDJUPNMHKMOUQC PDUNKNWCDKUFUNDPCGWIV75NUW5JACIAYTU74GXSJBMDA4IHVTOQC 5UJNSNQR7MRKERR4PPQ2KRRQBTPDNBAYLKVMUGSL5WXXBQ4YHLUAC R5QXEHUIZLELJGGCZAE7ATNS3CLRJ7JFRENMGH4XXH24C5WABZDQC PPVABNGQTQMPYILHDNSNXBI5IOCBSIYO45NIHUR4LYPABQZE6PAQC OELP2MAL5RGZ3AZ42V6H7RLGX52JLNHGUD7GV6YIVZ3ACOK5SFSQC K6ZDYZKXSLTLCCHWYK6K6WOCNXBZOXEDKDVNNJVCZUFOLLSUO5UAC FWCILHZLHSMW2RQF4ZTJVABMHTD6IR4KPCHUEJFTQT2MXHV75XDQC WKMW7PCE75A5CFXF5GPL5HQ4ZNASFOFQFHASOQ7LABSQKWU3KEGAC MU5W6A35USV3OPXIVGGY5FXC55KCIRQXOFHAGXMTOKCIL4MSQZ4AC G25JLJ5S6AIL76ILEAXQS3EN2SEWH2X6QT4IPHRXBIPLQVHKGXFAC BJ5X5O4ACBBJ56LRBBSTCW6IBQP4HAEOOOPNH3SKTA4F66YTOIDAC EZZBR2VSITUTJOQ3AR4ESYJMHWTQHOUMKMRD6HCM53QSTTLDFGHQC QJAYOFWY7V4BWVLJMEDCCBC2HX4BDAZI6PQVLWCLYRHWGMOBFTVAC EXZESF4IFJIIMKDIWKXZ3FQM5GYCIGQJEFDENCLCO5FHE5ZPABNQC 54Y4QQG3ETC4YMUDDJBQO4SLFMX3NOLI5PRGVHUY2DVGZAUJBZVAC 7JZFRO5FU57TYQOBZXVLISILKAYDQYTTGZXCPGOZNW3GAU7INQBQC JYJKYWCXAXBFEBLFY4MWFZXTQCI6J7FVZSF5KFE4IHYY42UXMBFAC 7IJQIPGG4G2DJAS2W4MUHB2TTJ75ZST6VNAMUYZXEYOVRIV4FZ5QC 7TQAF4BYIK75EEYCCK7VEUSZHNCWMWIA3HZGQKIILYESUZ5ZZRVQC SUPHTPXYKS4JBDPASHAYA5OBVJ45QT7ZV2HYNTF7OJYOKKS6DW5QC JIBCE66ZTWM5WEHEHNKKTRWBJQSQWBDDWPMOJIJR5Q676OSHYCNAC TZNPEHB3BRUHATVYAODURZUR45TYV62HYWQK5SUXHAOLVGYJVP7AC KAGTD334AIWFI34VE34OARC44BZDUJRP5R3ZTT6JCQGSYYC3GTVQC CDW426K3SG5CZ6BFCDQMQEL2NZKRQPF5DIFNS25CHV63R3BWBXRAC 5HBC66CSFQ257TO3DJYBUNKE5RKR47CUJNMYP6Y4F7T6W7LNRV4AC BF7TW3EKRIDYC6J2Q2J4YOBAVQF55Y3H6KGZIHNXMH4N72MR6GXQC EVDBN4WF54TPW76XAMHBIMCPZAY6H5E5CRDX4Y3V47UHWWGYPY7AC 4W2NJTC3NV4T3OF4KGGR2ADSXCCTV5GVQMN6TR6D5N4QESFWYY4QC YOCTF4J3GCMKKVKGO2N5NGHNCRG6FLD54QPI5RGLK4OP667D3NVAC 7P3EK7K2AWA3YDMQBFWJY4TVIKGJ5LI7E4P4F7Z2CVAGVETA3JHAC ZQMQVMFWZIGWBRCB455IKHPTAOUYPLYCSC44NBPPET557RGVRX3AC TBB7GHINPHDTKI3B6U3M2OF7UGQ5V5DUHODB7UNKNZMBA4NWKUFAC HTAB35N62YXTFGITVQAK6DNEKKAUKJQQ27RYO7BBVQKIHXBH6NMQC AUZQ7ULP65IGCJYIT3U6R42HEJT35R33TQHA7XNK242KWCV6IKMAC A = function()B()-- TODO: ugly that we're manipulating editor objects twicecompute_layout(Page, Page.x,Page.y, Surface)compute_layout(Page2, Page2.x,Page2.y, Surface)-- continue the pipelinelove.graphics.setFont(love.graphics.newFont(scale(20))) -- editor objects implicitly depend on current font
node.editor.screen_top1, node.editor.top = schema1_of_y(node.editor, scale(Viewport.y-node.y))--? print('modified screen_top to', node.editor.screen_top1.line, 'at', node.editor.top, 'vpx')else-- adjust editor to start rendering near top of viewport--? print(Viewport.y)node.editor.top = Viewport.y%node.editor.line_heightif node.editor.top > 0 then node.editor.top = node.editor.top - node.editor.line_height end--? print('top', node.editor.top)
if not eq(Cursor_node.editor.screen_top1, old_top) then--? print('modifying Viewport', Viewport.y, 'based on', Cursor_node.y, Cursor_node.editor.screen_top1.line, Cursor_node.editor.line_height)Viewport.y = Cursor_node.y + y_of_schema1(Cursor_node.editor, Cursor_node.editor.screen_top1)/Viewport.zoom--? print('modified Viewport', Viewport.y)-- Most of the time, we update the screen_top of nodes from Viewport.y.-- But here we went the other way.-- It's very important to avoid creating a recurrence, to avoid running-- both sides of this feedback loop in a single frame. These apps are-- not very numerically precise (e.g. we force text lines to start at-- integer pixels regardless of zoom, because that keeps text crisp),-- and the computations of Viewport.y and node.top will almost certainly-- not converge. The resulting bugs are extremely difficult to chase-- down.-- The optional skip_updating_screen_top_for arg ensures we don't run-- the other side of the feedback loop.A(--[[skip updating screen_top for]] Cursor_node)returnend
pan_viewport_to_contain_cursor(Cursor_node)
print('cursor before', Cursor_node.editor.cursor1.line, Cursor_node.editor.cursor1.pos)print('cursor after', Cursor_node.editor.cursor1.line, Cursor_node.editor.cursor1.pos)pan_viewport_to_contain_cursor(Cursor_node)
-- recompute various aspects based on the current viewport settingsfor _,obj in ipairs(Surface) doif obj.type == 'line' thenobj.zdata = {}for i=1,#obj.data,2 dotable.insert(obj.zdata, vx(obj.data[i]))table.insert(obj.zdata, vy(obj.data[i+1]))endelseif obj.type == 'bezier' thenzdata = {}for i=1,#obj.data,2 dotable.insert(zdata, vx(obj.data[i]))table.insert(zdata, vy(obj.data[i+1]))endobj.zdata = love.math.newBezierCurve(zdata):render()elseif obj.type == 'text' thenif obj.w then