17 const float pi = boost::math::constants::pi<float>();
18 const float threshold = 1
e-6;
19 float x, val, sinx1,sinx2,sinx3,cosx1;
24 *(kernel++) = 1.0 - pos;
27 if (pos < threshold && pos > - threshold) {
33 x = -
pi / 2.0 * (pos + 1.0);
34 sincosf(
x, &sinx1, &cosx1);
35 val = (*(kernel++) = sinx1 / (
x *
x));
37 val += (*(kernel++) = -cosx1 / (
x *
x));
39 val += (*(kernel++) = -sinx1 / (
x *
x));
41 val += (*kernel = cosx1 / (
x *
x));
49 if (pos < threshold && pos > - threshold) {
57 x = -
pi / 3.0 * (pos + 2.0);
58 sincosf(
x, &sinx1, &cosx1);
59 val = (*(kernel++) = sinx1 / (
x *
x));
61 val += (*(kernel++) = (sinx2 = -0.5 * sinx1 - 0.866025403785 * cosx1)
64 val += (*(kernel++) = (sinx3 = - 0.5 * sinx1 + 0.866025403785 * cosx1)
67 val += (*(kernel++) = sinx1 / (
x *
x));
69 val += (*(kernel++) = sinx2 / (
x *
x));
71 val += (*kernel = sinx3 / (
x *
x));
81 if (pos < threshold && pos > - threshold) {
91 x = -
pi / 4.0 * (pos + 3.0);
92 sincosf(
x, &sinx1, &cosx1);
93 val = (*(kernel++) = sinx1 / (
x *
x));
95 val += (*(kernel++) = - (sinx2 = 0.707106781186 * (sinx1 + cosx1))
98 val += (*(kernel++) = cosx1 / (
x *
x));
100 val += (*(kernel++) = - (sinx3 = 0.707106781186 * (cosx1 - sinx1))
103 val += (*(kernel++) = -sinx1 / (
x *
x));
105 val += (*(kernel++) = sinx2 / (
x *
x));
107 val += (*(kernel++) = -cosx1 / (
x *
x));
109 val += (*kernel = sinx3 / (
x *
x));
125 int xsize,
int ysize,
interpenum interptype) {
127 static const int interp_kernwidth[5]={1,2,4,6,8};
131 *kvector, *pixin, *pixout,
133 int i, j, ix, iy, kwidth, step;
135 kwidth = interp_kernwidth[interptype];
139 ix = (int)(
x-0.50001);
140 iy = (int)(
y-0.50001);
152 if (ix < 0 || ix + kwidth <= 0 || ix + kwidth > xsize ||
153 iy < 0 || iy + kwidth <= 0 || iy + kwidth > ysize)
158 step = xsize - kwidth;
159 pixin = pix + iy * xsize + ix ;
161 for (j = kwidth; j--;) {
164 for (i = kwidth; i--;)
165 val += *(kvector++) * *(pixin++);
175 for (i = kwidth; i--;)
176 val += *(kvector++) * *(pixin++);
188 double scale_factor,
double x_shift,
double y_shift) {
191 for(
int x_win=0; x_win < window_width; x_win++) {
192 for(
int y_win=0; y_win < window_height; y_win++) {
193 double x = (x_win + 0.5 - x_shift) / scale_factor - 0.5;
194 double y = (y_win + 0.5 - y_shift) / scale_factor - 0.5;
199 double x_delta =
x - xi;
200 double y_delta =
y - yi;
207 Traits::at(window, x_win, y_win) = (1.0 - y_delta) * ((1.0 - x_delta) * v00 + x_delta * v10) +
208 y_delta * ((1.0 - x_delta) * v01 + x_delta * v11);
217 auto data = &source->getData()[0];
218 auto source_width = source->getWidth();
219 auto source_height = source->getHeight();
226 for(
int x_win=0; x_win < window_width; x_win++) {
227 float x = (x_win + 0.5 - x_shift) / scale_factor + 0.5;
228 for(
int y_win=0; y_win < window_height; y_win++) {
229 float y = (y_win + 0.5 - y_shift) / scale_factor + 0.5;
240 auto source_width = source->getWidth();
241 auto source_height = source->getHeight();
248 for(
unsigned int buff_x = 0; buff_x <
Traits::width(buffer); buff_x++) {
249 float pos = (buff_x + 0.5 - y_shift) / scale_factor + 0.5;
250 int ipos = int(pos) - 4;
252 if (ipos < 0 || ipos + 7 >= source_height) {
257 for(
unsigned int buff_y = 0; buff_y <
Traits::height(buffer); buff_y++) {
259 for (
int i=0; i<8; i++) {
260 val += kernel[i] *
Traits::at(source, buff_y, ipos + i);
267 for(
int x_win=0; x_win < window_width; x_win++) {
268 float pos = (x_win + 0.5 - x_shift) / scale_factor + 0.5;
269 int ipos = int(pos) - 4;
270 if (ipos < 0 || ipos + 7 >= source_width) {
275 for(
int y_win=0; y_win < window_height; y_win++) {
277 for (
int i=0; i<8; i++) {
278 val += kernel[i] *
Traits::at(buffer, y_win, ipos + i);
292 double scale_factor,
double x,
double y) {
294 double scaled_width = width(source_image) * scale_factor;
295 double scaled_height = height(source_image) * scale_factor;
299 int window_width = x_max - x_min;
302 int window_height = y_max - y_min;
304 double x_shift =
x - scaled_width / 2. - x_min;
305 double y_shift =
y - scaled_height / 2. - y_min;
307 auto window = factory(window_width, window_height);
315 double corr_factor = 1. / (scale_factor * scale_factor);
317 for(
int x_im=
std::max(x_min,0); x_im<std::min<int>(x_max, width(target_image)); ++x_im) {
318 for (
int y_im=
std::max(y_min,0); y_im<std::min<int>(y_max, height(target_image)); ++y_im) {
319 int x_win = x_im - x_min;
320 int y_win = y_im - y_min;
321 at(target_image, x_im, y_im) += corr_factor * at(window, x_win, y_win);