diff --git a/Applications/Photoshop b/Applications/Photoshop new file mode 100644 index 00000000..3f373fa0 --- /dev/null +++ b/Applications/Photoshop @@ -0,0 +1,1053 @@ +local component = require("component") +local event = require("event") +local term = require("term") +local unicode = require("unicode") +local ecs = require("ECSAPI") +local fs = require("filesystem") +local context = require("context") +local colorlib = require("colorlib") +local palette = require("palette") +local computer = require("computer") +local seri = require("serialization") +local keyboard = require("keyboard") + +local gpu = component.gpu + +local arg = {...} + +-------------------------------------ПЕРЕМЕННЫЕ------------------------------------------------------ + +local xSize,ySize = gpu.getResolution() + +local drawImageFromX = 9 +local drawImageFromY = 3 + +local imageWidth = 8 +local imageHeight = 4 + +local transparentSymbol = "#" +local transparentBackground = 0xffffff +local transparentForeground = 0xcccccc + +local background = 0x000000 +local foreground = 0xffffff +local symbol = " " + +local toolbarColor = 0x535353 +local padColor = 0x262626 +local shadowColor = 0x1d1d1d +local toolbarTextColor = 0xcccccc +local toolbarPressColor = 0x3d3d3d +local consoleColor1 = 0x3d3d3d +local consoleColor2 = 0x999999 + +local historyLimit = 30 +local historyDisplayLimit = 13 +local drawHistoryFrom = 1 +local currentHistoryElement = 1 +local historyY = 2 +local rightToolbarWidth = 18 +local xRightToolbar = xSize - rightToolbarWidth + 1 + +local rightToolbarWidthTextLimit = rightToolbarWidth - 2 + +local currentLayer = 1 +local layersY = historyY + historyDisplayLimit + 1 +local layersDisplayLimit = math.floor((ySize - layersY - 1) / 2) +local drawLayersFrom = 1 +local layersIsVisibleSymbol = "●" +local layersIsNotVisibleSymbol = "◯" +local layersLimit = 20 +--◯ ● + +local currentInstrument = 2 +local instruments={ + {"Move","M"}, + {"Brush","B"}, + {"Eraser","E"}, + {"Fill","F"}, + {"Text","T"}, +} +local topButtons = { + {"Файл"}, + {"Редактировать"}, + {"Слои"}, + {"О программе"} +} + +local buttons = {"▲","▼","D","J","N","R"} + +local consoleEnabled = true +local consoleWidth = xSize - 6 - rightToolbarWidth +local consoleText = "Программа запущена, консоль отладки включена" + +local pixels = {} +local MasterPixels = {} + +--------------------------------------ФУНКЦИИ----------------------------------------------------- + +--ОТРИСОВКА ПОЛОСЫ ПРОКРУТКИ +function newScrollBar(x,y,height,countOfAllElements,displayingFrom,displayingTo,backColor,frontColor) + local diapason = displayingTo - displayingFrom + 1 + local percent = diapason / countOfAllElements + local sizeOfScrollBar = math.ceil(percent * height) + local displayBarFrom = math.floor(y + height*(displayingFrom-1)/countOfAllElements) + + ecs.square(x,y,1,height,backColor) + ecs.square(x,displayBarFrom,1,sizeOfScrollBar,frontColor) +end + +--ОБЪЕКТЫ +local obj = {} +local function newObj(class,name,key,value) + obj[class] = obj[class] or {} + obj[class][name] = obj[class][name] or {} + obj[class][name][key] = value +end + +newObj("tools","imageZone","x1",drawImageFromX);newObj("tools","imageZone","x2",drawImageFromX+imageWidth-1);newObj("tools","imageZone","y1",drawImageFromY);newObj("tools","imageZone","y2",drawImageFromY+imageHeight-1) + +local function clearScreen(color) + gpu.setBackground(color) + term.clear() +end + +local function drawTransparency() + gpu.setBackground(transparentBackground) + gpu.setForeground(transparentForeground) + gpu.fill(drawImageFromX,drawImageFromY,imageWidth,imageHeight,transparentSymbol) +end + +local function createSampleLayer() + local massiv = {} + for j = 1,imageHeight do + massiv[j] = {} + for i = 1,imageWidth do + massiv[j][i] = { transparentBackground, transparentForeground, transparentSymbol } + end + end + return massiv +end + +--ОБЪЕДИНИТЬ ВСЕ СЛОИ В ОДИН САМЫЙ ЖИРНЫЙ ПИЗДОСЛОЙ +local function mergeLayersToMasterPixels() + + local sPixels = #pixels + MasterPixels = createSampleLayer() + + local layerCounter = sPixels + while layerCounter >= 1 do + + if pixels[layerCounter][3] then + for y=1,imageHeight do + if pixels[layerCounter][2][y] then + for x=1,imageWidth do + if pixels[layerCounter][2][y][x] then + MasterPixels[y][x] = {pixels[layerCounter][2][y][x][1],pixels[layerCounter][2][y][x][2],pixels[layerCounter][2][y][x][3]} + end + end + end + end + end + + layerCounter = layerCounter - 1 + end + +end + +local function createMassiv() + MasterPixels = {} + pixels = { + {"Слой 1",{},true} + } +end + +newObj("tools", "imageZone2", "x1", 7); newObj("tools", "imageZone2", "x2", xSize - rightToolbarWidth); newObj("tools", "imageZone2", "y1", 2); newObj("tools", "imageZone2", "y2", ySize - 1) + +local function drawFromMassiv(clearScreenOrNot) + + if clearScreenOrNot then ecs.square(obj["tools"]["imageZone2"]["x1"], obj["tools"]["imageZone2"]["y1"], obj["tools"]["imageZone2"]["x2"] - obj["tools"]["imageZone2"]["x1"] + 1, obj["tools"]["imageZone2"]["y2"] - obj["tools"]["imageZone2"]["y1"] + 1, padColor) end + + obj["tools"]["imageZone"] = {} + newObj("tools","imageZone","x1",drawImageFromX);newObj("tools","imageZone","x2",drawImageFromX+imageWidth-1);newObj("tools","imageZone","y1",drawImageFromY);newObj("tools","imageZone","y2",drawImageFromY+imageHeight-1) + + + local x = drawImageFromX - 1 + local y = drawImageFromY - 1 + + --[[local PLUSY = drawImageFromY + imageHeight + local PLUSX = drawImageFromX + imageWidth]] + + mergeLayersToMasterPixels() + + for i=1,imageHeight do + for j=1,imageWidth do + + local xOnScreen = drawImageFromX + j - 1 + local yOnScreen = drawImageFromY + i - 1 + + if xOnScreen >= obj["tools"]["imageZone2"]["x1"] and xOnScreen <= obj["tools"]["imageZone2"]["x2"] and yOnScreen >= obj["tools"]["imageZone2"]["y1"] and yOnScreen <= obj["tools"]["imageZone2"]["y2"] then + + if MasterPixels[i][j][3] ~= transparentSymbol then + + gpu.setBackground(MasterPixels[i][j][1]) + gpu.setForeground(MasterPixels[i][j][2]) + gpu.set(x+j, y+i, MasterPixels[i][j][3]) + + + else + + gpu.setBackground(transparentBackground) + gpu.setForeground(transparentForeground) + gpu.set(x+j, y+i, transparentSymbol) + + end + + --[[ТЕНЬ, БЛЯДЬ + gpu.setBackground(shadowColor) + + if PLUSY <= obj["tools"]["imageZone2"]["y2"] then + gpu.set(xOnScreen,PLUSY," ") + end + + if PLUSX <= obj["tools"]["imageZone2"]["x2"]-1 then + gpu.fill(PLUSX,yOnScreen,2,1," ") + end]] + end + end + end +end + +--[[local function drawFromMassiv() + local x = drawImageFromX - 1 + local y = drawImageFromY - 1 + + mergeLayersToMasterPixels() + + for i=1,imageHeight do + for j=1,imageWidth do + + if MasterPixels[i][j][3] ~= transparentSymbol then + + gpu.setBackground(MasterPixels[i][j][1]) + gpu.setForeground(MasterPixels[i][j][2]) + gpu.set(x+j, y+i, MasterPixels[i][j][3]) + + + else + + gpu.setBackground(transparentBackground) + gpu.setForeground(transparentForeground) + gpu.set(x+j, y+i, transparentSymbol) + + end + end + end + + --ОТРИСОВКА ТЕНИ + gpu.setBackground(shadowColor) + gpu.fill(drawImageFromX+imageWidth,drawImageFromY+1,2,imageHeight," ") + gpu.fill(drawImageFromX+1,drawImageFromY+imageHeight,imageWidth+1,1," ") +end]] + +local function changePixelInMassiv(x,y,layer,background,foreground,symbol) + pixels[layer][2][y] = pixels[layer][2][y] or {} + pixels[layer][2][y][x] = pixels[layer][2][y][x] or {} + pixels[layer][2][y][x][1] = background + pixels[layer][2][y][x][2] = foreground + pixels[layer][2][y][x][3] = symbol +end + +local function drawInstruments(xStart,yStart) + for i=1,#instruments do + local posY = yStart+i*4-4 + local cyka = toolbarColor + + if currentInstrument == i then cyka = toolbarPressColor end + ecs.square(1,posY,6,3,cyka) + gpu.setForeground(toolbarTextColor) + gpu.set(xStart+1,posY+1,instruments[i][2]) + newObj("instruments",i,"x1",xStart);newObj("instruments",i,"x2",xStart+3);newObj("instruments",i,"y1",posY);newObj("instruments",i,"y2",posY+2) + end +end + +local function drawMemory() + local totalMemory = computer.totalMemory() / 1024 + local freeMemory = computer.freeMemory() / 1024 + local usedMemory = totalMemory - freeMemory + + local stro4ka = math.ceil(usedMemory).."/"..math.floor(totalMemory).."KB" + + local posX = xRightToolbar - unicode.len(stro4ka) - 1 + + ecs.colorTextWithBack(posX,ySize,consoleColor2,consoleColor1,stro4ka) +end + +local function console(x,y) + ecs.square(x,y,consoleWidth,1,consoleColor1) + gpu.setForeground(consoleColor2) + gpu.set(x+1,y,consoleText) + + drawMemory() +end + +local function drawTopToolbar() + ecs.square(1,1,xSize,1,toolbarColor) + ecs.colorText(3,1,ecs.colors.lightBlue,"PS") + + local posX = 7 + local spaceBetween = 2 + gpu.setForeground(toolbarTextColor) + for i=1,#topButtons do + gpu.set(posX,1,topButtons[i][1]) + local length = unicode.len(topButtons[i][1]) + newObj("top",i,"x1",posX-1);newObj("top",i,"x2",posX+length);newObj("top",i,"y1",1);newObj("top",i,"y2",1);newObj("top",i,"name",topButtons[i][1]) + + posX = posX + length + spaceBetween + end +end + +local function drawLeftToolbar() + ecs.square(1,2,6,xSize,toolbarColor) + + --ЦВЕТА + ecs.square(3,ySize-3,3,2,foreground) + ecs.square(2,ySize-4,3,2,background) + ecs.colorTextWithBack(3,ySize-1,toolbarTextColor,toolbarColor,"←→") + + drawInstruments(2,2) + + if consoleEnabled then console(7,ySize) end + + newObj("colors",1,"x1",2);newObj("colors",1,"x2",4);newObj("colors",1,"y1",ySize-4);newObj("colors",1,"y2",ySize-3) + newObj("colors",2,"x1",3);newObj("colors",2,"x2",5);newObj("colors",2,"y1",ySize-2);newObj("colors",2,"y2",ySize-2) + newObj("colors",3,"x1",5);newObj("colors",3,"x2",5);newObj("colors",3,"y1",ySize-3);newObj("colors",3,"y2",ySize-3) + + newObj("swapper",1,"x1",3);newObj("swapper",1,"x2",4);newObj("swapper",1,"y1",ySize-1);newObj("swapper",1,"y2",ySize-1) +end + + +newObj("layersZone",1,"x1",xRightToolbar);newObj("layersZone",1,"y1",layersY + 1);newObj("layersZone",1,"x2",xSize-1);newObj("layersZone",1,"y2",layersY + layersDisplayLimit*2+1) + + +--РИСОВАТЬ СЛОИ СПРАВА +local function drawLayers(from) + + obj["layers"] = {} + + local sLayers = #pixels + local posY = layersY + 2 + + local heigthOfGovno = layersDisplayLimit*2 + + --СЕРАЯ ОЧИСТКА ВСЕГО СПРАВА + ecs.square(xRightToolbar,posY,rightToolbarWidth-1,heigthOfGovno,toolbarColor) + + --ВЕРНОЕ ОТОБРАЖЕНИЕ СКРОЛЛБАРА, РАСЧЕТ, ДОКУДОВА ОНО БУДЕТ ЕБОШИТЬ + local to = sLayers + if sLayers > layersDisplayLimit then + to = drawLayersFrom + layersDisplayLimit - 1 + end + newScrollBar(xSize,posY-1,heigthOfGovno+1,sLayers,drawLayersFrom,to,padColor,ecs.colors.lightBlue) + + --СОЗДАНИЕ ХОРОШИХ ПЕРЕМННЫХ, ЧТОБЫ В ЦИКЛЕ НЕ СОЗДАВАЛИСЬ ПЛЮСИКИ + local dlyaCiklaO4istka = rightToolbarWidth - 4 + local dlyaCiklaText = xRightToolbar + 4 + local dlyaCiklaVision = xRightToolbar + 1 + local dlyaCiklaVisionPoloskaSprava = dlyaCiklaVision + 1 + local dlyaCiklaStartOfSelectionBlue = xRightToolbar+3 + + --СОЗДАНИЕ РАЗДЕЛИТЕЛЯ НУЖНОЙ ДЛИНЫ ПО ТИПУ STRING.REP() + local separatorLength = rightToolbarWidth-4 + local separator = "" + for i=1,separatorLength do + separator = separator .. "─" + end + --ФУНКЦИЯ ОТРИСОВКИ РАЗДЕЛИТЕЛЯ + local function drawLayersLine(y,type) + gpu.setForeground(toolbarPressColor) + gpu.setBackground(toolbarColor) + if type == "top" then + gpu.set(xRightToolbar,y,"──┬"..separator) + elseif type == "mid" then + gpu.set(xRightToolbar,y,"──┼"..separator) + else + gpu.set(xRightToolbar,y,"──┴"..separator) + end + end + + drawLayersLine(posY-1,"top") + + --ОТРИСОВКА ВСЕХ СЛОЕВ СПРАВА + local counter = 1 + for i=from,(from+layersDisplayLimit-1) do + + if pixels[i] then + + --СОЗДАНИЕ НАЗВАНИЯ СЛОЯ И ОТРИСОВКА СИНЕНЬКОГО ИЛИ НЕТ + local stroka = ecs.stringLimit("end",pixels[i][1],separatorLength-2,true) + if currentLayer == i then + ecs.square( dlyaCiklaStartOfSelectionBlue, posY, dlyaCiklaO4istka, 1, ecs.colors.blue ) + ecs.colorText(dlyaCiklaText,posY,0xffffff,stroka) + else + gpu.setForeground(toolbarTextColor) + gpu.setBackground(toolbarColor) + gpu.set(dlyaCiklaText,posY,stroka) + end + + --ОТРИСОВКА ВИДИМОГО ИЛИ НЕВИДИМОГО ГЛАЗКА + gpu.setBackground(toolbarPressColor) + gpu.setForeground(toolbarTextColor) + if pixels[i][3] then + gpu.set(dlyaCiklaVision,posY,layersIsVisibleSymbol) + else + gpu.set(dlyaCiklaVision,posY,layersIsNotVisibleSymbol) + end + + --ОТРИСОВКА РАЗДЕЛИТЕЛЕЙ ПО УСЛОВИЯМ + if counter < sLayers and counter < layersDisplayLimit then + drawLayersLine(posY + 1, "mid") + else + drawLayersLine(posY + 1, "bot") + end + gpu.set(dlyaCiklaVisionPoloskaSprava, posY, "│") + + --СОЗДАНИЕ ОБЪЕКТОВ + newObj("layers",i,"x1",xRightToolbar+3);newObj("layers",i,"x2",xSize);newObj("layers",i,"y",posY) + newObj("layerEyes",i,"x1",xRightToolbar+1);newObj("layerEyes",i,"x2",xRightToolbar+1);newObj("layerEyes",i,"y",posY) + + posY = posY + 2 + counter = counter + 1 + end + + end + + --РИСОВАНИЕ КНОПОЧЕК УПРАВЛЕНИЯ СЛОЯМИ + obj["layerButtons"] = {} + ecs.square(xRightToolbar, ySize, rightToolbarWidth, 1, toolbarPressColor + 0x111111) + + --ЭТО ШОБ КОД СОКРАТИТЬ, Я ЖЕ ТИПА ПРО + local function drawLayerButton(xPos,name,good) + if not good then + ecs.colorText(xPos,ySize,0x000000,name) + else + ecs.colorText(xPos,ySize,toolbarTextColor,name) + newObj("layerButtons",name,"x1",xPos);newObj("layerButtons",name,"x2",xPos);newObj("layerButtons",name,"y",ySize) + end + end + + local xPos = xRightToolbar + 1 + for i = 1, #buttons do + + if i == 1 then + + if currentLayer <= 1 then + drawLayerButton(xPos,buttons[i],false) + else + drawLayerButton(xPos,buttons[i],true) + end + + elseif i == 2 then + + if currentLayer >= sLayers then + drawLayerButton(xPos,buttons[i],false) + else + drawLayerButton(xPos,buttons[i],true) + end + + elseif i == 3 then + + drawLayerButton(xPos,buttons[i],true) + + elseif i == 4 then + + if sLayers > 1 and currentLayer < sLayers then + drawLayerButton(xPos,buttons[i],true) + else + drawLayerButton(xPos,buttons[i],false) + end + + elseif i == 5 then + + if sLayers >= layersLimit then + drawLayerButton(xPos,buttons[i],false) + else + drawLayerButton(xPos,buttons[i],true) + end + + elseif i == 6 then + + if sLayers <= 1 then + drawLayerButton(xPos,buttons[i],false) + else + drawLayerButton(xPos,buttons[i],true) + end + + end + + xPos = xPos + 3 + end + + +end + +local function drawLayersBEZVOPROSOVCYKA() + local sLayers = #pixels + drawLayersFrom = sLayers - layersDisplayLimit + 1 + if sLayers < layersDisplayLimit then drawLayersFrom = 1 end + drawLayers(drawLayersFrom) +end + +local function drawRightToolbar() + ecs.square(xRightToolbar,2,rightToolbarWidth,ySize-1,toolbarColor) + + ecs.square(xRightToolbar,historyY,rightToolbarWidth,1,toolbarPressColor) + ecs.colorText(xRightToolbar+1,historyY,toolbarTextColor,"Хуйня какая-то") + + ecs.square(xRightToolbar,layersY,rightToolbarWidth,1,toolbarPressColor) + ecs.colorText(xRightToolbar+1,layersY,toolbarTextColor,"Слои") + + drawLayers(drawLayersFrom) +end + +local function scrollLayers(direction) + if direction == 1 then + drawLayersFrom = drawLayersFrom - 1 + if drawLayersFrom < 1 then + drawLayersFrom = 1 + else + drawLayers(drawLayersFrom) + end + else + drawLayersFrom = drawLayersFrom + 1 + if drawLayersFrom + layersDisplayLimit -1 > #pixels then + drawLayersFrom = drawLayersFrom - 1 + + else + --ЭТО ШОБ НЕ СКРОЛЛИТЬ НИЖЕ КАРОЧ, А ТО ВЫЛЕЗЕТ И БУДЕТ 1 ЭЛЕМЕНТ ТОЛЬКА КАРОЧ + if drawLayersFrom > #pixels - layersDisplayLimit + 1 then + drawLayersFrom = drawLayersFrom - 1 + end + + drawLayers(drawLayersFrom) + end + end +end + +--ДОБАВИТЬ НОВЫЙ ЭЛЕМЕНТ В ИСТОРИЮ ЭТОГО КАЛОПРОИЗВОДСТВА +local function addElementToLayers(discription) + table.insert(pixels, 1, {"Слой "..(#pixels+1), {}, true}) + + --НУ ТУТ И ТАК ФСО ЯСНА, БЛЯДЬ + currentLayer = 1 +end + +local function duplicateLayer(from) + local hehe = {"Копия "..pixels[from][1], {}, true} + for key,val in pairs(pixels[from][2]) do + hehe[2][key] = val + end + + table.insert(pixels, from, hehe) + hehe = nil +end + +local function moveLayer(from,direction) + local hehe = {} + for key,val in pairs(pixels[from]) do + hehe[key] = val + end + + if direction == "up" then + pixels[from] = pixels[from - 1] + pixels[from - 1] = hehe + currentLayer = currentLayer - 1 + else + pixels[from] = pixels[from + 1] + pixels[from + 1] = hehe + currentLayer = currentLayer + 1 + end + + hehe = nil + + drawFromMassiv() +end + +local function joinLayer(from) + local fromPlusOne = from + 1 + for j=1,imageHeight do + if pixels[from][2][j] then + for i = 1,imageWidth do + if pixels[from][2][j][i] then + pixels[fromPlusOne][2][j] = pixels[fromPlusOne][2][j] or {} + pixels[fromPlusOne][2][j][i] = pixels[from][2][j][i] + end + end + end + end + pixels[fromPlusOne][1] = pixels[from][1].." и "..pixels[fromPlusOne][1] + table.remove(pixels,from) +end + +local function deleteLayer(layer) + table.remove(pixels,layer) + if currentLayer > #pixels then currentLayer = #pixels end + + drawLayers(drawLayersFrom) + drawFromMassiv() +end + +local function HEXtoSTRING(color,withNull) + local stro4ka = string.format("%x",color) + local sStro4ka = unicode.len(stro4ka) + + if sStro4ka < 6 then + for i=1,(6-sStro4ka) do + stro4ka = "0"..stro4ka + end + end + + if withNull then return "0x"..stro4ka else return stro4ka end +end + +local function swapColors() + local tempColor = foreground + foreground = background + background = tempColor + tempColor = nil + consoleText = "Цвета переключены. Первичный цвет "..string.format("%x",background)..", вторичный "..string.format("%x",foreground) + drawLeftToolbar() +end + +local function save(path) + mergeLayersToMasterPixels() + if fs.exists(path) then fs.remove(path) end + local f = io.open(path,"w") + + for j=1,imageHeight do + for i=1,imageWidth do + f:write(HEXtoSTRING(MasterPixels[j][i][1])," ",HEXtoSTRING(MasterPixels[j][i][2])," ",MasterPixels[j][i][3]," ") + --f:write(MasterPixels[j][i][1], " ", MasterPixels[j][i][2], " ", MasterPixels[j][i][3], " ") + + end + f:write("\n") + end + + f:close() +end + +local function open(path) + local f = io.open(path,"r") + local lines = {} + while true do + local line = f:read("*l") + if not line then + break + else + lines[#lines+1] = line + end + end + f:close() + + local loadedImageWidth = unicode.len(lines[1]) + local loadedImageHeight = #lines + createMassiv() + + for i = 1, #lines do + pixels[1][2][i] = {} + local counter = 1 + for j = 1, loadedImageWidth, 16 do + local loadedBackground = unicode.sub(lines[i], j, j + 5) + local loadedForeground = unicode.sub(lines[i], j + 7, j + 12) + local loadedSymbol = unicode.sub(lines[i], j + 14, j + 14) + pixels[1][2][i][counter] = {tonumber("0x"..loadedBackground), tonumber("0x"..loadedForeground), loadedSymbol} + + counter = counter + 1 + + loadedBackground, loadedForeground, loadedSymbol = nil, nil, nil + end + counter = nil + end + + lines = nil + + imageWidth, imageHeight = loadedImageWidth / 16, loadedImageHeight + drawFromMassiv() +end + +--ОТРИСОВАТЬ ВАЩЕ ВСЕ ЧТО ТОЛЬКО МОЖНО +local function drawAll() + clearScreen(padColor) + drawLeftToolbar() + drawTopToolbar() + drawRightToolbar() + drawFromMassiv() +end + +--А ЭТО КАРОЧ ИЗ ЮНИКОДА В СИМВОЛ - ВРОДЕ РАБОТАЕТ, НО ВСЯКОЕ БЫВАЕТ +local function convertCodeToSymbol(code) + local symbol = nil + if code ~= 0 and code ~= 13 and code ~= 8 then + symbol = unicode.char(code) + if keyboard.isShiftPressed then symbol = unicode.upper(symbol) end + end + return symbol +end + +--КРАСИВАЯ ШТУЧКА ДЛЯ ВВОДА ТЕКСТА +local function inputText(x,y,limit,textColor) + + textColor = textColor or background + + local oldPixels = ecs.rememberOldPixels(x,y-1,x+limit-1,y+1) + + local text = "" + local inputPos = 1 + + local function drawThisShit() + for i=1,inputPos do + ecs.invertedText(x + i - 1, y + 1, "─") + ecs.adaptiveText(x + i - 1, y - 1, " ", background) + end + ecs.invertedText(x + inputPos - 1, y + 1, "▲")--"▲","▼" + ecs.invertedText(x + inputPos - 1, y - 1, "▼") + ecs.adaptiveText(x,y,ecs.stringLimit("start",text,limit,false),textColor) + end + + drawThisShit() + + while true do + local e = {event.pull()} + if e[1] == "key_down" then + if e[4] == 14 then + if unicode.len(text) >= 1 then + text = unicode.sub(text, 1, -2) + if unicode.len(text) < (limit - 1) then + inputPos = inputPos - 1 + end + ecs.drawOldPixels(oldPixels) + drawThisShit() + end + elseif e[4] == 28 then + break + else + local symbol = convertCodeToSymbol(e[3]) + if symbol ~= nil then + text = text .. symbol + if unicode.len(text) < limit then + inputPos = inputPos + 1 + end + drawThisShit() + end + end + end + end + + ecs.drawOldPixels(oldPixels) + return text +end + +--СОХРАНЕНИЕ ТЕКСТА В МАССИВ ПИКСЕЛЕЙ, НО ЕСЛИ ЧЕТ ПРЕВЫШАЕТ ИЛИ ЕЩЕ КАКАЯ ХУЙНЯ - ТО СОСИ! +local function saveTextToPixels(x,y,text) + local sText = unicode.len(text) + pixels[currentLayer][2][y] = pixels[currentLayer][2][y] or {} + for i=1,sText do + local xPlusIMinus1 = x + i - 1 + local kuso4ek = unicode.sub(text,i,i) + if pixels[currentLayer][2][y][xPlusIMinus1] then + pixels[currentLayer][2][y][xPlusIMinus1][2] = background + pixels[currentLayer][2][y][xPlusIMinus1][3] = kuso4ek + else + pixels[currentLayer][2][y][xPlusIMinus1] = {} + pixels[currentLayer][2][y][xPlusIMinus1][1] = foreground + pixels[currentLayer][2][y][xPlusIMinus1][2] = background + pixels[currentLayer][2][y][xPlusIMinus1][3] = kuso4ek + end + end +end + +local function newFile() + consoleText = "Новое изображение" + createMassiv() + currentLayer = 1 + drawAll() +end + +--------------------------------------ПРОЖКА------------------------------------------------------- + +if arg[1] == "-o" or arg[1] == "open" then + open(arg[2]) + drawAll() +elseif arg[1] == "-n" or arg[1] == "new" then + imageWidth = arg[2] + imageHeight = arg[3] + newFile() +end + +--ecs.palette(5,5,0xff0000) + +local breakLags = false + +while true do + + local eventData = {event.pull()} + breakLags = false + + if eventData[1] == "touch" or eventData[1] == "drag" then + + local coordInMassivX = eventData[3] - drawImageFromX + 1 + local coordInMassivY = eventData[4] - drawImageFromY + 1 + + if eventData[5] == 0 then + consoleText = "Левый клик мышью, x = "..eventData[3]..", y = "..eventData[4] + console(7,ySize) + if ecs.clickedAtArea(eventData[3],eventData[4],obj["tools"]["imageZone"]["x1"],obj["tools"]["imageZone"]["y1"],obj["tools"]["imageZone"]["x2"],obj["tools"]["imageZone"]["y2"]) then + + if pixels[currentLayer][3] then + --ЕСЛИ КИСТЬ + if currentInstrument == 2 then + + ecs.colorTextWithBack(eventData[3],eventData[4],foreground,background,symbol) + + changePixelInMassiv(coordInMassivX,coordInMassivY,currentLayer,background,foreground,symbol) + + elseif currentInstrument == 3 then + + ecs.colorTextWithBack(eventData[3],eventData[4],transparentForeground,transparentBackground,transparentSymbol) + + changePixelInMassiv(coordInMassivX,coordInMassivY,currentLayer,transparentBackground,transparentForeground,transparentSymbol) + elseif currentInstrument == 5 then + + local limit = imageWidth - coordInMassivX + 1 + local text = inputText(eventData[3],eventData[4],limit) + if text == "" then text = transparentSymbol end + + local sText = unicode.len(text) + if sText > limit then text = unicode.sub(text,1,limit) end + + saveTextToPixels(coordInMassivX,coordInMassivY,text) + drawFromMassiv() + end + + breakLags = true + else + ecs.error("Каким раком я те буду рисовать на слое, который выключен, тупая ты блядина?") + end + + end + + for key,val in pairs(obj["instruments"]) do + if breakLags then break end + if ecs.clickedAtArea(eventData[3],eventData[4],obj["instruments"][key]["x1"],obj["instruments"][key]["y1"],obj["instruments"][key]["x2"],obj["instruments"][key]["y2"]) then + currentInstrument = key + consoleText = "Выбран инструмент "..instruments[key][1] + drawLeftToolbar() + + breakLags = true + end + end + + for key,val in pairs(obj["colors"]) do + if breakLags then break end + if ecs.clickedAtArea(eventData[3],eventData[4],obj["colors"][key]["x1"],obj["colors"][key]["y1"],obj["colors"][key]["x2"],obj["colors"][key]["y2"]) then + local CYKA = {gpu.get(eventData[3],eventData[4])} + local chosenColor = palette.drawPalette("auto","auto",CYKA[3]) + if chosenColor then + if key == 1 then + background = chosenColor + consoleText = "Основной цвет изменен на 0x"..string.format("%x",chosenColor) + else + foreground = chosenColor + consoleText = "Вторичный цвет изменен на 0x"..string.format("%x",chosenColor) + end + end + clearScreen(padColor) + drawLeftToolbar() + drawTopToolbar() + drawFromMassiv() + drawRightToolbar() + + breakLags = true + end + end + + if ecs.clickedAtArea(eventData[3],eventData[4],obj["swapper"][1]["x1"],obj["swapper"][1]["y1"],obj["swapper"][1]["x2"],obj["swapper"][1]["y2"]) then + ecs.colorTextWithBack(3,ySize-1,0xff0000,toolbarColor,"←→") + os.sleep(0.3) + swapColors() + end + + for key,val in pairs(obj["layers"]) do + if breakLags then break end + if ecs.clickedAtArea(eventData[3],eventData[4],obj["layers"][key]["x1"],obj["layers"][key]["y"],obj["layers"][key]["x2"],obj["layers"][key]["y"]) then + if currentLayer ~= key then + currentLayer = key + else + local limit = xSize - xRightToolbar - 5 + ecs.square(xRightToolbar+4, obj["layers"][key]["y"], limit, 1, ecs.colors.blue) + local text = inputText(xRightToolbar + 4, obj["layers"][key]["y"], limit, 0xffffff) + if text == "" then + text = pixels[key][1] + else + pixels[key][1] = text + end + end + + drawLayers(drawLayersFrom) + breakLags = true + end + end + + for key,val in pairs(obj["layerEyes"]) do + if breakLags then break end + if ecs.clickedAtArea(eventData[3],eventData[4],obj["layerEyes"][key]["x1"],obj["layerEyes"][key]["y"],obj["layerEyes"][key]["x2"],obj["layerEyes"][key]["y"]) then + if pixels[key][3] then + pixels[key][3] = false + else + pixels[key][3] = true + end + + drawLayers(drawLayersFrom) + drawFromMassiv() + + breakLags = true + end + end + + for key,val in pairs(obj["top"]) do + if breakLags then break end + if ecs.clickedAtArea(eventData[3],eventData[4],obj["top"][key]["x1"],obj["top"][key]["y1"],obj["top"][key]["x2"],obj["top"][key]["y2"]) then + ecs.colorTextWithBack(obj["top"][key]["x1"],obj["top"][key]["y1"],toolbarTextColor,toolbarPressColor," "..obj["top"][key]["name"].." ") + + --------------------------------------------- + + if obj["top"][key]["name"] == "Файл" then + local action = context.menu(obj["top"][key]["x1"],obj["top"][key]["y1"]+1,{"Новый",false,"^N"},{"Открыть",false,"^O"},"-",{"Сохранить",true,"^S"},{"Сохранить как",false,"^!S"},"-",{"Выйти"}) + if action == "Сохранить как" then + local fileName = "icon.png" + save(fileName) + consoleText = "Файл сохранен как "..fileName + console(7,ySize) + elseif action == "Открыть" then + local fileName = "icon.png" + open(fileName) + consoleText = "Открыт файл "..fileName + console(7,ySize) + elseif action == "Выйти" then + ecs.clearScreen(0x000000) + gpu.setForeground(0xffffff) + gpu.set(1,1,"") + return 0 + elseif action == "Новый" then + newFile() + end + end + + --------------------------------------------- + + drawTopToolbar() + + breakLags = true + end + end + + for key,val in pairs(obj["layerButtons"]) do + if breakLags then break end + if ecs.clickedAtArea(eventData[3],eventData[4],obj["layerButtons"][key]["x1"],obj["layerButtons"][key]["y"],obj["layerButtons"][key]["x2"],obj["layerButtons"][key]["y"]) then + ecs.colorTextWithBack(obj["layerButtons"][key]["x1"],obj["layerButtons"][key]["y"],0xff0000,toolbarPressColor+0x111111,key) + os.sleep(0.3) + if key == buttons[5] then + addElementToLayers(discription) + drawLayers(drawLayersFrom) + elseif key == buttons[6] then + deleteLayer(currentLayer) + elseif key == buttons[3] then + duplicateLayer(currentLayer) + drawLayers(drawLayersFrom) + elseif key == buttons[1] then + moveLayer(currentLayer,"up") + drawLayers(drawLayersFrom) + elseif key == buttons[2] then + moveLayer(currentLayer,"down") + drawLayers(drawLayersFrom) + elseif key == buttons[4] then + joinLayer(currentLayer) + drawLayers(drawLayersFrom) + end + + breakLags = true + end + end + end + + elseif eventData[1] == "key_down" then + --КЛАВИША SPACE + if eventData[4] == 57 then + consoleText = "Интерфейс программы перерисован" + drawAll() + --КЛАВИША ENTER + elseif eventData[4] == 28 then + newFile() + --КЛАВИША BACKSPACE + elseif eventData[4] == 14 then + deleteLayer(currentLayer) + --КЛАВИША N + elseif eventData[4] == 49 then + addElementToLayers(discription) + drawLayers(drawLayersFrom) + --КЛАВИША X + elseif eventData[4] == 45 then + swapColors() + --КЛАВИША D + elseif eventData[4] == 32 then + background = 0x000000 + foreground = 0xffffff + drawLeftToolbar() + --КЛАВИША T + elseif eventData[4] == 20 then + currentInstrument = 5 + drawLeftToolbar() + --КЛАВИША T + elseif eventData[4] == 48 then + currentInstrument = 2 + drawLeftToolbar() + --КЛАВИША T + elseif eventData[4] == 18 then + currentInstrument = 3 + drawLeftToolbar() + elseif eventData[4] == 200 then + drawImageFromY = drawImageFromY - 1 + drawFromMassiv(true) + elseif eventData[4] == 208 then + drawImageFromY = drawImageFromY + 1 + drawFromMassiv(true) + elseif eventData[4] == 203 then + drawImageFromX = drawImageFromX - 1 + drawFromMassiv(true) + elseif eventData[4] == 205 then + drawImageFromX = drawImageFromX + 1 + drawFromMassiv(true) + end + + elseif eventData[1] == "scroll" then + + --[[local a1 = gpu.getResolution() + + local a2 = gpu.maxResolution()Ы + local currentScale = a1/a2 + eventData[3] = math.floor(eventData[3]*0.5/currentScale) + eventData[4] = math.floor(eventData[4]*0.5/currentScale)]] + + if ecs.clickedAtArea(eventData[3],eventData[4],obj["layersZone"][1]["x1"],obj["layersZone"][1]["y1"],obj["layersZone"][1]["x2"],obj["layersZone"][1]["y2"]) then + scrollLayers(eventData[5]) + + end + + end +end + +--------------------------------------ВЫХОД ИЗ ПРОЖКИ------------------------------------------------------ + +clearScreen(0x000000) +gpu.setBackground(0x000000) +gpu.setForeground(0xffffff)