mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 11:09:21 +01:00
133 lines
3.5 KiB
Lua
133 lines
3.5 KiB
Lua
--[[
|
|
PNGView
|
|
by TehSomeLuigi, 2014
|
|
|
|
Intended for use with OpenComputers.
|
|
|
|
Feel free to use however you wish.
|
|
This header must however be preserved should this be redistributed, even
|
|
if in a modified form.
|
|
|
|
This software comes with no warranties whatsoever.
|
|
]]--
|
|
|
|
local args = {...}
|
|
|
|
--package.loaded.libPNGimage = nil
|
|
--package.loaded.deflatelua = nil
|
|
|
|
local term = require("term")
|
|
local fs = require("filesystem")
|
|
local shell = require("shell")
|
|
local component = require("component")
|
|
local bit = require("bit32")
|
|
local PNGImage = require("libPNGimage")
|
|
|
|
|
|
local out = io.stdout
|
|
local err = io.stderr
|
|
|
|
if not args[1] then
|
|
print("Enter filename of PNG Image:")
|
|
io.stdout:write(": ")
|
|
args[1] = io.read()
|
|
elseif args[1] == "-h" or args[1] == "--help" or args[1] == "-?" then
|
|
print(" * PNGView Help *")
|
|
print("Usage: pngview")
|
|
print(" (asks for filename)")
|
|
print("Usage: pngview <filename>")
|
|
print("Use Ctrl+C to exit once started.")
|
|
end
|
|
|
|
args[1] = shell.resolve(args[1])
|
|
|
|
if not fs.exists(args[1]) then
|
|
io.stderr:write(" * PNGView Error *\n")
|
|
io.stderr:write("The file '" .. tostring(args[1]) .. "' does not exist on the filesystem.\n")
|
|
return
|
|
end
|
|
|
|
if not component.isAvailable("gpu") then
|
|
io.stderr:write(" * PNGView Error *\n")
|
|
io.stderr:write("Component API says there is no primary GPU.\n")
|
|
return
|
|
end
|
|
|
|
local gpu = component.getPrimary("gpu")
|
|
|
|
-- now attempt to load the PNG image
|
|
-- run in protected call to handle potential errors
|
|
|
|
local success, pngiOrError = pcall(PNGImage.newFromFile, args[1])
|
|
|
|
if not success then
|
|
io.stderr:write(" * PNGView: PNG Loading Error *\n")
|
|
io.stderr:write("While attempting to load '" .. tostring(args[1]) .. "' as PNG, libPNGImage erred:\n")
|
|
io.stderr:write(pngiOrError)
|
|
return
|
|
end
|
|
|
|
local pngi = pngiOrError
|
|
|
|
local imgW, imgH = pngi:getSize()
|
|
local maxresW, maxresH = gpu.maxResolution()
|
|
|
|
if imgW > maxresW then
|
|
-- in future, we will attempt some scaling or scrolling
|
|
io.stderr:write(" * PNGView: PNG Display Error *\n")
|
|
io.stderr:write("Resolution not satisfactory: A width resolution of at least " .. imgW .. " is required, only " .. maxresW .. " available:\n")
|
|
io.stderr:write(pngiOrError)
|
|
return
|
|
end
|
|
|
|
if imgH > maxresH then
|
|
-- in future, we will attempt some scaling or scrolling
|
|
io.stderr:write(" * PNGView: PNG Display Error *\n")
|
|
io.stderr:write("Resolution not satisfactory: A height resolution of at least " .. imgH .. " is required, only " .. maxresH .. " available:\n")
|
|
io.stderr:write(pngiOrError)
|
|
return
|
|
end
|
|
|
|
local oldResW, oldResH = gpu.getResolution() -- store for later
|
|
local oldBackN, oldBackB = gpu.getBackground()
|
|
local oldForeN, oldForeB = gpu.getForeground()
|
|
|
|
|
|
local block = string.char(226, 150, 136)
|
|
local trans = string.char(226, 150, 145)
|
|
|
|
|
|
gpu.setResolution(maxresW, maxresH)
|
|
gpu.setBackground(0x000000, false)
|
|
|
|
local function drawPngImage(x, y)
|
|
for j = 0, imgW-1 do
|
|
for i = 0, imgH-1 do
|
|
local r, g, b, a = pngi:getPixel(i, j)
|
|
|
|
if a > 0 then
|
|
gpu.setForeground(bit.bor(bit.lshift(r, 16), bit.bor(bit.lshift(g, 8), b)), false)
|
|
--gpu.set(x+1, y+1, block)
|
|
gpu.fill(x + i * 2, y + j, 2, 1, block)
|
|
--print(x, y, r, g, b, a, bit.bor(bit.lshift(r, 16), bit.bor(bit.lshift(g, 8), b)))
|
|
--[[else
|
|
gpu.setForeground(0x888888, false)
|
|
gpu.set(x+1, y+1, trans)
|
|
--print(x, y, r, g, b, a, 'tr')
|
|
]]
|
|
end
|
|
--print(x, y, r, g, b, a)
|
|
end
|
|
end
|
|
end
|
|
|
|
ecs.prepareToExit()
|
|
|
|
drawPngImage(2, 2)
|
|
|
|
ecs.waitForTouchOrClick()
|
|
|
|
gpu.setResolution(oldResW, oldResH)
|
|
gpu.setForeground(oldForeN, oldForeB)
|
|
gpu.setBackground(oldBackN, oldBackB)
|