18 float x, val, sinx1, cosx1;
20 if (pos < threshold && pos > -threshold) {
27 x = -
PI / 2.0 * (pos + 1.0);
28 sincosf(x, &sinx1, &cosx1);
29 val = (*(kernel++) = sinx1 / (x * x));
31 val += (*(kernel++) = -cosx1 / (x * x));
33 val += (*(kernel++) = -sinx1 / (x * x));
35 val += (*kernel = cosx1 / (x * x));
45 float x, val, sinx1, sinx2, sinx3, cosx1;
47 if (pos < threshold && pos > -threshold) {
56 x = -
PI / 3.0 * (pos + 2.0);
57 sincosf(x, &sinx1, &cosx1);
58 val = (*(kernel++) = sinx1 / (x * x));
60 val += (*(kernel++) = (sinx2 = -0.5 * sinx1 - 0.866025403785 * cosx1) / (x * x));
62 val += (*(kernel++) = (sinx3 = -0.5 * sinx1 + 0.866025403785 * cosx1) / (x * x));
64 val += (*(kernel++) = sinx1 / (x * x));
66 val += (*(kernel++) = sinx2 / (x * x));
68 val += (*kernel = sinx3 / (x * x));
80 float x, val, sinx1, sinx2, sinx3, cosx1;
82 if (pos < threshold && pos > -threshold) {
93 x = -
PI / 4.0 * (pos + 3.0);
94 sincosf(x, &sinx1, &cosx1);
95 val = (*(kernel++) = sinx1 / (x * x));
97 val += (*(kernel++) = -(sinx2 = 0.707106781186 * (sinx1 + cosx1)) / (x * x));
99 val += (*(kernel++) = cosx1 / (x * x));
101 val += (*(kernel++) = -(sinx3 = 0.707106781186 * (cosx1 - sinx1)) / (x * x));
103 val += (*(kernel++) = -sinx1 / (x * x));
105 val += (*(kernel++) = sinx2 / (x * x));
107 val += (*(kernel++) = -cosx1 / (x * x));
109 val += (*kernel = sinx3 / (x * x));
148 int xsize,
int ysize,
interpenum interptype) {
150 static const int interp_kernwidth[5] = {1, 2, 4, 6, 8};
154 *kvector, *pixin, *pixout,
156 int i, j, ix, iy, kwidth, step;
158 kwidth = interp_kernwidth[interptype];
162 ix = (int) (x - 0.50001);
163 iy = (int) (y - 0.50001);
176 if (ix < 0 || ix + kwidth <= 0 || ix + kwidth > xsize ||
177 iy < 0 || iy + kwidth <= 0 || iy + kwidth > ysize) {
183 step = xsize - kwidth;
184 pixin = pix + iy * xsize + ix;
186 for (j = kwidth; j--;) {
189 for (i = kwidth; i--;) {
190 val += *(kvector++) * *(pixin++);
201 for (i = kwidth; i--;) {
202 val += *(kvector++) * *(pixin++);
215 double scale_factor,
double x_shift,
double y_shift) {
218 for (
int x_win = 0; x_win < window_width; x_win++) {
219 for (
int y_win = 0; y_win < window_height; y_win++) {
220 double x = (x_win + 0.5 - x_shift) / scale_factor - 0.5;
221 double y = (y_win + 0.5 - y_shift) / scale_factor - 0.5;
226 double x_delta = x - xi;
227 double y_delta = y - yi;
232 double v11 =
getClamped(source, xi + 1, yi + 1);
234 Traits::at(window, x_win, y_win) = (1.0 - y_delta) * ((1.0 - x_delta) * v00 + x_delta * v10) +
235 y_delta * ((1.0 - x_delta) * v01 + x_delta * v11);
241 double scale_factor,
double x_shift,
double y_shift) {
245 auto data = &source->
getData()[0];
246 auto source_width = source->
getWidth();
247 auto source_height = source->
getHeight();
249 for (
int x_win = 0; x_win < window_width; x_win++) {
250 float x = (x_win + 0.5 - x_shift) / scale_factor + 0.5;
251 for (
int y_win = 0; y_win < window_height; y_win++) {
252 float y = (y_win + 0.5 - y_shift) / scale_factor + 0.5;
260 double scale_factor,
double x_shift,
double y_shift) {
265 auto source_width = source->
getWidth();
266 auto source_height = source->
getHeight();
273 for (
unsigned int buff_x = 0; buff_x <
Traits::width(buffer); buff_x++) {
274 float pos = (buff_x + 0.5 - y_shift) / scale_factor + 0.5;
275 int ipos = int(pos) - 4;
277 if (ipos < 0 || ipos + 7 >= source_height) {
282 for (
unsigned int buff_y = 0; buff_y <
Traits::height(buffer); buff_y++) {
284 for (
int i = 0; i < 8; i++) {
285 val += kernel[i] *
Traits::at(source, buff_y, ipos + i);
292 for (
int x_win = 0; x_win < window_width; x_win++) {
293 float pos = (x_win + 0.5 - x_shift) / scale_factor + 0.5;
294 int ipos = int(pos) - 4;
295 if (ipos < 0 || ipos + 7 >= source_width) {
300 for (
int y_win = 0; y_win < window_height; y_win++) {
302 for (
int i = 0; i < 8; i++) {
303 val += kernel[i] *
Traits::at(buffer, y_win, ipos + i);
318 double scale_factor,
double x,
double y) {
320 double scaled_width =
width(source_image) * scale_factor;
321 double scaled_height =
height(source_image) * scale_factor;
323 int x_min =
std::floor(x - scaled_width / 2.);
324 int x_max =
std::ceil(x + scaled_width / 2.);
325 int window_width = x_max - x_min;
326 int y_min =
std::floor(y - scaled_height / 2.);
327 int y_max =
std::ceil(y + scaled_height / 2.);
328 int window_height = y_max - y_min;
330 double x_shift = x - scaled_width / 2. - x_min;
331 double y_shift = y - scaled_height / 2. - y_min;
333 auto window =
factory(window_width, window_height);
335 shiftResizeLancszosFast(source_image, window, scale_factor, x_shift, y_shift);
339 double corr_factor = 1. / (scale_factor * scale_factor);
341 for (
int x_im =
std::max(x_min, 0); x_im < std::min<int>(x_max,
width(target_image)); ++x_im) {
342 for (
int y_im =
std::max(y_min, 0); y_im < std::min<int>(y_max,
height(target_image)); ++y_im) {
343 int x_win = x_im - x_min;
344 int y_win = y_im - y_min;
345 at(target_image, x_im, y_im) += corr_factor *
at(window, x_win, y_win);