summaryrefslogtreecommitdiff
path: root/img/shitty_disp.lua
diff options
context:
space:
mode:
authorubq323 <ubq323@ubq323.website>2022-08-06 22:56:33 +0100
committerubq323 <ubq323@ubq323.website>2022-08-06 22:56:37 +0100
commit5fa756996028fc7ce6be943f3e47c10231dbed0d (patch)
tree017131c92420bc6e0d87c814af7a5b9ed9173f97 /img/shitty_disp.lua
parente9a46b2acf7aef3e9cdfb5ecde8f56256e402318 (diff)
img
Diffstat (limited to 'img/shitty_disp.lua')
-rw-r--r--img/shitty_disp.lua116
1 files changed, 3 insertions, 113 deletions
diff --git a/img/shitty_disp.lua b/img/shitty_disp.lua
index 8bd1b61..ea9681b 100644
--- a/img/shitty_disp.lua
+++ b/img/shitty_disp.lua
@@ -1,116 +1,6 @@
-- bad displayment thing
-
-local function color_dist(c1,c2)
- local total = 0
- for i=1,3 do total = total + (c1[i]-c2[i])^2 end
- return total
-end
-
-local function closest_palette_color(R,c)
- local closest = nil
- local closest_dist = 99999999
- for i=0,15 do
- local pc = {R.getPaletteColor(2^i)}
- local dist = color_dist(pc,c)
- if dist < closest_dist then
- closest = 2^i
- closest_dist = dist
- end
- end
- return closest
-end
-
-local function average_color(pxlist)
- local count = #pxlist
- local tr,tg,tb = 0,0,0
- for _,px in ipairs(pxlist) do
- tr = tr + px[1]
- tg = tg + px[2]
- tb = tb + px[3]
- end
- return {tr/count,tg/count,tb/count}
-end
-
-local function sortby_r(pxlist) table.sort(pxlist,function(a,b) return a[1]<b[1] end) end
-local function sortby_g(pxlist) table.sort(pxlist,function(a,b) return a[2]<b[2] end) end
-local function sortby_b(pxlist) table.sort(pxlist,function(a,b) return a[3]<b[3] end) end
-
-local function median_cut(pxlist,remaining)
- remaining = remaining or 4
- if remaining <= 0 then
- return {average_color(pxlist)}
- end
- local maxr,maxg,maxb = -1,-1,-1
- local minr,ming,minb = 999,999,999
- local max,min = math.max,math.min
- for _,px in ipairs(pxlist) do
- maxr = max(maxr,px[1])
- maxg = max(maxg,px[2])
- maxb = max(maxb,px[3])
- minr = min(minr,px[1])
- ming = min(ming,px[2])
- minb = min(minb,px[3])
- end
- local ranger,rangeg,rangeb = maxr-minr,maxg-ming,maxb-minb
- if ranger > rangeg then
- if ranger > rangeb then
- -- red
- sortby_r(pxlist)
- else
- -- blue
- sortby_b(pxlist)
- end
- else
- if rangeg > rangeb then
- -- green
- sortby_g(pxlist)
- else
- -- blue
- sortby_b(pxlist)
- end
- end
- local count = #pxlist
- local hcount = math.floor(count/2)
-
- local lhalf,uhalf = {},{}
- for i=1,hcount do
- lhalf[i] = pxlist[i]
- end
- for i=hcount+1,count do
- uhalf[i-hcount] = pxlist[i]
- end
-
- local lcols = median_cut(lhalf,remaining-1)
- local ucols = median_cut(uhalf,remaining-1)
-
- for i=1,#ucols do table.insert(lcols,ucols[i]) end
- return lcols
-end
-
-local function reset_palette(R)
- for i=0,15 do
- local cx = 2^i
- R.setPaletteColor(cx,term.nativePaletteColor(cx))
- end
-end
-
-local function improve_palette(R,img,w,h,imgx,imgy)
- local pxlist = {}
- local idx=1
- for px=imgx,imgx+w-1 do
- for py=imgy,imgy+h-1 do
- pxlist[idx] = img[py][px]
- idx = idx + 1
- end
- end
- local palette = median_cut(pxlist)
- assert(#palette==16,#palette.." doesn't equal 16")
- for i=0,15 do
- local pc = palette[i+1]
- R.setPaletteColor(2^i,table.unpack(pc))
- end
-end
-
+local disp_common = require("disp_common")
+local improve_palette,closest_palette_color = disp_common.improve_palette,disp_common.closest_palette_color
local function disp(R,img,scrx,scry,w,h,imgx,imgy)
@@ -134,4 +24,4 @@ local function disp(R,img,scrx,scry,w,h,imgx,imgy)
end
end
-return {disp=disp,color_dist=color_dist,closest_palette_color=closest_palette_color,reset_palette=reset_palette}
+return {disp=disp}