Gestion des couleurs

Android 8.1 et versions ultérieures incluent la prise en charge de la gestion des couleurs, qui peut être utilisée pour offrir une expérience cohérente sur toutes les technologies d'affichage. Les applications exécutées sur Android peuvent accéder à toutes les fonctionnalités d'un écran à large gamme de couleurs pour tirer le meilleur parti d'un appareil d'affichage.

Les versions précédentes d'Android n'incluaient pas la prise en charge de la gestion des couleurs et reposaient plutôt sur la compatibilité entre le contenu et les écrans (un objectif souvent facilité par le secteur de la télévision). Toutefois, les technologies d'affichage récentes permettent d'utiliser des écrans à gamme beaucoup plus large qui n'affichent pas le contenu existant comme prévu. Avec Android 8.1 et versions ultérieures, les appareils qui utilisent un écran à large gamme de couleurs (par exemple, une diode électroluminescente organique à matrice active ou AMOLED, certains écrans LCD) peuvent afficher le contenu à large gamme de couleurs des applications.

Déterminer la compatibilité de l'appareil

Les appareils équipés d'écrans à large gamme de couleurs exécutant Android 8.1 ou version ultérieure doivent être compatibles avec la gestion des couleurs (large gamme de couleurs). Avant d'activer cette fonctionnalité, assurez-vous que l'appareil répond aux exigences suivantes :

  • L'écran de l'appareil répond aux exigences matérielles, qui incluent un écran bien caractérisé compatible avec l'espace colorimétrique Display-P3. Si l'écran ne répond pas à cette exigence, n'activez pas la gestion des couleurs. Pour réduire l'impact sur le processeur et le GPU, il est souhaitable que le pipeline d'affichage soit compatible avec les formats sRVB étendu et HDR10.
  • L'appareil est compatible avec un processus d'étalonnage en usine qui génère des données d'étalonnage (stockées sur l'appareil) pour ajuster la variance de fabrication dans le comportement de l'écran. Au minimum, les données d'étalonnage doivent permettre à l'écran d'afficher avec précision le contenu sRVB et les points blancs D65 et D73.

Si ces exigences sont remplies, vous pouvez activer la fonctionnalité de gestion des couleurs pour l'appareil.

Implémenter la gestion des couleurs

Pour implémenter la gestion des couleurs, commencez par mettre à jour le pilote Hardware Composer 2 (HWC2) afin qu'il comprenne les modes de couleur et qu'il les applique au matériel. Plus précisément, le compositeur HWC2 doit signaler les modes de couleur Display-P3 et sRVB à l'aide de HWCDisplay::GetColorModes.

Ensuite, activez les extensions OpenGL et la prise en charge de la bibliothèque nécessaires pour traduire les espaces de couleurs OpenGL en espaces de données HAL. Les extensions OpenGL requises incluent les suivantes :

  • EGL_EXT_pixel_format_float. Permet aux applications de créer des EGLSurfaces présentables avec des composants de couleur flottants 16 bits. Priorité : élevée (il s'agit du format de pixel par défaut pour les applications compatibles avec la large gamme de couleurs). Nécessite la prise en charge du pilote.
  • EGL_KHR_gl_colorspace. Pour les applications qui souhaitent utiliser des tampons de trame par défaut au format sRVB afin d'obtenir plus facilement un rendu sRVB sur les appareils d'affichage, cette extension permet de créer des EGLSurfaces qui seront rendues au format sRVB par les contextes OpenGL compatibles avec cette fonctionnalité. Nécessite la prise en charge du pilote pour le comportement sRVB.

Android fournit également les extensions facultatives suivantes :

  • EGL_EXT_colorspace_scrgb_linear. Cette extension fournit une nouvelle option d'espace de couleurs, scRVB, que les applications peuvent choisir lors de la création d'une EGLSurface. L'espace de couleurs scRVB définit un espace d'affichage linéaire référencé avec le même point blanc et les mêmes primaires de couleur que sRVB (et est donc rétrocompatible avec sRVB). Cela ne devrait pas nécessiter la prise en charge du pilote et peut être implémenté dans le wrapper EGL Android. Pour être utile, cette extension nécessite la prise en charge des nombres à virgule flottante 16 bits (FP16).
  • EGL_EXT_gl_colorspace_display_p3 et EGL_EXT_gl_colorspace_display_p3_linear. Pour les applications qui souhaitent utiliser des tampons de trame par défaut au format Display-P3 afin d'obtenir plus facilement un rendu sRVB sur les appareils d'affichage, cette extension permet de créer des EGLSurfaces qui seront rendues au format Display-P3 par les contextes OpenGL compatibles avec cette fonctionnalité. Cela peut être implémenté dans le wrapper du pilote EGL.
  • VK_EXT_swapchain_colorspace (Vulkan). Permet aux applications de baliser les chaînes d'échange avec l'espace de couleurs qu'elles utilisent. Inclut un certain nombre d'espaces de couleurs courants tels que DCI-P3, Display-P3, AdobeRGB et BT2020.

Personnalisation

Vous pouvez personnaliser la fonctionnalité de gestion des couleurs en incluant la prise en charge de diverses normes de couleurs telles que DCI-P3, AdobeRGB, Rec709 et Rec2020. Voici d'autres personnalisations possibles :

  • Prise en charge matérielle de la conversion des couleurs dans le pipeline d'affichage. Permet la prise en charge de plusieurs transformations de couleurs dans le matériel.
  • Prise en charge de la transformation indépendante des couleurs sur plusieurs calques (par exemple, certains calques peuvent être sRVB et d'autres sRVB étendu, chacun avec son propre pipeline de couleurs). Lorsqu'il existe plusieurs espaces de couleurs visibles, certains doivent être convertis dans l'espace de couleurs de l'écran. Idéalement, cette transformation est fournie par le moteur d'affichage (sinon, Android doit effectuer la composition GPU).

Tests

Pour tester la gestion des couleurs, utilisez les ressources suivantes dans opengl/tests :

  • gl2_basic est une simple démonstration OpenGL qui demande un espace colorimétrique Display-P3.
  • EGL_test teste la prise en charge de l'extension et de la configuration nécessaires (10:10:10:2 et FP16).
  • test_wide_color crée une surface de la même manière que SurfaceFlinger (par exemple, configuration, espace de couleurs et format de pixel).

Implémentation de référence

Pour une implémentation de référence, consultez frameworks/native. Pour les en-têtes, consultez les pages suivantes :