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

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