В 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. Это расширение позволяет создавать EGLSurface, которые будут отрисовываться в sRGB контекстами OpenGL, поддерживающими эту возможность. Это упрощает отрисовку в sRGB для приложений, которые хотят использовать буферы кадров по умолчанию в формате sRGB для более легкого достижения отрисовки в sRGB на устройствах отображения. Требуется поддержка драйвера для поведения 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.hsystem/core/include/system/graphics-base.hHAL_DATASPACE_*HAL_COLOR_MODE_*