streamtools: refactor output/scaler drivers to their own directories
[jpcrr.git] / streamtools / resizer / nearest.cpp
blob2a9487ba30b25f738264d5830b860813ed00d1ff
1 #include "resize.hpp"
2 #include <stdint.h>
3 #include <cmath>
4 #include <stdexcept>
6 namespace
8 inline uint32_t nnscale(uint32_t value, uint32_t trange, uint32_t srange)
10 //x / trange is as good approximation for value / srange as possible.
11 //=> x is as good approximation for value * trange / srange as possible.
12 return (uint32_t)(((uint64_t)value * trange + srange / 2) / srange);
15 void do_resize(uint8_t* target, uint32_t twidth, uint32_t theight,
16 const uint8_t* source, uint32_t swidth, uint32_t sheight)
18 uint32_t* __restrict__ src = (uint32_t*)source;
19 uint32_t* __restrict__ dest = (uint32_t*)target;
21 for(uint32_t y = 0; y < theight; y++)
22 for(uint32_t x = 0; x < twidth; x++) {
23 uint32_t _x = nnscale(x, swidth, twidth);
24 uint32_t _y = nnscale(y, sheight, theight);
25 dest[y * twidth + x] = src[_y * swidth + _x];
29 simple_resizer factory("nearest", do_resize);