В Android 8.1 и более поздних версиях реализована поддержка управления цветом, которая позволяет обеспечить единообразие цветового восприятия на разных устройствах отображения. Приложения, работающие на Android, могут использовать все возможности дисплея с широким цветовым охватом, чтобы максимально эффективно использовать возможности устройства.
В предыдущих версиях Android отсутствовала поддержка управления цветом, и вместо этого использовалась совместимость контента и дисплеев (цель, в достижении которой часто участвовала телевизионная индустрия). Однако современные технологии отображения позволяют использовать дисплеи с гораздо более широким цветовым охватом, которые не всегда корректно отображают существующий контент. В Android 8.1 и выше устройства, использующие дисплеи с широким цветовым охватом (например, активные матричные органические светодиоды или AMOLED, некоторые ЖК-дисплеи), могут отображать контент с широким цветовым охватом в приложениях.
Определите поддержку устройства
Устройства с дисплеями, поддерживающими широкий цветовой охват, работающие под управлением Android 8.1 или выше, должны поддерживать управление цветом (широкий цветовой охват). Перед включением этой функции убедитесь, что устройство соответствует следующим требованиям:
- Дисплей устройства должен соответствовать аппаратным требованиям, которые включают в себя хорошо настроенный дисплей, поддерживающий цветовое пространство Display-P3. Если дисплей не соответствует этому требованию, не включайте управление цветом. Для снижения нагрузки на ЦП и ГП желательно наличие поддержки расширенного sRGB и HDR10 в конвейере обработки изображения.
- Устройство поддерживает заводскую калибровку, в ходе которой генерируются калибровочные данные (хранящиеся на устройстве) для компенсации производственных отклонений в поведении дисплея. Как минимум, калибровочные данные должны позволять дисплею точно отображать содержимое sRGB, а также точки белого D65 и D73.
Если эти требования выполнены, вы можете включить функцию управления цветом для устройства.
Внедрить управление цветом
Для реализации управления цветом сначала необходимо обновить драйвер Hardware Composer 2 (HWC2) , чтобы он понимал цветовые режимы и применял эти режимы к оборудованию. В частности, HWC2 Composer должен сообщать цветовые режимы Display-P3 и sRGB с помощью HWCDisplay::GetColorModes .
Далее необходимо включить поддержку необходимых расширений OpenGL и библиотек для преобразования цветовых пространств OpenGL в пространства данных HAL. К необходимым расширениям OpenGL относятся:
-
EGL_EXT_pixel_format_float. Позволяет приложениям создавать корректные EGLSurfaces с 16-битными компонентами цвета в формате float. Приоритет: высокий (за исключением случаев, когда это формат пикселей по умолчанию для приложений, поддерживающих широкий цветовой охват). Требуется поддержка драйвера. -
EGL_KHR_gl_colorspace. Для приложений, которые хотят использовать стандартные буферы кадров в формате sRGB для упрощения рендеринга sRGB на устройствах отображения, это расширение позволяет создавать EGLSurfaces, которые будут отображаться в формате sRGB контекстами OpenGL, поддерживающими эту возможность. Требуется поддержка драйвером поведения sRGB.
Android также предоставляет следующие дополнительные расширения:
- Расширение
EGL_EXT_colorspace_scrgb_linearпредоставляет новый вариант цветового пространства, scRGB, который приложения могут выбирать при создании EGLSurface. Цветовое пространство scRGB определяет линейное пространство, привязанное к дисплею, с той же точкой белого и основными цветами, что и sRGB (и, следовательно, обратно совместимо с sRGB). Это не должно требовать поддержки драйверов и может быть реализовано в оболочке Android EGL. Для корректной работы расширения требуется поддержка 16-битных чисел с плавающей запятой (FP16). -
EGL_EXT_gl_colorspace_display_p3иEGL_EXT_gl_colorspace_display_p3_linearпредназначены для приложений, которые хотят использовать стандартные буферы кадров формата Display-P3 для упрощения рендеринга sRGB на устройствах отображения. Это расширение позволяет создавать EGLSurfaces, которые будут отображаться в формате Display-P3 контекстами OpenGL, поддерживающими эту возможность. Это можно реализовать в обертке драйвера EGL. -
VK_EXT_swapchain_colorspace(Vulkan). Позволяет приложениям помечать цепочки обмена цветовыми пространствами в соответствии с используемым ими цветовым пространством. Включает ряд распространенных цветовых пространств, таких как DCI-P3, Display-P3, AdobeRGB и BT2020.
Настройка
Вы можете настроить функцию управления цветом, добавив поддержку различных цветовых стандартов, таких как DCI-P3, AdobeRGB, Rec709 и Rec2020. Другие параметры настройки включают:
- Аппаратная поддержка преобразования цвета в конвейере обработки изображений. Обеспечивает поддержку нескольких преобразований цвета на аппаратном уровне.
- Поддержка независимого преобразования цвета на нескольких слоях (например, некоторые слои могут быть в цветовом пространстве sRGB, а другие — в расширенном sRGB, каждый со своим собственным конвейером обработки цвета). Когда отображается более одного цветового пространства, некоторые цветовые пространства необходимо преобразовать в цветовое пространство дисплея. В идеале это преобразование лучше всего обеспечивать с помощью графического процессора (в противном случае Android должен выполнять композицию на GPU).
Тестирование
Для проверки управления цветом используйте следующие ресурсы в opengl/tests :
-
gl2_basic— это простая демонстрационная программа OpenGL, которая запрашивает цветовое пространство Display-P3. -
EGL_testпроверяет наличие необходимой поддержки расширений и конфигураций (10:10:10:2 и FP16). -
test_wide_colorсоздает поверхность аналогично SurfaceFlinger (например, задает конфигурацию, цветовое пространство и формат пикселей).
Эталонная реализация
Пример реализации см. в папке frameworks/native . Заголовочные файлы см. в:
-
system/core/include/system/graphics.h -
system/core/include/system/graphics-base.h-
HAL_DATASPACE_* -
HAL_COLOR_MODE_*
-