Browse Source

Merge pull request #310 from Mokosha/SpecializeYCoCg

Specialize integer implementation of YCoCg-R to use bitshifts #310
Christophe Riccio 11 years ago
parent
commit
c51422c375
1 changed files with 68 additions and 18 deletions
  1. 68 18
      glm/gtx/color_space_YCoCg.inl

+ 68 - 18
glm/gtx/color_space_YCoCg.inl

@@ -46,29 +46,84 @@ namespace glm
 	}
 	}
 
 
 	template <typename T, precision P>
 	template <typename T, precision P>
-	GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR
+	GLM_FUNC_QUALIFIER tvec3<T, P> YCoCg2rgb
 	(
 	(
-		tvec3<T, P> const & rgbColor
+		tvec3<T, P> const & YCoCgColor
 	)
 	)
 	{
 	{
 		tvec3<T, P> result;
 		tvec3<T, P> result;
-		result.x/*Y */ = rgbColor.g / T(2) + (rgbColor.r + rgbColor.b) / T(4);
-		result.y/*Co*/ = rgbColor.r - rgbColor.b;
-		result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / T(2);
+		result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z;
+		result.g = YCoCgColor.x				   + YCoCgColor.z;
+		result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z;
 		return result;
 		return result;
 	}
 	}
 
 
+	template <typename T, precision P, bool isInteger>
+	class compute_YCoCgR {
+	public:
+		static GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR
+		(
+			tvec3<T, P> const & rgbColor
+		)
+		{
+			tvec3<T, P> result;
+			result.x/*Y */ = rgbColor.g / T(2) + (rgbColor.r + rgbColor.b) / T(4);
+			result.y/*Co*/ = rgbColor.r - rgbColor.b;
+			result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / T(2);
+			return result;
+		}
+
+		static GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb
+		(
+			tvec3<T, P> const & YCoCgRColor
+		)
+		{
+			tvec3<T, P> result;
+			T tmp = YCoCgRColor.x - (YCoCgRColor.z / T(2));
+			result.g = YCoCgRColor.z + tmp;
+			result.b = tmp - (YCoCgRColor.y / T(2));
+			result.r = result.b + YCoCgRColor.y;
+			return result;
+		}
+	};
+
 	template <typename T, precision P>
 	template <typename T, precision P>
-	GLM_FUNC_QUALIFIER tvec3<T, P> YCoCg2rgb
+	class compute_YCoCgR<T, P, true> {
+	public:
+		static GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR
+		(
+			tvec3<T, P> const & rgbColor
+		)
+		{
+			tvec3<T, P> result;
+			result.y/*Co*/ = rgbColor.r - rgbColor.b;
+			T tmp = rgbColor.b + (result.y >> 1);
+			result.z/*Cg*/ = rgbColor.g - tmp;
+			result.x/*Y */ = tmp + (result.z >> 1);
+			return result;
+		}
+
+		static GLM_FUNC_QUALIFIER tvec3<T, P> YCoCgR2rgb
+		(
+			tvec3<T, P> const & YCoCgRColor
+		)
+		{
+			tvec3<T, P> result;
+			T tmp = YCoCgRColor.x - (YCoCgRColor.z >> 1);
+			result.g = YCoCgRColor.z + tmp;
+			result.b = tmp - (YCoCgRColor.y >> 1);
+			result.r = result.b + YCoCgRColor.y;
+			return result;
+		}
+	};
+
+	template <typename T, precision P>
+	GLM_FUNC_QUALIFIER tvec3<T, P> rgb2YCoCgR
 	(
 	(
-		tvec3<T, P> const & YCoCgColor
+		tvec3<T, P> const & rgbColor
 	)
 	)
 	{
 	{
-		tvec3<T, P> result;
-		result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z;
-		result.g = YCoCgColor.x                + YCoCgColor.z;
-		result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z;
-		return result;
+		return compute_YCoCgR<T, P, std::numeric_limits<T>::is_integer>::rgb2YCoCgR(rgbColor);
 	}
 	}
 
 
 	template <typename T, precision P>
 	template <typename T, precision P>
@@ -77,11 +132,6 @@ namespace glm
 		tvec3<T, P> const & YCoCgRColor
 		tvec3<T, P> const & YCoCgRColor
 	)
 	)
 	{
 	{
-		tvec3<T, P> result;
-		T tmp = YCoCgRColor.x - (YCoCgRColor.z / T(2));
-		result.g = YCoCgRColor.z + tmp;
-		result.b = tmp - (YCoCgRColor.y / T(2));
-		result.r = result.b + YCoCgRColor.y;
-		return result;
+		return compute_YCoCgR<T, P, std::numeric_limits<T>::is_integer>::YCoCgR2rgb(YCoCgRColor);
 	}
 	}
 }//namespace glm
 }//namespace glm