@@ -859,121 +859,100 @@ void IMTGaussLineMatrix (float *cmatrix, float radius)
859859
860860//////////////////////////////////////////////////////////////////////////////////////////////
861861
862- void IMTFilterGaussBlur (IMTpixel * * p_im , IMTpixel * * d_im , unsigned height , unsigned width , float radius )
862+ void IMTFilterGaussBlur (IMTpixel * * p_im , IMTpixel * * d_im , unsigned int height , unsigned int width , float radius )
863863{
864- int iradius ;
865- int y , x , yf , xf , i ;
866- unsigned d ;
867- float imc ;
868- float sc [3 ];
869- float * gaussmat ;
870- IMTpixel * * t_im ;
871- int h = (int )height ;
872- int w = (int )width ;
864+ unsigned int iradius , hw , y , x , i , d ;
865+ float imc , sc , * gaussmat , * buf ;
873866
874- if (radius < 0 )
867+ if (radius < 0.0f )
875868 {
876869 radius = - radius ;
877870 }
878- iradius = (int )(2.0 * radius + 0.5 ) + 1 ;
871+ iradius = (int )(2.0f * radius + 0.5f ) + 1 ;
872+ hw = (height < width ) ? width : height ;
873+ hw += iradius ;
874+ hw += iradius ;
879875
880- gaussmat = (float * )malloc (( iradius ) * sizeof (float ));
881- t_im = IMTalloc ( height , width );
876+ gaussmat = (float * )malloc (iradius * sizeof (float ));
877+ buf = ( float * ) malloc ( hw * sizeof ( float ) );
882878
883879 IMTGaussLineMatrix (gaussmat , radius );
884880
885881 if (iradius > 1 )
886882 {
887- for (y = 0 ; y < h ; y ++ )
883+ for (d = 0 ; d < 3 ; d ++ )
888884 {
889- for (x = 0 ; x < w ; x ++ )
885+ for (y = 0 ; y < height ; y ++ )
890886 {
891- for (d = 0 ; d < 3 ; d ++ )
887+ for (x = 0 ; x < iradius ; x ++ )
892888 {
893- imc = (float )p_im [y ][x ].c [d ];
894- sc [ d ] = imc * gaussmat [ 0 ];
889+ buf [ x ] = (float )p_im [y ][0 ].c [d ];
890+ buf [ width + iradius + x ] = ( float ) p_im [ y ][ width - 1 ]. c [ d ];
895891 }
896- for (i = 1 ; i < iradius ; i ++ )
892+ for (x = 0 ; x < width ; x ++ )
897893 {
898- yf = y - i ;
899- if (yf < 0 )
900- {
901- yf = 0 ;
902- }
903- for (d = 0 ; d < 3 ; d ++ )
904- {
905- imc = (float )p_im [yf ][x ].c [d ];
906- sc [d ] += imc * gaussmat [i ];
907- }
908- yf = y + i ;
909- if (yf >= h )
910- {
911- yf = h - 1 ;
912- }
913- for (d = 0 ; d < 3 ; d ++ )
914- {
915- imc = (float )p_im [yf ][x ].c [d ];
916- sc [d ] += imc * gaussmat [i ];
917- }
894+ buf [x + iradius ] = (float )p_im [y ][x ].c [d ];
918895 }
919- for (d = 0 ; d < 3 ; d ++ )
896+ for (x = 0 ; x < width ; x ++ )
920897 {
921- t_im [y ][x ].c [d ] = ByteClamp ((int )(sc [d ] + 0.5 ));
898+ imc = buf [x + iradius ];
899+ sc = imc * gaussmat [0 ];
900+ for (i = 1 ; i < iradius ; i ++ )
901+ {
902+ imc = buf [x + iradius - i ];
903+ sc += imc * gaussmat [i ];
904+ imc = buf [x + iradius + i ];;
905+ sc += imc * gaussmat [i ];
906+ }
907+ d_im [y ][x ].c [d ] = ByteClamp ((int )(sc + 0.5f ));
922908 }
923909 }
924- }
925- for (y = 0 ; y < h ; y ++ )
926- {
927- for (x = 0 ; x < w ; x ++ )
910+ for (x = 0 ; x < width ; x ++ )
928911 {
929- for (d = 0 ; d < 3 ; d ++ )
912+ for (y = 0 ; y < iradius ; y ++ )
930913 {
931- imc = (float )t_im [ y ][x ].c [d ];
932- sc [ d ] = imc * gaussmat [ 0 ];
914+ buf [ y ] = (float )d_im [ 0 ][x ].c [d ];
915+ buf [ height + iradius + y ] = ( float ) d_im [ height - 1 ][ x ]. c [ d ];
933916 }
934- for (i = 1 ; i < iradius ; i ++ )
917+ for (y = 0 ; y < height ; y ++ )
935918 {
936- xf = x - i ;
937- if (xf < 0 )
938- {
939- xf = 0 ;
940- }
941- for (d = 0 ; d < 3 ; d ++ )
942- {
943- imc = (float )t_im [y ][xf ].c [d ];
944- sc [d ] += imc * gaussmat [i ];
945- }
946- xf = x + i ;
947- if (xf >= w )
948- {
949- xf = w - 1 ;
950- }
951- for (d = 0 ; d < 3 ; d ++ )
952- {
953- imc = (float )t_im [y ][xf ].c [d ];
954- sc [d ] += imc * gaussmat [i ];
955- }
919+ buf [y + iradius ] = (float )d_im [y ][x ].c [d ];
956920 }
957- for (d = 0 ; d < 3 ; d ++ )
921+ for (y = 0 ; y < height ; y ++ )
958922 {
959- d_im [y ][x ].c [d ] = ByteClamp ((int )(sc [d ] + 0.5 ));
923+ imc = buf [y + iradius ];
924+ sc = imc * gaussmat [0 ];
925+ for (i = 1 ; i < iradius ; i ++ )
926+ {
927+ imc = buf [y + iradius - i ];
928+ sc += imc * gaussmat [i ];
929+ imc = buf [y + iradius + i ];
930+ sc += imc * gaussmat [i ];
931+ }
932+ d_im [y ][x ].c [d ] = ByteClamp ((int )(sc + 0.5f ));
960933 }
934+ }
935+ }
936+ for (y = 0 ; y < height ; y ++ )
937+ {
938+ for (x = 0 ; x < width ; x ++ )
939+ {
961940 d_im [y ][x ] = IMTcalcS (d_im [y ][x ]);
962941 }
963942 }
964943 }
965944 else
966945 {
967- for (y = 0 ; y < h ; y ++ )
946+ for (y = 0 ; y < height ; y ++ )
968947 {
969- for (x = 0 ; x < w ; x ++ )
948+ for (x = 0 ; x < width ; x ++ )
970949 {
971950 d_im [y ][x ] = p_im [y ][x ];
972951 }
973952 }
974953 }
975954
976- IMTfree ( t_im , height );
955+ free ( buf );
977956 free (gaussmat );
978957}
979958
0 commit comments