Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Perform linear interpolation using the CIE L*ab color-space.
- * Conversion is derived from "Standard-RGB โ XYZ" on https://easyrgb.com/en/math.php:
- * ----------------------------------------------------------------------------------------------------
- * //sR, sG and sB (Standard RGB) input range = 0 รท 255
- * //X, Y and Z output refer to a D65/2ยฐ standard illuminant.
- *
- * var_R = ( sR / 255 )
- * var_G = ( sG / 255 )
- * var_B = ( sB / 255 )
- *
- * if ( var_R > 0.04045 ) var_R = ( ( var_R + 0.055 ) / 1.055 ) ^ 2.4
- * else var_R = var_R / 12.92
- * if ( var_G > 0.04045 ) var_G = ( ( var_G + 0.055 ) / 1.055 ) ^ 2.4
- * else var_G = var_G / 12.92
- * if ( var_B > 0.04045 ) var_B = ( ( var_B + 0.055 ) / 1.055 ) ^ 2.4
- * else var_B = var_B / 12.92
- *
- * var_R = var_R * 100
- * var_G = var_G * 100
- * var_B = var_B * 100
- *
- * X = var_R * 0.4124 + var_G * 0.3576 + var_B * 0.1805
- * Y = var_R * 0.2126 + var_G * 0.7152 + var_B * 0.0722
- * Z = var_R * 0.0193 + var_G * 0.1192 + var_B * 0.9505
- * ----------------------------------------------------------------------------------------------------
- * Reference XYZ values (taken from the same Website, section "XYZ (Tristimulus) Reference values of a
- * perfect reflecting diffuser"):
- *
- * ----------------------------------------------------------------------------------
- * DESCRIPTION X2 Y2 Z2
- * ----------------------------------------------------------------------------------
- * Incandescent/tungsten 109.850 100.000 35.585
- * Old direct sunlight at noon 99.0927 100.000 85.313
- * Old daylight 98.074 100.000 118.232
- * ICC profile PCS 96.422 100.000 82.521
- * Mid-morning daylight 95.682 100.000 92.149
- * Daylight, sRGB, Adobe-RGB 95.047 100.000 108.883
- * North sky daylight 94.972 100.000 122.638
- * Equal energy 100.000 100.000 100.000
- * Daylight Fluorescent 92.834 100.000 103.665
- * Cool fluorescent 99.187 100.000 67.395
- * White Fluorescent 103.754 100.000 49.861
- * Warm White Fluorescent 109.147 100.000 38.813
- * Daylight Fluorescent 90.872 100.000 98.723
- * Lite White Fluorescent 97.309 100.000 60.191
- * Daylight fluorescent, D65 simulator 95.044 100.000 108.755
- * Sylvania F40, D50 simulator 96.413 100.000 82.333
- * Cool White Fluorescent 100.365 100.000 67.868
- * Ultralume 50, Philips TL85 96.174 100.000 81.712
- * Ultralume 40, Philips TL84 100.966 100.000 64.370
- * Ultralume 30, Philips TL83 108.046 100.000 39.228
- * ----------------------------------------------------------------------------------------------------
- */
- #define REF_X 100.0f
- #define REF_Y 100.0f
- #define REF_Z 100.0f
- static void hellion_col_lerp_lab(f32 scale, u8 f) {
- f32 xyz0[3], xyz1[3], lab0[3], lab1[3], refValues[3] = { REF_X, REF_Y, REF_Z };
- if (f) { // needed for overlay
- scale = 1.0f - scale;
- }
- // Convert to XYZ (TODO: Create a dedicated function for this, other color-spaces require it.)
- // Originals
- for (i = 0; i < 3; i++) {
- if (sUnshadedStore[i] > 0.04045f) {
- sUnshadedStore[i] = _fpow(((sUnshadedStore[i] + 0.055f) / 1.055f), 2.4f);
- } else {
- sUnshadedStore[i] /= 12.92f;
- }
- sUnshadedStore[i] *= 100.0f;
- }
- xyz0[0] = sUnshadedStore[C_RED] * 0.4124f + sUnshadedStore[C_GRN] * 0.3576f + sUnshadedStore[C_BLU] + 0.1805f;
- xyz0[1] = sUnshadedStore[C_RED] * 0.2126f + sUnshadedStore[C_GRN] * 0.7152f + sUnshadedStore[C_BLU] + 0.0722f;
- xyz0[2] = sUnshadedStore[C_RED] * 0.0193f + sUnshadedStore[C_GRN] * 0.1192f + sUnshadedStore[C_BLU] + 0.9505f;
- // HLight
- for (i = 0; i < 3; i++) {
- if (sShadedStore[i] > 0.04045f) {
- sShadedStore[i] = _fpow(((sShadedStore[i] + 0.055f) / 1.055f), 2.4f);
- } else {
- sShadedStore[i] /= 12.92f;
- }
- sShadedStore[i] *= 100.0f;
- }
- xyz1[0] = sShadedStore[C_RED] * 0.4124f + sShadedStore[C_GRN] * 0.3576f + sShadedStore[C_BLU] + 0.1805f;
- xyz1[1] = sShadedStore[C_RED] * 0.2126f + sShadedStore[C_GRN] * 0.7152f + sShadedStore[C_BLU] + 0.0722f;
- xyz1[2] = sShadedStore[C_RED] * 0.0193f + sShadedStore[C_GRN] * 0.1192f + sShadedStore[C_BLU] + 0.9505f;
- /*
- * ----------------------------------------------------------------------------------------------------
- * Based on "XYZ โ CIE-L*ab" from easyrgb.com:
- * //Reference-X, Y and Z refer to specific illuminants and observers.
- * //Common reference values are available below in this same page.
- *
- * var_X = X / Reference-X
- * var_Y = Y / Reference-Y
- * var_Z = Z / Reference-Z
- *
- * if ( var_X > 0.008856 ) var_X = var_X ^ ( 1/3 )
- * else var_X = ( 7.787 * var_X ) + ( 16 / 116 )
- * if ( var_Y > 0.008856 ) var_Y = var_Y ^ ( 1/3 )
- * else var_Y = ( 7.787 * var_Y ) + ( 16 / 116 )
- * if ( var_Z > 0.008856 ) var_Z = var_Z ^ ( 1/3 )
- * else var_Z = ( 7.787 * var_Z ) + ( 16 / 116 )
- *
- * CIE-L* = ( 116 * var_Y ) - 16
- * CIE-a* = 500 * ( var_X - var_Y )
- * CIE-b* = 200 * ( var_Y - var_Z )
- * ----------------------------------------------------------------------------------------------------
- */
- for (i = 0; i < 3; i++) xyz0[i] /= refValues[i];
- for (i = 0; i < 3; i++) xyz1[i] /= refValues[i];
- for (i = 0; i < 3; i++) {
- if (xyz0[i] > 0.008856) {
- xyz0[i] = _fpow(xyz0[i], 0.333333333);
- } else {
- xyz0[i] = (7.787 * xyz0[i]) + 0.137931034f;
- }
- }
- for (i = 0; i < 3; i++) {
- if (xyz1[i] > 0.008856) {
- xyz1[i] = _fpow(xyz1[i], 0.333333333);
- } else {
- xyz1[i] = (7.787 * xyz1[i]) + 0.137931034f;
- }
- }
- lab0[0] = (116 * xyz0[1]) - 16;
- lab0[1] = 500 * (xyz0[0] - xyz0[1]);
- lab0[2] = 200 * (xyz0[1] - xyz0[2]);
- lab1[0] = (116 * xyz1[1]) - 16;
- lab1[1] = 500 * (xyz1[0] - xyz1[1]);
- lab1[2] = 200 * (xyz1[1] - xyz1[2]);
- for (i = 0; i < 3; i++) sResultStore = hellion_col_clamp((1.0f - scale) * sUnshadedStore[i] + scale * sShadedStore[i]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement