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, em vez disso, dependiam da compatibilidade de conteúdo e telas (um objetivo geralmente auxiliado pelo setor de TV). No entanto, as tecnologias de tela recentes permitem telas de gama muito maiores que não exibem o conteúdo esperado. Com o Android 8.1 e versões mais recentes, os dispositivos que usam uma ampla gama de exibição (por exemplo, diodo orgânico emissor de luz de matriz ativa ou AMOLED, alguns LCDs) podem mostrar conteúdo de ampla gama de cores de apps.

Determinar o suporte do dispositivo

Os 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 que oferece suporte ao espaço de cor 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 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 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 do 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 necessárias e o suporte à biblioteca para traduzir 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 de ponto flutuante de 16 bits. Prioridade: alta (espera-se que esse seja o formato de pixel padrão para apps com reconhecimento de cores amplas). Requer suporte ao driver.
  • EGL_KHR_gl_colorspace. Para apps que querem usar framebuffers padrão de 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 esse recurso. Requer suporte ao driver para 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 cor, scRGB, que os apps podem escolher ao criar uma EGLSurface. O espaço de cor scRGB define um espaço de exibição linear referenciado 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 requer 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 de 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 cor comuns, como DCI-P3, Display-P3, AdobeRGB e BT2020.

Personalização

Você pode personalizar o recurso de gerenciamento de cores incluindo suporte a uma variedade de 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. Permite suporte a várias transformações de cores no hardware.
  • Suporte à 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 de cor 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:

  • gl2_basic é uma demonstração simples do OpenGL que solicita um espaço de cor Display-P3.
  • EGL_test testa o suporte necessário à extensão e à configuração (10:10:10:2 e FP16).
  • 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: