diff options
author | David Thompson <dthompson2@worcester.edu> | 2021-08-27 16:07:38 -0400 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2021-08-27 16:09:23 -0400 |
commit | 9b5d364add330fc18100491bf3c57316a27183f5 (patch) | |
tree | 7799b4b8ae3224a4bdd6e4ec82db796a12b4d5c7 /data/shaders/path-stroke-frag.glsl | |
parent | 9b6c5e3ba42eace457ce96600fecd31109e976ab (diff) |
graphics: path: Separate fill/stroke into different shaders.
Diffstat (limited to 'data/shaders/path-stroke-frag.glsl')
-rw-r--r-- | data/shaders/path-stroke-frag.glsl | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/data/shaders/path-stroke-frag.glsl b/data/shaders/path-stroke-frag.glsl new file mode 100644 index 0000000..9682c8f --- /dev/null +++ b/data/shaders/path-stroke-frag.glsl @@ -0,0 +1,77 @@ +// -*- mode: c -*- + +#ifdef GLSL330 +out vec4 fragColor; +#else +#define fragColor gl_FragColor +#endif + +#ifdef GLSL120 +varying vec2 fragTex; +varying float fragStrokeLength; +#else +in vec2 fragTex; +in float fragStrokeLength; +#endif + +uniform vec4 color; +uniform float feather; +uniform int strokeClosed; +uniform float strokeWidth; +uniform int strokeCap; +uniform int strokeMiterStyle; +uniform float strokeMiterLimit; + +float infinity = 1.0 / 0.0; + +void main(void) { + if (color.a <= 0.0) { + discard; + } + + float hw = strokeWidth / 2.0; + float u = fragTex.x; + float v = fragTex.y; + float dx; + float dy; + float d; + + // Stroke caps. + if (u < 0 || u > fragStrokeLength) { + if (u < 0) { + dx = abs(u); + } else { + dx = u - fragStrokeLength; + } + dy = abs(v); + + if (strokeCap == 0) { // none + d = infinity; + } else if (strokeCap == 1) { // butt + d = max(dx + hw - 2 * feather, dy); + } else if (strokeCap == 2) { // square + d = max(dx, dy); + } else if (strokeCap == 3) { // round + d = sqrt(dx * dx + dy * dy); + } else if (strokeCap == 4) { // triangle out + d = dx + dy; + } else if (strokeCap == 5) { // triangle in + d = max(dy, hw - feather + dx - dy); + } + // Stroke inner/join + } else { + d = abs(v); + } + + if(d <= hw) { + fragColor = color; + } else { + vec4 c = vec4(color.rgb, color.a * (1.0 - ((d - hw) / feather))); + + if (c.a <= 0.0) { + discard; + } + + fragColor = c; + } +} |