-------------------------------------------- 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