【小白课程】openKylin护眼模式功能和实现原理介绍
在openKylin开源操作系统中,贴心地为用户提供了护眼模式,旨在通过调整屏幕色温与亮度,降低对用户视力的潜在危害。同时,它允许用户根据个人偏好和周围环境的需求,灵活调整屏幕显示效果,有效屏蔽高能蓝光,从而减轻视觉疲劳,提升用眼舒适度。
我们可以通过多种途径快速打开控制面板,如按下win+i键、在桌面上右键并选择“显示设置”等。在控制面板的显示设置界面中,我们可以找到护眼模式选项。护眼模式可以减少屏幕的蓝光辐射,以降低对眼睛的刺激。
相较于单纯的开启色温,全天生硬的使用一个色温值,护眼模式则更加智能、更加贴心。在openKylin 2.0的护眼模式中,我们根据人的作息习惯引入了时间段的概念,并针对每个时间段提供不同的色温值,达到略微减少蓝光,中等减少蓝光,大量减少蓝光。三个时间段分别为:
白天:日出之后~日落之前
伴晚:日落之后1点之前
深夜:1点到3点
黎明:3点之后日出之前
每个时间段对应的色温值分别为:
白天:4500k
伴晚:3500k
深夜:2800k
黎明:3500k
白天:日落前一个小时开始向伴晚的色温渐变 伴晚:12点开始向深夜的色温渐变 深夜:2点开始向黎明的色温渐变 黎明:日出前一个小时向白天的色温渐变
通过这种渐变的方式,openKylin系统可以实现在用户不知不觉中逐渐调整显示器的色温,避免突然的变化对用户造成不适。这种方法能够提供更加舒适的使用体验。
当然了,以上数据仅仅代表社区调研、分析的结论。三个档位的值并非是一个死值,他是以Gsettings存储的、可供用户自定义调整的。我们可以通过如下方法设置自己自定义的白天、黑夜,让“白天也懂夜的黑”。
查询:
白天:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value 伴晚:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn 深夜:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-late-night 黎明:gsettings get org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn
设置:
白天:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value 4500 伴晚:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn 3500 深夜:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-late-night 2800 黎明:gsettings set org.ukui.SettingsDaemon.plugins.color eye-care-value-evening-dawn 3500
当然如果设置错误,想要回复可以使用如下命令恢复为预设值:
gsettings reset-recursively org.ukui.SettingsDaemon.plugins.color
目前openKylin系统采用的方案是通过调整显示器的gamma曲线来实现调整色温的效果。根据redshift的色温与RGB的对照表,将色温以100K为刻度进行拆分,每个刻度对应一组RGB的值。举个例子:
{ { 1.0000, 0.0425, 0.0000 }, /* 1000K */ { 1.0000, 0.0668, 0.0000 }, /* 1100K */ { 1.0000, 0.0911, 0.0000 }, /* 1200K */ { 1.0000, 0.1149, 0.0000 }, /* ... */ /* ... */ { 1.0000, 0.2630, 0.0062 },/* 2000K */ { 1.0000, 0.4859, 0.1505 },/* 3000K */ { 1.0000, 0.6727, 0.3739 },/* 4000K */ { 1.0000, 0.8250, 0.6272 },/* 5000K */ { 1.0000, 0.9478, 0.8795 },/* 6000K */ { 1.0000, 1.0000, 1.0000 }, /* 6500K */ { 0.5944, 0.7414, 1.0000 } /* 10000K */};(https://gitee.com/openkylin/ukui-settings-daemon/blob/upstream/plugins/gamma-manager/rgb-gamma-table.h)
当需要调整色温,将色温换算出一组rgb,然后根据rgb调整gamma曲线即可,此方案不仅可以调整显示的色温,同时还可以调整显示器的亮度。核心代码:
for(int k = 0; k < m_pScreenRes->noutput; k++) {
RROutput outputId = m_pScreenRes->outputs[k];
XRROutputInfo *outputInfo = XRRGetOutputInfo (QX11Info::display(), m_pScreenRes, outputId);
QString outputname = QString::fromLatin1(outputInfo->name);
if (outputInfo->connection != RR_Connected) {
XRRFreeOutputInfo(outputInfo);
continue;
}
if (!outputInfo->crtc) {
ret = true;
USD_LOG(LOG_ERR,"crtc size is 0.\n");
goto FREEOUTPUT;
}
size = XRRGetCrtcGammaSize(QX11Info::display(), outputInfo->crtc);
if (!size) {
ret = false;
USD_LOG(LOG_ERR,"Gamma size is 0.\n");
goto FREEOUTPUT;
}
/*
* The gamma-correction lookup table managed through XRR[GS]etCrtcGamma
* is 2^n in size, where 'n' is the number of significant bits in
* the X Color. Because an X Color is 16 bits, size cannot be larger
* than 2^16.
*/
if (size > 65536) {
ret = false;
USD_LOG(LOG_ERR,"Gamma correction table is impossibly large.\n");
goto FREEOUTPUT;
}
pCrtcGamma = XRRAllocGamma(size);
if (!pCrtcGamma) {
USD_LOG(LOG_ERR,"Gamma allocation failed.\n");
continue;
}
m_colorRGB.R == m_colorRGB.R ? m_colorRGB.R : 1.0;
m_colorRGB.G == m_colorRGB.G ? m_colorRGB.G : 1.0;
m_colorRGB.B == m_colorRGB.B ? m_colorRGB.B : 1.0;
gammaRed = 1 / m_colorRGB.R;
gammaGreen = 1 / m_colorRGB.G;
gammaBlue = 1 / m_colorRGB.B;
for (int i = 0; i < size; i++) {\
uint value = (i * 0xffff) / (size - 1);
pCrtcGamma->red[i] = value * m_colorRGB.R * brightness;
pCrtcGamma->green[i]= value * m_colorRGB.G * brightness;
pCrtcGamma->blue[i] = value * m_colorRGB.B * brightness;
}
XRRSetCrtcGamma(QX11Info::display(), outputInfo->crtc, pCrtcGamma);
XSync(QX11Info::display(), NULL);
XRRFreeGamma(pCrtcGamma);
FREEOUTPUT:
XRRFreeOutputInfo(outputInfo);
}
openKylin操作系统中的护眼模式是一项既实用又方便的功能,它通过科学合理地调整屏幕色彩,减轻长时间使用电脑对眼睛可能造成的负担。同时,用户还可以根据自己的日常作息和视觉感受进行个性化设置,从而更好地保护视力。