Cómo corregir el color con tablas de consulta (LUT)

Las diferentes capacidades de HDR en los dispositivos Android pueden generar salidas de pantalla HDR fragmentadas. Una tabla de consulta (LUT) es una nueva solución de corrección de colores diseñada para resolver esta inconsistencia. Esta inconsistencia se resuelve prescribiendo una forma de corregir el color, en lugar de delegar en un mecanismo de corrección de color indefinido por dispositivo.

Requisitos previos del SDK

Para implementar LUT, la versión del SDK debe ser la 36 o una posterior.

Implementa una LUT

Sigue estos pasos para aplicar una LUT a un SurfaceControl:

  1. Crea una instancia de DisplayLuts.
  2. Crea instancias de DisplayLuts.Entry con el búfer de datos de la LUT, la dimensión de la LUT y la clave de muestreo de la LUT. Para obtener más información, consulta la documentación de LutProperties.
  3. Llama a DisplayLuts#set(DisplayLuts.Entry luts) o DisplayLuts#set(DisplayLuts.Entry first, DisplayLuts.Entry second) para establecer entradas de LUT. El framework admite LUT 1D, LUT 3D o una combinación de LUT 1D y 3D.
  4. Llama a SurfaceControl.Transaction#setLuts para aplicar las LUT a la capa.

Kotlin

val sc = SurfaceControl.Builder().build()
val luts = DisplayLuts()
val entry = DisplayLuts.Entry(
    floatArrayOf(0.5f, 0.5f, 0.5f, 0.5f),
    LutProperties.ONE_DIMENSION,
    LutProperties.SAMPLING_KEY_MAX_RGB
)
luts.set(entry)
SurfaceControl.Transaction().setLuts(sc, luts).apply()

Java

SurfaceControl sc = new SurfaceControl.Builder().build();
DisplayLuts luts = new DisplayLuts();
DisplayLuts.Entry entry = new DisplayLuts.Entry(
  new float[]{0.5f, 0.5f, 0.5f, 0.5f},
  LutProperties.ONE_DIMENSION,
  LutProperties.SAMPLING_KEY_MAX_RGB
);
luts.set(entry);
new SurfaceControl.Transaction().setLuts(sc, luts).apply();

También puedes usar OverlayProperties.getLutProperties() para comprender las propiedades de LUT del dispositivo y determinar si Hardware Composer puede controlar la LUT seleccionada.