Android 8.1 и более поздние версии включают поддержку управления цветом, которое можно использовать для обеспечения единообразия при использовании различных технологий отображения. Приложения, работающие на Android, могут получить доступ ко всем возможностям дисплея с широкой гаммой, чтобы максимально эффективно использовать возможности устройства отображения.
Предыдущие выпуски Android не включали поддержку управления цветом и вместо этого полагались на совместимость контента и дисплеев (эта цель часто поддерживается телеиндустрией). Однако последние технологии отображения позволяют создавать дисплеи с гораздо большей гаммой, которые не отображают существующий контент должным образом. В Android 8.1 и более поздних версиях устройства, использующие дисплеи с широкой гаммой (например, органические светодиоды с активной матрицей или AMOLED, некоторые ЖК-дисплеи), могут видеть контент с широкой гаммой из приложений.
Определить поддержку устройства
Устройства с широкоцветными дисплеями под управлением Android 8.1 или более поздней версии должны поддерживать управление цветом (широкий цвет). Прежде чем включать эту функцию, убедитесь, что устройство соответствует следующим требованиям:
- Дисплей устройства соответствует требованиям к оборудованию, в том числе хорошо продуманному дисплею, поддерживающему цветовое пространство Display-P3. Если дисплей не соответствует этому требованию, не включайте управление цветом. Чтобы снизить нагрузку на процессор и графический процессор, желательна поддержка расширенного sRGB и HDR10 в конвейере дисплея.
- Устройство поддерживает процесс заводской калибровки, в ходе которого генерируются данные калибровки (хранящиеся на устройстве) для корректировки производственных отклонений в поведении дисплея. Как минимум, данные калибровки должны позволять дисплею точно отображать содержимое sRGB и точки белого D65 и D73.
Если эти требования соблюдены, вы можете включить функцию управления цветом на устройстве.
Внедрить управление цветом
Чтобы реализовать управление цветом, сначала обновите драйвер Hardware Composer 2 (HWC2), чтобы понять цветовые режимы и применить эти режимы к оборудованию. В частности, компоновщик HWC2 должен сообщить о цветовых режимах Display-P3 и sRGB с помощью HWCDisplay::GetColorModes
.
Затем включите необходимые расширения OpenGL и поддержку библиотек для преобразования цветовых пространств OpenGL в пространства данных HAL. Необходимые расширения OpenGL включают в себя:
-
EGL_EXT_pixel_format_float
. Позволяет приложениям создавать презентабельные поверхности EGLSurface с 16-битными компонентами цвета с плавающей запятой. Приоритет: высокий (ожидайте, что это формат пикселей по умолчанию для приложений с поддержкой широкого цвета). Требуется поддержка драйверов. -
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
(Вулкан). Позволяет приложениям помечать цепочки замены цветовым пространством, которое они используют. Включает ряд распространенных цветовых пространств, таких как DCI-P3, Display-P3, AdobeRGB и BT2020.
Кастомизация
Вы можете настроить функцию управления цветом, включив поддержку различных стандартов цвета, таких как DCI-P3, AdobeRGB, Rec709 и Rec2020. Другие настройки включают в себя:
- Аппаратная поддержка преобразования цветов в конвейере дисплея. Включает поддержку аппаратного преобразования нескольких цветов.
- Поддержка независимого преобразования цвета на нескольких слоях (например, некоторые слои могут быть sRGB, а другие — расширенным sRGB, каждый со своим собственным цветовым конвейером). Если отображается более одного цветового пространства, некоторые цветовые пространства необходимо преобразовать в цветовое пространство дисплея. В идеале это преобразование лучше всего обеспечивает механизм отображения (в противном случае Android должен выполнять композицию графического процессора).
Тестирование
Чтобы протестировать управление цветом, используйте следующие ресурсы в 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_*
-