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;
@@ -36,33 +38,29 @@ out vec4 frag_color;
3638void main() {
3739 vec2 res = IPComputeConicalT(frag_info.focus, frag_info.focus_radius,
3840 frag_info.center, frag_info.radius, v_position);
39- if (res.y < 0.0 ) {
40- frag_color = vec4 (0 );
41- return ;
42- }
4341
4442 float t = res.x;
45- 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);
43+ if (res.y < 0.0 ||
44+ ((t < 0.0 || t > 1.0 ) && frag_info.tile_mode == kTileModeDecal)) {
45+ frag_color = frag_info.decal_border_color ;
46+ } else {
47+ t = IPFloatTile(t, frag_info.tile_mode);
5048
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);
49+ vec4 result_color = vec4 (0 );
50+ for (int i = 1 ; i < frag_info.colors_length; i++ ) {
51+ ColorPoint prev_point = color_data.colors[i - 1 ];
52+ ColorPoint current_point = color_data.colors[i];
53+ if (t >= prev_point.stop && t <= current_point.stop) {
54+ float delta = (current_point.stop - prev_point.stop);
55+ if (delta < 0.001 ) {
56+ result_color = current_point.color;
57+ } else {
58+ float ratio = (t - prev_point.stop) / delta;
59+ result_color = mix (prev_point.color, current_point.color, ratio);
60+ }
61+ break ;
6262 }
63- break ;
6463 }
6564 }
66- frag_color =
67- vec4 (result_color.xyz * result_color.a, result_color.a) * frag_info.alpha;
65+ frag_color = IPPremultiply(frag_color) * frag_info.alpha;
6866}
0 commit comments