local GUI = require("GUI") local screen = require("Screen") local image = require("Image") ------------------------------------------------------ local workspace, window, menu = select(1, ...), select(2, ...), select(3, ...) local tool = {} local locale = select(4, ...) tool.shortcut = "Slc" tool.keyCode = 50 tool.about = locale.tool1 local selector, touchX, touchY, dragX, dragY = GUI.object(1, 1, 1, 1) local fillButton = window.newButton1(locale.fill) local outlineButton = window.newButton1(locale.outline) local rasterizeLineButton = window.newButton1(locale.rasterizeLine) local rasterizeEllipseButton = window.newButton1(locale.rasterizeEllipse) local rasterizePolygonButton = window.newButton1(locale.rasterizePolygon) local clearButton = window.newButton2(locale.clear) local cropButton = window.newButton2(locale.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(rasterizePolygonButton).onTouch = function() local container = GUI.addBackgroundContainer(workspace, true, true, locale.polygonEdges) container.panel.eventHandler = nil local edgesSelector = container.layout:addChild(GUI.comboBox(1, 1, 30, 3, 0xEEEEEE, 0x2D2D2D, 0xCCCCCC, 0x888888)) for i = 3, 10 do edgesSelector:addItem(i) end container.layout:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, locale.ok)).onTouch = function() screen.rasterizePolygon( touchX - window.image.x + 1, touchY - window.image.y + 1, dragX - window.image.x + 1, dragY - window.image.y + 1, edgesSelector.selectedItem + 2, function(x, y) if x <= window.image.data[1] and y <= window.image.data[2] and x > 0 and y > 0 then image.set(window.image.data, x, y, window.primaryColorSelector.color, 0x0, 0, " ") end end ) container:remove() end container.layout:addChild(GUI.button(1, 1, 30, 3, 0xFFFFFF, 0x555555, 0x880000, 0xFFFFFF, locale.cancel)).onTouch = function() container:remove() 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 e3, e4 = math.ceil(e3), math.ceil(e4) touchX, touchY, dragX, dragY = e3, e4, e3, e4 repositionSelector() elseif e1 == "drag" then e3, e4 = math.ceil(e3), math.ceil(e4) dragX, dragY = e3, e4 repositionSelector() end end selector.eventHandler = tool.eventHandler selector.draw = function() -- Border local temp = true for x = selector.x + 1, selector.x + selector.width - 2 do screen.drawText(x, selector.y, temp and 0xFFFFFF or 0x0, "━") screen.drawText(x, selector.y + selector.height - 1, temp and 0xFFFFFF or 0x0, "━") temp = not temp end temp = true for y = selector.y + 1, selector.y + selector.height - 2 do screen.drawText(selector.x, y, temp and 0xFFFFFF or 0x0, "┃") screen.drawText(selector.x + selector.width - 1, y, temp and 0xFFFFFF or 0x0, "┃") temp = not temp 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, "┗") -- Corners screen.drawText(touchX, touchY, 0x66FF80, "●") screen.drawText(dragX, dragY, 0x66FF80, "●") -- Size temp = selector.width .. " px" screen.drawText(math.floor(selector.x + selector.width / 2 - #temp / 2), selector.y + selector.height, 0xFFFFFF, temp) screen.drawText(selector.x + selector.width + 1, math.floor(selector.y + selector.height / 2), 0xFFFFFF, selector.height .. " px") end ------------------------------------------------------ return tool