MineOS/Beta/debugImageApi.lua

751 lines
48 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-------------------------------------------- OCIF Image Format -----------------------------------------------------------
local copyright = [[
Автор: Pirnogion
VK: https://vk.com/id88323331
Соавтор: IT
VK: https://vk.com/id7799889
]]
--------------------------------------- Подгрузка библиотек --------------------------------------------------------------
local component = require("component")
local unicode = require("unicode")
local fs = require("filesystem")
local gpu = component.gpu
-------------------------------------------- Переменные -------------------------------------------------------------------
--Массив библиотеки
local imageAPI = {}
--Cигнатура OCIF-файла
local ocif_signature1 = 0x896F6369
local ocif_signature2 = 0x00661A0A --7 bytes: 89 6F 63 69 66 1A 0A
local ocif_signature_expand = { string.char(0x89), string.char(0x6F), string.char(0x63), string.char(0x69), string.char(0x66), string.char(0x1A), string.char(0x0A) }
--Константы программы
local constants = {
elementCount = 2,
byteSize = 8,
nullChar = 0,
FILE_OPEN_ERROR = "Can't open file",
compressedFileFormat = ".pic",
rawFileFormat = ".rawpic"
}
---------------------------------------- Локальные функции -------------------------------------------------------------------
--Выделить бит-терминатор в первом байте UTF-8 символа: 1100 0010 --> 0010 0000
local function selectTerminateBit_l()
local prevByte = nil
local prevTerminateBit = nil
return function( byte )
local x, terminateBit = nil
if ( prevByte == byte ) then
return prevTerminateBit
end
x = bit32.band( bit32.bnot(byte), 0x000000FF )
x = bit32.bor( x, bit32.rshift(x, 1) )
x = bit32.bor( x, bit32.rshift(x, 2) )
x = bit32.bor( x, bit32.rshift(x, 4) )
x = bit32.bor( x, bit32.rshift(x, 8) )
x = bit32.bor( x, bit32.rshift(x, 16) )
terminateBit = x - bit32.rshift(x, 1)
prevByte = byte
prevTerminateBit = terminateBit
return terminateBit
end
end
local selectTerminateBit = selectTerminateBit_l()
--Прочитать n байтов из файла, возвращает прочитанные байты как число, если не удалось прочитать, то возвращает 0
local function readBytes(file, bytes)
local readedByte = 0
local readedNumber = 0
for i = bytes, 1, -1 do
readedByte = string.byte( file:read(1) or constants.nullChar )
readedNumber = readedNumber + bit32.lshift(readedByte, i * constants.byteSize - constants.byteSize)
end
return readedNumber
end
--Преобразует цвет из HEX-записи в RGB-запись
local function HEXtoRGB(color)
return bit32.rshift( color, 16 ), bit32.rshift( bit32.band(color, 0x00ff00), 8 ), bit32.band(color, 0x0000ff)
end
--Аналогично, но из RGB в HEX
local function RGBtoHEX(rr, gg, bb)
return bit32.lshift(rr, 16) + bit32.lshift(gg, 8) + bb
end
--Смешивание двух цветов на основе альфа-канала второго
local function alphaBlend(back_color, front_color, alpha_channel)
local INVERTED_ALPHA_CHANNEL = 255 - alpha_channel
local back_color_rr, back_color_gg, back_color_bb = HEXtoRGB(back_color)
local front_color_rr, front_color_gg, front_color_bb = HEXtoRGB(front_color)
local blended_rr = front_color_rr * INVERTED_ALPHA_CHANNEL / 255 + back_color_rr * alpha_channel / 255
local blended_gg = front_color_gg * INVERTED_ALPHA_CHANNEL / 255 + back_color_gg * alpha_channel / 255
local blended_bb = front_color_bb * INVERTED_ALPHA_CHANNEL / 255 + back_color_bb * alpha_channel / 255
return RGBtoHEX( blended_rr, blended_gg, blended_bb )
end
--Конвертация 24-битной палитры в 8-битную
local function convert24bitTo8bit( hexcolor24 )
local rr, gg, bb = HEXtoRGB( hexcolor24 )
return bit32.lshift( bit32.rshift(rr, 5), 5 ) + bit32.lshift( bit32.rshift(gg, 5), 2 ) + bit32.rshift(bb, 6)
end
--Конвертация 8-битной палитры в 24-битную
local function convert8bitTo24bit( hexcolor8 )
local rr = bit32.lshift( bit32.rshift( hexcolor8, 5 ), 5 )
local gg = bit32.lshift( bit32.rshift( bit32.band( hexcolor8, 28 ), 2 ), 5 )
local bb = bit32.lshift( bit32.band( hexcolor8, 3 ), 6 )
return RGBtoHEX( rr, gg, bb )
end
--Сжимает два цвета и альфа-канал в одную переменную вида 0xaabbcc (aa - первый цвет, bb - второй, cc - альфа-канал)
local function compressPixel(foreground, background, alpha)
return bit32.lshift( foreground, constants.byteSize * 2 ) + bit32.lshift( background, constants.byteSize ) + alpha
end
--Разжимает сжатую переменную в два цвета и один альфа-канал
local function decompressPixel( compressed_pixel )
return bit32.rshift( compressed_pixel, constants.byteSize * 2 ), bit32.rshift( bit32.band( compressed_pixel, 0x00FF00 ), constants.byteSize ), bit32.band( compressed_pixel, 0x0000FF )
end
--Подготавливает цвета и символ для записи в файл сжатого формата
local function encodePixel(compressed_pixel, char)
local new_fg, new_bg, alpha = decompressPixel( compressed_pixel )
local ascii_char1, ascii_char2, ascii_char3, ascii_char4, ascii_char5, ascii_char6 = string.byte( char, 1, 6 )
ascii_char1 = ascii_char1 or constants.nullChar
return new_fg, new_bg, alpha, ascii_char1, ascii_char2, ascii_char3, ascii_char4, ascii_char5, ascii_char6
end
--Декодирование UTF-8 символа
local function decodeChar(file)
local first_byte = readBytes(file, 1)
local charcode_array = {first_byte}
local len = 1
local middle = selectTerminateBit(first_byte)
if ( middle == 32 ) then
len = 2
elseif ( middle == 16 ) then
len = 3
elseif ( middle == 8 ) then
len = 4
elseif ( middle == 4 ) then
len = 5
elseif ( middle == 2 ) then
len = 6
end
for i = 1, len-1 do
table.insert( charcode_array, readBytes(file, 1) )
end
return string.char( table.unpack( charcode_array ) )
end
--Правильное конвертирование HEX-переменной в строковую
local function HEXtoSTRING(color, bitCount, withNull)
local stro4ka = string.format("%X",color)
local sStro4ka = unicode.len(stro4ka)
if sStro4ka < bitCount then
stro4ka = string.rep("0", bitCount - sStro4ka) .. stro4ka
end
sStro4ka = nil
if withNull then return "0x"..stro4ka else return stro4ka end
end
--Получение формата файла
local function getFileFormat(path)
local name = fs.name(path)
local starting, ending = string.find(name, "(.)%.[%d%w]*$")
if starting == nil then
return nil
else
return unicode.sub(name,starting + 1, -1)
end
name, starting, ending = nil, nil, nil
end
------------------------------ Все, что касается сжатого формата ------------------------------------------------------------
-- Запись в файл сжатого OCIF-формата изображения
function image.saveCompressed(path, picture)
local encodedPixel
local file = assert( io.open(path, "w"), FILE_OPEN_ERROR )
file:write( table.unpack(ocif_signature_expand) )
file:write( string.char( picture.width ) )
file:write( string.char( picture.height ) )
for i = 1, picture.width * picture.height * constants.elementCount, constants.elementCount do
encodedPixel =
{
encodePixel
(
picture[i],
picture[i + 1]
)
}
for i = 1, #encodedPixel do
file:write( string.char( encodedPixel[i] ) )
end
end
file:close()
end
--Чтение из файла сжатого OCIF-формата изображения, возвращает массив типа 2 (подробнее о типах см. конец файла)
function image.loadCompressed(path)
local picture = {}
local file = assert( io.open(path, "rb"), FILE_OPEN_ERROR )
--Проверка файла на соответствие сигнатуры
local signature1, signature2 = readBytes(file, 4), readBytes(file, 3)
if ( signature1 ~= ocif_signature1 or signature2 ~= ocif_signature2 ) then
file:close()
return nil
end
--Читаем ширину и высоту файла
picture.width = readBytes(file, 1)
picture.height = readBytes(file, 1)
for i = 1, picture.width * picture.height * constants.elementCount, constants.elementCount do
--Читаем сжатый цвет и алфа-канал
table.insert(picture, readBytes(file, 3))
--Читаем символ
table.insert(picture, decodeChar( file ))
end
file:close()
return picture
end
------------------------------ Все, что касается сырого формата ------------------------------------------------------------
--Сохранение в файл сырого формата изображения типа 2 (подробнее о типах см. конец файла)
function image.saveRaw(path, picture)
local file = assert( io.open(path, "w"), FILE_OPEN_ERROR )
local xPos, yPos = 1, 1
for i = 1, picture.width * picture.height * constants.imageElementSize, constants.imageElementSize do
file:write( HEXtoSTRING(picture[i], 6), " ", HEXtoSTRING(picture[i + 1], 6), " ", HEXtoSTRING(picture[i + 2], 2), " ", picture[i + 3], " ")
xPos = xPos + 1
if xPos > picture.width then
xPos = 1
yPos = yPos + 1
file:write("\n")
end
end
file:close()
end
--Загрузка из файла сырого формата изображения типа 2 (подробнее о типах см. конец файла)
function image.loadRaw(path)
local file = assert( io.open(path, "r"), FILE_OPEN_ERROR )
local picture = {}
local background, foreground, alpha, symbol, sLine
local lineCounter = 0
for line in file:lines() do
sLine = unicode.len(line)
for i = 1, sLine, constants.rawImageLoadStep do
background = "0x" .. unicode.sub(line, i, i + 5)
foreground = "0x" .. unicode.sub(line, i + 7, i + 12)
alpha = "0x" .. unicode.sub(line, i + 14, i + 15)
symbol = unicode.sub(line, i + 17, i + 17)
table.insert(picture, tonumber(background))
table.insert(picture, tonumber(foreground))
table.insert(picture, tonumber(alpha))
table.insert(picture, symbol)
end
lineCounter = lineCounter + 1
end
picture.width = sLine / constants.rawImageLoadStep
picture.height = lineCounter
file:close()
return picture
end
----------------------------------- Вспомогательные функции программы ------------------------------------------------------------
--Оптимизировать и сгруппировать по цветам картинку типа 2 (подробнее о типах см. конец файла)
function image.convertToGroupedImage(picture)
--Создаем массив оптимизированной картинки
local optimizedPicture = {}
--Задаем константы
local xPos, yPos, background24bit, foreground24bit, alpha, symbol, background8bit, foreground8bit = 1, 1, nil, nil, nil, nil, nil, nil
--Перебираем все элементы массива
for i = 1, picture.width * picture.height * constants.elementCount, constants.elementCount do
--Разжимаем сжатый пиксель из неоптимизированного массива
foreground8bit, background8bit, alpha = decompressPixel( picture[i] )
--Конвертируем сжатые цвета в нормальную 3-байтную HEX-форму
foreground24bit, background24bit = convert8bitTo24bit( foreground8bit ), convert8bitTo24bit( background8bit )
--Получаем символ из неоптимизированного массива
symbol = picture[i + 1]
--Группируем картинку по цветам
optimizedPicture[background24bit] = optimizedPicture[background24bit] or {}
optimizedPicture[background24bit][foreground24bit] = optimizedPicture[background24bit][foreground24bit] or {}
table.insert(optimizedPicture[background24bit][foreground24bit], xPos)
table.insert(optimizedPicture[background24bit][foreground24bit], yPos)
table.insert(optimizedPicture[background24bit][foreground24bit], alpha)
table.insert(optimizedPicture[background24bit][foreground24bit], symbol)
--Если xPos достигает width изображения, то сбросить на 1, иначе xPos++
xPos = (xPos == picture.width) and 1 or xPos + 1
--Если xPos равняется 1, то yPos++, а если нет, то похуй
yPos = (xPos == 1) and yPos + 1 or yPos
end
--Возвращаем оптимизированный массив
return optimizedPicture
end
--Конвертирует картинку типа 1 в картинку типа 3 (cм. конец файла)
function image.convertRawPictureToOptimizedPicture(rawPicture)
local optimizedPicture = {}
--Получаем ширну файла
optimizedPicture.width = #rawPicture[1]
optimizedPicture.height = #rawPicture
--Перебираем быдло-массив и постепенно создаем оптимизированный
for j = 1, #rawPicture do
for i = 1, #rawPicture[j] do
--Вставляем в оптимизированный массив сжатые цвета с альфа-каналом
table.insert(optimizedPicture, compressPixel( convert24bitTo8bit(rawPicture[j][i][2]), convert24bitTo8bit(rawPicture[j][i][1]), rawPicture[j][i][3]))
--А теперь вставляем символ
table.insert(optimizedPicture, rawPicture[j][i][4])
--Очищаем оперативку
rawPicture[j][i] = nil
end
--Очищаем оперативку
rawPicture[j] = nil
end
--Очищаем оперативку
rawPicture.width, rawPicture.height = nil, nil; rawPicture = nil
--Возвращаем самый крутой и мегаоптимизированный массив
return optimizedPicture
end
--Нарисовать по указанным координатам картинку указанной ширины и высоты для теста
function image.drawRandomImage(x, y, width, height)
local picture = {}
local symbolArray = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "И", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я"}
picture.width = width
picture.height = height
local background, foreground, symbol, compressed
for j = 1, height do
for i = 1, width do
background = math.random(0x000000, 0xffffff)
foreground = math.random(0x000000, 0xffffff)
symbol = symbolArray[math.random(1, #symbolArray)]
compressed = compressPixel( convert24bitTo8bit(foreground), convert24bitTo8bit(background), 0x00)
table.insert(picture, compressed)
table.insert(picture, symbol)
end
end
local optimizedPicture = image.convertToGroupedImage(picture)
image.draw(x, y, optimizedPicture)
end
--Отладочная функция для наглядного составления сжатой цветовой палитры
function image.createCompressedColorPalette(iterator)
iterator = iterator or 64
local file = io.open("colors.lua", "w")
ecs.prepareToExit()
local massiv = {}
local xSize, ySize = gpu.getResolution()
local _,_,first,second,color,compressed,decompressed,strColor,strCompressed
local i = 0x0
local yPos, xPos = 8, 2
while i <= 0xffffff do
color = i
compressed = convert24bitTo8bit(color)
decompressed = convert8bitTo24bit(compressed)
strColor = HEXtoSTRING(color, 6, true)
strCompressed = HEXtoSTRING(compressed, 2, true)
ecs.drawButton(2, 2, 10, 3, strColor, color, 0xffffff - color)
ecs.drawButton(14, 2, 10, 3, strCompressed, decompressed, 0xffffff - decompressed)
ecs.colorTextWithBack(2, 6, 0xffffff, 0x262626, "Идет сравнение цветов, ".. math.floor(i / 0xffffff * 100).."% завершено. Ниже выводится список соответствий.")
_,_,first = gpu.get(2,2)
_,_,second = gpu.get(14,2)
if first == second then
if not massiv[compressed] then
massiv[compressed] = color
ecs.colorTextWithBack(xPos, yPos, color, 0x262626, strCompressed.." = "..strColor)
yPos = yPos + 1
if yPos >= ySize then yPos = 8; xPos = xPos + 16 end
end
end
i = i + iterator
end
for key, val in pairs(massiv) do
file:write("[", HEXtoSTRING(key, 2, true), "] = ", HEXtoSTRING(val, 6, true), ",\n")
end
file:close()
ecs.prepareToExit()
end
----------------------------------------- Основные функции программы -------------------------------------------------------------------
--Сохранить изображение любого поддерживаемого формата
function image.save(path, picture)
--Создать папку под файл, если ее нет
fs.makeDirectory(fs.path(path))
--Получаем формат указанного файла
local fileFormat = getFileFormat(path)
--Проверяем соответствие формата файла
if fileFormat == constants.compressedFileFormat then
image.saveCompressed(path, picture)
elseif fileFormat == constants.rawFileFormat then
image.saveRaw(path, picture)
else
error("Unsupported file format.\n")
end
end
--Загрузить изображение любого поддерживаемого формата
function image.load(path)
--Кинуть ошибку, если такого файла не существует
if not fs.exists(path) then error("File \""..path.."\" does not exists.\n") end
--Получаем формат указанного файла
local fileFormat = getFileFormat(path)
--Проверяем соответствие формата файла
if fileFormat == constants.compressedFileFormat then
return image.loadCompressed(path)
elseif fileFormat == constants.rawFileFormat then
return image.loadRaw(path)
else
error("Unsupported file format.\n")
end
end
--Отрисовка изображения типа 3 (подробнее о типах см. конец файла)
function image.draw(x, y, rawPicture)
--Конвертируем в групповое изображение
local picture = image.convertToGroupedImage(rawPicture)
--Все как обычно
x, y = x - 1, y - 1
--Переменные, чтобы в цикле эту парашу не создавать
local currentBackground, xPos, yPos, alpha, symbol
local _, _
--Перебираем все цвета фона
for background in pairs(picture) do
--Заранее ставим корректный цвет фона
gpu.setBackground(background)
--Перебираем все цвета текста
for foreground in pairs(picture[background]) do
--Ставим сразу и корректный цвет текста
gpu.setForeground(foreground)
--Перебираем все пиксели
for i = 1, #picture[background][foreground], 4 do
--Получаем временную репрезентацию
xPos, yPos, alpha, symbol = picture[background][foreground][i], picture[background][foreground][i + 1], picture[background][foreground][i + 2], picture[background][foreground][i + 3]
--Рассчитать прозрачность только в том случае, если альфа имеется
if alpha > 0x00 then
_, _, currentBackground = gpu.get(x + xPos, y + yPos)
currentBackground = alphaBlend(currentBackground, background, alpha)
gpu.setBackground(currentBackground)
else
if currentBackground ~= background then
currentBackground = background
gpu.setBackground(currentBackground)
end
end
--Рисуем символ на экране
gpu.set(x + xPos, y + yPos, symbol)
--Выгружаем сгруппированное изображение из памяти
picture[background][foreground][i], picture[background][foreground][i + 1], picture[background][foreground][i + 2], picture[background][foreground][i + 3] = nil, nil, nil, nil
end
--Выгружаем данные о текущем цвете текста из памяти
picture[background][foreground] = nil
end
--Выгружаем данные о текущем фоне из памяти
picture[background] = nil
end
end
------------------------------------------ Примеры работы с библиотекой ------------------------------------------------
ecs.prepareToExit()
-- image.createCompressedColorPalette(iterator)
-- local full = 0x0
-- local xPos, yPos = 2, 2
-- local xSize, ySize = gpu.getResolution()
-- local compressed = 0x0
-- local function printColors()
-- ecs.colorTextWithBack(xPos, yPos, full, 0x262626, HEXtoSTRING(compressed, 2, true).." = "..HEXtoSTRING(full, 6, true))
-- yPos = yPos + 1
-- if yPos >= ySize then yPos = 2; xPos = xPos + 16 end
-- end
-- while compressed <= 0xff do
-- for i = 1, 8 do
-- for j = 1, 4 do
-- printColors()
-- full = full + 0x40
-- compressed = compressed + 0x1
-- end
-- full = full + 0x1F00
-- end
-- full = full + 0x1F0000
-- end
-- local function formula(shortColor)
-- local fullColor = shortColor * (8 * ( 4 * (0x40) + 0x1F00) + 0x1F0000)
-- ecs.colorTextWithBack(2, 2, fullColor, 0x262626, HEXtoSTRING(shortColor, 2, true).." = "..HEXtoSTRING(fullColor, 6, true))
-- end
-- formula(0xA0)
-- --Пример изображения типа 1 (подробнее о типах см. конец файла)
-- local rawPicture = {
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x33ff66, 0x0092ff, 0x00, " "}, {0x33ff66, 0x0092ff, 0x00, " "}, {0x33ff66, 0x0092ff, 0x00, " "}, {0x33ff66, 0x0092ff, 0x00, " "}, {0x33ff66, 0x0092ff, 0x00, " "}, {0x33ff66, 0x0092ff, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x336d3f, 0x004936, 0x00, " "}, {0x336d3f, 0x004936, 0x00, " "}, {0x336d3f, 0x004936, 0x00, " "}, {0x336d3f, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x004936, 0x00926d, 0x00, " "}, {0x004936, 0x00926d, 0x00, " "}, {0x004936, 0x00926d, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0xff6d80, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0xff6d80, 0x004940, 0x00, " "}, {0xff6d80, 0x004940, 0x00, " "}, {0xff6d80, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x004940, 0xffffff, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0xff6d80, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0xff6d80, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0x004940, 0x00, " "}, {0xff0000, 0x004940, 0x00, " "}, {0xff0000, 0x004940, 0x00, " "}, {0xff0000, 0x004940, 0x00, " "}, {0xff0000, 0x004940, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x338592, 0x003f49, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x1e1e1e, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x004936, 0x339286, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x339286, 0x004936, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff4940, 0x004940, 0x00, " "}, {0xff0000, 0xffffff, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0x338592, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x003f49, 0xffffff, 0x00, " "}, {0x004940, 0xffffff, 0x00, " "}, {0x004940, 0xffffff, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0xcc0000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x990000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- {{0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0x660000, 0x004940, 0x00, " "}, {0x660000, 0x004940, 0x00, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}, {0xffffff, 0xcccccc, 0xff, " "}},
-- }
-- --Конвертируем изображение типа 1 в изображение типа 2 для отрисовки
-- local optimizedPicture = image.convertRawPictureToOptimizedPicture(rawPicture)
-- --Рисуем сконвертированное изображение
-- image.draw(2, 2, optimizedPicture)
------------------------------------------ Типы массивов изображений ---------------------------------------------------
--[[
Тип 1:
Изображение без сжатия, используется как дружелюбная к человеку заготовка,
ее очень легко понять и изменить простым текстовым редактором. Из минусов
можно отметить крайне высокий расход оперативной памяти.
Структура:
local picture = {
{{Цвет фона, Цвет текста, Альфа-канал, Символ}, {Цвет фона, Цвет текста, Альфа-канал, Символ}, ... },
{{Цвет фона, Цвет текста, Альфа-канал, Символ}, {Цвет фона, Цвет текста, Альфа-канал, Символ}, ... },
...
}
Пример:
local picture = {
{{0xffffff, 0x000000, 0x00, "Q"}, {0xff00ff, 0x00ff00, 0xac, "W"}},
{{0xffffff, 0x000000, 0x00, "E"}, {0xff00ff, 0x00ff00, 0xac, "R"}},
}
Тип 1 легко конвертируется во тип 2 с помощью функции:
Изображение типа 2 = image.convertRawPictureToOptimizedPicture( Сюда кидаем массив изображения типа 1 )
Тип 2:
Основной формат изображения, линейная запись данных о пикселях,
сжатие двух цветов и альфа-канала в одно число. Минимальный расход
оперативной памяти, однако для изменения цвета требует декомпрессию.
Структура:
local picture = {
width = ширина изображения,
height = высота изображения,
Сжатые цвета и альфа-канал,
Символ,
Сжатые цвета и альфа-канал,
Символ,
...
}
Пример:
local picture = {
width = 2,
height = 2,
0xff00aa,
"Q",
0x88aacc,
"W",
0xff00aa,
"E",
0x88aacc,
"R"
}
Тип 2 конвертируется только в тип 3 и только для отрисовки на экране:
Изображение типа 3 = image.convertToGroupedImage( Сюда кидаем массив изображения типа 2 )
Тип 3 (сгруппированный по цветам формат, ипользуется только для отрисовки изображения):
Структура:
local picture = {
Цвет фона 1 = {
Цвет текста 1 = {
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
...
},
Цвет текста 2 = {
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
...
},
...
},
Цвет фона 2 = {
Цвет текста 1 = {
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
...
},
Цвет текста 2 = {
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
Координата по X,
Координата по Y,
Альфа-канал,
Символ,
...
},
...
},
}
Пример:
local picture = {
0xffffff = {
0xaabbcc = {
1,
1,
0x00,
"Q",
12,
12,
0xaa,
"W"
},
0x88aa44 = {
5,
5,
0xcc,
"E",
12,
12,
0x00,
"R"
}
},
0x444444 = {
0x112233 = {
40,
20,
0x00,
"T",
12,
12,
0xaa,
"Y"
},
0x88aa44 = {
5,
5,
0xcc,
"U",
12,
12,
0x00,
"I"
}
}
}
]]
------------------------------------------------------------------------------------------------------------------------
return image