Gerenciamento de cores

O Android 8.1 e versões mais recentes incluem compatibilidade com o 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 tela de ampla gama para aproveitar ao máximo um dispositivo de exibição.

As versões anteriores do Android não incluíam compatibilidade com gerenciamento de cores e dependiam da compatibilidade entre conteúdo e telas, um objetivo geralmente facilitado pela indústria de TV. No entanto, as tecnologias de exibição recentes permitem telas de gama muito maiores 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 (por exemplo, diodo orgânico emissor de luz de matriz ativa ou AMOLED, alguns LCDs) podem ver conteúdo de ampla gama de apps.

Determinar a compatibilidade do dispositivo

Dispositivos com telas de cores amplas que executam o Android 8.1 ou versões mais recentes precisam oferecer suporte ao gerenciamento de cores (cores amplas). 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 compatível com o espaço de cores Display-P3. Se o monitor não atender a esse requisito, não ative o gerenciamento de cores. Para reduzir o impacto na CPU e na GPU, é recomendável ter suporte para sRGB estendido e HDR10 no pipeline de exibição.
  • O dispositivo é compatível com um processo de calibragem de fábrica que gera dados de calibragem (armazenados no dispositivo) para ajustar a variação de fabricação no comportamento da tela. No mínimo, os dados de calibragem precisam permitir que a tela mostre com precisão conteúdo sRGB e 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 cor Display-P3 e sRGB usando HWCDisplay::GetColorModes.

Em seguida, ative as extensões OpenGL e o suporte à biblioteca necessários para traduzir espaços de cores 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 de ponto flutuante de 16 bits. Prioridade: alta (espera-se que esse seja o formato de pixel padrão para apps compatíveis com cores amplas). É necessário ter suporte do driver.
  • EGL_KHR_gl_colorspace. Para apps que querem usar framebuffers padrão no formato sRGB para alcançar mais facilmente a renderização sRGB em dispositivos de exibição, essa extensão permite criar EGLSurfaces que serão renderizadas em sRGB por contextos OpenGL que oferecem 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, o scRGB, que os apps podem escolher ao criar uma EGLSurface. O espaço de cores scRGB define um espaço linear referido à exibição com o mesmo ponto branco e as mesmas cores primárias do sRGB (e, portanto, é compatível com versões anteriores do sRGB). Isso não exige suporte a drivers 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 no formato Display-P3 para alcançar mais facilmente a renderização sRGB em dispositivos de exibição, essa extensão permite criar EGLSurfaces que serão renderizadas em Display-P3 por contextos OpenGL que oferecem 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

Você pode personalizar o recurso de gerenciamento de cores incluindo suporte a 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 display. Ativa o suporte para várias transformações de cor no hardware.
  • Suporte para transformação de cores independente em várias camadas (por exemplo, algumas camadas podem ser sRGB e outras sRGB estendido, cada uma com seu próprio pipeline de cores). Quando há mais de um espaço de cor visível, alguns 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 precisa realizar a composição da GPU.

Teste

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

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

Implementação de referência

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