我喜欢 compiz 中的反转窗口颜色功能,但是我更希望能够只反转亮度,保留原始色调。我更希望有一个适用于所有窗口的全局功能,可以反转窗口的亮度,如果亮度比原始亮度暗,则使用该亮度,否则使用原始亮度。这样我就再也不用看着白屏了 ;)。
更新:
我认为在着色器中进行这样的改变neg.cpp
可能执行我想要的基本版本。我找到了 rgb 到 hsv 到 rgb 的 GLSL 代码,将其注入原始着色器,将设置v
为1.0 - v
(我假设的范围value
是 1.0,但我不确定),然后将结果转换回 rgb 并将其用作最终像素颜色:
/* rgb:hsv conversion based on:
http://stackoverflow.com/questions/15095909/from-rgb-to-hsv-in-opengl-glsl */
static std::string fragment_function = " \n\
void neg_fragment () { \n\
// convert to hsv \n\
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); \n\
vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); \n\
vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); \n\
float d = q.x - min(q.w, q.y); \n\
float e = 1.0e-10; \n\
vec3 c = vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); \n\
// flip luminosity (value) \n\
c.z = 1.0 - c.z \n\
// convert back to rgb \n\
K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); \n\
p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); \n\
c = c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); \n\
// use converted rgb value \n\
gl_FragColor = vec4(c, gl_FragColor.a); \n\
} \n\
";
我在 Bazaar 上找到了 compiz 存储库。我将浏览源代码并尝试找到反转颜色模块的实现位置
如果有人想知道,该插件是“负面”还是“负面”插件,源代码的相关部分是在 bazaar.launchpad.net 上
该插件原始自述文件上的所有三个联系电子邮件地址都已消失 - 如果有人有办法联系原始开发人员,我们将不胜感激。
我没有太多时间投入到这个方面,但如果有人能找到一种方法来让 compiz 进行编译并且可以测试它,我将不胜感激!