mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-15 02:57:37 -04:00
lua optimize poly_draw add draw_number, poly_points modules
Change-Id: Id36e765f18234f5a4f3092d090c0adffa3da1612
This commit is contained in:
parent
9f551b09f6
commit
b99d4d7fa9
4 changed files with 297 additions and 43 deletions
118
apps/plugins/lua/include_lua/poly_points.lua
Normal file
118
apps/plugins/lua/include_lua/poly_points.lua
Normal file
|
@ -0,0 +1,118 @@
|
|||
--PolyPoints.lua
|
||||
--[[
|
||||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
]]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- decodes ascii string back to t_pts
|
||||
function points_from_ascii(encstr, scale)
|
||||
scale = scale or 1
|
||||
local t_pts = {}
|
||||
encstr = encstr or "00000008"
|
||||
local chroffset = tonumber(string.sub(encstr, 1, 3)) or 0
|
||||
local chrlen = tonumber(string.sub(encstr, 4, 8)) or 0
|
||||
|
||||
if string.len(encstr) ~= chrlen then
|
||||
error("Invalid Points String" .. string.len(encstr), 2)
|
||||
end
|
||||
|
||||
for i = 9, string.len(encstr) - 1, 2 do
|
||||
local x = string.byte(encstr, i, i) - chroffset
|
||||
local y = string.byte(encstr, i + 1, i + 1) - chroffset
|
||||
t_pts[#t_pts + 1] = x * scale
|
||||
t_pts[#t_pts + 1] = y * scale
|
||||
end
|
||||
return t_pts
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
-- encodes t_pts as a ascii string non print chars are excluded so
|
||||
-- size is limited to approx ~ 90x90
|
||||
function points_to_ascii(t_pts)
|
||||
if not t_pts then return "" end
|
||||
local chroffset = 33
|
||||
local maxoffset = 126 - 33
|
||||
local t_enc = {[1] = string.format("%03d%05d", chroffset, #t_pts + 8)}
|
||||
local max_n, min_n = 0, 0
|
||||
for i = 1, #t_pts, 2 do
|
||||
if t_pts[i] > max_n then max_n = t_pts[i] end
|
||||
if t_pts[i] < min_n then min_n = t_pts[i] end
|
||||
if t_pts[i+1] > max_n then max_n = t_pts[i+1] end
|
||||
if t_pts[i+1] < min_n then min_n = t_pts[i+1] end
|
||||
if max_n > maxoffset or min_n < 0 then break; end
|
||||
t_enc[#t_enc + 1] = string.char(t_pts[i] + chroffset)
|
||||
t_enc[#t_enc + 1] = string.char(t_pts[i+1] + chroffset)
|
||||
end
|
||||
if min_n >= 0 and (max_n - min_n) <= maxoffset then
|
||||
return table.concat(t_enc)
|
||||
else
|
||||
return "00000008"
|
||||
end
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
-- scales t_pts by percentage (x/y)
|
||||
function points_scale_pct(t_pts, x_pct, y_pct)
|
||||
for i = 1, #t_pts, 2 do
|
||||
local t_pt = {t_pts[i], t_pts[i + 1]}
|
||||
t_pt = t_pt or {0, 0}
|
||||
t_pts[i] = (t_pt[1] * x_pct) / 100
|
||||
t_pts[i+1] = (t_pt[2] * y_pct) / 100
|
||||
end
|
||||
return t_pts
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
-- scales t_pts by (x/y)
|
||||
function points_scale(t_pts, width, height)
|
||||
local max_x, max_y = 0, 0
|
||||
for i = 1, #t_pts, 2 do
|
||||
if t_pts[i] > max_x then max_x = t_pts[i] end
|
||||
if t_pts[i+1] > max_y then max_y = t_pts[i+1] end
|
||||
end
|
||||
|
||||
local x_pct = (width * 100) / max_x
|
||||
local y_pct = (height * 100) / max_y
|
||||
|
||||
return points_scale_pct(t_pts, x_pct, y_pct)
|
||||
end
|
||||
--------------------------------------------------------------------------------
|
||||
--[[
|
||||
function scaleup(t_pts, scale_x, scale_y)
|
||||
local t_coord
|
||||
for key,value in pairs(t_pts) do
|
||||
t_coord = t_pts[key]
|
||||
t_coord[1] = t_coord[1] * scale_x
|
||||
t_coord[2] = t_coord[2] * scale_y
|
||||
t_pts[key] = t_coord
|
||||
end
|
||||
end
|
||||
|
||||
function scaledn(t_pts, scale_x, scale_y)
|
||||
local t_coord
|
||||
for key,value in pairs(t_pts) do
|
||||
t_coord = t_pts[key]
|
||||
t_coord[1] = t_coord[1] / scale_x
|
||||
t_coord[2] = t_coord[2] / scale_y
|
||||
t_pts[key] = t_coord
|
||||
end
|
||||
end
|
||||
]]
|
Loading…
Add table
Add a link
Reference in a new issue