blob: a38f1d0fc20582592d7ae22335dfb38116553331 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
// -*- mode: c -*-
#ifdef GLSL330
out vec4 fragColor;
#endif
#ifdef GLSL120
attribute vec2 fragTex;
attribute float fragStrokeLength;
#else
in vec2 fragTex;
in float fragStrokeLength;
#endif
uniform int mode;
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;
}
// fill mode
if(mode == 0) {
#ifdef GLSL330
fragColor = color;
#else
gl_FragColor = color;
#endif
} else if(mode == 1) { // stroke mode
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) {
#ifdef GLSL330
fragColor = color;
#else
gl_FragColor = color;
#endif
} else {
vec4 c = vec4(color.rgb, color.a * (1.0 - ((d - hw) / feather)));
if (c.a <= 0.0) {
discard;
}
#ifdef GLSL330
fragColor = c;
#else
gl_FragColor = c;
#endif
}
}
}
|