[GEM-cvs] SF.net SVN: pd-gem:[3451] trunk/Gem/src
Brought to you by:
zmoelnig
From: <zmo...@us...> - 2010-08-07 18:24:10
|
Revision: 3451 http://pd-gem.svn.sourceforge.net/pd-gem/?rev=3451&view=rev Author: zmoelnig Date: 2010-08-07 18:24:04 +0000 (Sat, 07 Aug 2010) Log Message: ----------- implemented fromARGB() v4l2 devices with FMT_RGB32 return ARGB -> now we finally have to correct colors! Modified Paths: -------------- trunk/Gem/src/Base/GemPixUtil.cpp trunk/Gem/src/Base/GemPixUtil.h trunk/Gem/src/plugins/videoV4L2/videoV4L2.cpp Modified: trunk/Gem/src/Base/GemPixUtil.cpp =================================================================== --- trunk/Gem/src/Base/GemPixUtil.cpp 2010-08-07 17:44:12 UTC (rev 3450) +++ trunk/Gem/src/Base/GemPixUtil.cpp 2010-08-07 18:24:04 UTC (rev 3451) @@ -814,6 +814,7 @@ // in place conversion unsigned char dummy=0; while(pixelnum--){ + dummy =pixels[3]; pixels[3]=pixels[0]; pixels[0]=dummy; dummy =pixels[1]; pixels[1]=pixels[2]; pixels[2]=dummy; pixels+=4; @@ -869,6 +870,85 @@ } } +GEM_EXTERN void imageStruct::fromARGB(unsigned char *argbdata) { + if(!argbdata)return; + size_t pixelnum=xsize*ysize; + setCsizeByFormat(); + reallocate(); + unsigned char *pixels=data; + switch (format){ + case GL_BGR_EXT: + while(pixelnum--){ + pixels[0]=argbdata[3]; // B + pixels[1]=argbdata[2]; // G + pixels[2]=argbdata[1]; // R + pixels+=3; argbdata+=4; + } + break; + case GL_RGB: + while(pixelnum--){ + argbdata++; + *pixels++=*argbdata++; + *pixels++=*argbdata++; + *pixels++=*argbdata++; + } + break; +#if 0 + case GL_ARGB_EXT: + memcpy(data, argbdata, pixelnum*csize); + break; +#endif + case GL_RGBA: + while(pixelnum--){ + pixels[0]=argbdata[1]; // R + pixels[1]=argbdata[2]; // G + pixels[2]=argbdata[3]; // B + pixels[3]=argbdata[0]; // A + pixels+=4;argbdata+=4; + } + break; + case GL_LUMINANCE: + while(pixelnum--){ +#ifdef __APPLE__ + const int R=0; + const int G=3; + const int B=2; +#else + const int R=1; + const int G=2; + const int B=3; +#endif + *pixels++=(argbdata[R]*RGB2GRAY_RED+argbdata[G]*RGB2GRAY_GREEN+argbdata[B]*RGB2GRAY_BLUE)>>8; + argbdata+=4; + } + break; + case GL_YUV422_GEM: + START_TIMING; + switch(m_simd){ + case GEM_SIMD_NONE: default: + pixelnum>>=1; + while(pixelnum--){ + *pixels++=((RGB2YUV_21*argbdata[chGreen]+ // R + RGB2YUV_22*argbdata[chBlue]+ // G + RGB2YUV_23*argbdata[chAlpha] // B + )>>8)+UV_OFFSET; // U + *pixels++=((RGB2YUV_11*argbdata[chGreen]+ + RGB2YUV_12*argbdata[chBlue]+ + RGB2YUV_13*argbdata[chAlpha])>>8)+ Y_OFFSET; // Y + *pixels++=((RGB2YUV_31*argbdata[chGreen]+ + RGB2YUV_32*argbdata[chBlue]+ + RGB2YUV_33*argbdata[chAlpha])>>8)+UV_OFFSET; // V + *pixels++=((RGB2YUV_11*argbdata[4+chGreen]+ + RGB2YUV_12*argbdata[4+chBlue]+ + RGB2YUV_13*argbdata[4+chAlpha])>>8)+ Y_OFFSET; // Y + argbdata+=8; + } + } + STOP_TIMING("ARGB_to_YCbCr"); + break; + } +} + GEM_EXTERN void imageStruct::fromGray(unsigned char *greydata) { if(!greydata)return; size_t pixelnum=xsize*ysize; Modified: trunk/Gem/src/Base/GemPixUtil.h =================================================================== --- trunk/Gem/src/Base/GemPixUtil.h 2010-08-07 17:44:12 UTC (rev 3450) +++ trunk/Gem/src/Base/GemPixUtil.h 2010-08-07 18:24:04 UTC (rev 3451) @@ -199,6 +199,7 @@ virtual void fromBGRA (unsigned char* orgdata); virtual void fromRGB16 (unsigned char* orgdata); virtual void fromABGR (unsigned char* orgdata); + virtual void fromARGB (unsigned char* orgdata); virtual void fromGray (unsigned char* orgdata); virtual void fromGray (short* orgdata); virtual void fromUYVY (unsigned char* orgdata); Modified: trunk/Gem/src/plugins/videoV4L2/videoV4L2.cpp =================================================================== --- trunk/Gem/src/plugins/videoV4L2/videoV4L2.cpp 2010-08-07 17:44:12 UTC (rev 3450) +++ trunk/Gem/src/plugins/videoV4L2/videoV4L2.cpp 2010-08-07 18:24:04 UTC (rev 3451) @@ -295,7 +295,7 @@ switch(m_gotFormat){ case V4L2_PIX_FMT_RGB24: m_image.image.fromRGB (data); break; case V4L2_PIX_FMT_BGR32: m_image.image.fromBGRA (data); break; - case V4L2_PIX_FMT_RGB32: m_image.image.fromRGBA (data); break; + case V4L2_PIX_FMT_RGB32: m_image.image.fromARGB (data); break; case V4L2_PIX_FMT_GREY : m_image.image.fromGray (data); break; case V4L2_PIX_FMT_UYVY : m_image.image.fromYUV422(data); break; case V4L2_PIX_FMT_YUYV : m_image.image.fromYUY2 (data); break; @@ -610,8 +610,7 @@ switch(m_gotFormat){ case V4L2_PIX_FMT_GREY : m_colorConvert=(m_reqFormat!=GL_LUMINANCE); break; case V4L2_PIX_FMT_RGB24 : m_colorConvert=(m_reqFormat!=GL_BGR); break; -#warning RGB32 vs BGRA confusion - case V4L2_PIX_FMT_RGB32 : m_colorConvert=(m_reqFormat!=GL_BGRA); break;//RGB32!=RGBA; its ARGB + case V4L2_PIX_FMT_RGB32 : m_colorConvert=true; break; case V4L2_PIX_FMT_UYVY : m_colorConvert=(m_reqFormat!=GL_YCBCR_422_GEM); break; case V4L2_PIX_FMT_YUV420: m_colorConvert=1; break; default: m_colorConvert=true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |