Как определить текущий режим экрана AMOLED?

Многие устройства Android с экранами AMOLED по умолчанию отображают все изображения с перенасыщенными цветами. Например. В телефонах Samsung Galaxy есть режим адаптивного экрана, который заставляет окна всех приложений отображаться так, как если бы они были визуализированы в собственном цветовом пространстве экрана, которое шире, чем Display-P3.

OTOH, не все такие устройства поддерживают EGL_EXT_gl_colorspace_display_p3, независимо от режима экрана, поэтому я не могу быть уверен, есть ли у устройства, на котором запущено мое приложение, даже экран с широкой гаммой, а уж тем более определить, является ли этот режим режимом по умолчанию.

Итак, как я могу на самом деле определить, является ли текущий режим экрана sRGB или каким-либо режимом с широкой гаммой? Я нацеливаюсь на одну конкретную модель устройства, Samsung Galaxy A320F / DS (AKA A3 (2017)), поэтому подходы для конкретных платформ.


person Ruslan    schedule 13.01.2020    source источник


Ответы (1)


Есть несколько слоев, на которых можно изменять цвета.

  • SurfaceFlinger. Этот компонент является общим для всех систем Android. Ему можно передать пользовательскую цветовую матрицу (см. исходный код обработчика этого запроса) через, например, следующая команда выполняется от имени пользователя root:
service call SurfaceFlinger 1015 i32 1 \
f 0 f 0 f 1 f 0 \
f 0 f 1 f 0 f 0 \
f 1 f 0 f 0 f 0 \
f 0 f 0 f 0 f 1

В приведенном выше примере команда устанавливает матрицу, которая, воздействуя на векторы RGBA, меняет местами красный и синий каналы. Чтобы сбросить настраиваемую матрицу по умолчанию (идентичность), вы можете просто сделать

service call SurfaceFlinger 1015 i32 0

Возможно, вы сможете сделать все это из приложения Java / JNI без привилегий root, просто попросив разрешения, я этого не исследовал.

  • mDNIe, which stands for mobile Digital Natural Image engine. It's a Samsung-specific system that acts on a lower level than SurfaceFlinger. Namely, it affects Always On Display, on which SurfaceFlinger's custom color matrix doesn't have any effect.
    Current screen mode can be seen in the /sys/class/mdnie/mdnie/mode file, which appears to have the following mapping of values on Galaxy A320F/DS:
    • 0 — AMOLED cinema (apparently aims at Display-P3),
    • 1 - фотография AMOLED (очевидно, нацелена на Adobe RGB),
    • 2 - Базовый (нацелен на sRGB),
    • 3 - (не знаю его назначение, но значение принимается, если записано в mode)
    • 4 - Адаптивный дисплей (самое широкое, видимо, родное цветовое пространство экрана).
    • 5 - (не знаю его назначение, но значение принимается, если записано в mode)

Кроме того, на цвета также влияет ползунок Холодный - Теплый, а также Расширенные параметры поканальной настройки RGB. Изменения первого так или иначе отражаются в файлах mdnie_ldu и sensorRGB в том же каталоге, а последний напрямую соответствует файлу whiteRGB.

Кроме того, состояние функции Фильтр синего света отражается в файле night_mode (это также влияет на файлы mdnie_ldu и sensorRGB, упомянутые выше).

Из файлов, описанных выше, только mode может быть прочитан пользователем, не являющимся root.

person Ruslan    schedule 20.01.2020