From a6570b7d378b6236c40d2e2bd983f7d53ad479e3 Mon Sep 17 00:00:00 2001 From: William Wilgus Date: Fri, 5 Apr 2024 00:38:35 -0400 Subject: 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 --- apps/plugins/lua/include_lua/draw_text.lua | 85 +++++++----------------------- 1 file changed, 19 insertions(+), 66 deletions(-) (limited to 'apps/plugins/lua/include_lua/draw_text.lua') diff --git a/apps/plugins/lua/include_lua/draw_text.lua b/apps/plugins/lua/include_lua/draw_text.lua index 3722931c2c..1d44954a5c 100644 --- a/apps/plugins/lua/include_lua/draw_text.lua +++ b/apps/plugins/lua/include_lua/draw_text.lua @@ -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 - - -- 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 + if width or height then + local res, w, h = rb.font_getstringsize(text, font) - -- 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) + if not width then + width = 0 + else + width = (width - w) / 2 + end - lenr = text:len() + if not height then + height = 0 + else + height = (height - h) / 2 end - else --w <= LCD_W - rb.lcd_putsxy(0, 0, text) + x = width + x + y = height + y - -- using the mask we made blit color into img - _copy(img, _LCD, x + width, y + height, _NIL, _NIL, _NIL, _NIL, false, BSAND, color) end - _copy(_LCD, screen_img) -- restore screen + rb.lcd_putsxy(x, y, text) + rb.set_viewport() -- set viewport default return res, w, h end -- cgit v1.2.3