Streamtools: Refactor rescaling code
[jpcrr.git] / streamtools / rescalers / nearest.cpp
blobea5849458a64d0478da551f0a50393c36f4c7edd
1 #include "rescalers/simple.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_rescale(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_rescaler factory("nearest", make_bound_method(do_rescale));