Warning, /frameworks/kquickcharts/src/shaders/piechart.frag is written in an unsupported language. File is not indexed.

0001 /*
0002  * This file is part of KQuickCharts
0003  * SPDX-FileCopyrightText: 2019 Arjen Hiemstra <ahiemstra@heimr.nl>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 // This requires "sdf.frag" which is included through SDFShader.
0009 
0010 // The maximum number of segments we can support for a single pie.
0011 // This is based on OpenGL's MAX_FRAGMENT_UNIFORM_COMPONENTS.
0012 // MAX_FRAGMENT_UNIFORM_COMPONENTS is required to be at least 1024.
0013 // Assuming a segment of size 1, each segment needs
0014 // 2 (size of a vec2) * 2 (number of points) + 4 (size of vec4) + 1 (segment size)
0015 // components. We also need to leave some room for the other uniforms.
0016 #define MAX_SEGMENTS 100
0017 
0018 uniform lowp float opacity;
0019 uniform lowp float innerRadius;
0020 uniform lowp float outerRadius;
0021 uniform lowp vec4 backgroundColor;
0022 uniform bool smoothEnds;
0023 uniform lowp float fromAngle;
0024 uniform lowp float toAngle;
0025 
0026 uniform lowp vec2 segments[MAX_SEGMENTS];
0027 uniform lowp vec4 colors[MAX_SEGMENTS];
0028 uniform int segmentCount;
0029 
0030 #ifdef LEGACY_STAGE_INOUT
0031 varying lowp vec2 uv;
0032 #else
0033 in lowp vec2 uv;
0034 out lowp vec4 out_color;
0035 #endif
0036 
0037 const lowp vec2 origin = vec2(0.0, 0.0);
0038 const lowp float lineSmooth = 0.001;
0039 
0040 lowp float rounded_segment(lowp float from, lowp float to, lowp float inner, lowp float outer, lowp float rounding)
0041 {
0042     return sdf_torus_segment(uv, from + rounding, to - rounding, inner + rounding, outer - rounding) - rounding;
0043 }
0044 
0045 void main()
0046 {
0047     lowp vec4 color = vec4(0.0);
0048 
0049     lowp float thickness = (outerRadius - innerRadius) / 2.0;
0050     lowp float rounding = smoothEnds ? thickness : 0.0;
0051 
0052     // Background first, slightly smaller than the actual pie to avoid antialiasing artifacts.
0053     lowp float background_rounding = (toAngle - fromAngle) >= 2.0 * pi ? 0.001 : rounding + 0.001;
0054     lowp float background = rounded_segment(fromAngle, toAngle, innerRadius, outerRadius, background_rounding);
0055     color = sdf_render(background, color, backgroundColor);
0056 
0057     for (int i = 0; i < segmentCount && i < MAX_SEGMENTS; ++i) {
0058         lowp vec2 segment = segments[i];
0059 
0060         lowp float segment_sdf = rounded_segment(segment.x, segment.y, innerRadius, outerRadius, rounding);
0061         color = sdf_render(segment_sdf, color, colors[i]);
0062     }
0063 
0064 #ifdef LEGACY_STAGE_INOUT
0065     gl_FragColor = color * opacity;
0066 #else
0067     out_color = color * opacity;
0068 #endif
0069 }