MineOS/Applications/Photoshop.lua
2015-08-05 00:03:15 +03:00

1054 lines
31 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.

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)