text: /* See LICENSE file for copyright and license details. */
  #include "common.h"
  
  
  /**
   * Concatenation of all ramps
   */
  #define ALL red
  
  /**
   * Preform installation in an `for (i = 0; i < n; i++)`
   * loop and do a `break` afterwords
   */
  #define TRANSLATE(instruction)  for (i = 0; i < n; i++) instruction;  break
  
  
  /**
   * Undo the actions of `libgamma_internal_translate_to_64`
   * 
   * @param  depth  The depth of the gamma ramp, `-1` for `float`, `-2` for `double`
   * @param  n      The grand size of gamma ramps (sum of all channels' sizes)
   * @param  out    Output gamma ramps
   * @param  in     Input array, may be modified
   */
  void
  libgamma_internal_translate_from_64(signed depth, size_t n, union gamma_ramps_any *restrict out, const uint64_t *restrict in)
  {
  	size_t i;
  	switch (depth) {
  	/* Translate integer */
  	case  8:  TRANSLATE(out->bits8. ALL[i] =  (uint8_t)(in[i] / UINT64_C(0x0101010101010101)));
  	case 16:  TRANSLATE(out->bits16.ALL[i] = (uint16_t)(in[i] / UINT64_C(0x0001000100010001)));
  	case 32:  TRANSLATE(out->bits32.ALL[i] = (uint32_t)(in[i] / UINT64_C(0x0000000100000001)));
  	/* Identity translation */
  	case 64:  TRANSLATE(out->bits64.ALL[i] = in[i]);
  	/* Translate floating point */
  	case -1:  TRANSLATE(out->float_single.ALL[i] =  (float)in[i] /  (float)UINT64_MAX);
  	case -2:  TRANSLATE(out->float_double.ALL[i] = (double)in[i] / (double)UINT64_MAX);
  	default:
  		/* This is not possible */
  		abort();
  		break;
  	}
  }
  