From 136e791ad901c14fa2d570469027aa7ea5265928 Mon Sep 17 00:00:00 2001 From: Igor Timofeev Date: Wed, 28 Oct 2015 09:59:52 +0300 Subject: [PATCH] aefaef --- Applications/BufferDemo/Invoker.pic | Bin 0 -> 64009 bytes Applications/Photoshop/Photoshop.lua | 2 +- lib/image.lua | 70 ++++++++++++++++----------- 3 files changed, 44 insertions(+), 28 deletions(-) create mode 100644 Applications/BufferDemo/Invoker.pic diff --git a/Applications/BufferDemo/Invoker.pic b/Applications/BufferDemo/Invoker.pic new file mode 100644 index 0000000000000000000000000000000000000000..d291e6ea431400d50fe89a0b5ce441dd7255a31d GIT binary patch literal 64009 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 literal 0 HcmV?d00001 diff --git a/Applications/Photoshop/Photoshop.lua b/Applications/Photoshop/Photoshop.lua index 038cdd76..0dad4da5 100644 --- a/Applications/Photoshop/Photoshop.lua +++ b/Applications/Photoshop/Photoshop.lua @@ -742,7 +742,7 @@ while true do ecs.error("Некорректное имя файла!") elseif not fs.exists(data[1]) then ecs.error("Файл\""..data[1].."\" не существует!") - elseif fileFormat ~= ".pic" and fileFormat ~= ".rawpic" then + elseif fileFormat ~= ".pic" and fileFormat ~= ".rawpic" and fileFormat ~= ".png" then ecs.error("Формат файла \""..fileFormat.."\" не поддерживается!") else masterPixels = image.load(data[1]) diff --git a/lib/image.lua b/lib/image.lua index 5fc7ea46..abed9087 100644 --- a/lib/image.lua +++ b/lib/image.lua @@ -15,6 +15,9 @@ local copyright = [[ local component = require("component") local unicode = require("unicode") local fs = require("filesystem") +local bit = require("bit32") +local libPNGImage = require("libPNGImage") +local colorlib = require('colorlib') local gpu = component.gpu local image = {} @@ -35,6 +38,7 @@ local constants = { fileOpenError = "Can't open file", compressedFileFormat = ".pic", rawFileFormat = ".rawpic", + pngFileFormat = ".png", } ---------------------------------------- Локальные функции ------------------------------------------------------------------- @@ -79,35 +83,11 @@ local function readBytes(file, bytes) 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 - --Подготавливает цвета и символ для записи в файл сжатого формата local function encodePixel(background, foreground, alpha, char) --Расхерачиваем жирные цвета в компактные цвета - local ascii_background1, ascii_background2, ascii_background3 = HEXtoRGB(background) - local ascii_foreground1, ascii_foreground2, ascii_foreground3 = HEXtoRGB(foreground) + local ascii_background1, ascii_background2, ascii_background3 = colorlib.HEXtoRGB(background) + local ascii_foreground1, ascii_foreground2, ascii_foreground3 = colorlib.HEXtoRGB(foreground) --Расхерачиваем жирный код юникод-символа в несколько миленьких ascii-кодов 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 @@ -275,6 +255,40 @@ function image.loadRaw(path) return picture end +----------------------------------- Все, что касается реального PNG-формата ------------------------------------------------------------ + +function image.loadPng(path) + local success, pngImageOrErrorMessage = pcall(libPNGImage.newFromFile, path) + + if not success then + io.stderr:write(" * PNGView: PNG Loading Error *\n") + io.stderr:write("While attempting to load '" .. path .. "' as PNG, libPNGImage erred:\n") + io.stderr:write(pngImageOrErrorMessage) + return + end + + local picture = {} + picture.width, picture.height = pngImageOrErrorMessage:getSize() + + local r, g, b, a, hex + for j = 0, picture.height - 1 do + for i = 0, picture.width - 1 do + r, g, b, a = pngImageOrErrorMessage:getPixel(i, j) + + if r and g and b and a and a > 0 then + hex = colorlib.RGBtoHEX(r, g, b) + table.insert(picture, hex) + table.insert(picture, 0x000000) + table.insert(picture, 0x00) + table.insert(picture, " ") + end + + end + end + + return picture +end + ----------------------------------- Вспомогательные функции программы ------------------------------------------------------------ --Оптимизировать и сгруппировать по цветам картинку типа 2 (подробнее о типах см. конец файла) @@ -355,6 +369,8 @@ function image.load(path) return image.loadCompressed(path) elseif fileFormat == constants.rawFileFormat then return image.loadRaw(path) + elseif fileFormat == constants.pngFileFormat then + return image.loadPng(path) else error("Unsupported file format.\n") end @@ -384,7 +400,7 @@ function image.draw(x, y, rawPicture) --Если альфа имеется, но она не совсем прозрачна if (alpha > 0x00 and alpha < 0xFF) or (alpha == 0xFF and symbol ~= " ")then _, _, currentBackground = gpu.get(x + xPos, y + yPos) - currentBackground = alphaBlend(currentBackground, background, alpha) + currentBackground = colorlib.alphaBlend(currentBackground, background, alpha) gpu.setBackground(currentBackground) --Рисуем символ на экране gpu.set(x + xPos, y + yPos, symbol)