Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.31 KB | None | 0 0
  1. /**
  2. * Perform linear interpolation using the CIE L*ab color-space.
  3. * Conversion is derived from "Standard-RGB โ†’ XYZ" on https://easyrgb.com/en/math.php:
  4. * ----------------------------------------------------------------------------------------------------
  5. * //sR, sG and sB (Standard RGB) input range = 0 รท 255
  6. * //X, Y and Z output refer to a D65/2ยฐ standard illuminant.
  7. *
  8. * var_R = ( sR / 255 )
  9. * var_G = ( sG / 255 )
  10. * var_B = ( sB / 255 )
  11. *
  12. * if ( var_R > 0.04045 ) var_R = ( ( var_R + 0.055 ) / 1.055 ) ^ 2.4
  13. * else var_R = var_R / 12.92
  14. * if ( var_G > 0.04045 ) var_G = ( ( var_G + 0.055 ) / 1.055 ) ^ 2.4
  15. * else var_G = var_G / 12.92
  16. * if ( var_B > 0.04045 ) var_B = ( ( var_B + 0.055 ) / 1.055 ) ^ 2.4
  17. * else var_B = var_B / 12.92
  18. *
  19. * var_R = var_R * 100
  20. * var_G = var_G * 100
  21. * var_B = var_B * 100
  22. *
  23. * X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
  24. * Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
  25. * Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505
  26. * ----------------------------------------------------------------------------------------------------
  27. * Reference XYZ values (taken from the same Website, section "XYZ (Tristimulus) Reference values of a
  28. * perfect reflecting diffuser"):
  29. *
  30. * ----------------------------------------------------------------------------------
  31. * DESCRIPTION X2 Y2 Z2
  32. * ----------------------------------------------------------------------------------
  33. * Incandescent/tungsten 109.850 100.000 35.585
  34. * Old direct sunlight at noon 99.0927 100.000 85.313
  35. * Old daylight 98.074 100.000 118.232
  36. * ICC profile PCS 96.422 100.000 82.521
  37. * Mid-morning daylight 95.682 100.000 92.149
  38. * Daylight, sRGB, Adobe-RGB 95.047 100.000 108.883
  39. * North sky daylight 94.972 100.000 122.638
  40. * Equal energy 100.000 100.000 100.000
  41. * Daylight Fluorescent 92.834 100.000 103.665
  42. * Cool fluorescent 99.187 100.000 67.395
  43. * White Fluorescent 103.754 100.000 49.861
  44. * Warm White Fluorescent 109.147 100.000 38.813
  45. * Daylight Fluorescent 90.872 100.000 98.723
  46. * Lite White Fluorescent 97.309 100.000 60.191
  47. * Daylight fluorescent, D65 simulator 95.044 100.000 108.755
  48. * Sylvania F40, D50 simulator 96.413 100.000 82.333
  49. * Cool White Fluorescent 100.365 100.000 67.868
  50. * Ultralume 50, Philips TL85 96.174 100.000 81.712
  51. * Ultralume 40, Philips TL84 100.966 100.000 64.370
  52. * Ultralume 30, Philips TL83 108.046 100.000 39.228
  53. * ----------------------------------------------------------------------------------------------------
  54. */
  55.  
  56. #define REF_X 100.0f
  57. #define REF_Y 100.0f
  58. #define REF_Z 100.0f
  59.  
  60. static void hellion_col_lerp_lab(f32 scale, u8 f) {
  61. f32 xyz0[3], xyz1[3], lab0[3], lab1[3], refValues[3] = { REF_X, REF_Y, REF_Z };
  62. if (f) { // needed for overlay
  63. scale = 1.0f - scale;
  64. }
  65.  
  66. // Convert to XYZ (TODO: Create a dedicated function for this, other color-spaces require it.)
  67. // Originals
  68. for (i = 0; i < 3; i++) {
  69. if (sUnshadedStore[i] > 0.04045f) {
  70. sUnshadedStore[i] = _fpow(((sUnshadedStore[i] + 0.055f) / 1.055f), 2.4f);
  71. } else {
  72. sUnshadedStore[i] /= 12.92f;
  73. }
  74. sUnshadedStore[i] *= 100.0f;
  75. }
  76.  
  77. xyz0[0] = sUnshadedStore[C_RED] * 0.4124f + sUnshadedStore[C_GRN] * 0.3576f + sUnshadedStore[C_BLU] + 0.1805f;
  78. xyz0[1] = sUnshadedStore[C_RED] * 0.2126f + sUnshadedStore[C_GRN] * 0.7152f + sUnshadedStore[C_BLU] + 0.0722f;
  79. xyz0[2] = sUnshadedStore[C_RED] * 0.0193f + sUnshadedStore[C_GRN] * 0.1192f + sUnshadedStore[C_BLU] + 0.9505f;
  80.  
  81. // HLight
  82. for (i = 0; i < 3; i++) {
  83. if (sShadedStore[i] > 0.04045f) {
  84. sShadedStore[i] = _fpow(((sShadedStore[i] + 0.055f) / 1.055f), 2.4f);
  85. } else {
  86. sShadedStore[i] /= 12.92f;
  87. }
  88. sShadedStore[i] *= 100.0f;
  89. }
  90.  
  91. xyz1[0] = sShadedStore[C_RED] * 0.4124f + sShadedStore[C_GRN] * 0.3576f + sShadedStore[C_BLU] + 0.1805f;
  92. xyz1[1] = sShadedStore[C_RED] * 0.2126f + sShadedStore[C_GRN] * 0.7152f + sShadedStore[C_BLU] + 0.0722f;
  93. xyz1[2] = sShadedStore[C_RED] * 0.0193f + sShadedStore[C_GRN] * 0.1192f + sShadedStore[C_BLU] + 0.9505f;
  94.  
  95. /*
  96. * ----------------------------------------------------------------------------------------------------
  97. * Based on "XYZ โ†’ CIE-L*ab" from easyrgb.com:
  98. * //Reference-X, Y and Z refer to specific illuminants and observers.
  99. * //Common reference values are available below in this same page.
  100. *
  101. * var_X = X / Reference-X
  102. * var_Y = Y / Reference-Y
  103. * var_Z = Z / Reference-Z
  104. *
  105. * if ( var_X > 0.008856 ) var_X = var_X ^ ( 1/3 )
  106. * else var_X = ( 7.787 * var_X ) + ( 16 / 116 )
  107. * if ( var_Y > 0.008856 ) var_Y = var_Y ^ ( 1/3 )
  108. * else var_Y = ( 7.787 * var_Y ) + ( 16 / 116 )
  109. * if ( var_Z > 0.008856 ) var_Z = var_Z ^ ( 1/3 )
  110. * else var_Z = ( 7.787 * var_Z ) + ( 16 / 116 )
  111. *
  112. * CIE-L* = ( 116 * var_Y ) - 16
  113. * CIE-a* = 500 * ( var_X - var_Y )
  114. * CIE-b* = 200 * ( var_Y - var_Z )
  115. * ----------------------------------------------------------------------------------------------------
  116. */
  117.  
  118.  
  119. for (i = 0; i < 3; i++) xyz0[i] /= refValues[i];
  120. for (i = 0; i < 3; i++) xyz1[i] /= refValues[i];
  121.  
  122. for (i = 0; i < 3; i++) {
  123. if (xyz0[i] > 0.008856) {
  124. xyz0[i] = _fpow(xyz0[i], 0.333333333);
  125. } else {
  126. xyz0[i] = (7.787 * xyz0[i]) + 0.137931034f;
  127. }
  128. }
  129.  
  130. for (i = 0; i < 3; i++) {
  131. if (xyz1[i] > 0.008856) {
  132. xyz1[i] = _fpow(xyz1[i], 0.333333333);
  133. } else {
  134. xyz1[i] = (7.787 * xyz1[i]) + 0.137931034f;
  135. }
  136. }
  137.  
  138. lab0[0] = (116 * xyz0[1]) - 16;
  139. lab0[1] = 500 * (xyz0[0] - xyz0[1]);
  140. lab0[2] = 200 * (xyz0[1] - xyz0[2]);
  141.  
  142. lab1[0] = (116 * xyz1[1]) - 16;
  143. lab1[1] = 500 * (xyz1[0] - xyz1[1]);
  144. lab1[2] = 200 * (xyz1[1] - xyz1[2]);
  145.  
  146. for (i = 0; i < 3; i++) sResultStore = hellion_col_clamp((1.0f - scale) * sUnshadedStore[i] + scale * sShadedStore[i]);
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement