@@ -14,24 +14,24 @@ double RADGRD = 57.295779513082320876798154814105;
1414
1515BYTE ByteClamp (int c )
1616{
17- BYTE buff [3 ] = {0 , (BYTE )c , 255 };
18- return buff [ (int )(c > 0 ) + (int )(c > 255 ) ];
17+ BYTE buff [3 ] = {(BYTE )c , 255 , 0 };
18+ return buff [ (int )(c < 0 ) + (int )(( unsigned ) c > 255 ) ];
1919}
2020
2121////////////////////////////////////////////////////////////////////////////////
2222
2323WORD Byte3Clamp (int c )
2424{
25- WORD buff [3 ] = {0 , (WORD )c , 765 };
26- return buff [ (int )(c > 0 ) + (int )(c > 765 ) ];
25+ WORD buff [3 ] = {(WORD )c , 765 , 0 };
26+ return buff [ (int )(c < 0 ) + (int )(( unsigned ) c > 765 ) ];
2727}
2828
2929////////////////////////////////////////////////////////////////////////////////
3030
3131unsigned IndexClamp (int i , unsigned threshold )
3232{
33- unsigned buff [3 ] = {0 , (unsigned )i , threshold };
34- return buff [ (int )(i > 0 ) + (int )(i > threshold ) ];
33+ unsigned buff [3 ] = {(unsigned )i , threshold , 0 };
34+ return buff [ (int )(i < 0 ) + (int )(( unsigned ) i > threshold ) ];
3535}
3636
3737////////////////////////////////////////////////////////////////////////////////
@@ -6339,6 +6339,89 @@ void IMTFilterSNearest (IMTpixel** p_im, IMTpixel** d_im, unsigned height, unsig
63396339
63406340////////////////////////////////////////////////////////////////////////////////
63416341
6342+ void IMTFilterSFRP (IMTpixel * * p_im , IMTpixel * * d_im , unsigned height , unsigned width , int smode )
6343+ {
6344+ unsigned y , x , yf , xf , ys , xs , ysf , xsf , ym , xm , yr , xr , d , k , l , bpp = 3 , r = 1 , rd = (2 * r + 1 );
6345+ unsigned widths , heights , imdm , imdt , imdms = (512 * bpp * rd * rd );
6346+ int im , ims , imd ;
6347+ IMTpixel * * s_im , * * r_im ;
6348+
6349+ if (smode < 2 ) {smode = 2 ;}
6350+ heights = (height + smode - 1 ) / smode ;
6351+ widths = (width + smode - 1 ) / smode ;
6352+ s_im = IMTalloc (heights , widths );
6353+ r_im = IMTalloc (rd , rd );
6354+ IMTFilterSReduce (p_im , s_im , height , width , smode );
6355+
6356+ for (y = 0 ; y < height ; y ++ )
6357+ {
6358+ yr = y * smode ;
6359+ for (x = 0 ; x < width ; x ++ )
6360+ {
6361+ xr = x * smode ;
6362+ for (k = 0 ; k < rd ; k ++ )
6363+ {
6364+ yf = IndexClamp (((int )(y + k ) - r ), (height - 1 ));
6365+ for (l = 0 ; l < rd ; l ++ )
6366+ {
6367+ xf = IndexClamp (((int )(x + l ) - r ), (width - 1 ));
6368+ r_im [k ][l ] = p_im [yf ][xf ];
6369+ }
6370+ }
6371+ ym = 0 ;
6372+ xm = 0 ;
6373+ imdm = imdms ;
6374+ for (ys = 0 ; ys < heights ; ys ++ )
6375+ {
6376+ for (xs = 0 ; xs < widths ; xs ++ )
6377+ {
6378+ imdt = 0 ;
6379+ for (k = 0 ; k < rd ; k ++ )
6380+ {
6381+ ysf = IndexClamp (((int )(ys + k ) - r ), (heights - 1 ));
6382+ for (l = 0 ; l < rd ; l ++ )
6383+ {
6384+ xsf = IndexClamp (((int )(xs + l ) - r ), (widths - 1 ));
6385+ im = r_im [k ][l ].s ;
6386+ ims = s_im [ysf ][xsf ].s ;
6387+ imd = (im > ims ) ? (im - ims ) : (ims - im );
6388+ imdt += imd ;
6389+ for (d = 0 ; d < bpp ; d ++ )
6390+ {
6391+ im = r_im [k ][l ].c [d ];
6392+ ims = s_im [ysf ][xsf ].c [d ];
6393+ imd = (im > ims ) ? (im - ims ) : (ims - im );
6394+ imdt += imd ;
6395+ }
6396+ }
6397+ }
6398+ if (imdt < imdm )
6399+ {
6400+ ym = ys ;
6401+ xm = xs ;
6402+ imdm = imdt ;
6403+ }
6404+ }
6405+ }
6406+ ym *= smode ;
6407+ xm *= smode ;
6408+ for (k = 0 ; k < smode ; k ++ )
6409+ {
6410+ yf = IndexClamp ((ym + k ), (height - 1 ));
6411+ for (l = 0 ; l < smode ; l ++ )
6412+ {
6413+ xf = IndexClamp ((xm + l ), (width - 1 ));
6414+ d_im [yr + k ][xr + l ] = p_im [yf ][xf ];
6415+ }
6416+ }
6417+ }
6418+ }
6419+ IMTfree (r_im , rd );
6420+ IMTfree (s_im , heights );
6421+ }
6422+
6423+ ////////////////////////////////////////////////////////////////////////////////
6424+
63426425int IMTFilterThreshold (IMTpixel * * p_im , BYTE * * d_im , unsigned height , unsigned width , int threshold )
63436426{
63446427 unsigned y , x ;
0 commit comments