| /* | |
| * Copyright (C) 2026 The Android Open Source Project | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef ANDROID_BOOTANIMATION_SHADERS_H | |
| #define ANDROID_BOOTANIMATION_SHADERS_H | |
| static const char VERTEX_SHADER_SOURCE[] = R"( | |
| precision mediump float; | |
| attribute vec4 aPosition; | |
| attribute highp vec2 aUv; | |
| varying highp vec2 vUv; | |
| void main() { | |
| gl_Position = aPosition; | |
| vUv = aUv; | |
| })"; | |
| static const char IMAGE_FRAG_DYNAMIC_COLORING_SHADER_SOURCE[] = R"( | |
| precision mediump float; | |
| const float cWhiteMaskThreshold = 0.05; | |
| uniform sampler2D uTexture; | |
| uniform float uFade; | |
| uniform float uColorProgress; | |
| uniform vec3 uStartColor0; | |
| uniform vec3 uStartColor1; | |
| uniform vec3 uStartColor2; | |
| uniform vec3 uStartColor3; | |
| uniform vec3 uEndColor0; | |
| uniform vec3 uEndColor1; | |
| uniform vec3 uEndColor2; | |
| uniform vec3 uEndColor3; | |
| varying highp vec2 vUv; | |
| void main() { | |
| vec4 mask = texture2D(uTexture, vUv); | |
| float r = mask.r; | |
| float g = mask.g; | |
| float b = mask.b; | |
| float a = mask.a; | |
| // If all channels have values, render pixel as a shade of white. | |
| float useWhiteMask = step(cWhiteMaskThreshold, r) | |
| * step(cWhiteMaskThreshold, g) | |
| * step(cWhiteMaskThreshold, b) | |
| * step(cWhiteMaskThreshold, a); | |
| vec3 color = r * mix(uStartColor0, uEndColor0, uColorProgress) | |
| + g * mix(uStartColor1, uEndColor1, uColorProgress) | |
| + b * mix(uStartColor2, uEndColor2, uColorProgress) | |
| + a * mix(uStartColor3, uEndColor3, uColorProgress); | |
| color = mix(color, vec3((r + g + b + a) * 0.25), useWhiteMask); | |
| gl_FragColor = vec4(color.x, color.y, color.z, (1.0 - uFade)); | |
| })"; | |
| static const char IMAGE_FRAG_SHADER_SOURCE[] = R"( | |
| precision mediump float; | |
| uniform sampler2D uTexture; | |
| uniform float uFade; | |
| varying highp vec2 vUv; | |
| void main() { | |
| vec4 color = texture2D(uTexture, vUv); | |
| gl_FragColor = vec4(color.x, color.y, color.z, (1.0 - uFade)) * color.a; | |
| })"; | |
| static const char TEXT_FRAG_SHADER_SOURCE[] = R"( | |
| precision mediump float; | |
| uniform sampler2D uTexture; | |
| uniform vec4 uCropArea; | |
| varying highp vec2 vUv; | |
| void main() { | |
| vec2 uv = vec2(mix(uCropArea.x, uCropArea.z, vUv.x), | |
| mix(uCropArea.y, uCropArea.w, vUv.y)); | |
| gl_FragColor = texture2D(uTexture, uv); | |
| })"; | |
| #endif // ANDROID_BOOTANIMATION_SHADERS_H |