[GEM-cvs] SF.net SVN: pd-gem:[3573] trunk/Gem/src/Pixes
Brought to you by:
zmoelnig
From: <zmo...@us...> - 2010-12-09 15:43:41
|
Revision: 3573 http://pd-gem.svn.sourceforge.net/pd-gem/?rev=3573&view=rev Author: zmoelnig Date: 2010-12-09 15:43:35 +0000 (Thu, 09 Dec 2010) Log Message: ----------- use RTE::Array rather than directly accessing Pd's arrays this hopefully fixes the problems on 64bit Modified Paths: -------------- trunk/Gem/src/Pixes/pix_curve.cpp trunk/Gem/src/Pixes/pix_histo.cpp Modified: trunk/Gem/src/Pixes/pix_curve.cpp =================================================================== --- trunk/Gem/src/Pixes/pix_curve.cpp 2010-12-09 15:42:48 UTC (rev 3572) +++ trunk/Gem/src/Pixes/pix_curve.cpp 2010-12-09 15:43:35 UTC (rev 3573) @@ -29,6 +29,7 @@ #include "pix_curve.h" #include <string.h> #include <math.h> +#include "RTE/Array.h" CPPEXTERN_NEW_WITH_GIMME(pix_curve) @@ -137,44 +138,40 @@ unsigned char *base = image.data; int n_R, n_G, n_B, n_A; - t_float *tab_R, *tab_G, *tab_B, *tab_A; - int r, g, b, a; - if (m_mode==0) return; - if (!(tab_R=checkarray(name_R, &n_R))) return; - if (!(tab_G=checkarray(name_G, &n_G))) return; - if (!(tab_B=checkarray(name_B, &n_B))) return; + gem::RTE::Array tabR=gem::RTE::Array(name_R->s_name); + gem::RTE::Array tabG=gem::RTE::Array(name_G->s_name); + gem::RTE::Array tabB=gem::RTE::Array(name_B->s_name); + gem::RTE::Array tabA=gem::RTE::Array(name_A->s_name); + n_R=tabR.size(); + n_G=tabG.size(); + n_B=tabB.size(); + n_A=tabA.size(); + switch (m_mode) { case 3: // only RGB + if(! (tabR.isValid() && tabG.isValid() && tabB.isValid())) + return; while (i--) { - r = static_cast<int>(*(tab_R+((n_R*base[chRed ])>>8))); - g = static_cast<int>(*(tab_G+((n_G*base[chGreen])>>8))); - b = static_cast<int>(*(tab_B+((n_B*base[chBlue ])>>8))); - - base[chRed] = CLAMP(r); - base[chGreen] = CLAMP(g); - base[chBlue] = CLAMP(b); + base[chRed ]=CLAMP(static_cast<int>(tabR[ n_R*base[chRed ]>>8 ])); + base[chGreen]=CLAMP(static_cast<int>(tabG[ n_G*base[chGreen]>>8 ])); + base[chBlue ]=CLAMP(static_cast<int>(tabB[ n_B*base[chBlue ]>>8 ])); base+=4; } break; case 4: // RGBA case 1: // one table for all - if (!(tab_A=checkarray(name_A, &n_A))) return; - + if(! (tabR.isValid() && tabG.isValid() && tabB.isValid() && tabA.isValid())) + return; while (i--) { - r = static_cast<int>(*(tab_R+((n_R*base[chRed])>>8))); - g = static_cast<int>(*(tab_G+((n_G*base[chGreen])>>8))); - b = static_cast<int>(*(tab_B+((n_B*base[chBlue])>>8))); - a = static_cast<int>(*(tab_A+((n_A*base[chAlpha])>>8))); - - base[chRed] = CLAMP(r); - base[chGreen] = CLAMP(g); - base[chBlue] = CLAMP(b); - base[chAlpha] = CLAMP(a); + base[chRed ]=CLAMP(static_cast<int>(tabR[ n_R*base[chRed ]>>8 ])); + base[chGreen ]=CLAMP(static_cast<int>(tabG[ n_G*base[chGreen ]>>8 ])); + base[chBlue ]=CLAMP(static_cast<int>(tabB[ n_B*base[chBlue ]>>8 ])); + base[chAlpha ]=CLAMP(static_cast<int>(tabA[ n_A*base[chAlpha]>>8 ])); base+=4; } @@ -191,14 +188,13 @@ int i=image.xsize*image.ysize; unsigned char *base = image.data; - int n; - t_float *tab; - int val; + gem::RTE::Array tab=gem::RTE::Array(name_R->s_name); + int n = tab.size(); - if (!(tab=checkarray(name_R, &n))) return; + if(!tab.isValid())return; while (i--) { - val = static_cast<int>(*(tab+static_cast<int>((n*base[chGray])>>8))); - *base++ = CLAMP(val); + base[chGray]=CLAMP(static_cast<int>(tab[ n*base[chGray]>>8 ])); + base++; } } @@ -208,40 +204,37 @@ unsigned char *base = image.data; int n_Y, n_U, n_V; - t_float *tab_Y, *tab_U, *tab_V; - int y0, y1, u, v; - if (m_mode==0) return; - if (!(tab_Y=checkarray(name_R, &n_Y))) return; - if (!(tab_U=checkarray(name_G, &n_U))) return; - if (!(tab_V=checkarray(name_B, &n_V))) return; + gem::RTE::Array tabY=gem::RTE::Array(name_R->s_name); + gem::RTE::Array tabU=gem::RTE::Array(name_G->s_name); + gem::RTE::Array tabV=gem::RTE::Array(name_B->s_name); + + n_Y=tabY.size(); + n_U=tabU.size(); + n_V=tabV.size(); + switch (m_mode) { case 3: // YUV + if(! (tabY.isValid() && tabU.isValid() && tabV.isValid())) + return; while (i--) { - u = static_cast<int>(*(tab_U+((n_U*base[chU])>>8))); - y0 = static_cast<int>(*(tab_Y+((n_Y*base[chY0])>>8))); - v = static_cast<int>(*(tab_V+((n_V*base[chV])>>8))); - y1 = static_cast<int>(*(tab_Y+((n_Y*base[chY1])>>8))); + base[chU ]=CLAMP(static_cast<int>(tabY[ n_U*base[chU ]>>8 ])); + base[chY0]=CLAMP(static_cast<int>(tabY[ n_Y*base[chY0]>>8 ])); + base[chV ]=CLAMP(static_cast<int>(tabY[ n_V*base[chV ]>>8 ])); + base[chY1]=CLAMP(static_cast<int>(tabY[ n_Y*base[chY1]>>8 ])); - base[chU] = CLAMP(u); - base[chY0] = CLAMP(y0); - base[chV] = CLAMP(v); - base[chY1] = CLAMP(y1); - base+=4; } break; case 1: // only Y - if (!(tab_Y=checkarray(name_A, &n_Y))) return; - + if(! (tabY.isValid())) + return; + while (i--) { - y0 = static_cast<int>(*(tab_Y+((n_Y*base[chY0])>>8))); - y1 = static_cast<int>(*(tab_Y+((n_Y*base[chY1])>>8))); - - base[chY0] = CLAMP(y0); - base[chY1] = CLAMP(y1); + base[chY0]=CLAMP(static_cast<int>(tabY[ n_Y*base[chY0]>>8 ])); + base[chY1]=CLAMP(static_cast<int>(tabY[ n_Y*base[chY1]>>8 ])); base+=4; } Modified: trunk/Gem/src/Pixes/pix_histo.cpp =================================================================== --- trunk/Gem/src/Pixes/pix_histo.cpp 2010-12-09 15:42:48 UTC (rev 3572) +++ trunk/Gem/src/Pixes/pix_histo.cpp 2010-12-09 15:43:35 UTC (rev 3573) @@ -13,8 +13,8 @@ // WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution. // ///////////////////////////////////////////////////////// +#include <iostream> - ///////////////////////////////////////////////////////// // // pix_histo @@ -30,6 +30,9 @@ #include <string.h> #include <math.h> +#include "RTE/Array.h" +#include "Base/GemPixConvert.h" + CPPEXTERN_NEW_WITH_GIMME(pix_histo) @@ -157,68 +160,78 @@ ///////////////////////////////////////////////////////// void pix_histo :: processRGBAImage(imageStruct &image) { - int i=image.xsize*image.ysize; + int size=image.xsize*image.ysize; unsigned char *base = image.data; - int n_R, n_G, n_B, n_A; - t_float *tab_R=NULL, *tab_G=NULL, *tab_B=NULL, *tab_A=NULL; - t_float scale_R=0, scale_G=0, scale_B=0, scale_A=0; + int n_R=0, n_G=0, n_B=0, n_A=0; - t_float f; + t_float incr=0.; - int n; - t_float *tab; + gem::RTE::Array tabR=gem::RTE::Array(name_R->s_name); + gem::RTE::Array tabG=gem::RTE::Array(name_G->s_name); + gem::RTE::Array tabB=gem::RTE::Array(name_B->s_name); + gem::RTE::Array tabA=gem::RTE::Array(name_A->s_name); if (m_mode==0) return; switch (m_mode) { case 4: - if (!(tab_A=checkarray(name_A, &n_A))) return; - scale_A=n_A/256.; - n = n_A; tab = tab_A; while(n--)*tab++=0; + if(!tabA.isValid())return; + n_A=tabA.size(); + tabA.set(0); + case 3: - if (!(tab_G=checkarray(name_G, &n_G))) return; - scale_G=n_G/256.; - n = n_G; tab = tab_G; while(n--)*tab++=0; - if (!(tab_B=checkarray(name_B, &n_B))) return; - scale_B=n_B/256.; - n = n_B; tab = tab_B; while(n--)*tab++=0; + if(!tabB.isValid())return; + n_B=tabB.size(); + tabB.set(0); + + if(!tabG.isValid())return; + n_G=tabG.size(); + tabG.set(0); + case 1: - if (!(tab_R=checkarray(name_R, &n_R))) return; - scale_R=n_R/256.; - n = n_R; tab = tab_R; while(n--)*tab++=0; + if(!tabR.isValid())return; + n_R=tabR.size(); + tabR.set(0); + default: break; } - f = 1./i; + incr = 1./size; switch (m_mode) { case 1: // RGB->grey - while (i--) { - float grey = base[chRed] * 0.3086f + base[chGreen] * 0.6094f - + base[chBlue] * 0.0820f; - - // *(tab_R+static_cast<int>(scale_R*(unsigned char)grey)) - *(tab_R+static_cast<int>(scale_R*grey))+=f; - + while (size--) { + +#if 1 + const unsigned int grey =((base[chRed] *RGB2GRAY_RED+ + base[chGreen]*RGB2GRAY_GREEN+ + base[chBlue] *RGB2GRAY_BLUE) + >>8)+RGB2GRAY_OFFSET; + const unsigned int index=(n_R*grey)>>8; + tabR[index]+=incr; +#else + float grey = (base[chRed] * 0.3086f + base[chGreen] * 0.6094f + base[chBlue] * 0.0820f)/255.f; + tabR[static_cast<int>(n_R*grey)]+=incr; +#endif base+=4; } break; case 3: // RGB - while (i--) { - *(tab_R+static_cast<int>(scale_R*base[chRed])) +=f; - *(tab_G+static_cast<int>(scale_G*base[chGreen]))+=f; - *(tab_B+static_cast<int>(scale_B*base[chBlue])) +=f; + while (size--) { + tabR[(n_R*base[chRed ])>>8]+=incr; + tabG[(n_G*base[chGreen])>>8]+=incr; + tabB[(n_B*base[chBlue ])>>8]+=incr; base+=4; } break; case 4: // RGBA - while (i--) { - *(tab_R+static_cast<int>(scale_R*base[chRed])) +=f; - *(tab_G+static_cast<int>(scale_G*base[chGreen]))+=f; - *(tab_B+static_cast<int>(scale_B*base[chBlue])) +=f; - *(tab_A+static_cast<int>(scale_B*base[chAlpha]))+=f; + while (size--) { + tabR[(n_R*base[chRed ])>>8]+=incr; + tabG[(n_G*base[chGreen])>>8]+=incr; + tabB[(n_B*base[chBlue ])>>8]+=incr; + tabA[(n_A*base[chAlpha])>>8]+=incr; base+=4; } @@ -231,46 +244,55 @@ void pix_histo :: processYUVImage(imageStruct &image) { - int i=image.xsize*image.ysize; + int size=image.xsize*image.ysize; unsigned char *base = image.data; int n_Y, n_U, n_V; - t_float *tab_Y=NULL, *tab_U=NULL, *tab_V=NULL; - int n; - t_float *tab; + gem::RTE::Array tabY=gem::RTE::Array(name_R->s_name); + gem::RTE::Array tabU=gem::RTE::Array(name_G->s_name); + gem::RTE::Array tabV=gem::RTE::Array(name_B->s_name); + if (m_mode==0) return; switch (m_mode) { case 3: - if (!(tab_V=checkarray(name_B, &n_V))) return; - n = n_V; tab = tab_V; while(n--)*tab++=0; - if (!(tab_U=checkarray(name_G, &n_U))) return; - n = n_U; tab = tab_U; while(n--)*tab++=0; + if(!tabU.isValid())return; + n_U=tabU.size(); + tabU.set(0); + + if(!tabV.isValid())return; + n_V=tabV.size(); + tabV.set(0); + case 1: - if (!(tab_Y=checkarray(name_R, &n_Y))) return; - n = n_Y; tab = tab_Y; while(n--)*tab++=0; + if(!tabY.isValid())return; + n_Y=tabY.size(); + tabY.set(0); default: break; } - t_float f = 1./i; - t_float f2 = f*2.f; + t_float incrY = 1./size; + t_float incrUV = incrY *2.f; - i/=2; + size/=2; switch (m_mode) { case 1: // RGB->grey - while (i--) { - *(tab_Y+((n_Y*base[chY0])>>8))+=f; - *(tab_Y+((n_Y*base[chY1])>>8))+=f; + while (size--) { + tabY[(n_Y*base[chY0])>>8]+=incrY; + tabY[(n_Y*base[chY1])>>8]+=incrY; + + // *(tab_Y+((n_Y*base[chY0])>>8))+=incrY; + // *(tab_Y+((n_Y*base[chY1])>>8))+=incrY; base+=4; } break; case 3: // RGB - while (i--) { - *(tab_Y+((n_Y*base[chY0])>>8)) +=f; - *(tab_Y+((n_Y*base[chY1])>>8)) +=f; - *(tab_U+((n_U*base[chU])>>8)) +=f2; - *(tab_V+((n_V*base[chV])>>8)) +=f2; + while (size--) { + tabU[(n_U*base[chU ])>>8]+=incrUV; + tabY[(n_Y*base[chY0])>>8]+=incrY; + tabV[(n_V*base[chV ])>>8]+=incrUV; + tabY[(n_Y*base[chY1])>>8]+=incrY; base+=4; } break; @@ -282,25 +304,26 @@ void pix_histo :: processGrayImage(imageStruct &image) { - int i=image.xsize*image.ysize; + int size=image.xsize*image.ysize; + t_float incr= 1./size; + unsigned char *base = image.data; - - int n_G; - t_float *tab_G=NULL; - t_float f; - int n; - t_float *tab; - if (m_mode==0) return; - - if (!(tab_G=checkarray(name_A, &n_G))) return; - n = n_G; tab = tab_G; while(n--)*tab++=0; - f = 1./i; + gem::RTE::Array tab=gem::RTE::Array(name_A->s_name); + int n=tab.size(); - while (i--)*(tab_G+((n_G*(*base++))>>8)) +=f; + if(!tab.isValid()) + return; + tab.set(0); + + while (size--) { + tab[(n*base[chGray])>>8]+=incr; + base++; + } + update_graphs(); } ///////////////////////////////////////////////////////// This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |