diff options
-rw-r--r-- | core/res/res/raw/color_fade_frag.frag | 34 | ||||
-rw-r--r-- | services/core/java/com/android/server/display/ColorFade.java | 15 |
2 files changed, 32 insertions, 17 deletions
diff --git a/core/res/res/raw/color_fade_frag.frag b/core/res/res/raw/color_fade_frag.frag index 29975d5f7b5e..db0f63f2ee24 100644 --- a/core/res/res/raw/color_fade_frag.frag +++ b/core/res/res/raw/color_fade_frag.frag @@ -3,12 +3,34 @@ precision mediump float; uniform samplerExternalOES texUnit; uniform float opacity; -uniform float gamma; varying vec2 UV; -void main() -{ - vec4 color = texture2D(texUnit, UV); - vec3 rgb = pow(color.rgb * opacity, vec3(gamma)); - gl_FragColor = vec4(rgb, 1.0); +vec3 mixBvec3(vec3 a, vec3 b, bvec3 sel) { + return vec3( + sel.x ? b.x : a.x, + sel.y ? b.y : a.y, + sel.z ? b.z : a.z + ); +} + +vec3 srgbTransfer(vec3 c) { + vec3 gamma = 1.055 * pow(c, vec3(1.0/2.4)) - 0.055; + vec3 linear = 12.92 * c; + bvec3 selectParts = lessThan(c, vec3(0.0031308)); + return mixBvec3(gamma, linear, selectParts); +} + +vec3 srgbTransferInv(vec3 c) { + vec3 gamma = pow((c + 0.055)/1.055, vec3(2.4)); + vec3 linear = c / 12.92; + bvec3 selectParts = lessThan(c, vec3(0.04045)); + return mixBvec3(gamma, linear, selectParts); +} + +void main() { + vec3 inRgb = srgbTransferInv(texture2D(texUnit, UV).rgb); + vec3 fade = inRgb * opacity * opacity; + vec3 outRgb = srgbTransfer(fade); + + gl_FragColor = vec4(outRgb, 1.0); } diff --git a/services/core/java/com/android/server/display/ColorFade.java b/services/core/java/com/android/server/display/ColorFade.java index 7cb29215b5bf..5acfb234d14a 100644 --- a/services/core/java/com/android/server/display/ColorFade.java +++ b/services/core/java/com/android/server/display/ColorFade.java @@ -112,7 +112,7 @@ final class ColorFade { private final float mProjMatrix[] = new float[16]; private final int[] mGLBuffers = new int[2]; private int mTexCoordLoc, mVertexLoc, mTexUnitLoc, mProjMatrixLoc, mTexMatrixLoc; - private int mOpacityLoc, mGammaLoc; + private int mOpacityLoc; private int mProgram; // Vertex and corresponding texture coordinates. @@ -288,7 +288,6 @@ final class ColorFade { mTexMatrixLoc = GLES20.glGetUniformLocation(mProgram, "tex_matrix"); mOpacityLoc = GLES20.glGetUniformLocation(mProgram, "opacity"); - mGammaLoc = GLES20.glGetUniformLocation(mProgram, "gamma"); mTexUnitLoc = GLES20.glGetUniformLocation(mProgram, "texUnit"); GLES20.glUseProgram(mProgram); @@ -432,12 +431,7 @@ final class ColorFade { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); // Draw the frame. - double one_minus_level = 1 - level; - double cos = Math.cos(Math.PI * one_minus_level); - double sign = cos < 0 ? -1 : 1; - float opacity = (float) -Math.pow(one_minus_level, 2) + 1; - float gamma = (float) ((0.5d * sign * Math.pow(cos, 2) + 0.5d) * 0.9d + 0.1d); - drawFaded(opacity, 1.f / gamma); + drawFaded(level); if (checkGlErrors("drawFrame")) { return false; } @@ -449,9 +443,9 @@ final class ColorFade { return showSurface(1.0f); } - private void drawFaded(float opacity, float gamma) { + private void drawFaded(float opacity) { if (DEBUG) { - Slog.d(TAG, "drawFaded: opacity=" + opacity + ", gamma=" + gamma); + Slog.d(TAG, "drawFaded: opacity=" + opacity); } // Use shaders GLES20.glUseProgram(mProgram); @@ -460,7 +454,6 @@ final class ColorFade { GLES20.glUniformMatrix4fv(mProjMatrixLoc, 1, false, mProjMatrix, 0); GLES20.glUniformMatrix4fv(mTexMatrixLoc, 1, false, mTexMatrix, 0); GLES20.glUniform1f(mOpacityLoc, opacity); - GLES20.glUniform1f(mGammaLoc, gamma); // Use textures GLES20.glActiveTexture(GLES20.GL_TEXTURE0); |