В 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
. Позволяет приложениям создавать презентабельные EGLSurfaces с 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 на устройствах отображения, это расширение позволяет создавать поверхности EGLSurface, которые будут отображаться в 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_*
-