Перейти к содержимому
swg2you

simple color tester или игры с цветами

Рекомендуемые сообщения

Захотелось мне найти значения безопасных цветов, чтобы разноцветные программы одинаково отображались на мониторах 2-го и 3-го уровня.
Затем мне захотелось найти простую формулу для генерации палитры 6*8*5 + 16 оттенков серого, для мониторов 3-го уровня.
 
В процессе изысканий родился инструмент Sipmle color tester или sicot.lua:

local gpu=require('component').gpu
local ev=require('event')
 
local function setColor(f,b)
  gpu.setForeground(f)
  gpu.setBackground(b)
end
 
local w=0xFFFFFF
require('term').clear()
gpu.fill(1,1,80,12," ")
gpu.set(27,1,'← click →')
gpu.set(76,1,'ʕ▫ᴥ▫ʔ')
gpu.set(69,3,'◄ Tier 2')
gpu.set(69,5,'◄ Tier 3')
gpu.set(69,6,'       ▼')
local t=ev.timer(1,function() if math.random(6)==1 then setColor(w,0) gpu.set(76,1,'ʕ▪ᴥ▪ʔ') os.sleep(.05) gpu.set(76,1,'ʕ▫ᴥ▫ʔ') end end, math.huge)
 
local function showcolor(c)
  for i=0,24 do
    local b=bit32.extract(c,i,1)
    setColor((1-b)*w, b*w)   
    gpu.set(24-i,1,tostring(b))
  end
  setColor(bit32.bxor(c,w), c)
  gpu.fill(1,3,24,3," ")
  gpu.set(9,4,'0x'..string.format('%06X',c))
  setColor(w,0)
  gpu.set(1,2,'└──┴┴──┘└──┴┴──┘└──┴┴──┘')
end
 
local color=math.random(w)
showcolor(color)
 
local s='SimpleColorTest'
for i=1,#s do
  setColor(bit32.bxor(color,w), color)
  gpu.set(36+i*2,1,string.sub(s,i,i)..' ')
  color=math.random(w)
end
 
--Tier2: безопасная палитра, используйте эти цвета, чтобы ваша программа выглядела одинаково на мониторах 2-го и 3-го уровней
palTier2={0x000000,0x333333,0x333399,0x336600,0x336699,0x33CC33,0x663300,0x6699FF,0x9933CC,0xCC66CC,0xCCCCCC,0xFF3333,0xFFCC33,0xFF6699,0xFFFF33,0xFFFFFF}
for x=0,15 do
  setColor(w,palTier2[x+1]) 
  gpu.set(36+2*x, 3, '  ') 
end
 
--Tier3: 16 оттенков серого
for y=0,0xF do 
  setColor(w,y*0x111111)
  gpu.set(36+y*2, 5, '  ')
end
 
--Tier3: большая палитра 6*8*5=240 комбинаций цветов
for r=0,5 do
  for g=0,7 do
    for b=0,4 do
      setColor(w, r*0x330000 + g*0x2400 + b*0x3F)
      gpu.set(1+2*(b+g*5), 7+r, '  ')
    end 
  end
end
 
repeat
  local _,_,x,y,b=ev.pull('touch')
  local s,fg,bg=gpu.get(x,y)
  if y==1 and x<=24 then
    local bit=24-x
    color = bit32.bxor(color,2^bit)
    showcolor(color)
  else
    color=bg
    showcolor(color)
  end
until b==1
ev.cancel(t)
setColor(w,0)
require('term').clear()

 
Так он выглядит не мониторе 3-го уровня:
h_1435288264_1966583_3f083dc9e6.png

А так, на мониторе 2-го уровня:
h_1435288264_9615441_e723a8e3b8.png

(Обратите внимание на то, что цвета ,безопасной палитры Tier 2 выглядят одинаково на обеих экранах!)

 

На мониторе 1-го уровня он не выглядит никак.

 
В нем можно кликать по битам, и по цветным квадратикам.
(Только по медвежонку LiVi не кликайте, он этого не любит)
 
Внутри кода, вы можете найти безопасную палитру в 16 цветов, и простую формулу генерации большой палитры.
 
Код сырой и грубый, улучшать можно бесконечно. Навскидку:

  • Повесить резидентом, чтобы вызывался по хоткею, сохранял под собой экран, и выводился поверх.
  • Добавить кнопочку "вставить цвет", которая в таймере будет имитировать ввод цветового кода.
  • Переписать в виде библиотеки с выдачей/запросом/установкой цветов по индексу.
  • Добавить таблицу комбинаций цветов текста и фона, для наглядности.
  • Добавить определение цвета текста (а не только фона).
  • Добавить в библиотеку аналог ANSI цветовых кодов.
  • Научить LiVi танцевать.
  • Что-то еще.

В процессе игры было обнаружено, что OC принудительно приводит цвета к стандартному значению. Т.е, какие бы вы цвета не писали, они будут приведены к 256 цветам в случае с  T3 и к 16 - в случае с Т2. Это есть очень хорошо для хранения экранов во всяких многооконных бодягах. В самом худшем случае (присутствие всех возможных цветов), хранение полной цветовой плоскости экрана T3, без сжатия, займет 16000 байт, а T2 - 2000 байт.
 
Также была обнаружена дикость генерации 16 цветной палитры T2, кто найдет закономерность и простую формулу для генерации - тому печенька.
 
Еще был обнаружен аномальный, странный, неучтенный, нестандартный цвет на T2. Кто найдет 17-й цвет - тому две печеньки, и цвет в подарок.

Изменено пользователем swg2you

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Никому не верьте, ОС умеет в True-color, миллионы цветов:

 

0RxuyCV.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Никому не верьте, ОС умеет в True-color, миллионы цветов:

ОС умеет. Мониторы не умеют )

Изменено пользователем swg2you

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ОС умеет. Мониторы не умеют )

Хммм, действительно. Значит я нашел баг в эмуляторе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...