Corrigir cores com tabelas de consulta (LUTs)

A variação dos recursos de HDR em dispositivos Android pode levar a saídas de exibição fragmentadas. Uma tabela de pesquisa (LUT, na sigla em inglês) é uma nova solução de correção de cores projetada para resolver essa inconsistência. Essa inconsistência é resolvida prescrevendo uma maneira de corrigir as cores, em vez de delegar a um mecanismo indefinido de correção de cores por dispositivo.

Pré-requisitos do SDK

Para implementar LUTs, a versão do SDK precisa ser 36 ou mais recente.

Implementar uma LUT

Siga estas etapas para aplicar uma LUT a um SurfaceControl:

  1. Crie uma instância DisplayLuts.
  2. Crie instâncias DisplayLuts.Entry com o buffer de dados da LUT, a dimensão da LUT e a chave de amostragem dela. Para mais informações, consulte a documentação do LutProperties.
  3. Chame DisplayLuts#set(DisplayLuts.Entry luts) ou DisplayLuts#set(DisplayLuts.Entry first, DisplayLuts.Entry second) para definir entradas de LUT. O framework é compatível com LUTs 1D, 3D ou uma combinação de LUTs 1D e 3D.
  4. Chame SurfaceControl.Transaction#setLuts para aplicar as LUTs à camada.

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();

Você também pode usar OverlayProperties.getLutProperties() para entender as propriedades da LUT do dispositivo e determinar se o Hardware Composer pode processar a LUT selecionada.