color_space_YCoCg.inl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /// @ref gtx_color_space_YCoCg
  2. namespace glm
  3. {
  4. template<typename T, qualifier Q>
  5. GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCg
  6. (
  7. vec<3, T, Q> const& rgbColor
  8. )
  9. {
  10. vec<3, T, Q> result;
  11. result.x/*Y */ = rgbColor.r / T(4) + rgbColor.g / T(2) + rgbColor.b / T(4);
  12. result.y/*Co*/ = rgbColor.r / T(2) + rgbColor.g * T(0) - rgbColor.b / T(2);
  13. result.z/*Cg*/ = - rgbColor.r / T(4) + rgbColor.g / T(2) - rgbColor.b / T(4);
  14. return result;
  15. }
  16. template<typename T, qualifier Q>
  17. GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCg2rgb
  18. (
  19. vec<3, T, Q> const& YCoCgColor
  20. )
  21. {
  22. vec<3, T, Q> result;
  23. result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z;
  24. result.g = YCoCgColor.x + YCoCgColor.z;
  25. result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z;
  26. return result;
  27. }
  28. template<typename T, qualifier Q, bool isInteger>
  29. class compute_YCoCgR {
  30. public:
  31. static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR
  32. (
  33. vec<3, T, Q> const& rgbColor
  34. )
  35. {
  36. vec<3, T, Q> result;
  37. result.x/*Y */ = rgbColor.g * static_cast<T>(0.5) + (rgbColor.r + rgbColor.b) * static_cast<T>(0.25);
  38. result.y/*Co*/ = rgbColor.r - rgbColor.b;
  39. result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) * static_cast<T>(0.5);
  40. return result;
  41. }
  42. static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb
  43. (
  44. vec<3, T, Q> const& YCoCgRColor
  45. )
  46. {
  47. vec<3, T, Q> result;
  48. T tmp = YCoCgRColor.x - (YCoCgRColor.z * static_cast<T>(0.5));
  49. result.g = YCoCgRColor.z + tmp;
  50. result.b = tmp - (YCoCgRColor.y * static_cast<T>(0.5));
  51. result.r = result.b + YCoCgRColor.y;
  52. return result;
  53. }
  54. };
  55. template<typename T, qualifier Q>
  56. class compute_YCoCgR<T, Q, true> {
  57. public:
  58. static GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR
  59. (
  60. vec<3, T, Q> const& rgbColor
  61. )
  62. {
  63. vec<3, T, Q> result;
  64. result.y/*Co*/ = rgbColor.r - rgbColor.b;
  65. T tmp = rgbColor.b + (result.y >> 1);
  66. result.z/*Cg*/ = rgbColor.g - tmp;
  67. result.x/*Y */ = tmp + (result.z >> 1);
  68. return result;
  69. }
  70. static GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb
  71. (
  72. vec<3, T, Q> const& YCoCgRColor
  73. )
  74. {
  75. vec<3, T, Q> result;
  76. T tmp = YCoCgRColor.x - (YCoCgRColor.z >> 1);
  77. result.g = YCoCgRColor.z + tmp;
  78. result.b = tmp - (YCoCgRColor.y >> 1);
  79. result.r = result.b + YCoCgRColor.y;
  80. return result;
  81. }
  82. };
  83. template<typename T, qualifier Q>
  84. GLM_FUNC_QUALIFIER vec<3, T, Q> rgb2YCoCgR
  85. (
  86. vec<3, T, Q> const& rgbColor
  87. )
  88. {
  89. return compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::rgb2YCoCgR(rgbColor);
  90. }
  91. template<typename T, qualifier Q>
  92. GLM_FUNC_QUALIFIER vec<3, T, Q> YCoCgR2rgb
  93. (
  94. vec<3, T, Q> const& YCoCgRColor
  95. )
  96. {
  97. return compute_YCoCgR<T, Q, std::numeric_limits<T>::is_integer>::YCoCgR2rgb(YCoCgRColor);
  98. }
  99. }//namespace glm