summaryrefslogtreecommitdiffstats
path: root/apps/plugins/lua/include_lua/draw_text.lua
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/lua/include_lua/draw_text.lua')
-rw-r--r--apps/plugins/lua/include_lua/draw_text.lua121
1 files changed, 121 insertions, 0 deletions
diff --git a/apps/plugins/lua/include_lua/draw_text.lua b/apps/plugins/lua/include_lua/draw_text.lua
new file mode 100644
index 0000000000..3722931c2c
--- /dev/null
+++ b/apps/plugins/lua/include_lua/draw_text.lua
@@ -0,0 +1,121 @@
+--[[ Lua Draw Text function
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2017 William Wilgus
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+]]
+-- 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())
+ local _LCD = rb.lcd_framebuffer()
+ local LCD_W, LCD_H = rb.LCD_WIDTH, rb.LCD_HEIGHT
+ local BSAND = 8 -- blits color to dst if src <> 0
+ local _NIL = nil -- nil placeholder
+
+ local _clear = rocklib_image.clear
+ local _copy = rocklib_image.copy
+ local _newimg = rb.new_image
+
+
+ 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
+ else
+ width = (width - w) / 2
+ 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
+
+ -- 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()
+ 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)
+ end
+
+ _copy(_LCD, screen_img) -- restore screen
+ rb.set_viewport() -- set viewport default
+ return res, w, h
+ end
+end