本文档基于AndroidQ,因为暂时没有Q的代码连接,代码引用连接是AndroidP.
打开你Android手机“设置”界面,点击“显示”=>“高级”=>“颜色”,你可以看到手机生产商为你定制的显示效果选项。如果是Google原生系统的话,则一般有三个选项,如下是Pixel4的Color Modes设置界面:
1. APP和Framework Java层相关代码:
从下面Android代码看,Google在应用层定义了4个ColorMode,分别是自然色模式COLOR_MODE_NATURAL(0)、效果增强模式COLOR_MODE_BOOSTED(1)、鲜艳模式 COLOR_MODE_SATURATED(2) 、和自动调节模式COLOR_MODE_AUTOMATIC(3)。
88 /**
89 * Color mode with natural colors.
90 *
91 * @see #setColorMode(int)
92 */
93 public static final int COLOR_MODE_NATURAL = 0;
94 /**
95 * Color mode with boosted colors.
96 *
97 * @see #setColorMode(int)
98 */
99 public static final int COLOR_MODE_BOOSTED = 1;
100 /**
101 * Color mode with saturated colors.
102 *
103 * @see #setColorMode(int)
104 */
105 public static final int COLOR_MODE_SATURATED = 2;
106 /**
107 * Color mode with automatic colors.
108 *
109 * @see #setColorMode(int)
110 */
111 public static final int COLOR_MODE_AUTOMATIC = 3;
从图1可以看出,Pixel4在设置中给出了3个ColorModes,分别是自然色、效果增强和自动调节。这个界面的colorModes选项,可以通过以下config来配置,一般放到项目本身的overlay目录。
http://androidxref.com/9.0.0_r3/xref/frameworks/base/core/res/res/values/symbols.xml#2967
961 <!-- Indicate available ColorDisplayController.COLOR_MODE_xxx. --> 962 <integer-array name="config_availableColorModes"> 963 <!-- Example: 964 <item>0</item> 965 <item>1</item> 966 <item>3</item> 967 -->
设置UI中的colorModes是怎么实现的呢?看DisplayTransformManager.java中的setColorMode函数。有两个接口很关键,它们是applySaturation()和setDisplayColor()。他们分别调用了SurfaceFlinger的transact code 1022/1023,用来设置饱和度和colorSetting,从而综合得出一个colorMode的效果。代码如下图。顺便提下,除了colorMode外,Android显示效果中的夜晚模式以及颜色反转等,是通过另外一个接口setColorTransform配置不同的matrix来实现的。
frameworks/base/services/core/java/com/android/server/display/color/DisplayTransformManager.java
327 public boolean setColorMode(int colorMode, float[] nightDisplayMatrix) {
328 if (colorMode == ColorDisplayManager.COLOR_MODE_NATURAL) {
329 applySaturation(COLOR_SATURATION_NATURAL);
330 setDisplayColor(DISPLAY_COLOR_MANAGED);
331 } else if (colorMode == ColorDisplayManager.COLOR_MODE_BOOSTED) {
340 applySaturation(COLOR_SATURATION_BOOSTED);
341 setDisplayColor(DISPLAY_COLOR_MANAGED);
343 } else if (colorMode == ColorDisplayManager.COLOR_MODE_SATURATED) {
344 applySaturation(COLOR_SATURATION_NATURAL);
345 setDisplayColor(DISPLAY_COLOR_UNMANAGED);
346 } else if (colorMode == ColorDisplayManager.COLOR_MODE_AUTOMATIC) {
347 applySaturation(COLOR_SATURATION_NATURAL);
348 setDisplayColor(DISPLAY_COLOR_ENHANCED);
349 } else if (colorMode >= ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MIN
350 && colorMode <= ColorDisplayManager.VENDOR_COLOR_MODE_RANGE_MAX) {
351 applySaturation(COLOR_SATURATION_NATURAL);
352 setDisplayColor(colorMode);
353 }
354 }
可以看出,除了效果增强模式COLOR_MODE_BOOSTED使用了110%(COLOR_SATURATION_BOOSTED)的饱和度,其他模式都是使用100%(COLOR_SATURATION_NATURAL )的饱和度。几个相关定义如下:
//用来调用surfaceFlinger的transact code如下
//SurfaceFlinger global saturation factor.
private static final int SURFACE_FLINGER_TRANSACTION_SATURATION = 1022;
//SurfaceFlinger display color (managed, unmanaged, etc.).
private static final int SURFACE_FLINGER_TRANSACTION_DISPLAY_COLOR = 1023;
private static final int SURFACE_FLINGER_TRANSACTION_COLOR_MATRIX = 1015;//Google饱和度初设值
private static final float COLOR_SATURATION_NATURAL = 1.0f;
private static final float COLOR_SATURATION_BOOSTED = 1.1f;//Google定义的colorSetting值,在native层会转化为renderIntent,用来区分相同colorSpace的不同底层colorMode
private static final int DISPLAY_COLOR_MANAGED = 0;
private static final int DISPLAY_COLOR_UNMANAGED = 1;
private static final int DISPLAY_COLOR_ENHANCED = 2;
2. SurfaceFlinger相关代码
上面我们讲了app层的代码,知道DisplayTransformManager会调用SurfaceFlinger来配置saturation和colorSetting。上层应用可以随时设置saturation和colorSetting,并记为mGlobalSaturationFactor和mDisplayColorSetting,但真正的colorMode生效是实际的layer更新时才向HAL层传递的。mGlobalSaturationFactor会更新mDrawingState.colorMatrix并通过setColorTransform()来生效。
frameworks/native