diff options
Diffstat (limited to 'gfx/wr/webrender/res/cs_gradient.glsl')
-rw-r--r-- | gfx/wr/webrender/res/cs_gradient.glsl | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/gfx/wr/webrender/res/cs_gradient.glsl b/gfx/wr/webrender/res/cs_gradient.glsl new file mode 100644 index 0000000000..6e6b5c4ad0 --- /dev/null +++ b/gfx/wr/webrender/res/cs_gradient.glsl @@ -0,0 +1,56 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include shared + +varying float vPos; +flat varying vec4 vStops; +flat varying vec4 vColor0; +flat varying vec4 vColor1; +flat varying vec4 vColor2; +flat varying vec4 vColor3; + +#ifdef WR_VERTEX_SHADER + +PER_INSTANCE in vec4 aTaskRect; +PER_INSTANCE in float aAxisSelect; +PER_INSTANCE in vec4 aStops; +PER_INSTANCE in vec4 aColor0; +PER_INSTANCE in vec4 aColor1; +PER_INSTANCE in vec4 aColor2; +PER_INSTANCE in vec4 aColor3; +PER_INSTANCE in vec2 aStartStop; + +void main(void) { + vPos = mix(aStartStop.x, aStartStop.y, mix(aPosition.x, aPosition.y, aAxisSelect)); + + vStops = aStops; + vColor0 = aColor0; + vColor1 = aColor1; + vColor2 = aColor2; + vColor3 = aColor3; + + gl_Position = uTransform * vec4(aTaskRect.xy + aTaskRect.zw * aPosition.xy, 0.0, 1.0); +} +#endif + +#ifdef WR_FRAGMENT_SHADER +float linear_step(float edge0, float edge1, float x) { + if (edge0 >= edge1) { + return 0.0; + } + + return clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0); +} + +void main(void) { + vec4 color = vColor0; + + color = mix(color, vColor1, linear_step(vStops.x, vStops.y, vPos)); + color = mix(color, vColor2, linear_step(vStops.y, vStops.z, vPos)); + color = mix(color, vColor3, linear_step(vStops.z, vStops.w, vPos)); + + oFragColor = color; +} +#endif |