184 lines
3.7 KiB
Lua
184 lines
3.7 KiB
Lua
require"imlua"
|
|
require"cdlua"
|
|
require"cdluaim"
|
|
require"iuplua"
|
|
require"iupluacd"
|
|
|
|
function PrintError(func, err)
|
|
local msg = {}
|
|
msg[im.ERR_OPEN] = "Error Opening File."
|
|
msg[im.ERR_MEM] = "Insuficient memory."
|
|
msg[im.ERR_ACCESS] = "Error Accessing File."
|
|
msg[im.ERR_DATA] = "Image type not Suported."
|
|
msg[im.ERR_FORMAT] = "Invalid Format."
|
|
msg[im.ERR_COMPRESS] = "Invalid or unsupported compression."
|
|
|
|
if msg[err] then
|
|
print(func..": "..msg[err])
|
|
else
|
|
print("Unknown Error.")
|
|
end
|
|
end
|
|
|
|
function LoadImage(file_name)
|
|
local image
|
|
local ifile, err = im.FileOpen(file_name)
|
|
if not ifile then
|
|
PrintError("open", err)
|
|
return
|
|
end
|
|
|
|
-- load the first image in the file.
|
|
-- force the image to be converted to a bitmap
|
|
image, err = ifile:LoadBitmap()
|
|
if not image then
|
|
PrintError("load", err)
|
|
return
|
|
end
|
|
|
|
ifile:Close()
|
|
return image
|
|
end
|
|
|
|
|
|
dlg = nil -- only one dlg
|
|
|
|
function ShowImage(file_name)
|
|
|
|
local image = LoadImage(file_name)
|
|
if not image then
|
|
return false
|
|
end
|
|
|
|
if dlg then
|
|
local old_canvas = dlg.canvas
|
|
local old_image = dlg.image
|
|
|
|
if old_canvas ~= nil then old_canvas:Kill() end
|
|
if old_image ~= nil then old_image:Destroy() end
|
|
|
|
iup.Destroy(dlg)
|
|
end
|
|
|
|
cnv = iup.canvas{}
|
|
|
|
function cnv:action()
|
|
local canvas = dlg.canvas
|
|
local image = dlg.image
|
|
|
|
if (not canvas) then return end
|
|
|
|
-- posy is top-down, CD is bottom-top.
|
|
-- invert scroll reference (YMAX-DY - POSY).
|
|
y = self.ymax-self.dy - self.posy
|
|
if (y < 0) then y = 0 end
|
|
|
|
|
|
canvas:Activate()
|
|
canvas:Clear()
|
|
x = -self.posx
|
|
y = -y
|
|
image:cdCanvasPutImageRect(canvas, x, y, image:Width(), image:Height(), 0, 0, 0, 0)
|
|
canvas:Flush()
|
|
|
|
return iup.DEFAULT
|
|
end
|
|
|
|
function cnv:button_cb()
|
|
local file_name = "*.*"
|
|
local err
|
|
|
|
file_name, err = iup.GetFile(file_name)
|
|
if err ~= 0 then
|
|
return iup.DEFAULT
|
|
end
|
|
|
|
ShowImage(file_name)
|
|
return iup.DEFAULT
|
|
end
|
|
|
|
|
|
-- Set the Canvas inicial size (IUP will retain this value).
|
|
w = image:Width()
|
|
h = image:Height()
|
|
if (w > 800) then w = 800 end
|
|
if (h > 600) then h = 600 end
|
|
cnv.rastersize = string.format("%dx%d", w, h)
|
|
cnv.border = "no"
|
|
cnv.scrollbar = "yes"
|
|
cnv.xmax = image:Width()-1
|
|
cnv.ymax = image:Height()-1
|
|
|
|
function cnv:resize_cb(w, h)
|
|
self.dx = w
|
|
self.dy = h
|
|
self.posx = self.posx -- needed only in IUP 2.x
|
|
self.posy = self.posy
|
|
end
|
|
|
|
dlg = iup.dialog{cnv}
|
|
dlg.title = file_name
|
|
dlg.cnv = cnv
|
|
dlg.image = image
|
|
|
|
function dlg:close_cb()
|
|
local canvas = self.canvas
|
|
local image = self.image
|
|
|
|
if canvas then canvas:Kill() end
|
|
if image then image:Destroy() end
|
|
|
|
return iup.CLOSE
|
|
end
|
|
|
|
function dlg:map_cb()
|
|
canvas = cd.CreateCanvas(cd.IUP, self.cnv)
|
|
self.canvas = canvas
|
|
self.posx = 0 -- needed only in IUP 2.x
|
|
self.posy = 0
|
|
end
|
|
|
|
dlg:show()
|
|
cnv.rastersize = nil -- to remove the minimum limit
|
|
|
|
return true
|
|
end
|
|
|
|
function main(arg)
|
|
local file_name = "*.*"
|
|
local err
|
|
|
|
-- Try to get a file name from the command line.
|
|
if (arg == nil or table.getn(arg) < 2) then
|
|
file_name, err = iup.GetFile(file_name)
|
|
if err ~= 0 then
|
|
return true
|
|
end
|
|
else
|
|
file_name = arg[1]
|
|
end
|
|
|
|
if not ShowImage(file_name) then
|
|
local Try = true
|
|
-- If ShowImage returns an error I will try to read another image.
|
|
-- I can give up on File Open dlg choosing "Cancel".
|
|
while Try do
|
|
file_name = "*.*"
|
|
|
|
file_name, err = iup.GetFile(file_name)
|
|
if err ~= 0 then
|
|
return true
|
|
end
|
|
|
|
if ShowImage(file_name) then
|
|
Try = false
|
|
end
|
|
end
|
|
end
|
|
|
|
iup.MainLoop()
|
|
return true
|
|
end
|
|
|
|
main(arg)
|