summaryrefslogtreecommitdiff
path: root/img/better_disp.lua
diff options
context:
space:
mode:
Diffstat (limited to 'img/better_disp.lua')
-rw-r--r--img/better_disp.lua121
1 files changed, 108 insertions, 13 deletions
diff --git a/img/better_disp.lua b/img/better_disp.lua
index d7b59c1..1d36f7a 100644
--- a/img/better_disp.lua
+++ b/img/better_disp.lua
@@ -1,3 +1,5 @@
+local disp_common = require("disp_common")
+
-- a vlorb consists of six gromlings[A
-- 1 2
-- 4 8
@@ -22,10 +24,102 @@ local function vlorb(onc,offc, g1,g2,g3,g4,g5,g6)
return textc,bgc,string.char(vlorbchar)
end
-local function should_be_on(col)
- return col[1]+col[2]+col[3] > 1.5
+local function all_palette_distances(R)
+ local out = {}
+ for a=0,15 do
+ for b = 0,15 do
+ local ia=2^a
+ local ib=2^b
+ local ca = R.getPaletteColor(ia)
+ local cb = R.getPaletteColor(ib)
+ local dist = disp_common.color_dist(ca,cb)
+ out[ia][ib] = dist
+ end
+ end
+ return out
+end
+
+local function list_contains(list,val)
+ for _,v in ipairs(list) do
+ if v == val then return true end
+ end
+ return false
end
+-- R, lPx_gromlings, l_pdists -> lCx_gromlings
+local function adjust_to_2_colors(R,gromlings,pdists)
+ -- gromlings goes 1 2 3 4 5 6
+ -- compress the 6 pixels to just 2 colors
+ -- return the list of cidxs
+ local gromling_colors = {}
+ for i,c in ipairs(gromlings) do
+ gromling_colors[i] = disp_common.closest_palette_color(R,c)
+ end
+
+ local all_current_colors = {}
+ local ncolors = 0
+ for _,cidx in ipairs(gromling_colors) do
+ all_current_colors[cidx] = true
+ ncolors = ncolors+1
+ end
+
+ while ncolors > 2 do
+ -- merge closest two colors until there are only 2 distinct ones left
+ local best_dist = 9999
+ local best_a = nil
+ local best_b = nil
+ for a in pairs(all_current_colors) do
+ for b in pairs(all_current_colors) do
+ if a ~= b then
+ local dist = pdists[a][b]
+ if dist < best_dist then
+ best_dist = dist
+ best_a = a
+ best_b = b
+ end
+ end
+ end
+ end
+
+ -- todo: be cleverer when deciding whether to merge a into b, or b into a
+ -- currently just merge b into a
+ assert(best_a and best_b and best_a ~= best_b)
+ all_current_colors[best_b] = false
+ ncolors=ncolors-1
+ for gidx,col in ipairs(gromling_colors) do
+ if col == best_b then gromling_colors[gidx] = best_a end
+ end
+ end
+
+ return gromling_colors
+end
+
+local function gromling_list_to_vlorb(gromling_colors)
+ -- takes list of cidxs
+ local ca = nil
+ local cb = nil
+ local gs = {}
+ for i,col in ipairs(gromling_colors) do
+ if col == ca then
+ gs[i] = true
+ elseif col == cb then
+ gs[i] = false
+ else
+ if not ca then
+ ca = col
+ gs[i] = true
+ elseif not cb then
+ cb = col
+ gs[i] = false
+ else
+ error("third gromling color in vlorb")
+ end
+ end
+ end
+ return ca,cb,table.unpack(gs)
+end
+
+
-- todo: refactor common stuff into a common file
local function disp(R,img,scrx,scry,w,h,imgx,imgy)
-- w and h are image coords
@@ -36,6 +130,9 @@ local function disp(R,img,scrx,scry,w,h,imgx,imgy)
imgx = imgx or 1
imgy = imgy or 1
+ disp_common.improve_palette(R,img,w,h,imgx,imgy)
+ local pdists=all_palette_distances(R)
+
local sw = math.ceil(w/2)
local sh = math.ceil(h/3)
@@ -44,23 +141,21 @@ local function disp(R,img,scrx,scry,w,h,imgx,imgy)
local ioffx=soffx*2
local ioffy=soffy*3
R.setCursorPos(scrx+soffx,scry+soffy)
- local gs = {}
+ local lPx_gromlings = {}
for goffy=0,2 do
for goffx=0,1 do
- local ic = img[imgy+ioffy+goffy][imgx+ioffx+goffx] or {0,0,0}
- table.insert(gs,should_be_on(ic))
+ local px = img[imgy+ioffy+goffy][imgx+ioffx+goffx] or {0,0,0}
+ table.insert(lPx_gromlings,px)
end
end
- local tc,bc,ch = vlorb(colors.white,colors.black,table.unpack(gs))
- R.setTextColor(tc)
- R.setBackgroundColor(bc)
- R.write(ch)
+
+ local lCx_gromlings = adjust_to_2_colors(lPx_gromlings)
+ local textc,bgc,vlorbchar = vlorb(gromling_list_to_vlorb(lCx_gromlings))
+ R.setTextColor(textc)
+ R.setBackgroundColor(bgc)
+ R.write(vlorbchar)
end
end
end
-
-
-
-
return {vlorb=vlorb,disp=disp}