Oops, last version was missing some files

This commit is contained in:
Ilari Liusvaara 2011-11-27 23:23:50 +02:00
parent caffc7042c
commit f4d3774c13
2 changed files with 3852 additions and 0 deletions

3776
src/core/lanczos.cpp Normal file

File diff suppressed because it is too large Load diff

76
src/genlanczos.lua Normal file
View file

@ -0,0 +1,76 @@
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);