toRgb16 method

  1. @override
RayRgb16 toRgb16()
override

Converts this color to 16-bit RGB representation.

Implementation

@override
RayRgb16 toRgb16() {
  // Convert Oklab to linear sRGB using the inverse transformation
  final lCubed = math.pow(_l + 0.3963377774 * _a + 0.2158037573 * _b, 3.0);
  final mCubed = math.pow(_l - 0.1055613458 * _a - 0.0638541728 * _b, 3.0);
  final sCubed = math.pow(_l - 0.0894841775 * _a - 1.2914855480 * _b, 3.0);

  final linearR =
      4.0767416621 * lCubed - 3.3077115913 * mCubed + 0.2309699292 * sCubed;
  final linearG =
      -1.2684380046 * lCubed + 2.6097574011 * mCubed - 0.3413193965 * sCubed;
  final linearB =
      -0.0041960863 * lCubed - 0.7034186147 * mCubed + 1.7076147010 * sCubed;

  // Convert from linear RGB to sRGB
  final srgbR = _linearToSrgb(linearR);
  final srgbG = _linearToSrgb(linearG);
  final srgbB = _linearToSrgb(linearB);

  // Clamp values to valid range and convert to 0-65535
  final redNative = (srgbR.clamp(0.0, 1.0) * 65535).round();
  final greenNative = (srgbG.clamp(0.0, 1.0) * 65535).round();
  final blueNative = (srgbB.clamp(0.0, 1.0) * 65535).round();
  final alphaNative = (opacity * 65535).round();

  return RayRgb16.fromComponentsNative(
      redNative, greenNative, blueNative, alphaNative);
}