Android Qcom Display学习(十三)

该系列文章总目录链接与各部分简介: Android Qcom Display学习(零)
在上一篇中dump GraphicBuffer中,知道了护眼模式中调用setColorTransform应用于每一层Layer,于是想往上了解一些,color是针对屏幕的,不是对单个Layer的,Screencap出的图是不带color模式的。

屏幕重要指标之一的色域
显示屏色域、色深、色差等参数
Android10 Night Light实现细节分析

Android原生支持模式

frameworks/base/services/core/java/com/android/server/display/color/DisplayTransformManager.java setColorMode
frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp SurfaceFlinger::onTransact

护眼模式 通过applyTint只调用DisplayTransformManager::setColorMatrix来调节色温
色彩模式 通过setColorMode调用DisplayTransformManager::setColorMode来调节色彩模式

Android原生支持的四种color mode

(1)COLOR_MODE_NATURAL      COLOR_SATURATION_NATURAL + DISPLAY_COLOR_MANAGED
(2)COLOR_MODE_BOOSTED      COLOR_SATURATION_BOOSTED + DISPLAY_COLOR_MANAGED
(3)COLOR_MODE_SATURATED    COLOR_SATURATION_NATURAL + DISPLAY_COLOR_UNMANAGED 
(4)COLOR_MODE_AUTOMATIC    COLOR_SATURATION_NATURAL + DISPLAY_COLOR_ENHANCED

主要依据以下四个参数进行设置: (1)saturation 饱和度  (2)color 显示模式   (3)compositionColorMode 颜色模式   (4)level 颜色转换

1.applySaturation(saturation)

可通过 “persist.sys.sf.color_saturation” 设置,通过SURFACE_FLINGER_TRANSACTION_SATURATION = 1022与SurfaceFlinger进行通信

COLOR_SATURATION_NATURAL = 1.0f;
COLOR_SATURATION_BOOSTED = 1.1f;

2.setDisplayColor(color)

可通过“persist.sys.sf.native_mode” 设置,通过SURFACE_FLINGER_TRANSACTION_DISPLAY_COLOR = 1023与SurfaceFlinger进行通信

DISPLAY_COLOR_MANAGED = 0;
DISPLAY_COLOR_UNMANAGED = 1;
DISPLAY_COLOR_ENHANCED = 2;

3.setDisplayColor(compositionColorMode)

可通过“persist.sys.sf.color_mode” 设置,通过SURFACE_FLINGER_TRANSACTION_DISPLAY_COLOR = 1023与SurfaceFlinger进行通信

COLOR_MODE_INVALID = -1;
COLOR_MODE_DEFAULT = 0;
COLOR_MODE_BT601_625 = 1;
COLOR_MODE_BT601_625_UNADJUSTED = 2;
COLOR_MODE_BT601_525 = 3;
COLOR_MODE_BT601_525_UNADJUSTED = 4;
COLOR_MODE_BT709 = 5;
COLOR_MODE_DCI_P3 = 6;
COLOR_MODE_SRGB = 7;
COLOR_MODE_ADOBE_RGB = 8;
COLOR_MODE_DISPLAY_P3 = 9;

4.setColorMatrix(level)

通过setMatrix设置色温temperature,通过SURFACE_FLINGER_TRANSACTION_COLOR_MATRIX = 1015与SurfaceFlinger进行通信

LEVEL_COLOR_MATRIX_NIGHT_DISPLAY = 100;
LEVEL_COLOR_MATRIX_DISPLAY_WHITE_BALANCE = 125;

色温调节范围设置
<integer name="config_nightDisplayColorTemperatureMin">2596</integer>
<integer name="config_nightDisplayColorTemperatureMax">4082</integer>

Setting中默认是支持的Display white balance,只是这个功能没有打开,如下修改后即可

packages/apps/Settings/res/xml/display_settings.xml Settings.APK
<SwitchPreference
     android:key="display_white_balance"
     android:title="@string/display_white_balance_title"
     android:summary="@string/display_white_balance_summary"
     settings:controller="com.android.settings.display.DisplayWhiteBalancePreferenceController"/>
	 
DisplayWhiteBalancePreferenceController getAvailabilityStatus 
    DisplayWhiteBalanceTintController isDisplayWhiteBalanceAvailable
	    ColorDisplayManager  config_displayWhiteBalanceAvailable (services.jar)
		
frameworks/base/core/res/res/values/config.xml framework-res.apk
-<bool name="config_displayWhiteBalanceAvailable">false</bool>
+<bool name="config_displayWhiteBalanceAvailable">true</bool>

打开后没有效果,才发现需要AmbientSensor.AmbientColorTemperatureSensor环境色温传感器支持来一直更新Temperature

那其实要想实现这个手动调节白平衡,还是很简单的,对于framework新手三天就够了,新增或修改如下文件

packages/apps/Settings/res/xml/display_settings.xml
packages/apps/Settings/res/xml/whitebalance_display_settings.xml
packages/apps/Settings/src/com/android/settings/display/DisplayWhiteBalancePreferenceController.java
packages/apps/Settings/src/com/android/settings/display/WhiteBalanceIntensityPreferenceController.java
packages/apps/Settings/src/com/android/settings/display/WhiteBalanceSettings.java

一级菜单display_settings.xml 二级菜单whitebalance_display_settings.xml
WhiteBalanceSettings.java 布局相关
DisplayWhiteBalancePreferenceController.java控制 功能开关
WhiteBalanceIntensityPreferenceController 控制手动调节滑动

