sokol-luajit/engine/nuklear/png-loader.lua

118 lines
3.2 KiB
Lua
Raw Permalink Normal View History

local stb = require("stb")
local ffi = require("ffi")
local nk = sg
-- A magic cache pool of loaded pngs. Storing filename to data
local images_loaded = {}
-- returns struct nk_image
local function image_load(filename)
local x = ffi.new("int[1]", {0})
local y = ffi.new("int[1]", {0})
local n = ffi.new("int[1]", {4})
local data = stb.stbi_load(filename, x, y, nil, 4)
if (data == nil) then error("[STB]: failed to load image: "..filename); end
print("Image Loaded: "..filename.." Width: "..x[0].." Height: "..y[0].." Channels: "..n[0])
local pixformat = sg.SG_PIXELFORMAT_RGBA8
local sg_img_desc = ffi.new("sg_image_desc[1]")
sg_img_desc[0].width = x[0]
sg_img_desc[0].height = y[0]
sg_img_desc[0].pixel_format = pixformat
sg_img_desc[0].sample_count = 1
sg_img_desc[0].data.subimage[0][0].ptr = data
sg_img_desc[0].data.subimage[0][0].size = x[0] * y[0] * n[0]
local new_img = sg.sg_make_image(sg_img_desc)
-- // create a sokol-nuklear image object which associates an sg_image with an sg_sampler
local img_desc = ffi.new("snk_image_desc_t[1]")
img_desc[0].image = new_img
local snk_img = nk.snk_make_image(img_desc)
local nk_hnd = nk.snk_nkhandle(snk_img)
local nk_img = nk.nk_image_handle(nk_hnd);
return nk_img
end
----------------------------
local function image_create( buffer, width, height, channels )
channels = channels or 4
local x = ffi.new("int[1]", {width})
local y = ffi.new("int[1]", {height})
local n = ffi.new("int[1]", {channels})
local data = ffi.new("unsigned char[?]", width * height * channels)
ffi.copy(data, ffi.cast("unsigned char *",buffer), width * height * channels)
local pixformat = sg.SG_PIXELFORMAT_RGBA8
if(channels == 1) then
pixformat = sg.SG_PIXELFORMAT_R8
elseif(channels == 2) then
pixformat = sg.SG_PIXELFORMAT_RG8
end
local sg_img_desc = ffi.new("sg_image_desc[1]")
sg_img_desc[0].width = x[0]
sg_img_desc[0].height = y[0]
sg_img_desc[0].pixel_format = pixformat
sg_img_desc[0].sample_count = 1
sg_img_desc[0].data.subimage[0][0].ptr = data
sg_img_desc[0].data.subimage[0][0].size = x[0] * y[0] * channels
local new_img = sg.sg_make_image(sg_img_desc)
-- // create a sokol-nuklear image object which associates an sg_image with an sg_sampler
local img_desc = ffi.new("snk_image_desc_t[1]")
img_desc[0].image = new_img
local snk_img = nk.snk_make_image(img_desc)
local nk_hnd = nk.snk_nkhandle(snk_img)
local nk_img = nk.nk_image_handle(nk_hnd);
return snk_img, nk_hnd, data
end
----------------------------
local function load(filename)
local imgid = image_load(filename)
images_loaded[filename] =imgid
return imgid
end
----------------------------
local function loadbuffer(filename)
local imgid = image_load(filename)
images_loaded[filename] =imgid
return imgid
end
----------------------------
local function getimage(filename)
return images_loaded[filename]
end
----------------------------
return {
load = load,
loadbuffer = loadbuffer,
getimage = getimage,
image_load = image_load,
image_create = image_create,
}
----------------------------