76 lines
2 KiB
Lua
76 lines
2 KiB
Lua
fnname = arg[1];
|
|
src = tonumber(arg[2]);
|
|
dest = tonumber(arg[3]);
|
|
a = tonumber(arg[4]);
|
|
bits8 = (arg[5] == "8");
|
|
|
|
coeffscale = 16384;
|
|
|
|
coeffs_for = function(xpos, srcsize, dstsize, alpha)
|
|
local ret = {};
|
|
local center = math.floor(xpos * srcsize / dstsize);
|
|
for i = -alpha + 1, alpha do
|
|
local point = center + i;
|
|
local x = point + 0.5 - xpos * srcsize / dstsize - 0.5 * srcsize / dstsize;
|
|
if x < -1e-10 or x > 1e-10 then
|
|
local xpi = x * math.pi;
|
|
if point >= 0 and point < srcsize then
|
|
ret[point] = a * math.sin(xpi) * math.sin(xpi / a) / (xpi * xpi);
|
|
end
|
|
else
|
|
if point >= 0 and point < srcsize then
|
|
ret[point] = 1;
|
|
end
|
|
end
|
|
end
|
|
local sum = 0;
|
|
local k, v;
|
|
for k, v in pairs(ret) do
|
|
sum = sum + v;
|
|
end
|
|
for k, v in pairs(ret) do
|
|
ret[k] = math.floor(coeffscale * ret[k] / sum + 0.5);
|
|
end
|
|
return ret;
|
|
end
|
|
|
|
emit_pixel = function(xpos, srcsize, dstsize, alpha)
|
|
local t = coeffs_for(xpos, srcsize, dstsize, alpha);
|
|
io.stdout:write("tmp[" .. xpos .. "]=(");
|
|
for k,v in pairs(t) do
|
|
io.stdout:write(v .. "*src[" .. k .. "]+");
|
|
end
|
|
io.stdout:write("0)/" .. coeffscale .. ";\n");
|
|
end
|
|
|
|
emit_fn_prologue = function(name, dstsize, b8f)
|
|
if b8f then
|
|
io.stdout:write("void " .. name .. "(unsigned char* dst, unsigned char* src)\n");
|
|
else
|
|
io.stdout:write("void " .. name .. "(unsigned short* dst, unsigned short* src)\n");
|
|
end
|
|
io.stdout:write("{\n");
|
|
io.stdout:write("int tmp[" .. dstsize .. "];\n");
|
|
end
|
|
|
|
emit_fn_epilogue = function(dstsize, b8f)
|
|
io.stdout:write("for(int i = 0; i < " .. dstsize .. "; i++)\n");
|
|
io.stdout:write("if(tmp[i] < 0) dst[i] = 0;\n");
|
|
if b8f then
|
|
io.stdout:write("else if(tmp[i] > 255) dst[i] = 255;\n");
|
|
else
|
|
io.stdout:write("else if(tmp[i] > 65535) dst[i] = 65535;\n");
|
|
end
|
|
io.stdout:write("else dst[i] = tmp[i];\n");
|
|
io.stdout:write("}\n");
|
|
end
|
|
|
|
emit_fn = function(name, srcsize, dstsize, alpha, b8f)
|
|
emit_fn_prologue(name, dstsize, b8f);
|
|
for i = 0, dstsize - 1 do
|
|
emit_pixel(i, srcsize, dstsize, alpha)
|
|
end
|
|
emit_fn_epilogue(dstsize, b8f);
|
|
end
|
|
|
|
emit_fn(fnname, src, dest, a, bits8);
|