44
55precision mediump float ;
66
7+ #include < impeller/ color.glsl>
78#include < impeller/ gradient.glsl>
89#include < impeller/ texture.glsl>
910#include < impeller/ types.glsl>
@@ -22,6 +23,7 @@ uniform FragInfo {
2223 highp vec2 center;
2324 float radius;
2425 float tile_mode;
26+ vec4 decal_border_color;
2527 float alpha;
2628 int colors_length;
2729 vec2 focus;
@@ -43,26 +45,25 @@ void main() {
4345
4446 float t = res.x;
4547 if ((t < 0.0 || t > 1.0 ) && frag_info.tile_mode == kTileModeDecal) {
46- frag_color = vec4 (0 );
47- return ;
48- }
49- t = IPFloatTile(t, frag_info.tile_mode);
48+ frag_color = decal_border_color;
49+ } else {
50+ t = IPFloatTile(t, frag_info.tile_mode);
5051
51- vec4 result_color = vec4 (0 );
52- for (int i = 1 ; i < frag_info.colors_length; i++ ) {
53- ColorPoint prev_point = color_data.colors[i - 1 ];
54- ColorPoint current_point = color_data.colors[i];
55- if (t >= prev_point.stop && t <= current_point.stop) {
56- float delta = (current_point.stop - prev_point.stop);
57- if (delta < 0.001 ) {
58- result_color = current_point.color;
59- } else {
60- float ratio = (t - prev_point.stop) / delta;
61- result_color = mix (prev_point.color, current_point.color, ratio);
52+ vec4 result_color = vec4 (0 );
53+ for (int i = 1 ; i < frag_info.colors_length; i++ ) {
54+ ColorPoint prev_point = color_data.colors[i - 1 ];
55+ ColorPoint current_point = color_data.colors[i];
56+ if (t >= prev_point.stop && t <= current_point.stop) {
57+ float delta = (current_point.stop - prev_point.stop);
58+ if (delta < 0.001 ) {
59+ result_color = current_point.color;
60+ } else {
61+ float ratio = (t - prev_point.stop) / delta;
62+ result_color = mix (prev_point.color, current_point.color, ratio);
63+ }
64+ break ;
6265 }
63- break ;
6466 }
6567 }
66- frag_color =
67- vec4 (result_color.xyz * result_color.a, result_color.a) * frag_info.alpha;
68+ frag_color = IPPremultiply(frag_color) * frag_info.alpha;
6869}
0 commit comments