Gerenciamento de cor

O Android 8.1 e superior incluem suporte para gerenciamento de cores que pode ser usado para fornecer uma experiência consistente em todas as tecnologias de exibição. Os aplicativos executados no Android podem acessar todos os recursos 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 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 exibição recentes permitem exibições de gama muito maior que não exibem o conteúdo existente conforme o esperado. Com o Android 8.1 e superior, os dispositivos que usam uma tela de gama ampla (por exemplo, diodo orgânico emissor de luz de matriz ativa ou AMOLED, alguns LCDs) podem ver conteúdo de gama ampla de aplicativos.

Como determinar o suporte do dispositivo

Dispositivos com telas de cores amplas com Android 8.1 ou superior devem oferecer suporte ao gerenciamento de cores (cor ampla). 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 suporta o 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 GPU, é desejável suporte para sRGB e HDR10 estendidos 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 de exibição. No mínimo, os dados de calibração devem permitir que o monitor exiba 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.

Implementando o gerenciamento de cores

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

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

  • EGL_EXT_pixel_format_float . Permite que os aplicativos criem EGLSurfaces apresentáveis ​​com componentes de cores flutuantes de 16 bits. Prioridade: alta (espere que este seja o formato de pixel padrão para aplicativos com reconhecimento de cores amplas). Requer suporte de motorista.
  • EGL_KHR_gl_colorspace . Para aplicativos que desejam usar framebuffers padrão do formato sRGB para obter mais facilmente a renderização sRGB para dispositivos de exibição, essa extensão permite a criação de EGLSurfaces que serão renderizadas em sRGB por contextos OpenGL que suportam esse recurso. Requer suporte de driver para comportamento sRGB.

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

  • EGL_EXT_colorspace_scrgb_linear . Essa extensão fornece uma nova opção de espaço de cores, scRGB, que os aplicativos podem escolher ao criar um EGLsurface. O espaço de cores scRGB define um espaço referenciado de exibição linear com o mesmo ponto branco e cores primárias como sRGB (e, portanto, é compatível com versões anteriores com sRGB). Isso não deve exigir suporte de driver e pode ser implementado no wrapper do Android EGL. Para ser útil, esta extensão requer suporte para ponto flutuante de 16 bits (FP16).
  • EGL_EXT_gl_colorspace_display_p3 e EGL_EXT_gl_colorspace_display_p3_linear . Para aplicativos que desejam usar framebuffers padrão do formato Display-P3 para obter mais facilmente a renderização sRGB para dispositivos de exibição, essa extensão permite criar EGLSurfaces que serão renderizados no Display-P3 por contextos OpenGL que suportam esse recurso. Isso pode ser implementado no wrapper do driver EGL.
  • VK_EXT_swapchain_colorspace (Vulkan). Permite que os aplicativos marquem as cadeias de troca com o espaço de cores 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 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. Habilita o suporte para várias transformações de cores no hardware.
  • Suporte para 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 cores visível, alguns espaços de cores precisam ser convertidos no espaço de cores da tela. Idealmente, essa transformação é melhor fornecida pelo mecanismo de exibição (caso contrário, o Android deve executar 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.
  • Testes EGL_test para extensão necessária e suporte de configuração (10:10:10:2 e FP16).
  • test_wide_color cria uma superfície da mesma maneira que SurfaceFlinger (por exemplo, config, espaço de cores e formato de pixel).

Implementação de referência

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