mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
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:
parent
7f1b49693c
commit
a6570b7d37
7 changed files with 432 additions and 107 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue