first test!

This commit is contained in:
Kartik K. Agaram 2022-05-22 23:17:06 -07:00
parent 8aa72be226
commit 46d4c4de10
2 changed files with 87 additions and 12 deletions

View File

@ -102,3 +102,59 @@ function store_drawing(outfile, drawing)
end
outfile:write('```\n')
end
-- for tests
function load_array(a)
local result = {}
local next_line = ipairs(a)
local i,line = 0, ''
while true do
i,line = next_line(a, i)
if i == nil then break end
if line == '```lines' then -- inflexible with whitespace since these files are always autogenerated
table.insert(result, load_drawing_from_array(next_line, a, i))
else
table.insert(result, {mode='text', data=line})
end
end
if #result == 0 then
table.insert(result, {mode='text', data=''})
end
return result
end
function load_drawing_from_array(iter, a, i)
local drawing = {mode='drawing', h=256/2, points={}, shapes={}, pending={}}
local line
while true do
i, line = iter(a, i)
assert(i)
if line == '```' then break end
local shape = json.decode(line)
if shape.mode == 'freehand' then
-- no changes needed
elseif shape.mode == 'line' or shape.mode == 'manhattan' then
local name = shape.p1.name
shape.p1 = Drawing.insert_point(drawing.points, shape.p1.x, shape.p1.y)
drawing.points[shape.p1].name = name
name = shape.p2.name
shape.p2 = Drawing.insert_point(drawing.points, shape.p2.x, shape.p2.y)
drawing.points[shape.p2].name = name
elseif shape.mode == 'polygon' or shape.mode == 'rectangle' or shape.mode == 'square' then
for i,p in ipairs(shape.vertices) do
local name = p.name
shape.vertices[i] = Drawing.insert_point(drawing.points, p.x,p.y)
drawing.points[shape.vertices[i]].name = name
end
elseif shape.mode == 'circle' or shape.mode == 'arc' then
local name = shape.center.name
shape.center = Drawing.insert_point(drawing.points, shape.center.x,shape.center.y)
drawing.point[shape.center].name = name
else
print(shape.mode)
assert(false)
end
table.insert(drawing.shapes, shape)
end
return drawing
end

View File

@ -23,7 +23,7 @@ function Text.draw(line, line_width, line_index)
for _, f in ipairs(line.fragments) do
local frag, frag_text = f.data, f.text
-- render fragment
local frag_width = math.floor(frag_text:getWidth()*Zoom)
local frag_width = math.floor(App.width(frag_text)*Zoom)
if x + frag_width > line_width then
assert(x > 25) -- no overfull lines
if line_index > Screen_top1.line or pos > Screen_top1.pos then
@ -47,7 +47,7 @@ function Text.draw(line, line_width, line_index)
if Debug_new_render then print('checking to draw', pos, Screen_top1.pos) end
if line_index > Screen_top1.line or pos >= Screen_top1.pos then
if Debug_new_render then print('drawing '..frag) end
love.graphics.draw(frag_text, x,y, 0, Zoom)
App.screen.draw(frag_text, x,y, 0, Zoom)
end
-- render cursor if necessary
local frag_len = utf8.len(frag)
@ -78,13 +78,32 @@ function Text.draw_cursor(x, y)
Cursor_y = y+math.floor(15*Zoom)
end
function test_draw_text()
App.screen.init{width=120, height=60}
Lines = load_array{'abc', 'def', 'ghi'}
Line_width = 120
Cursor1 = {line=1, pos=1}
Screen_top1 = {line=1, pos=1}
Screen_bottom1 = {}
Zoom = 1
App.draw()
local screen_top_margin = 15 -- pixels
local line_height = 15 -- pixels
local y = screen_top_margin
App.screen.check(y, 'abc', 'F - test_draw_text/screen:1')
y = y + line_height
App.screen.check(y, 'def', 'F - test_draw_text/screen:2')
y = y + line_height
App.screen.check(y, 'ghi', 'F - test_draw_text/screen:3')
end
function Text.compute_fragments(line, line_width)
line.fragments = {}
local x = 25
-- try to wrap at word boundaries
for frag in line.data:gmatch('%S*%s*') do
local frag_text = love.graphics.newText(love.graphics.getFont(), frag)
local frag_width = math.floor(frag_text:getWidth()*Zoom)
local frag_text = App.newText(love.graphics.getFont(), frag)
local frag_width = math.floor(App.width(frag_text)*Zoom)
--? print('x: '..tostring(x)..'; '..tostring(line_width-x)..'px to go')
--? print('frag: ^'..frag..'$ is '..tostring(frag_width)..'px wide')
if x + frag_width > line_width then
@ -95,13 +114,13 @@ function Text.compute_fragments(line, line_width)
local b = Text.nearest_cursor_pos(frag, line_width - x)
--? print('space for '..tostring(b)..' graphemes')
local frag1 = string.sub(frag, 1, b)
local frag1_text = love.graphics.newText(love.graphics.getFont(), frag1)
local frag1_width = math.floor(frag1_text:getWidth()*Zoom)
local frag1_text = App.newText(love.graphics.getFont(), frag1)
local frag1_width = math.floor(frag1App.width(_text)*Zoom)
--? print('inserting '..frag1..' of width '..tostring(frag1_width)..'px')
table.insert(line.fragments, {data=frag1, text=frag1_text})
frag = string.sub(frag, b+1)
frag_text = love.graphics.newText(love.graphics.getFont(), frag)
frag_width = math.floor(frag_text:getWidth()*Zoom)
frag_text = App.newText(love.graphics.getFont(), frag)
frag_width = math.floor(App.width(frag_text)*Zoom)
end
x = 25 -- new line
end
@ -479,14 +498,14 @@ end
function Text.cursor_x(line_data, cursor_pos)
local line_before_cursor = line_data:sub(1, cursor_pos-1)
local text_before_cursor = love.graphics.newText(love.graphics.getFont(), line_before_cursor)
return 25 + math.floor(text_before_cursor:getWidth()*Zoom)
local text_before_cursor = App.newText(love.graphics.getFont(), line_before_cursor)
return 25 + math.floor(App.width(text_before_cursor)*Zoom)
end
function Text.cursor_x2(s, cursor_pos)
local s_before_cursor = s:sub(1, cursor_pos-1)
local text_before_cursor = love.graphics.newText(love.graphics.getFont(), s_before_cursor)
return math.floor(text_before_cursor:getWidth()*Zoom)
local text_before_cursor = App.newText(love.graphics.getFont(), s_before_cursor)
return math.floor(App.width(text_before_cursor)*Zoom)
end
function Text.to2(pos1)