toRgb16 method
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);
}