Gestion des couleurs

Android 8.1 et les versions ultérieures sont compatibles avec la gestion des couleurs, qui peut être utilisée pour offrir une expérience cohérente sur les différentes 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 périphérique d'affichage.

Les versions précédentes d'Android n'incluaient pas la gestion des couleurs et reposaient plutôt sur la compatibilité entre le contenu et les écrans (un objectif souvent aidé par l'industrie 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, les écrans AMOLED (Active Matrix Organic Light Emitting Diode) ou certains écrans LCD) peuvent afficher du contenu à large gamme de couleurs provenant d'applications.

Déterminer la compatibilité de l'appareil

Les appareils équipés d'écrans à large gamme de couleurs fonctionnant sous Android 8.1 ou version ultérieure devraient ê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é prenant en charge 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 de prendre en charge les formats sRGB étendu et HDR10 dans le pipeline d'affichage.
  • L'appareil est compatible avec un processus de calibration en usine qui génère des données de calibration (stockées sur l'appareil) pour ajuster la variance de fabrication dans le comportement de l'écran. Les données de calibration doivent au minimum permettre à l'écran d'afficher avec précision le contenu sRGB 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 de comprendre les modes de couleur et de les appliquer au matériel. Plus précisément, le compositeur HWC2 doit signaler les modes colorimétriques Display-P3 et sRGB à l'aide de HWCDisplay::GetColorModes.

Ensuite, activez les extensions OpenGL et la compatibilité avec les bibliothèques nécessaires pour traduire les espaces colorimétriques OpenGL en espaces de données HAL. Les extensions OpenGL requises incluent :

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

Android fournit également les extensions facultatives suivantes :

  • EGL_EXT_colorspace_scrgb_linear. Cette extension fournit une nouvelle option d'espace colorimétrique, scRVB, que les applications peuvent choisir lors de la création d'une EGLSurface. L'espace colorimétrique scRVB définit un espace d'affichage linéaire référencé avec le même point blanc et les mêmes couleurs primaires que sRVB (et est donc rétrocompatible avec sRVB). Cela ne devrait pas nécessiter de prise en charge par le pilote et peut être implémenté dans le wrapper Android EGL. Pour être utile, cette extension nécessite la compatibilité avec les 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 framebuffers par défaut au format Display-P3 afin d'obtenir plus facilement un rendu sRGB sur les périphériques 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 taguer les chaînes d'échange avec l'espace colorimétrique qu'elles utilisent. Inclut un certain nombre d'espaces colorimétriques 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 couleur 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 couleur dans le matériel.
  • Prise en charge de la transformation indépendante des couleurs sur plusieurs calques (par exemple, certains calques peuvent être en sRVB et d'autres en sRVB étendu, chacun avec son propre pipeline de couleurs). Lorsque plusieurs espaces colorimétriques sont visibles, certains doivent être convertis dans l'espace colorimétrique de l'écran. Idéalement, cette transformation est fournie par le moteur d'affichage (sinon, Android doit effectuer la composition du 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 tests pour la compatibilité nécessaire des extensions et de la configuration (10:10:10:2 et FP16).
  • test_wide_color crée une surface de la même manière que SurfaceFlinger (par exemple, la configuration, l'espace colorimétrique et le format de pixel).

Implémentation de référence

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