[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17320] trunk/blender/source/gameengine/ VideoTexture: VideoTexture: fix RGB/BGR confusion, make code compatible with big endian CPU, add RGBA source filter.

Benoit Bolsee benoit.bolsee at online.be
Tue Nov 4 13:05:00 CET 2008


Revision: 17320
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17320
Author:   ben2610
Date:     2008-11-04 13:04:59 +0100 (Tue, 04 Nov 2008)

Log Message:
-----------
VideoTexture: fix RGB/BGR confusion, make code compatible with big endian CPU, add RGBA source filter.

Modified Paths:
--------------
    trunk/blender/source/gameengine/VideoTexture/FilterBase.h
    trunk/blender/source/gameengine/VideoTexture/FilterBlueScreen.h
    trunk/blender/source/gameengine/VideoTexture/FilterColor.cpp
    trunk/blender/source/gameengine/VideoTexture/FilterColor.h
    trunk/blender/source/gameengine/VideoTexture/FilterNormal.cpp
    trunk/blender/source/gameengine/VideoTexture/FilterNormal.h
    trunk/blender/source/gameengine/VideoTexture/FilterSource.cpp
    trunk/blender/source/gameengine/VideoTexture/FilterSource.h
    trunk/blender/source/gameengine/VideoTexture/ImageBuff.cpp
    trunk/blender/source/gameengine/VideoTexture/ImageViewport.cpp
    trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.cpp
    trunk/blender/source/gameengine/VideoTexture/VideoFFmpeg.h
    trunk/blender/source/gameengine/VideoTexture/blendVideoTex.cpp

Modified: trunk/blender/source/gameengine/VideoTexture/FilterBase.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterBase.h	2008-11-04 11:02:13 UTC (rev 17319)
+++ trunk/blender/source/gameengine/VideoTexture/FilterBase.h	2008-11-04 12:04:59 UTC (rev 17320)
@@ -29,6 +29,12 @@
 
 #include "PyTypeList.h"
 
+#define VT_C(v,idx)	((unsigned char*)&v)[idx]
+#define VT_R(v)	((unsigned char*)&v)[0]
+#define VT_G(v)	((unsigned char*)&v)[1]
+#define VT_B(v)	((unsigned char*)&v)[2]
+#define VT_A(v)	((unsigned char*)&v)[3]
+#define VT_RGBA(v,r,g,b,a)	VT_R(v)=(unsigned char)r, VT_G(v)=(unsigned char)g, VT_B(v)=(unsigned char)b, VT_A(v)=(unsigned char)a
 
 // forward declaration
 class FilterBase;

Modified: trunk/blender/source/gameengine/VideoTexture/FilterBlueScreen.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterBlueScreen.h	2008-11-04 11:02:13 UTC (rev 17319)
+++ trunk/blender/source/gameengine/VideoTexture/FilterBlueScreen.h	2008-11-04 12:04:59 UTC (rev 17320)
@@ -63,25 +63,24 @@
 		short * size, unsigned int pixSize, unsigned int val)
 	{
 		// calculate differences
-		int difRed = int((val >> 16) & 0xFF) - int(m_color[0]);
-		int difGreen = int((val >> 8) & 0xFF) - int(m_color[1]);
-		int difBlue = int(val & 0xFF) - int(m_color[2]);
+		int difRed = int(VT_R(val)) - int(m_color[0]);
+		int difGreen = int(VT_G(val)) - int(m_color[1]);
+		int difBlue = int(VT_B(val)) - int(m_color[2]);
 		// calc distance from "blue screen" color
 		unsigned int dist = (unsigned int)(difRed * difRed + difGreen * difGreen
 			+ difBlue * difBlue);
 		// condition for fully transparent color
 		if (m_squareLimits[0] >= dist) 
 			// return color with zero alpha
-			//return 0xFF000000;
-			return val & 0x00FFFFFF;
+			VT_A(val) = 0;
 		// condition for fully opaque color
 		else if (m_squareLimits[1] <= dist)
 			// return normal colour
-			return val | 0xFF000000;
+			VT_A(val) = 0xFF;
 		// otherwise calc alpha
 		else
-			return (val & 0x00FFFFFF) | ((((dist - m_squareLimits[0]) << 8)
-			/ m_limitDist) << 24);
+			VT_A(val) = (((dist - m_squareLimits[0]) << 8) / m_limitDist);
+		return val;
 	}
 
 	/// virtual filtering function for byte source

Modified: trunk/blender/source/gameengine/VideoTexture/FilterColor.cpp
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterColor.cpp	2008-11-04 11:02:13 UTC (rev 17319)
+++ trunk/blender/source/gameengine/VideoTexture/FilterColor.cpp	2008-11-04 12:04:59 UTC (rev 17320)
@@ -223,7 +223,7 @@
 	for (int r = 0; r < 4; ++r)
 	{
 		levels[r][0] = 0;
-		levels[r][1] = 0xFF << (r << 3);
+		levels[r][1] = 0xFF;
 		levels[r][2] = 0xFF;
 	}
 }
