Управление цветом

В 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 . Заголовочные файлы см. в: