Gerenciamento de cores

O Android 8.1 e versões mais recentes incluem suporte ao gerenciamento de cores, que pode ser usado para proporcionar uma experiência consistente em todas as tecnologias de tela. Os apps executados no Android podem acessar os recursos completos de uma ampla gama de exibição para aproveitar ao máximo a tela do dispositivo.

As versões anteriores do Android não incluíam suporte ao gerenciamento de cores e dependiam da compatibilidade entre conteúdo e telas, uma meta geralmente auxiliada pela indústria de TV. No entanto, as tecnologias de exibição recentes permitem telas de gama muito maior que não mostram o conteúdo atual como esperado. Com o Android 8.1 e versões mais recentes, os dispositivos que usam uma tela de ampla gama de cores (por exemplo, diodo emissor de luz orgânico de matriz ativa ou AMOLED, alguns LCDs) podem acessar conteúdo de ampla gama de cores dos apps.

Determinar a compatibilidade do dispositivo

Os dispositivos com telas wide-color que executam o Android 8.1 ou versões mais recentes precisam oferecer suporte ao gerenciamento de cores (wide-color). Antes de ativar esse recurso, verifique se o dispositivo atende aos seguintes requisitos:

  • A tela do dispositivo atende aos requisitos de hardware, que incluem uma tela bem caracterizada que oferece suporte ao espaço de cores Display P3. Se a tela não atender a esse requisito, não ative o gerenciamento de cores. Para reduzir o impacto da CPU e da GPU, é recomendável oferecer suporte a sRGB estendido e HDR10 no pipeline de exibição.
  • O dispositivo oferece suporte a um processo de calibração de fábrica que gera dados de calibração (armazenados no dispositivo) para ajustar a variação de fabricação no comportamento da tela. No mínimo, os dados de calibração precisam permitir que a tela mostre corretamente o conteúdo sRGB e os pontos brancos D65 e D73.

Se esses requisitos forem atendidos, você poderá ativar o recurso de gerenciamento de cores para o dispositivo.

Implementar o gerenciamento de cores

Para implementar o gerenciamento de cores, primeiro atualize o driver Hardware Composer 2 (HWC2) para entender os modos de cor e aplicá-los ao hardware. Especificamente, o compositor HWC2 precisa informar os modos de cores Display-P3 e sRGB usando HWCDisplay::GetColorModes.

Em seguida, ative as extensões e o suporte de biblioteca OpenGL necessários para converter os espaços de cor OpenGL em espaços de dados HAL. As extensões OpenGL necessárias incluem:

  • EGL_EXT_pixel_format_float. Permite que os apps criem EGLSurfaces apresentáveis com componentes de cor flutuante de 16 bits. Prioridade: alta (padrão para apps que reconhecem cores amplas). Requer suporte ao driver.
  • EGL_KHR_gl_colorspace. Para apps que querem usar framebuffers padrão do formato sRGB para alcançar a renderização sRGB em dispositivos de exibição com mais facilidade, essa extensão permite criar EGLSurfaces que serão renderizadas em sRGB por contextos OpenGL com suporte a essa capacidade. Requer suporte do driver para o comportamento sRGB.

O Android também oferece as seguintes extensões opcionais:

  • EGL_EXT_colorspace_scrgb_linear. Essa extensão oferece uma nova opção de espaço de cores, scRGB, que os apps podem escolher ao criar uma EGLSurface. O espaço de cores scRGB define um espaço de referência de tela linear com o mesmo ponto branco e cores primárias que o sRGB e, portanto, é compatível com versões anteriores do sRGB. Isso não precisa de suporte ao driver e pode ser implementado no wrapper EGL do Android. Para ser útil, essa extensão requer suporte a ponto flutuante de 16 bits (FP16).
  • EGL_EXT_gl_colorspace_display_p3 e EGL_EXT_gl_colorspace_display_p3_linear. Para apps que querem usar framebuffers padrão do formato Display-P3 para renderizar sRGB com mais facilidade em dispositivos de exibição, essa extensão permite criar EGLSurfaces que serão renderizados em Display-P3 por contextos OpenGL com suporte a esse recurso. Isso pode ser implementado no wrapper do driver EGL.
  • VK_EXT_swapchain_colorspace (Vulkan). Permite que os apps marquem cadeias de troca com o espaço de cor que estão usando. Inclui vários espaços de cores comuns, como DCI-P3, Display-P3, AdobeRGB e BT2020.

Personalização

É possível personalizar o recurso de gerenciamento de cores incluindo suporte para vários padrões de cores, como DCI-P3, AdobeRGB, Rec709 e Rec2020. Outras personalizações incluem:

  • Suporte de hardware para conversão de cores no pipeline de exibição. Ativa o suporte a várias transformações de cor no hardware.
  • Suporte a transformação de cores independente em várias camadas. Por exemplo, algumas camadas podem ser sRGB e outras sRGB estendidas, cada uma com seu próprio pipeline de cores. Quando há mais de um espaço de cor visível, alguns espaços precisam ser convertidos para o espaço de cor da tela. O ideal é que essa transformação seja fornecida pelo mecanismo de exibição. Caso contrário, o Android precisará realizar a composição da GPU.

Teste

Para testar o gerenciamento de cores, use os seguintes recursos em opengl/tests:

  • gl2_basic é uma demonstração simples do OpenGL que solicita um espaço de cores Display P3.
  • EGL_test testa o suporte necessário para extensões e configurações (10:10:10:2 e FP16).
  • test_wide_color cria uma superfície da mesma maneira que SurfaceFlinger (por exemplo, configuração, espaço de cores e formato de pixel).

Implementação de referência

Para conferir uma implementação de referência, consulte frameworks/native. Para cabeçalhos, consulte: