@webarkit/jsfeat-next
Version:
Typescript version of jsfeat for WebARKit
165 lines • 5.83 kB
JavaScript
export function _resample_u8(src, dst, cache, nw, nh) {
let xofs_count = 0;
const ch = src.channel, w = src.cols, h = src.rows;
const src_d = src.data, dst_d = dst.data;
const scale_x = w / nw, scale_y = h / nh;
const inv_scale_256 = (scale_x * scale_y * 0x10000) | 0;
let dx = 0, dy = 0, sx = 0, sy = 0, sx1 = 0, sx2 = 0, i = 0, k = 0, fsx1 = 0.0, fsx2 = 0.0;
let a = 0, b = 0, dxn = 0, alpha = 0, beta = 0, beta1 = 0;
const buf_node = cache.get_buffer((nw * ch) << 2);
const sum_node = cache.get_buffer((nw * ch) << 2);
const xofs_node = cache.get_buffer((w * 2 * 3) << 2);
const buf = buf_node.i32;
const sum = sum_node.i32;
const xofs = xofs_node.i32;
for (; dx < nw; dx++) {
(fsx1 = dx * scale_x), (fsx2 = fsx1 + scale_x);
(sx1 = (fsx1 + 1.0 - 1e-6) | 0), (sx2 = fsx2 | 0);
sx1 = Math.min(sx1, w - 1);
sx2 = Math.min(sx2, w - 1);
if (sx1 > fsx1) {
xofs[k++] = (dx * ch) | 0;
xofs[k++] = ((sx1 - 1) * ch) | 0;
xofs[k++] = ((sx1 - fsx1) * 0x100) | 0;
xofs_count++;
}
for (sx = sx1; sx < sx2; sx++) {
xofs_count++;
xofs[k++] = (dx * ch) | 0;
xofs[k++] = (sx * ch) | 0;
xofs[k++] = 256;
}
if (fsx2 - sx2 > 1e-3) {
xofs_count++;
xofs[k++] = (dx * ch) | 0;
xofs[k++] = (sx2 * ch) | 0;
xofs[k++] = ((fsx2 - sx2) * 256) | 0;
}
}
for (dx = 0; dx < nw * ch; dx++) {
buf[dx] = sum[dx] = 0;
}
dy = 0;
for (sy = 0; sy < h; sy++) {
a = w * sy;
for (k = 0; k < xofs_count; k++) {
dxn = xofs[k * 3];
sx1 = xofs[k * 3 + 1];
alpha = xofs[k * 3 + 2];
for (i = 0; i < ch; i++) {
buf[dxn + i] += src_d[a + sx1 + i] * alpha;
}
}
if ((dy + 1) * scale_y <= sy + 1 || sy == h - 1) {
beta = (Math.max(sy + 1 - (dy + 1) * scale_y, 0.0) * 256) | 0;
beta1 = 256 - beta;
b = nw * dy;
if (beta <= 0) {
for (dx = 0; dx < nw * ch; dx++) {
dst_d[b + dx] = Math.min(Math.max((sum[dx] + buf[dx] * 256) / inv_scale_256, 0), 255);
sum[dx] = buf[dx] = 0;
}
}
else {
for (dx = 0; dx < nw * ch; dx++) {
dst_d[b + dx] = Math.min(Math.max((sum[dx] + buf[dx] * beta1) / inv_scale_256, 0), 255);
sum[dx] = buf[dx] * beta;
buf[dx] = 0;
}
}
dy++;
}
else {
for (dx = 0; dx < nw * ch; dx++) {
sum[dx] += buf[dx] * 256;
buf[dx] = 0;
}
}
}
cache.put_buffer(sum_node);
cache.put_buffer(buf_node);
cache.put_buffer(xofs_node);
}
export function _resample(src, dst, cache, nw, nh) {
let xofs_count = 0;
const ch = src.channel, w = src.cols, h = src.rows;
const src_d = src.data, dst_d = dst.data;
const scale_x = w / nw, scale_y = h / nh;
const scale = 1.0 / (scale_x * scale_y);
let dx = 0, dy = 0, sx = 0, sy = 0, sx1 = 0, sx2 = 0, i = 0, k = 0, fsx1 = 0.0, fsx2 = 0.0;
let a = 0, b = 0, dxn = 0, alpha = 0.0, beta = 0.0, beta1 = 0.0;
const buf_node = cache.get_buffer((nw * ch) << 2);
const sum_node = cache.get_buffer((nw * ch) << 2);
const xofs_node = cache.get_buffer((w * 2 * 3) << 2);
const buf = buf_node.f32;
const sum = sum_node.f32;
const xofs = xofs_node.f32;
for (; dx < nw; dx++) {
(fsx1 = dx * scale_x), (fsx2 = fsx1 + scale_x);
(sx1 = (fsx1 + 1.0 - 1e-6) | 0), (sx2 = fsx2 | 0);
sx1 = Math.min(sx1, w - 1);
sx2 = Math.min(sx2, w - 1);
if (sx1 > fsx1) {
xofs_count++;
xofs[k++] = ((sx1 - 1) * ch) | 0;
xofs[k++] = (dx * ch) | 0;
xofs[k++] = (sx1 - fsx1) * scale;
}
for (sx = sx1; sx < sx2; sx++) {
xofs_count++;
xofs[k++] = (sx * ch) | 0;
xofs[k++] = (dx * ch) | 0;
xofs[k++] = scale;
}
if (fsx2 - sx2 > 1e-3) {
xofs_count++;
xofs[k++] = (sx2 * ch) | 0;
xofs[k++] = (dx * ch) | 0;
xofs[k++] = (fsx2 - sx2) * scale;
}
}
for (dx = 0; dx < nw * ch; dx++) {
buf[dx] = sum[dx] = 0;
}
dy = 0;
for (sy = 0; sy < h; sy++) {
a = w * sy;
for (k = 0; k < xofs_count; k++) {
sx1 = xofs[k * 3] | 0;
dxn = xofs[k * 3 + 1] | 0;
alpha = xofs[k * 3 + 2];
for (i = 0; i < ch; i++) {
buf[dxn + i] += src_d[a + sx1 + i] * alpha;
}
}
if ((dy + 1) * scale_y <= sy + 1 || sy == h - 1) {
beta = Math.max(sy + 1 - (dy + 1) * scale_y, 0.0);
beta1 = 1.0 - beta;
b = nw * dy;
if (Math.abs(beta) < 1e-3) {
for (dx = 0; dx < nw * ch; dx++) {
dst_d[b + dx] = sum[dx] + buf[dx];
sum[dx] = buf[dx] = 0;
}
}
else {
for (dx = 0; dx < nw * ch; dx++) {
dst_d[b + dx] = sum[dx] + buf[dx] * beta1;
sum[dx] = buf[dx] * beta;
buf[dx] = 0;
}
}
dy++;
}
else {
for (dx = 0; dx < nw * ch; dx++) {
sum[dx] += buf[dx];
buf[dx] = 0;
}
}
}
cache.put_buffer(sum_node);
cache.put_buffer(buf_node);
cache.put_buffer(xofs_node);
}
//# sourceMappingURL=resample.js.map