com.android.settings.widget.PrimarySwitchPreference 开关和左侧区域是分开的,左侧跳转二级
SwitchPreference 开关和全区域都会跳转二级菜单 Preference 没有开关,全区域跳转二级

<com.android.settings.widget.PrimarySwitchPreference
            android:key="display_white_balance"
            android:title="@string/display_white_balance_title"
            android:fragment="com.android.settings.display.WhiteBalanceSettings"
            android:summary="@string/display_white_balance_summary"
            settings:controller="com.android.settings.display.DisplayWhiteBalancePreferenceController"
            settings:keywords="@string/keywords_display_night_display"/>
			
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res-auto"
    android:title="@string/display_white_balance_title"
    settings:keywords="@string/display_white_balance_title">

    <com.android.settings.widget.SeekBarPreference
        android:key="whitebalance_temperature"
        android:title="@string/night_display_temperature_title"
        settings:keywords="@string/keywords_color_temperature"
        settings:controller="com.android.settings.display.WhiteBalanceIntensityPreferenceController"
        settings:unavailableSliceSubtitle="@string/night_display_not_currently_on"/>

</PreferenceScreen>

添加与Settings.apk的控制接口,主要就是获取和设置color temperature, 需要注意由于没有AmbientSensor,所以new
DisplayWhiteBalanceController对象会失败,需要注销掉validateArguments会判断是null object

framework/base/core/java/android/hardware/display/ColorDisplayManager.java
framework/base/core/java/android/hardware/display/IColorDisplayManager.aidl
framework/base/core/java/android/hardware/display/WhiteBalanceListener.java
framework/base/core/res/res/values/config.xml
framework/base/services/core/java/com/android/server/display/color/ColorDisplayService.java
framework/base/services/core/java/com/android/server/display/color/DisplayWhiteBalanceTintController.java
framework/base/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceController.java	
framework/base/services/core/java/com/android/server/display/whitebalance/DisplayWhiteBalanceFactory.java

Android色彩模式色域

       色域其实也可以叫做色彩空间,就是指表色模式所能表达的颜色构成的范围区域,指一个技术系统能够产生颜色的总和。下图的最大范围就是人眼可接受范围的色彩空间,市面上的色域标准都是它的子集。色域越高,颜色越丰富,越接近肉眼所见的真实色彩。

在这里插入图片描述
       广色域用于描述可以再现比 sRGB 色彩空间更多颜色的设备和色彩空间。在原来CRT、TN屏的时代,色域都是较小,可能以前达到70% sRGB色域就能称为广色域,但现在有了更加优秀的技术加持(IPS屏、OLED屏、QLED屏),色域需提升至90% sRGB才满足。

       SRGB/NTSC/DCI-P3的色域标准广泛应用于手机屏幕行业中,由于色域空间的大小不一致,所以宣传的时候可能会倾向于更大比例范围的,之前有询问过模组厂,不同的屏色域的标准来源主要是基于屏幕的材质,驱动IC主要影响gamma亮度,对色域影响较小,并且客户在选型的过程中,色域的优先级并非第一位,屏幕的尺寸和性能是选型的主要因素,色域除非有特别要求.,一般色域在65% NTSC以上+调整好IC的gamma参数,屏幕的整体质量还是不错。一般来说相同标准下色域是越高越好,但并不意味着高色域能够真实地显示色彩,色域还要搭配色彩还原才能体现出显示器在色彩方面的真实表现。

1.sRGB

sRGB色域是微软和HP在1996年共同开发的色彩空间,也是目前的微软旗下的Windows系统和众多原生软件默认支持的色彩空间

2.NTSC

NTSC色域(美国国家电视标准委员会)指定的标准,不能直接兼容计算机系统,不能完全覆盖住 sRGB,100% sRGB ≈ 72% NTSC

3.DCI-P3

DCI-P3是一种应用于数字影院的色域,它是一种以人类视觉体验为主导的色域标准,尽可能匹配电影场景中能展现的全部色域。它也不是色域最广的标准(目前最新的标准为BT.2020),但是在Rec.709标准之上,拥有更广阔的红色/绿色系范围

4.Adobe RGB

Adobe RGB是专业软件生产商Adobe在1998年推出的色彩空间,初衷是为了同时囊括sRGB(电脑常用的色彩空间)和CMYK(印刷常用的色彩空间),随着CCD/CMOS的发展,拍出的数码照片不仅能在电脑上正常显示和编辑,也能印刷出颜色无损而正确的相片。

Android护眼模式色温

在这里插入图片描述
       色温就是用来形容常见的冷暖色,Camera Tunning调试AWB的时候就会涉及到人造光源D65(6500K)、D50(5000K), 不同色温下通过ISP的算法调整,抵消色温引起的偏色,在日光灯的房间里拍摄会发绿,在室内钨丝灯光下拍摄会偏黄,而在日光阴影处拍摄会偏蓝。
       色温没有特定的标准,看个人眼镜的适应程度。一般考验显示设备在屏幕不同亮度(比如0%、25%、50%、75%、100%五个亮度等级)下白点色温的稳定性,让电子产品屏幕显示纯白色,在D65标准、色温为6500K标记为正常,低于6500K则偏暖,而高于6500K则偏冷。测试结果在标准色温值6500K的基础上呈现±500K的规格,意味着该显示设备的灰度上只有非常低的色调转变。

猜你喜欢

转载自blog.csdn.net/qq_40405527/article/details/126921620
今日推荐