Android 8.1 y versiones posteriores incluyen compatibilidad con la administración de color que se puede usar para proporcionar una experiencia coherente en todas las tecnologías de visualización. Las apps que se ejecutan en Android pueden acceder a todas las funciones de una pantalla de amplia gama de colores para aprovechar al máximo un dispositivo de visualización.
Las versiones anteriores de Android no incluían compatibilidad con la administración de colores y, en su lugar, dependían de la compatibilidad del contenido y las pantallas (un objetivo que a menudo ayudaba la industria de la TV). Sin embargo, las tecnologías de visualización recientes permiten pantallas de gama mucho más grandes que no muestran el contenido existente como se espera. Con Android 8.1 y versiones posteriores, los dispositivos que usan una pantalla de gama amplia (por ejemplo, un diodo de emisión de luz orgánico de matriz activa o AMOLED, algunas LCD) pueden ver contenido de gama amplia desde las apps.
Cómo determinar la compatibilidad de los dispositivos
Los dispositivos con pantallas de amplia gama de colores que ejecutan Android 8.1 o versiones posteriores deben admitir la administración de colores (amplia gama de colores). Antes de habilitar esta función, asegúrate de que el dispositivo cumpla con los siguientes requisitos:
- La pantalla del dispositivo cumple con los requisitos de hardware, que incluyen una pantalla bien caracterizada que admite el espacio de color Display-P3. Si la pantalla no cumple con este requisito, no habilites la administración de colores. Para reducir el impacto de la CPU y la GPU, es conveniente admitir sRGB extendido y HDR10 en la canalización de la pantalla.
- El dispositivo admite un proceso de calibración de fábrica que genera datos de calibración (almacenados en el dispositivo) para ajustar la variación de fabricación en el comportamiento de la pantalla. Como mínimo, los datos de calibración deben permitir que la pantalla muestre con precisión el contenido sRGB y los puntos blancos D65 y D73.
Si se cumplen estos requisitos, puedes habilitar la función de administración de colores para el dispositivo.
Implementa la administración de colores
Para implementar la administración de colores, primero actualiza el controlador de Hardware Composer 2 (HWC2) para comprender los modos de color y aplicarlos al hardware.
Específicamente, el compositor de HWC2 debe informar los modos de color Display-P3 y sRGB con HWCDisplay::GetColorModes
.
A continuación, habilita las extensiones de OpenGL y la compatibilidad con bibliotecas necesarias para traducir los espacios de color de OpenGL a espacios de datos de HAL. Entre las extensiones de OpenGL obligatorias, se incluyen las siguientes:
-
EGL_EXT_pixel_format_float
. Permite que las apps creen EGLSurfaces presentables con componentes de color de punto flotante de 16 bits. Prioridad: alta (se espera que este sea el formato de píxeles predeterminado para las apps compatibles con el modo de colores amplios). Requiere asistencia del conductor. -
EGL_KHR_gl_colorspace
. Para las apps que desean usar búferes de trama predeterminados en formato sRGB para lograr una renderización sRGB más fácil en dispositivos de visualización, esta extensión permite crear EGLSurfaces que se renderizarán en sRGB por contextos de OpenGL que admitan esa función. Requiere compatibilidad del controlador para el comportamiento sRGB.
Android también proporciona las siguientes extensiones opcionales:
-
EGL_EXT_colorspace_scrgb_linear
. Esta extensión proporciona una nueva opción de espacio de color, scRGB, que las apps pueden elegir cuando crean un EGLSurface. El espacio de color scRGB define un espacio de referencia de pantalla lineal con el mismo punto blanco y colores primarios que sRGB (por lo que es retrocompatible con sRGB). Esto no debería requerir compatibilidad con el controlador y se puede implementar en el wrapper de EGL de Android. Para ser útil, esta extensión requiere compatibilidad con el punto flotante de 16 bits (FP16). -
EGL_EXT_gl_colorspace_display_p3
yEGL_EXT_gl_colorspace_display_p3_linear
. Para las apps que desean usar búferes de trama predeterminados en formato Display-P3 para lograr una renderización sRGB más fácil en dispositivos de visualización, esta extensión permite crear EGLSurfaces que se renderizarán en Display-P3 por contextos de OpenGL que admitan esa función. Esto se puede implementar en el wrapper del controlador de EGL. -
VK_EXT_swapchain_colorspace
(Vulkan). Permite que las apps etiqueten cadenas de intercambio con el espacio de color que usan. Incluye varios espacios de color comunes, como DCI-P3, Display-P3, AdobeRGB y BT2020.
Personalización
Puedes personalizar la función de administración de colores si incluyes compatibilidad con una variedad de estándares de color, como DCI-P3, AdobeRGB, Rec709 y Rec2020. Estas son otras personalizaciones:
- Compatibilidad de hardware para la conversión de colores en la canalización de la pantalla Habilita la compatibilidad con varias transformaciones de color en el hardware.
- Compatibilidad con la transformación de color independiente en varias capas (por ejemplo, algunas capas podrían ser sRGB y otras sRGB extendidas, cada una con su propia canalización de colores). Cuando hay más de un espacio de color visible, algunos espacios de color deben convertirse al espacio de color de la pantalla. Idealmente, el motor de renderización de la pantalla es la mejor opción para proporcionar esta transformación (de lo contrario, Android debe realizar la composición de la GPU).
Prueba
Para probar la administración de colores, usa los siguientes recursos en opengl/tests
:
gl2_basic
es una demostración sencilla de OpenGL que solicita un espacio de color Display-P3.-
EGL_test
realiza pruebas para verificar la compatibilidad necesaria con la extensión y la configuración (10:10:10:2 y FP16). test_wide_color
crea una superficie de la misma manera que SurfaceFlinger (por ejemplo, configuración, espacio de color y formato de píxeles).
Implementación de referencia
Para obtener una implementación de referencia, consulta frameworks/native
. Para los encabezados, consulta lo siguiente:
system/core/include/system/graphics.h
system/core/include/system/graphics-base.h
HAL_DATASPACE_*
HAL_COLOR_MODE_*