2019-01-25 08:24:34 +03:00

163 lines
5.5 KiB
Lua

local GUI = require("GUI")
local screen = require("Screen")
local image = require("Image")
------------------------------------------------------
local workspace, window, menu = select(1, ...), select(2, ...), select(3, ...)
local tool = {}
tool.shortcut = "Slc"
tool.keyCode = 50
tool.about = "Selection tool allows you to select preferred area on image and to perform some operations on it. Green dots mean start and end points (for example, it needs to line rasterization)"
local selector, touchX, touchY, dragX, dragY = GUI.object(1, 1, 1, 1)
local fillButton = window.newButton1("Fill")
local outlineButton = window.newButton1("Outline")
local rasterizeLineButton = window.newButton1("Rasterize line")
local rasterizeEllipseButton = window.newButton1("Rasterize ellipse")
local clearButton = window.newButton2("Clear")
local cropButton = window.newButton2("Crop")
local function repositionSelector()
if dragX - touchX >= 0 then
selector.localX, selector.width = touchX - window.currentToolOverlay.x + 1, dragX - touchX + 1
else
selector.localX, selector.width = dragX - window.currentToolOverlay.x + 1, touchX - dragX + 1
end
if dragY - touchY >= 0 then
selector.localY, selector.height = touchY - window.currentToolOverlay.y + 1, dragY - touchY + 1
else
selector.localY, selector.height = dragY - window.currentToolOverlay.y + 1, touchY - dragY + 1
end
workspace:draw()
end
local function fitSelector()
touchX, touchY, dragX, dragY = window.image.x, window.image.y, window.image.x + window.image.width - 1, window.image.y + window.image.height - 1
repositionSelector()
end
tool.onSelection = function()
window.currentToolLayout:addChild(fillButton).onTouch = function()
for j = selector.y, selector.y + selector.height - 1 do
for i = selector.x, selector.x + selector.width - 1 do
image.set(window.image.data, i - window.image.x + 1, j - window.image.y + 1, window.primaryColorSelector.color, 0x0, 0, " ")
end
end
workspace:draw()
end
window.currentToolLayout:addChild(outlineButton).onTouch = function()
local x1, y1 = selector.x - window.image.x + 1, selector.y - window.image.y + 1
local x2, y2 = x1 + selector.width - 1, y1 + selector.height - 1
for x = x1, x2 do
image.set(window.image.data, x, y1, window.primaryColorSelector.color, 0x0, 0, " ")
image.set(window.image.data, x, y2, window.primaryColorSelector.color, 0x0, 0, " ")
end
for y = y1 + 1, y2 - 1 do
image.set(window.image.data, x1, y, window.primaryColorSelector.color, 0x0, 0, " ")
image.set(window.image.data, x2, y, window.primaryColorSelector.color, 0x0, 0, " ")
end
workspace:draw()
end
window.currentToolLayout:addChild(rasterizeLineButton).onTouch = function()
screen.rasterizeLine(
touchX - window.image.x + 1,
touchY - window.image.y + 1,
dragX - window.image.x + 1,
dragY - window.image.y + 1,
function(x, y)
image.set(window.image.data, x, y, window.primaryColorSelector.color, 0x0, 0, " ")
end
)
workspace:draw()
end
window.currentToolLayout:addChild(rasterizeEllipseButton).onTouch = function()
local minX, minY, maxX, maxY = math.min(touchX, dragX), math.min(touchY, dragY), math.max(touchX, dragX), math.max(touchY, dragY)
local centerX, centerY = math.ceil(minX + (maxX - minX) / 2), math.ceil(minY + (maxY - minY) / 2)
screen.rasterizeEllipse(
centerX - window.image.x + 1,
centerY - window.image.y + 1,
maxX - centerX,
maxY - centerY,
function(x, y)
image.set(window.image.data, x, y, window.primaryColorSelector.color, 0x0, 0, " ")
end
)
workspace:draw()
end
window.currentToolLayout:addChild(clearButton).onTouch = function()
for j = selector.y, selector.y + selector.height - 1 do
for i = selector.x, selector.x + selector.width - 1 do
image.set(window.image.data, i - window.image.x + 1, j - window.image.y + 1, 0x0, 0x0, 1, " ")
end
end
workspace:draw()
end
window.currentToolLayout:addChild(cropButton).onTouch = function()
window.image.data = image.crop(window.image.data, selector.x - window.image.x + 1, selector.y - window.image.y + 1, selector.width, selector.height)
window.image.reposition()
fitSelector()
end
window.currentToolOverlay:addChild(selector)
fitSelector()
end
tool.eventHandler = function(workspace, object, e1, e2, e3, e4)
if e1 == "touch" then
touchX, touchY, dragX, dragY = e3, e4, e3, e4
repositionSelector()
elseif e1 == "drag" then
dragX, dragY = e3, e4
repositionSelector()
end
end
selector.eventHandler = tool.eventHandler
selector.draw = function()
local step = true
for x = selector.x + 1, selector.x + selector.width - 2 do
screen.drawText(x, selector.y, step and 0xFFFFFF or 0x0, "")
screen.drawText(x, selector.y + selector.height - 1, step and 0xFFFFFF or 0x0, "")
step = not step
end
step = true
for y = selector.y + 1, selector.y + selector.height - 2 do
screen.drawText(selector.x, y, step and 0xFFFFFF or 0x0, "")
screen.drawText(selector.x + selector.width - 1, y, step and 0xFFFFFF or 0x0, "")
step = not step
end
screen.drawText(selector.x, selector.y, 0x0, "")
screen.drawText(selector.x + selector.width - 1, selector.y + selector.height - 1, 0x0, "")
screen.drawText(selector.x + selector.width - 1, selector.y, 0x0, "")
screen.drawText(selector.x, selector.y + selector.height - 1, 0x0, "")
screen.drawText(selector.x, selector.y, 0x66FF80, "")
screen.drawText(selector.x + selector.width - 1, selector.y + selector.height - 1, 0x66FF80, "")
end
------------------------------------------------------
return tool