3 * Copyright (C) 2010 Marko Cebokli http://lea.hamradio.si/~s57uuu
4 * This file is a part of the Frei0r plugin "c0rners"
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 /*******************************************************************
22 * The remapping functions use a map aray, which contains a pair
23 * of floating values fo each pixel of the output image. These
24 * represent the location in the input image, from where the value
25 * of the given output pixel should be interpolated.
26 * They are given in pixels of the input image.
27 * If the output image is wo pixels wide, then the x coordinate
28 * of the pixel in row r and column c is at 2*(r*wo+c) in the map
29 * array, and y at 2*(r*wo+c)+1
31 * The map array is usually computation intensive to generate, and
32 * he purpose of the map array is to allow fast remapping of
33 * several images (video) using the same map array.
34 ******************************************************************/
37 //compile: gcc -c -O2 -Wall -std=c99 -fPIC interp.c -o interp.o
39 // -std=c99 za rintf()
40 // -fPIC da lahko linkas v .so (za frei0r)
43 #include <stdio.h> /* za debug printoute */
47 //#define TEST_XY_LIMITS
49 //--------------------------------------------------------
50 //pointer to an interpolating function
59 // flag to overwrite alpha channel
60 typedef int (*interpp)(unsigned char*, int, int, float, float, float, unsigned char*, int);
62 //**************************************
63 //HERE BEGIN THE INTERPOLATION FUNCTIONS
65 //------------------------------------------------------
66 //za debugging - z izpisovanjem
67 //interpolacija "najblizji sosed" (ni prava interpolacija)
68 //za byte (char) vrednosti
69 // *sl vhodni array (slika)
70 // w,h dimenzija slike je wxh
71 // x,y tocka, za katero izracuna interpolirano vrednost
73 // *v interpolirana vrednost
74 int interpNNpr_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
76 //printf("u=%5.2f v=%5.2f ",x,y);
77 printf("u=%5.3f v=%5.3f ",x/(w-1),y/(h-1));
78 //printf("U=%2d V=%2d ",(int)rintf(x),(int)rintf(y));
81 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
84 *v=sl[(int)rintf(x)+(int)rintf(y)*w];
88 //------------------------------------------------------
89 //interpolacija "najblizji sosed" (ni prava interpolacija)
90 //za byte (char) vrednosti
91 // *sl vhodni array (slika)
92 // w,h dimenzija slike je wxh
93 // x,y tocka, za katero izracuna interpolirano vrednost
95 // *v interpolirana vrednost
96 int interpNN_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
99 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
102 *v=sl[(int)rintf(x)+(int)rintf(y)*w];
106 //------------------------------------------------------
107 //interpolacija "najblizji sosed" (ni prava interpolacija)
108 //za byte (char) vrednosti v packed color 32 bitnem formatu
110 // *sl vhodni array (slika)
111 // w,h dimenzija slike je wxh
112 // x,y tocka, za katero izracuna interpolirano vrednost
114 // *v interpolirana vrednost
115 int interpNN_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
117 #ifdef TEST_XY_LIMITS
118 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
120 int p = (int) rintf(x) * 4 + (int) rintf(y) * 4 * w;
121 float alpha = (float) sl[p + 3] / 255.0 * o;
122 v[0]= v[0] * (1.0 - alpha) + sl[p] * alpha;
123 v[1]= v[1] * (1.0 - alpha) + sl[p + 1] * alpha;
124 v[2]= v[2] * (1.0 - alpha) + sl[p + 2] * alpha;
125 if (is_alpha) v[3] = sl[p +3];
130 //------------------------------------------------------
131 //bilinearna interpolacija
132 //za byte (char) vrednosti
133 // *sl vhodni array (slika)
134 // w,h dimenzija slike je wxh
135 // x,y tocka, za katero izracuna interpolirano vrednost
137 // *v interpolirana vrednost
138 int interpBL_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
143 #ifdef TEST_XY_LIMITS
144 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
147 m=(int)floorf(x); n=(int)floorf(y);
148 k=n*w+m; l=(n+1)*w+m;
149 a=sl[k]+(sl[k+1]-sl[k])*(x-(float)m);
150 b=sl[l]+(sl[l+1]-sl[l])*(x-(float)m);
151 *v=a+(b-a)*(y-(float)n);
155 //------------------------------------------------------
156 //bilinearna interpolacija
157 //za byte (char) vrednosti v packed color 32 bitnem formatu
158 int interpBL_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
160 int m,n,k,l,n1,l1,k1;
163 #ifdef TEST_XY_LIMITS
164 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
167 m=(int)floorf(x); n=(int)floorf(y);
168 k=n*w+m; l=(n+1)*w+m;
169 k1=4*(k+1); l1=4*(l+1); n1=4*((n+1)*w+m);
172 a=sl[k+3]+(sl[k1+3]-sl[k+3])*(x-(float)m);
173 b=sl[l+3]+(sl[l1+3]-sl[n1+3])*(x-(float)m);
174 float alpha = a+(b-a)*(y-(float)n);
175 if (is_alpha) v[3] = alpha;
176 alpha = alpha / 255.0 * o;
178 a=sl[k]+(sl[k1]-sl[k])*(x-(float)m);
179 b=sl[l]+(sl[l1]-sl[n1])*(x-(float)m);
180 v[0]= v[0] * (1.0 - alpha) + (a+(b-a)*(y-(float)n)) * alpha;
182 a=sl[k+1]+(sl[k1+1]-sl[k+1])*(x-(float)m);
183 b=sl[l+1]+(sl[l1+1]-sl[n1+1])*(x-(float)m);
184 v[1]= v[1] * (1.0 - alpha) + (a+(b-a)*(y-(float)n)) * alpha;
186 a=sl[k+2]+(sl[k1+2]-sl[k+2])*(x-(float)m);
187 b=sl[l+2]+(sl[l1+2]-sl[n1+2])*(x-(float)m);
188 v[2]= v[2] * (1.0 - alpha) + (a+(b-a)*(y-(float)n)) * alpha;
193 //------------------------------------------------------
194 //bikubicna interpolacija "smooth"
195 //za byte (char) vrednosti
196 //kar Aitken-Neville formula iz Bronstajna
197 // *sl vhodni array (slika)
198 // w,h dimenzija slike je wxh
199 // x,y tocka, za katero izracuna interpolirano vrednost
201 // *v interpolirana vrednost
202 int interpBC_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
206 float p[4],p1[4],p2[4],p3[4],p4[4];
208 #ifdef TEST_XY_LIMITS
209 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
212 m=(int)ceilf(x)-2; if (m<0) m=0; if ((m+5)>w) m=w-4;
213 n=(int)ceilf(y)-2; if (n<0) n=0; if ((n+5)>h) n=h-4;
215 //njaprej po y (stiri stolpce)
228 p1[i]=p1[i]+k*(p1[i]-p1[i-1]);
229 p2[i]=p2[i]+k*(p2[i]-p2[i-1]);
230 p3[i]=p3[i]+k*(p3[i]-p3[i-1]);
231 p4[i]=p4[i]+k*(p4[i]-p4[i-1]);
235 p[0]=p1[3]; p[1]=p2[3]; p[2]=p3[3]; p[3]=p4[3];
238 p[i]=p[i]+(x-i-m)/j*(p[i]-p[i-1]);
240 if (p[3]<0.0) p[3]=0.0; //printf("p=%f ",p[3]);
241 if (p[3]>256.0) p[3]=255.0; //printf("p=%f ",p[3]);
248 //------------------------------------------------------
249 //bikubicna interpolacija "smooth"
250 //za byte (char) vrednosti v packed color 32 bitnem formatu
251 int interpBC_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
255 float p[4],p1[4],p2[4],p3[4],p4[4];
258 #ifdef TEST_XY_LIMITS
259 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
262 m=(int)ceilf(x)-2; if (m<0) m=0; if ((m+5)>w) m=w-4;
263 n=(int)ceilf(y)-2; if (n<0) n=0; if ((n+5)>h) n=h-4;
268 //njaprej po y (stiri stolpce)
281 p1[i]=p1[i]+k*(p1[i]-p1[i-1]);
282 p2[i]=p2[i]+k*(p2[i]-p2[i-1]);
283 p3[i]=p3[i]+k*(p3[i]-p3[i-1]);
284 p4[i]=p4[i]+k*(p4[i]-p4[i-1]);
288 p[0]=p1[3]; p[1]=p2[3]; p[2]=p3[3]; p[3]=p4[3];
291 p[i]=p[i]+(x-i-m)/j*(p[i]-p[i-1]);
293 if (p[3]<0.0) p[3]=0.0;
294 if (p[3]>255.0) p[3]=255.0;
297 alpha = p[3] / 255.0 * o;
298 if (is_alpha) v[3] = p[3];
300 v[b] = v[b] * (1.0 - alpha) + p[3] * alpha;
307 //------------------------------------------------------
308 //bikubicna interpolacija "sharp"
309 //za byte (char) vrednosti
310 //Helmut Dersch polinom
311 // *sl vhodni array (slika)
312 // w,h dimenzija slike je wxh
313 // x,y tocka, za katero izracuna interpolirano vrednost
315 // *v interpolirana vrednost
316 //!!! ODKOD SUM??? (ze po eni rotaciji v interp_test !!)
317 //!!! v defish tega suma ni???
318 int interpBC2_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
321 float pp,p[4],wx[4],wy[4],xx;
323 #ifdef TEST_XY_LIMITS
324 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
327 m=(int)ceilf(x)-2; if (m<0) m=0; if ((m+5)>w) m=w-4;
328 n=(int)ceilf(y)-2; if (n<0) n=0; if ((n+5)>h) n=h-4;
331 //najprej po y (stiri stolpce)
332 xx=y-n; wy[0]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
333 xx=xx-1.0; wy[1]=(1.25*xx-2.25)*xx*xx+1.0;
334 xx=1.0-xx; wy[2]=(1.25*xx-2.25)*xx*xx+1.0;
335 xx=xx+1.0; wy[3]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
337 xx=x-m; wx[0]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
338 xx=xx-1.0; wx[1]=(1.25*xx-2.25)*xx*xx+1.0;
339 xx=1.0-xx; wx[2]=(1.25*xx-2.25)*xx*xx+1.0;
340 xx=xx+1.0; wx[3]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
347 p[i]=wy[0]*sl[l]; l+=w;
348 p[i]+=wy[1]*sl[l]; l+=w;
349 p[i]+=wy[2]*sl[l]; l+=w;
359 if (pp>256.0) pp=255.0;
365 //------------------------------------------------------
366 //bikubicna interpolacija "sharp"
367 //za byte (char) vrednosti v packed color 32 bitnem formatu
368 //!!! ODKOD SUM??? (ze po eni rotaciji v interp_test !!)
369 //!!! v defish tega suma ni???
370 int interpBC2_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
373 float pp,p[4],wx[4],wy[4],xx;
375 #ifdef TEST_XY_LIMITS
376 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
379 m=(int)ceilf(x)-2; if (m<0) m=0; if ((m+5)>w) m=w-4;
380 n=(int)ceilf(y)-2; if (n<0) n=0; if ((n+5)>h) n=h-4;
382 //najprej po y (stiri stolpce)
383 xx=y-n; wy[0]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
384 xx=xx-1.0; wy[1]=(1.25*xx-2.25)*xx*xx+1.0;
385 xx=1.0-xx; wy[2]=(1.25*xx-2.25)*xx*xx+1.0;
386 xx=xx+1.0; wy[3]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
388 xx=x-m; wx[0]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
389 xx=xx-1.0; wx[1]=(1.25*xx-2.25)*xx*xx+1.0;
390 xx=1.0-xx; wx[2]=(1.25*xx-2.25)*xx*xx+1.0;
391 xx=xx+1.0; wx[3]=(-0.75*(xx-5.0)*xx-6.0)*xx+3.0;
400 p[i]=wy[0]*sl[l]; l+=u;
401 p[i]+=wy[1]*sl[l]; l+=u;
402 p[i]+=wy[2]*sl[l]; l+=u;
413 if (pp>256.0) pp=255.0;
421 //------------------------------------------------------
422 //spline 4x4 interpolacija
423 //za byte (char) vrednosti
424 //Helmut Dersch polinom
425 // *sl vhodni array (slika)
426 // w,h dimenzija slike je wxh
427 // x,y tocka, za katero izracuna interpolirano vrednost
429 // *v interpolirana vrednost
430 int interpSP4_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
433 float pp,p[4],wx[4],wy[4],xx;
435 #ifdef TEST_XY_LIMITS
436 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
439 m=(int)ceilf(x)-2; if (m<0) m=0; if ((m+5)>w) m=w-4;
440 n=(int)ceilf(y)-2; if (n<0) n=0; if ((n+5)>h) n=h-4;
442 //najprej po y (stiri stolpce)
443 xx=y-n; wy[0]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
444 xx=xx-1.0; wy[1]=((xx-1.8)*xx-0.2)*xx+1.0;
445 xx=1.0-xx; wy[2]=((xx-1.8)*xx-0.2)*xx+1.0;
446 xx=xx+1.0; wy[3]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
448 xx=x-m; wx[0]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
449 xx=xx-1.0; wx[1]=((xx-1.8)*xx-0.2)*xx+1.0;
450 xx=1.0-xx; wx[2]=((xx-1.8)*xx-0.2)*xx+1.0;
451 xx=xx+1.0; wx[3]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
458 p[i]=p[i]+wy[j]*sl[(j+n)*w+i+m];
467 if (pp>256.0) pp=255.0;
473 //------------------------------------------------------
474 //spline 4x4 interpolacija
475 //za byte (char) vrednosti v packed color 32 bitnem formatu
476 int interpSP4_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
479 float pp,p[4],wx[4],wy[4],xx;
481 #ifdef TEST_XY_LIMITS
482 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
485 m=(int)ceilf(x)-2; if (m<0) m=0; if ((m+5)>w) m=w-4;
486 n=(int)ceilf(y)-2; if (n<0) n=0; if ((n+5)>h) n=h-4;
488 //najprej po y (stiri stolpce)
489 xx=y-n; wy[0]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
490 xx=xx-1.0; wy[1]=((xx-1.8)*xx-0.2)*xx+1.0;
491 xx=1.0-xx; wy[2]=((xx-1.8)*xx-0.2)*xx+1.0;
492 xx=xx+1.0; wy[3]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
494 xx=x-m; wx[0]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
495 xx=xx-1.0; wx[1]=((xx-1.8)*xx-0.2)*xx+1.0;
496 xx=1.0-xx; wx[2]=((xx-1.8)*xx-0.2)*xx+1.0;
497 xx=xx+1.0; wx[3]=((-0.333333*(xx-1.0)+0.8)*(xx-1.0)-0.466667)*(xx-1.0);
506 p[i]=p[i]+wy[j]*sl[4*((j+n)*w+i+m)+b];
515 if (pp>256.0) pp=255.0;
523 //------------------------------------------------------
524 //spline 6x6 interpolacija
525 //za byte (char) vrednosti
526 //Helmut Dersch polinom
527 // *sl vhodni array (slika)
528 // w,h dimenzija slike je wxh
529 // x,y tocka, za katero izracuna interpolirano vrednost
531 // *v interpolirana vrednost
532 //!!! PAZI, TOLE NE DELA CISTO PRAV ??? belina se siri
533 //!!! zaenkrat sem dodal fudge factor...
534 int interpSP6_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
537 float pp,p[6],wx[6],wy[6],xx;
539 #ifdef TEST_XY_LIMITS
540 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
543 m=(int)ceilf(x)-3; if (m<0) m=0; if ((m+7)>w) m=w-6;
544 n=(int)ceilf(y)-3; if (n<0) n=0; if ((n+7)>h) n=h-6;
546 //najprej po y (sest stolpcev)
548 wy[0]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
550 wy[1]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
552 wy[2]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
554 wy[3]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
556 wy[4]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
558 wy[5]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
561 wx[0]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
563 wx[1]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
565 wx[2]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
567 wx[3]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
569 wx[4]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
571 wx[5]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
579 p[i]=p[i]+wy[j]*sl[(j+n)*w+i+m];
587 pp=0.947*pp; //fudge factor...!!! cca 0.947...
589 if (pp>256.0) pp=255.0;
595 //------------------------------------------------------
596 //spline 6x6 interpolacija
597 //za byte (char) vrednosti v packed color 32 bitnem formatu
598 //!!! PAZI, TOLE NE DELA CISTO PRAV ??? belina se siri
599 //!!! zaenkrat sem dodal fudge factor...
600 int interpSP6_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
603 float pp,p[6],wx[6],wy[6],xx;
605 #ifdef TEST_XY_LIMITS
606 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
609 m=(int)ceilf(x)-3; if (m<0) m=0; if ((m+7)>w) m=w-6;
610 n=(int)ceilf(y)-3; if (n<0) n=0; if ((n+7)>h) n=h-6;
612 //najprej po y (sest stolpcev)
614 wy[0]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
616 wy[1]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
618 wy[2]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
620 wy[3]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
622 wy[4]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
624 wy[5]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
627 wx[0]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
629 wx[1]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
631 wx[2]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
633 wx[3]=((1.181818*xx-2.167464)*xx+0.014354)*xx+1.0;
635 wx[4]=((-0.545455*(xx-1.0)+1.291866)*(xx-1.0)-0.746411)*(xx-1.0);
637 wx[5]=((0.090909*(xx-2.0)-0.215311)*(xx-2.0)+0.124402)*(xx-2.0);
647 p[i]=p[i]+wy[j]*sl[4*((j+n)*w+i+m)+b];
655 pp=0.947*pp; //fudge factor...!!! cca 0.947...
657 if (pp>256.0) pp=255.0;
665 //------------------------------------------------------
666 //truncated sinc "lanczos" 16x16 interpolacija
667 //za byte (char) vrednosti
668 // *sl vhodni array (slika)
669 // w,h dimenzija slike je wxh
670 // x,y tocka, za katero izracuna interpolirano vrednost
672 // *v interpolirana vrednost
673 int interpSC16_b(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
676 float pp,p[16],wx[16],wy[16],xx,xxx,x1;
677 float PI=3.141592654;
679 #ifdef TEST_XY_LIMITS
680 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
683 m=(int)ceilf(x)-8; if (m<0) m=0; if ((m+17)>w) m=w-16;
684 n=(int)ceilf(y)-8; if (n<0) n=0; if ((n+17)>h) n=h-16;
691 wy[7-i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
692 xxx=(float)(2*i+1)-xx;
694 wy[8+i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
702 wx[7-i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
703 xxx=(float)(2*i+1)-xx;
705 wx[8+i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
714 p[i]=p[i]+wy[j]*sl[(j+n)*w+i+m];
723 if (pp>256.0) pp=255.0;
729 //------------------------------------------------------
730 //truncated sinc "lanczos" 16x16 interpolacija
731 //za byte (char) vrednosti v packed color 32 bitnem formatu
732 int interpSC16_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v, int is_alpha)
735 float pp,p[16],wx[16],wy[16],xx,xxx,x1;
736 float PI=3.141592654;
738 #ifdef TEST_XY_LIMITS
739 if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1;
742 m=(int)ceilf(x)-8; if (m<0) m=0; if ((m+17)>w) m=w-16;
743 n=(int)ceilf(y)-8; if (n<0) n=0; if ((n+17)>h) n=h-16;
750 wy[7-i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
751 xxx=(float)(2*i+1)-xx;
753 wy[8+i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
761 wx[7-i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
762 xxx=(float)(2*i+1)-xx;
764 wx[8+i]=(sin(x1)/(x1))*(sin(x1*0.125)/(x1*0.125));
775 p[i]=p[i]+wy[j]*sl[4*((j+n)*w+i+m)+b];
784 if (pp>256.0) pp=255.0;