90 lines
3.0 KiB
Plaintext
90 lines
3.0 KiB
Plaintext
print(love.filesystem.createDirectory("Cache"))
|
|
local multi,thread = require("multi"):init()
|
|
GLOBAL,THREAD = require("multi.integration.loveManager"):init()
|
|
local queue = multi:newSystemThreadedJobQueue(16)
|
|
local LoadImage = queue:newFunction(function(path)
|
|
return love.image.newImageData(path)
|
|
end)
|
|
local DownloadImage = queue:newFunction(function(url,hash)
|
|
print = THREAD:getConsole().print
|
|
require("love.image")
|
|
require("love.filesystem")
|
|
require("love.data")
|
|
local http = require("socket.http")
|
|
local request = require("luajit-request")
|
|
function download(path)
|
|
if path:find("https") then
|
|
return request.send(path).body
|
|
elseif path:find("http") then
|
|
return http.request(path)
|
|
end
|
|
end
|
|
local data = download(url)
|
|
function IsImage(str)
|
|
return str:find("\0")~=nil -- Image Data will contain nul character
|
|
end
|
|
love.filesystem.createDirectory("Cache")
|
|
if IsImage(data or "") then
|
|
love.filesystem.write("Cache/"..hash..".jpg", data)
|
|
return love.image.newImageData("Cache/"..hash..".jpg")
|
|
else
|
|
return "noimage"
|
|
end
|
|
end)
|
|
local cache = {}
|
|
function gui:SetImage(i,inthread,backup)
|
|
if not i then return end
|
|
if self.scale.size.x~=0 or self.scale.size.y~=0 then
|
|
gui.OnScreenSizeChanged(function()
|
|
multi:newAlarm(.01):OnRing(function() self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth) end)
|
|
end)
|
|
end
|
|
if type(i) == "userdata" and i:type() == "Image" then
|
|
self.Image=i
|
|
self.ImageHeigth=self.Image:getHeight()
|
|
self.ImageWidth=self.Image:getWidth()
|
|
self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth)
|
|
elseif type(i)=="string" then
|
|
if cache[i] then
|
|
self:SetImage(cache[i])
|
|
else
|
|
if i:match([[https?://]]) then
|
|
local hash = love.data.encode("string", "hex",love.data.hash("md5", i))
|
|
if love.filesystem.getInfo("Cache/"..hash..".jpg") then
|
|
self:SetImage("Cache/"..hash..".jpg")
|
|
return
|
|
end
|
|
DownloadImage(i,hash).connect(function(img)
|
|
if img == "noimage" then
|
|
if backup then
|
|
return self:SetImage(backup)
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
self.Image = love.graphics.newImage(img)
|
|
cache[i]=self.Image
|
|
self.ImageHeigth=self.Image:getHeight()
|
|
self.ImageWidth=self.Image:getWidth()
|
|
self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth)
|
|
end)
|
|
else
|
|
if inthread or self.threadable then
|
|
func(i).connect(function(img)
|
|
self.Image = love.graphics.newImage(img)
|
|
cache[i]=self.Image
|
|
self.ImageHeigth=self.Image:getHeight()
|
|
self.ImageWidth=self.Image:getWidth()
|
|
self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth)
|
|
end)
|
|
else
|
|
self.Image = love.graphics.newImage(i)
|
|
cache[i]=self.Image
|
|
self.ImageHeigth=self.Image:getHeight()
|
|
self.ImageWidth=self.Image:getWidth()
|
|
self.Quad=love.graphics.newQuad(0,0,self.width,self.height,self.ImageWidth,self.ImageHeigth)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end |