Oops, last version was missing some files
This commit is contained in:
parent
caffc7042c
commit
f4d3774c13
2 changed files with 3852 additions and 0 deletions
3776
src/core/lanczos.cpp
Normal file
3776
src/core/lanczos.cpp
Normal file
File diff suppressed because it is too large
Load diff
76
src/genlanczos.lua
Normal file
76
src/genlanczos.lua
Normal 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);
|
Loading…
Add table
Reference in a new issue