@@ -235,7 +235,7 @@
 	for (int r = 0; r < 4; ++r)
 	{
 		for (int c = 0; c < 2; ++c)
-			levels[r][c] = lev[r][c] << (r << 3);
+			levels[r][c] = lev[r][c];
 		levels[r][2] = lev[r][0] < lev[r][1] ? lev[r][1] - lev[r][0] : 1;
 	}
 }
@@ -252,9 +252,9 @@
 static PyObject * getLevels (PyFilter * self, void * closure)
 {
 	ColorLevel & lev = getFilterLevel(self)->getLevels();
-	return Py_BuildValue("((kk)(kk)(kk)(kk))",
-		lev[0][0], lev[0][1], lev[1][0] >> 8, lev[1][1] >> 8,
-		lev[2][0] >> 16, lev[2][1] >> 16, lev[3][0] >> 24, lev[3][1] >> 24);
+	return Py_BuildValue("((HH)(HH)(HH)(HH))",
+		lev[0][0], lev[0][1], lev[1][0], lev[1][1],
+		lev[2][0], lev[2][1], lev[3][0], lev[3][1]);
 }
 
 // set color levels
@@ -279,7 +279,7 @@
 			valid = PyInt_Check(PySequence_Fast_GET_ITEM(row, c));
 			// if it is valid, save it in matrix
 			if (valid)
-				lev[r][c] = (unsigned long)(PyInt_AsLong(PySequence_Fast_GET_ITEM(row, c)));
+				lev[r][c] = (unsigned short)(PyInt_AsLong(PySequence_Fast_GET_ITEM(row, c)));
 		}
 	}
 	// if parameter is not valid, report error

Modified: trunk/blender/source/gameengine/VideoTexture/FilterColor.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterColor.h	2008-11-04 11:02:13 UTC (rev 17319)
+++ trunk/blender/source/gameengine/VideoTexture/FilterColor.h	2008-11-04 12:04:59 UTC (rev 17320)
@@ -43,10 +43,13 @@
 		short * size, unsigned int pixSize, unsigned int val)
 	{
 		// calculate gray value
-		unsigned int gray = (28 * ((val >> 16) & 0xFF) + 151 * ((val >> 8) & 0xFF)
-			+ 77 * (val & 0xFF)) & 0xFF00;
+		unsigned int gray = (28 * (VT_B(val)) + 151 * (VT_G(val))
+			+ 77 * (VT_R(val))) >> 8;
 		// return gray scale value
-		return (val & 0xFF000000) | gray << 8 | gray | gray >> 8;
+		VT_R(val) = gray;
+		VT_G(val) = gray;
+		VT_B(val) = gray;
+		return val;
 	}
 
 	/// virtual filtering function for byte source
@@ -82,11 +85,11 @@
 	ColorMatrix m_matrix;
 
 	/// calculate one color component
-	unsigned int calcColor (unsigned int val, short idx)
+	unsigned char calcColor (unsigned int val, short idx)
 	{
-		return (((m_matrix[idx][0]  * (val & 0xFF) + m_matrix[idx][1] * ((val >> 8) & 0xFF)
-			+ m_matrix[idx][2] * ((val >> 16) & 0xFF) + m_matrix[idx][3] * ((val >> 24) & 0xFF)
-			+ m_matrix[idx][4]) >> 8) & 0xFF) << (idx << 3);
+		return (((m_matrix[idx][0]  * (VT_R(val)) + m_matrix[idx][1] * (VT_G(val))
+			+ m_matrix[idx][2] * (VT_B(val)) + m_matrix[idx][3] * (VT_A(val))
+			+ m_matrix[idx][4]) >> 8) & 0xFF);
 	}
 
 	/// filter pixel template, source int buffer
@@ -94,8 +97,9 @@
 		short * size, unsigned int pixSize, unsigned int val)
 	{
 		// return calculated color
-		return calcColor(val, 0) | calcColor(val, 1) | calcColor(val, 2)
-			| calcColor(val, 3);
+		int color;
+		VT_RGBA(color, calcColor(val, 0), calcColor(val, 1), calcColor(val, 2), calcColor(val, 3));
+		return color;
 	}
 
 	/// virtual filtering function for byte source
@@ -110,7 +114,7 @@
 
 
 /// type for color levels
-typedef unsigned long ColorLevel[4][3];
+typedef unsigned short ColorLevel[4][3];
 
 /// pixel filter for color calculation
 class FilterLevel : public FilterBase
@@ -133,11 +137,10 @@
 	/// calculate one color component
 	unsigned int calcColor (unsigned int val, short idx)
 	{
-		unsigned int col = val & (0xFF << (idx << 3));
+		unsigned int col = VT_C(val,idx);;
 		if (col <= levels[idx][0]) col = 0;
-		else if (col >= levels[idx][1]) col = 0xFF << (idx << 3);
-		else if (idx < 3) col = (((col - levels[idx][0]) << 8) / levels[idx][2]) & (0xFF << (idx << 3));
-		else col = (((col - levels[idx][0]) / levels[idx][2]) << 8) & (0xFF << (idx << 3));
+		else if (col >= levels[idx][1]) col = 0xFF;
+		else col = (((col - levels[idx][0]) << 8) / levels[idx][2]) & 0xFF;
 		return col; 
 	}
 
