Revision: 4476 http://pd-gem.svn.sourceforge.net/pd-gem/?rev=4476&view=rev Author: zmoelnig Date: 2011-08-16 12:37:53 +0000 (Tue, 16 Aug 2011)
Log Message: ----------- normalized behaviour of [pix_movement] in all colorspaces Modified Paths: -------------- trunk/Gem/src/Pixes/pix_movement.cpp trunk/Gem/src/Pixes/pix_movement.h Modified: trunk/Gem/src/Pixes/pix_movement.cpp =================================================================== --- trunk/Gem/src/Pixes/pix_movement.cpp 2011-08-16 10:17:44 UTC (rev 4475) +++ trunk/Gem/src/Pixes/pix_movement.cpp 2011-08-16 12:37:53 UTC (rev 4476) @@ -55,9 +55,6 @@ if(f>1.f)f=1.0; threshold = (unsigned char)(255*f); inlet_new(this->x_obj, &this->x_obj->ob_pd, gensym("float"), gensym("thresh")); - - index = 0; - averageTime = 0; } ///////////////////////////////////////////////////////// @@ -84,8 +81,8 @@ int pixsize = image.ysize * image.xsize; - unsigned char *rp = image.data; // read pointer - unsigned char *wp=buffer.data; // write pointer + unsigned char *rp = image.data; // read pointer + unsigned char *wp=buffer.data; // write pointer while(pixsize--) { // unsigned char grey = (unsigned char)(rp[chRed] * 0.3086f + rp[chGreen] * 0.6094f + rp[chBlue] * 0.0820f); @@ -114,8 +111,8 @@ Y0 = chY0; thresh = threshold; - unsigned char *rp = image.data; // read pointer - unsigned char *wp=buffer.data; // write pointer to the copy + unsigned char *rp = image.data; // read pointer + unsigned char *wp=buffer.data; // write pointer to the copy unsigned char grey,grey1; grey = 0; @@ -129,11 +126,13 @@ grey1 = rp[Y1]; rp[Y1]=CLAMP_Y(255*(abs(grey1-*wp)>thresh)); *wp++=grey1; -#if 1 - // looks cool (C64), but what for ? + + // looks cool (C64), but what for ? + + if(true) { // black&white rp[chU]=128; rp[chV]=128; -#endif + } rp+=4; } } @@ -146,102 +145,102 @@ buffer.ysize = image.ysize; buffer.reallocate(buffer.xsize*buffer.ysize*2); } + int pixsize = image.ysize * image.xsize/8; - union{ - signed short c[8]; - vector signed short v; + signed short c[8]; + vector signed short v; }shortBuffer; - - int pixsize = image.ysize * image.xsize/8; + union{ + unsigned short c[8]; + vector unsigned short v; + }ushortBuffer; + int i; - vector signed short thresh; - + vector signed short thresh; shortBuffer.c[0] = threshold; thresh = shortBuffer.v; thresh = (vector signed short)vec_splat(thresh,0); - vector unsigned char *rp = (vector unsigned char *) image.data; // read pointer - vector unsigned char *wp = (vector unsigned char *) buffer.data; // write pointer to the copy - vector unsigned char grey,grey1; + vector unsigned char *rp = (vector unsigned char *) image.data; // read pointer + vector unsigned char *wp = (vector unsigned char *) buffer.data; // write pointer to the copy + vector unsigned char grey0,grey1; vector unsigned char one = vec_splat_u8(1); - vector unsigned short Y,UV,Ywp,UVwp,hiImage,loImage; - vector unsigned short Y1,UV1,Ywp1,UVwp1,hiImage1,loImage1; - vector signed short temp,temp1; - //vector signed int Ye, Yo; - //vector signed short twofivefive; + vector unsigned short Y0,Ywp0,hiImage0,loImage0; + vector unsigned short Y1,Ywp1,hiImage1,loImage1; + vector unsigned short UVwp0,UVwp1; + vector signed short temp0,temp1; - // int const1, const2, const3,j; - + ushortBuffer.c[0]=127; + vector unsigned short UV0= (vector unsigned short)vec_splat(ushortBuffer.v, 0); + vector unsigned short UV1= (vector unsigned short)vec_splat(ushortBuffer.v, 0); - - #ifndef PPC970 +#ifndef PPC970 //setup the cache prefetch -- A MUST!!! - UInt32 prefetchSize = GetPrefetchConstant( 16, 0, 256 ); + UInt32 prefetchSize = GetPrefetchConstant( 16, 0, 256 ); vec_dst( rp, prefetchSize, 0 ); vec_dst( wp, prefetchSize, 1 ); - #endif +#endif - - j = 16; + int j = 16; pixsize/=2; for (i=0; i < pixsize; i++) { - #ifndef PPC970 +# ifndef PPC970 //setup the cache prefetch -- A MUST!!! - UInt32 prefetchSize = GetPrefetchConstant( j, 0, j * 16 ); + UInt32 prefetchSize = GetPrefetchConstant( j, 0, j * 16 ); vec_dst( rp, prefetchSize, 0 ); vec_dst( wp, prefetchSize, 1 ); vec_dst( rp+16, prefetchSize, 2 ); vec_dst( wp+16, prefetchSize, 3 ); - #endif +# endif - grey = rp[0]; + grey0 = rp[0]; grey1 = rp[1]; - // rp[Y0]=255*(abs(grey-*wp)>thresh); +// rp[Y0]=255*(abs(grey0-*wp)>thresh); - UV = (vector unsigned short)vec_mule(rp[0],one); - Y = (vector unsigned short)vec_mulo(rp[0],one); +// UV0= (vector unsigned short)vec_mule(grey0,one); + Y0 = (vector unsigned short)vec_mulo(grey0,one); - UV1 = (vector unsigned short)vec_mule(grey1,one); +// UV1= (vector unsigned short)vec_mule(grey1,one); Y1 = (vector unsigned short)vec_mulo(grey1,one); //wp is actually 1/2 the size of the image because it is only Y?? //here the full U Y V Y is stored - UVwp = (vector unsigned short)vec_mule(wp[0],one); - Ywp = (vector unsigned short)vec_mulo(wp[0],one); +// UVwp0= (vector unsigned short)vec_mule(wp[0],one); + Ywp0 = (vector unsigned short)vec_mulo(wp[0],one); - UVwp1 = (vector unsigned short)vec_mule(wp[1],one); +// UVwp1= (vector unsigned short)vec_mule(wp[1],one); Ywp1 = (vector unsigned short)vec_mulo(wp[1],one); //store the current pixels as the history for next time - wp[0]=grey; + wp[0]=grey0; wp++; - wp[0] = grey1; + wp[0]=grey1; wp++; - temp = vec_abs(vec_sub((vector signed short)Y,(vector signed short)Ywp)); - Y = (vector unsigned short)vec_cmpgt(temp,thresh); + temp0 = vec_abs(vec_sub((vector signed short)Y0,(vector signed short)Ywp0)); + Y0 = (vector unsigned short)vec_cmpgt(temp0,thresh); temp1 = vec_abs(vec_sub((vector signed short)Y1,(vector signed short)Ywp1)); Y1 = (vector unsigned short)vec_cmpgt(temp1,thresh); - hiImage = vec_mergeh(UV,Y); - loImage = vec_mergel(UV,Y); + hiImage0 = vec_mergeh(UV0,Y0); + loImage0 = vec_mergel(UV0,Y0); hiImage1 = vec_mergeh(UV1,Y1); loImage1 = vec_mergel(UV1,Y1); - grey = vec_packsu(hiImage,loImage); + grey0 = vec_packsu(hiImage0,loImage0); grey1 = vec_packsu(hiImage1,loImage1); - rp[0] = grey; + rp[0]=grey0; rp++; - rp[0] = grey1; + rp[0]=grey1; rp++; // grey = rp[0]; // rp[Y1]=255*(abs(grey-*wp)>thresh); @@ -251,12 +250,12 @@ // rp++; } - #ifndef PPC970 +# ifndef PPC970 vec_dss(0); vec_dss(1); vec_dss(2); vec_dss(3); - #endif +# endif } #endif /* __VEC__ */ @@ -276,8 +275,8 @@ int pixsize = image.ysize * image.xsize; - unsigned char *rp = image.data; // read pointer - unsigned char *wp=buffer.data; // write pointer to the copy + unsigned char *rp = image.data; // read pointer + unsigned char *wp=buffer.data; // write pointer to the copy unsigned char *wp2=buffer2.data; // write pointer to the diff-image while(pixsize--) { @@ -305,13 +304,13 @@ unsigned char thresh=threshold; - __m64*rp = (__m64*)image.data; // read pointer - __m64*wp = (__m64*)buffer.data; // write pointer to the copy + __m64*rp = (__m64*)image.data; // read pointer + __m64*wp = (__m64*)buffer.data; // write pointer to the copy __m64*wp2= (__m64*)buffer2.data; // write pointer to the diff-image __m64 m1, m2, grey; __m64 thresh8=_mm_set_pi8(thresh,thresh,thresh,thresh, - thresh,thresh,thresh,thresh); + thresh,thresh,thresh,thresh); // there is still one problem with the threshold: is the cmpgt only for signed ? while(pixsize--) { @@ -349,9 +348,9 @@ void pix_movement :: obj_setupCallback(t_class *classPtr) { class_addmethod(classPtr, reinterpret_cast<t_method>(&pix_movement::threshMessCallback), - gensym("threshold"), A_FLOAT, A_NULL); + gensym("threshold"), A_FLOAT, A_NULL); class_addmethod(classPtr, reinterpret_cast<t_method>(&pix_movement::threshMessCallback), - gensym("thresh"), A_FLOAT, A_NULL); + gensym("thresh"), A_FLOAT, A_NULL); } void pix_movement :: threshMessCallback(void *data, t_floatarg newmode) { Modified: trunk/Gem/src/Pixes/pix_movement.h =================================================================== --- trunk/Gem/src/Pixes/pix_movement.h 2011-08-16 10:17:44 UTC (rev 4475) +++ trunk/Gem/src/Pixes/pix_movement.h 2011-08-16 12:37:53 UTC (rev 4476) @@ -81,12 +81,9 @@ // the movement-mode unsigned char threshold; - int j,index, averageTime; - ////////// // the methods static void threshMessCallback(void *data, t_floatarg fthresh); - }; #endif // for header file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ uberSVN's rich system and user administration capabilities and model configuration take the hassle out of deploying and managing Subversion and the tools developers use with it. Learn more about uberSVN and get a free download at: http://p.sf.net/sfu/wandisco-dev2dev _______________________________________________ pd-gem-CVS mailing list pd-gem-CVS@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/pd-gem-cvs