lua use lcd_drawline to draw lines inside rliimages

rewrite draw_text to use new viewport buffer

set_viewport now accepts rliimage to allowe interfacing with rb. functions

fix long standing 2-bit bug with text drawing in lua
fix 2-bit img
saving bug (i'm guessing just a one off, just enabled clipping)

fix font_getstringsize bug

fix shape of numbers draw_num.lua also add auto centering

add page scrolling to printtable

add a new demo script 'stars'

Change-Id: I866905cee82ee89ebc0eb020a56a7ecdb101bf5e
This commit is contained in:
William Wilgus 2024-04-05 00:38:35 -04:00 committed by William Wilgus
parent 7f1b49693c
commit a6570b7d37
7 changed files with 432 additions and 107 deletions

View file

@ -23,7 +23,6 @@
-- draw text onto image if width/height are supplied text is centered
if not rb.lcd_framebuffer then rb.splash(rb.HZ, "No Support!") return nil end
do
-- Internal Constants
local rocklib_image = getmetatable(rb.lcd_framebuffer())
@ -40,81 +39,35 @@ do
return function(img, x, y, width, height, font, color, text)
font = font or rb.FONT_UI
local opts = {x = 0, y = 0, width = LCD_W - 1, height = LCD_H - 1,
font = font, drawmode = 3, fg_pattern = 0x1, bg_pattern = 0}
if rb.LCD_DEPTH == 2 then -- invert 2-bit screens
--vp.drawmode = bit.bxor(vp.drawmode, 4)
opts.fg_pattern = 3 - opts.fg_pattern
opts.bg_pattern = 3 - opts.bg_pattern
end
rb.set_viewport(opts)
local res, w, h = rb.font_getstringsize(text, font)
if not width then
width = 0
if rb.lcd_rgbpack ~= _NIL then -- Color target
rb.set_viewport(img, {fg_pattern = color, font = font, drawmode = 2})--DRMODE_FG
else
width = (width - w) / 2
if color ~= 0 then color = 3 end--DRMODE_SOLID
rb.set_viewport(img, {font = font, drawmode = color})
end
if not height then
height = 0
else
height = (height - h) / 2
end
if width or height then
local res, w, h = rb.font_getstringsize(text, font)
-- make a copy of the current screen for later
--local screen_img = _newimg(LCD_W, LCD_H)
local screen_img = _newimg(LCD_W, h * 2)
_copy(screen_img, _LCD)
-- check if the screen buffer is supplied image if so set img to the copy
if img == _LCD then
img = screen_img
end
-- we will be printing the text to the screen then blitting into img
--rb.lcd_clear_display()
_clear(_LCD, opts.bg_pattern or 0, 1, 1, LCD_W, h * 2)
if w > LCD_W then -- text is too long for the screen do it in chunks
local l = 1
local resp, wp, hp
local lenr = text:len()
while lenr > 1 do
l = lenr
resp, wp, hp = rb.font_getstringsize(text:sub(1, l), font)
while wp >= LCD_W and l > 1 do
l = l - 1
resp, wp, hp = rb.font_getstringsize(text:sub( 1, l), font)
end
rb.lcd_putsxy(0, 0, text:sub(1, l))
text = text:sub(l)
if x + width > img:width() or y + height > img:height() then
break
end
-- using the mask we made blit color into img
_copy(img, _LCD, x + width, y + height, _NIL, _NIL, _NIL, _NIL, false, BSAND, color)
x = x + wp
--rb.lcd_clear_display()
_clear(_LCD, opts.bg_pattern or 0, 1, 1, LCD_W, h * 2)
lenr = text:len()
if not width then
width = 0
else
width = (width - w) / 2
end
else --w <= LCD_W
rb.lcd_putsxy(0, 0, text)
-- using the mask we made blit color into img
_copy(img, _LCD, x + width, y + height, _NIL, _NIL, _NIL, _NIL, false, BSAND, color)
if not height then
height = 0
else
height = (height - h) / 2
end
x = width + x
y = height + y
end
_copy(_LCD, screen_img) -- restore screen
rb.lcd_putsxy(x, y, text)
rb.set_viewport() -- set viewport default
return res, w, h
end