@@ -146,8 +149,9 @@
 		short * size, unsigned int pixSize, unsigned int val)
 	{
 		// return calculated color
-		return calcColor(val, 0) | calcColor(val, 1) | calcColor(val, 2)
-			| calcColor(val, 3);
+		int color;
+		VT_RGBA(color, calcColor(val, 0), calcColor(val, 1), calcColor(val, 2), calcColor(val, 3));
+		return color;
 	}
 
 	/// virtual filtering function for byte source

Modified: trunk/blender/source/gameengine/VideoTexture/FilterNormal.cpp
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterNormal.cpp	2008-11-04 11:02:13 UTC (rev 17319)
+++ trunk/blender/source/gameengine/VideoTexture/FilterNormal.cpp	2008-11-04 12:04:59 UTC (rev 17320)
@@ -32,7 +32,7 @@
 // implementation FilterNormal
 
 // constructor
-FilterNormal::FilterNormal (void) : m_colShift(0)
+FilterNormal::FilterNormal (void) : m_colIdx(0)
 {
 	// set default depth
 	setDepth(4);
@@ -44,7 +44,7 @@
 	// check validity of index
 	if (colIdx < 3)
 		// set color shift
-		m_colShift = colIdx << 3;
+		m_colIdx = colIdx;
 }
 
 // set depth

Modified: trunk/blender/source/gameengine/VideoTexture/FilterNormal.h
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterNormal.h	2008-11-04 11:02:13 UTC (rev 17319)
+++ trunk/blender/source/gameengine/VideoTexture/FilterNormal.h	2008-11-04 12:04:59 UTC (rev 17320)
@@ -43,7 +43,7 @@
 	virtual ~FilterNormal (void) {}
 
 	/// get index of color used to calculate normals
-	unsigned short getColor (void) { return m_colShift >> 3; }
+	unsigned short getColor (void) { return m_colIdx; }
 	/// set index of color used to calculate normals
 	void setColor (unsigned short colIdx);
 
@@ -58,20 +58,28 @@
 	/// scale to calculate normals
 	float m_depthScale;
 
-	/// shift to used color component
-	unsigned short m_colShift;
+	/// color index, 0=red, 1=green, 2=blue, 3=alpha
+	unsigned short m_colIdx;
 
 	/// filter pixel, source int buffer
 	template <class SRC> unsigned int tFilter (SRC * src, short x, short y,
 		short * size, unsigned int pixSize, unsigned int val = 0)
 	{
 		// get value of required color
-		int actPix = int((val >> m_colShift) & 0xFF);
+		int actPix = int(VT_C(val,m_colIdx));
+		int upPix = actPix;
+		int leftPix = actPix;
 		// get upper and left pixel from actual pixel
-		int upPix = y > 0 ? int((convertPrevious(src - pixSize * size[0], x, y - 1,
-			size, pixSize) >> m_colShift) & 0xFF) : actPix;
-		int leftPix = x > 0 ? int((convertPrevious(src - pixSize, x - 1, y, size, pixSize)
-			>> m_colShift) & 0xFF) : actPix;
+		if (y > 0)
+		{
+			val = convertPrevious(src - pixSize * size[0], x, y - 1, size, pixSize);
+			upPix = VT_C(val,m_colIdx);
+		}
+		if (x > 0)
+		{
+			val = convertPrevious(src - pixSize, x - 1, y, size, pixSize);
+			leftPix = VT_C(val,m_colIdx);
+		}
 		// height differences (from blue color)
 		float dx = (actPix - leftPix) * m_depthScale;
 		float dy = (actPix - upPix) * m_depthScale;
@@ -81,7 +89,8 @@
 		dy = dy * dz + normScaleKoef;
 		dz += normScaleKoef;
 		// return normal vector converted to color
-		return 0xFF000000 | int(dz) << 16 | int(dy) << 8 | int(dx);
+		VT_RGBA(val, dx, dy, dz, 0xFF);
+		return val;
 	}
 
 	/// filter pixel, source byte buffer

Modified: trunk/blender/source/gameengine/VideoTexture/FilterSource.cpp
===================================================================
--- trunk/blender/source/gameengine/VideoTexture/FilterSource.cpp	2008-11-04 11:02:13 UTC (rev 17319)
+++ trunk/blender/source/gameengine/VideoTexture/FilterSource.cpp	2008-11-04 12:04:59 UTC (rev 17320)
@@ -77,6 +77,52 @@
 	Filter_allocNew,           /* tp_new */
 };
 
+// FilterRGBA32
+
+// define python type
+PyTypeObject FilterRGBA32Type =
+{ 
+	PyObject_HEAD_INIT(NULL)
+	0,                         /*ob_size*/

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list