g_assert_cmpint (self->program_name ## _program.program_name.uniform_basename ## _location, >, -1); \
}G_STMT_END
-#define INIT_PROGRAM_UNIFORM_RECT_LOCATION(program_name, uniform_basename) \
- G_STMT_START{\
- self->program_name ## _program.program_name.uniform_basename ## _bounds_location = \
- glGetUniformLocation(self->program_name ## _program.id, "u_" #uniform_basename ".bounds");\
- g_assert_cmpint (self->program_name ## _program.program_name.uniform_basename ## _bounds_location, >, -1); \
- self->program_name ## _program.program_name.uniform_basename ## _corners_location = \
- glGetUniformLocation(self->program_name ## _program.id, "u_" #uniform_basename ".corners");\
- g_assert_cmpint (self->program_name ## _program.program_name.uniform_basename ## _corners_location, >, -1); \
- }G_STMT_END
-
#define INIT_COMMON_UNIFORM_LOCATION(program_ptr, uniform_basename) \
G_STMT_START{\
program_ptr->uniform_basename ## _location = \
glGetUniformLocation(program_ptr->id, "u_" #uniform_basename);\
}G_STMT_END
-#define INIT_COMMON_UNIFORM_RECT_LOCATION(program_ptr, uniform_basename) \
- G_STMT_START{\
- program_ptr->uniform_basename ## _bounds_location = \
- glGetUniformLocation(program_ptr->id, "u_" #uniform_basename ".bounds");\
- program_ptr->uniform_basename ## _corners_location = \
- glGetUniformLocation(program_ptr->id, "u_" #uniform_basename ".corners");\
- }G_STMT_END
-
typedef enum
{
FORCE_OFFSCREEN = 1 << 0,
apply_clip_op (const Program *program,
const OpClip *op)
{
- glUniform4fv (program->clip_rect_bounds_location, 1, (float *)&op->clip.bounds);
+ int count;
if (op->send_corners)
{
OP_PRINT (" -> Clip: %s", gsk_rounded_rect_to_string (&op->clip));
- glUniform2fv (program->clip_rect_corners_location, 4, (float *)&op->clip.corner);
+ count = 3;
}
else
{
OP_PRINT (" -> clip: %f, %f, %f, %f",
op->clip.bounds.origin.x, op->clip.bounds.origin.y,
op->clip.bounds.size.width, op->clip.bounds.size.height);
+ count = 1;
}
+
+ glUniform4fv (program->clip_rect_location, count, (float *)&op->clip.bounds);
}
static inline void
glUniform4fv (program->inset_shadow.color_location, 1, (float *)op->color);
glUniform2fv (program->inset_shadow.offset_location, 1, op->offset);
glUniform1f (program->inset_shadow.spread_location, op->spread);
- glUniform4fv (program->inset_shadow.outline_rect_bounds_location, 1, (float *)&op->outline.bounds);
- glUniform2fv (program->inset_shadow.outline_rect_corners_location, 4, (float *)&op->outline.corner);
+ glUniform4fv (program->inset_shadow.outline_rect_location, 3, (float *)&op->outline.bounds);
}
static inline void
glUniform4fv (program->unblurred_outset_shadow.color_location, 1, (float *)op->color);
glUniform2fv (program->unblurred_outset_shadow.offset_location, 1, op->offset);
glUniform1f (program->unblurred_outset_shadow.spread_location, op->spread);
- glUniform4fv (program->unblurred_outset_shadow.outline_rect_bounds_location, 1, (float *)&op->outline.bounds);
- glUniform2fv (program->unblurred_outset_shadow.outline_rect_corners_location, 4, (float *)&op->outline.corner);
+ glUniform4fv (program->unblurred_outset_shadow.outline_rect_location, 3, (float *)&op->outline.bounds);
}
static inline void
const OpShadow *op)
{
OP_PRINT (" -> outset shadow");
- glUniform4fv (program->outset_shadow.outline_rect_bounds_location, 1, (float *)&op->outline.bounds);
- glUniform2fv (program->outset_shadow.outline_rect_corners_location, 4, (float *)&op->outline.corner);
+ glUniform4fv (program->outset_shadow.outline_rect_location, 3, (float *)&op->outline.bounds);
}
static inline void
{
OP_PRINT (" -> Border Outline");
- glUniform4fv (program->border.outline_rect_bounds_location, 1, (float *)&op->outline.bounds);
- glUniform2fv (program->border.outline_rect_corners_location, 4, (float *)&op->outline.corner);
+ glUniform4fv (program->border.outline_rect_location, 3, (float *)&op->outline.bounds);
}
static inline void
INIT_COMMON_UNIFORM_LOCATION (prog, alpha);
INIT_COMMON_UNIFORM_LOCATION (prog, source);
- INIT_COMMON_UNIFORM_RECT_LOCATION (prog, clip_rect);
+ INIT_COMMON_UNIFORM_LOCATION (prog, clip_rect);
INIT_COMMON_UNIFORM_LOCATION (prog, viewport);
INIT_COMMON_UNIFORM_LOCATION (prog, projection);
INIT_COMMON_UNIFORM_LOCATION (prog, modelview);
INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, color);
INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, spread);
INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, offset);
- INIT_PROGRAM_UNIFORM_RECT_LOCATION (inset_shadow, outline_rect);
+ INIT_PROGRAM_UNIFORM_LOCATION (inset_shadow, outline_rect);
/* outset shadow */
- INIT_PROGRAM_UNIFORM_RECT_LOCATION (outset_shadow, outline_rect);
+ INIT_PROGRAM_UNIFORM_LOCATION (outset_shadow, outline_rect);
/* unblurred outset shadow */
INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, color);
INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, spread);
INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, offset);
- INIT_PROGRAM_UNIFORM_RECT_LOCATION (unblurred_outset_shadow, outline_rect);
+ INIT_PROGRAM_UNIFORM_LOCATION (unblurred_outset_shadow, outline_rect);
/* border */
INIT_PROGRAM_UNIFORM_LOCATION (border, color);
INIT_PROGRAM_UNIFORM_LOCATION (border, widths);
- INIT_PROGRAM_UNIFORM_RECT_LOCATION (border, outline_rect);
+ INIT_PROGRAM_UNIFORM_LOCATION (border, outline_rect);
/* cross fade */
INIT_PROGRAM_UNIFORM_LOCATION (cross_fade, progress);
int viewport_location;
int projection_location;
int modelview_location;
- int clip_rect_bounds_location;
- int clip_rect_corners_location;
+ int clip_rect_location;
union {
struct {
int color_location;
int color_location;
int spread_location;
int offset_location;
- int outline_rect_bounds_location;
- int outline_rect_corners_location;
+ int outline_rect_location;
} inset_shadow;
struct {
- int outline_rect_bounds_location;
- int outline_rect_corners_location;
+ int outline_rect_location;
} outset_shadow;
struct {
- int outline_rect_bounds_location;
- int outline_rect_corners_location;
+ int outline_rect_location;
int color_location;
int spread_location;
int offset_location;
struct {
int color_location;
int widths_location;
- int outline_rect_bounds_location;
- int outline_rect_corners_location;
+ int outline_rect_location;
} border;
struct {
int source2_location;
vec2 pixel_step = vec2(1.0) / u_blur_size;
- float coefficientSum = 0;
+ float coefficientSum = 0.0;
vec4 sum = Texture(u_source, vUv) * incrementalGaussian.x;
coefficientSum += incrementalGaussian.x;
incrementalGaussian.xy *= incrementalGaussian.yz;
int pixels_per_side = int(floor(blur_radius / 2.0));
for (int i = 1; i <= pixels_per_side; i++) {
- vec2 p = i * pixel_step * u_blur_dir;
+ vec2 p = float(i) * pixel_step * u_blur_dir;
sum += Texture(u_source, vUv - p) * incrementalGaussian.x;
sum += Texture(u_source, vUv + p) * incrementalGaussian.x;
// FRAGMENT_SHADER:
uniform vec4 u_color;
uniform vec4 u_widths;
-uniform RoundedRect u_outline_rect;
+uniform vec4[3] u_outline_rect;
void main() {
vec4 f = gl_FragCoord;
f.x += u_viewport.x;
f.y = (u_viewport.y + u_viewport.w) - f.y;
- RoundedRect rinside = rounded_rect_shrink (u_outline_rect, u_widths);
+ RoundedRect outside = create_rect(u_outline_rect);
+ RoundedRect inside = rounded_rect_shrink (outside, u_widths);
- float alpha = clamp (rounded_rect_coverage (u_outline_rect, f.xy) -
- rounded_rect_coverage (rinside, f.xy),
+ float alpha = clamp (rounded_rect_coverage (outside, f.xy) -
+ rounded_rect_coverage (inside, f.xy),
0.0, 1.0);
/* Pre-multiply */
color.rgb /= color.a;
color = u_color_matrix * color + u_color_offset;
- color = clamp(color, 0.0f, 1.0f);
+ color = clamp(color, 0.0, 1.0);
color.rgb *= color.a;
uniform float u_spread;
uniform vec4 u_color;
uniform vec2 u_offset;
-uniform RoundedRect u_outline_rect;
+uniform vec4[3] u_outline_rect;
void main() {
vec4 f = gl_FragCoord;
f.x += u_viewport.x;
f.y = (u_viewport.y + u_viewport.w) - f.y;
- RoundedRect inside = rounded_rect_shrink(u_outline_rect, vec4(u_spread));
+ RoundedRect outside = create_rect(u_outline_rect);
+ RoundedRect inside = rounded_rect_shrink(outside, vec4(u_spread));
vec2 offset = vec2(u_offset.x, - u_offset.y);
vec4 color = vec4(u_color.rgb * u_color.a, u_color.a);
- color = color * clamp (rounded_rect_coverage (u_outline_rect, f.xy) -
+ color = color * clamp (rounded_rect_coverage (outside, f.xy) -
rounded_rect_coverage (inside, f.xy - offset),
0.0, 1.0);
setOutputColor(color * u_alpha);
}
// FRAGMENT_SHADER:
-uniform RoundedRect u_outline_rect;
+uniform vec4[3] u_outline_rect;
void main() {
vec4 f = gl_FragCoord;
f.x += u_viewport.x;
f.y = (u_viewport.y + u_viewport.w) - f.y;
+ RoundedRect outline = create_rect(u_outline_rect);
vec4 color = Texture(u_source, vUv);
- color = color * (1.0 - clamp(rounded_rect_coverage (u_outline_rect, f.xy), 0.0, 1.0));
+ color = color * (1.0 - clamp(rounded_rect_coverage(outline, f.xy), 0.0, 1.0));
setOutputColor(color * u_alpha);
}
+#ifdef GSK_GL3
+precision highp float;
+#endif
-#if GDK_GL3
+#ifdef GSK_GLES
precision highp float;
#endif
+
uniform sampler2D u_source;
uniform mat4 u_projection;
uniform mat4 u_modelview;
-uniform float u_alpha = 1.0;
+uniform float u_alpha;// = 1.0;
uniform vec4 u_viewport;
struct RoundedRect
{
vec4 bounds;
- vec2 corners[4];
+ vec4 corner_widths;
+ vec4 corner_heights;
};
-uniform RoundedRect u_clip_rect;
+uniform vec4[3] u_clip_rect;
#if GSK_GLES
varying vec2 vUv;
out vec4 outputColor;
#endif
+// Transform from a GskRoundedRect to a RoundedRect as we need it.
+RoundedRect
+create_rect(vec4 data[3])
+{
+ vec4 bounds = vec4(data[0].xy, data[0].xy + data[0].zw);
+ vec4 widths = vec4(data[1].x, data[1].z, data[2].x, data[2].z);
+ vec4 heights = vec4(data[1].y, data[1].w, data[2].y, data[2].w);
+ return RoundedRect(bounds, widths, heights);
+}
+
float
ellipsis_dist (vec2 p, vec2 radius)
{
rounded_rect_coverage (RoundedRect r, vec2 p)
{
if (p.x < r.bounds.x || p.y < r.bounds.y ||
- p.x >= (r.bounds.x + r.bounds.z) || p.y >= (r.bounds.y + r.bounds.w))
+ p.x >= r.bounds.z || p.y >= r.bounds.w)
return 0.0;
- vec2 rad_tl = r.corners[0];
- vec2 rad_tr = r.corners[1];
- vec2 rad_br = r.corners[2];
- vec2 rad_bl = r.corners[3];
+ vec2 rad_tl = vec2(r.corner_widths.x, r.corner_heights.x);
+ vec2 rad_tr = vec2(r.corner_widths.y, r.corner_heights.y);
+ vec2 rad_br = vec2(r.corner_widths.z, r.corner_heights.z);
+ vec2 rad_bl = vec2(r.corner_widths.w, r.corner_heights.w);
- vec2 ref_tl = r.bounds.xy + r.corners[0];
- vec2 ref_tr = vec2(r.bounds.x + r.bounds.z, r.bounds.y) + (r.corners[1] * vec2(-1, 1));
- vec2 ref_br = vec2(r.bounds.x + r.bounds.z, r.bounds.y + r.bounds.w) - r.corners[2];
- vec2 ref_bl = vec2(r.bounds.x, r.bounds.y + r.bounds.w) + (r.corners[3] * vec2(1, -1));
+ vec2 ref_tl = r.bounds.xy + vec2( r.corner_widths.x, r.corner_heights.x);
+ vec2 ref_tr = r.bounds.zy + vec2(-r.corner_widths.y, r.corner_heights.y);
+ vec2 ref_br = r.bounds.zw + vec2(-r.corner_widths.z, -r.corner_heights.z);
+ vec2 ref_bl = r.bounds.xw + vec2( r.corner_widths.w, -r.corner_heights.w);
float d_tl = ellipsis_coverage(p, ref_tl, rad_tl);
float d_tr = ellipsis_coverage(p, ref_tr, rad_tr);
RoundedRect
rounded_rect_shrink (RoundedRect r, vec4 amount)
{
- vec4 new_bounds = r.bounds;
- vec2 new_corners[4];
-
- new_bounds.xy += amount.wx;
- new_bounds.zw -= amount.wx + amount.yz;
-
- new_corners[0] = vec2(0);
- new_corners[1] = vec2(0);
- new_corners[2] = vec2(0);
- new_corners[3] = vec2(0);
+ vec4 new_bounds = r.bounds + vec4(1.0,1.0,-1.0,-1.0) * amount.wxyz;
+ vec4 new_widths = vec4(0);
+ vec4 new_heights = vec4(0);
// Left top
- if (r.corners[0].x > 0 || r.corners[0].y > 0)
- new_corners[0] = r.corners[0] - amount.wx;
+ if (r.corner_widths.x > 0.0) new_widths.x = r.corner_widths.x - amount.w;
+ if (r.corner_heights.x > 0.0) new_heights.x = r.corner_heights.x - amount.x;
- // top right
- if (r.corners[1].x > 0 || r.corners[1].y > 0)
- new_corners[1] = r.corners[1] - amount.yx;
+ // Top right
+ if (r.corner_widths.y > 0.0) new_widths.y = r.corner_widths.y - amount.y;
+ if (r.corner_heights.y > 0.0) new_heights.y = r.corner_heights.y - amount.x;
// Bottom right
- if (r.corners[2].x > 0 || r.corners[2].y > 0)
- new_corners[2] = r.corners[2] - amount.yz;
+ if (r.corner_widths.z > 0.0) new_widths.z = r.corner_widths.z - amount.y;
+ if (r.corner_heights.z > 0.0) new_heights.z = r.corner_heights.z - amount.z;
// Bottom left
- if (r.corners[3].x > 0 || r.corners[3].y > 0)
- new_corners[3] = r.corners[3] - amount.wz;
+ if (r.corner_widths.w > 0.0) new_widths.w = r.corner_widths.w - amount.w;
+ if (r.corner_heights.w > 0.0) new_heights.w = r.corner_heights.w - amount.z;
- return RoundedRect (new_bounds, new_corners);
+ return RoundedRect (new_bounds, new_widths, new_heights);
}
vec4 Texture(sampler2D sampler, vec2 texCoords) {
#if GSK_GLES
return texture2D(sampler, texCoords);
+#elif GSK_LEGACY
+ return texture2D(sampler, texCoords);
#else
return texture(sampler, texCoords);
#endif
f.y = (u_viewport.y + u_viewport.w) - f.y;
#if GSK_GLES
- gl_FragColor = color * rounded_rect_coverage(u_clip_rect, f.xy);
+ gl_FragColor = color * rounded_rect_coverage(create_rect(u_clip_rect), f.xy);
+#elif GSK_LEGACY
+ gl_FragColor = color * rounded_rect_coverage(create_rect(u_clip_rect), f.xy);
#else
- outputColor = color * rounded_rect_coverage(u_clip_rect, f.xy);
+ outputColor = color * rounded_rect_coverage(create_rect(u_clip_rect), f.xy);
#endif
/*outputColor = color;*/
}
uniform float u_spread;
uniform vec4 u_color;
uniform vec2 u_offset;
-uniform RoundedRect u_outline_rect;
+uniform vec4[3] u_outline_rect;
void main() {
vec4 f = gl_FragCoord;
f.x += u_viewport.x;
f.y = (u_viewport.y + u_viewport.w) - f.y;
- RoundedRect outline = rounded_rect_shrink(u_outline_rect, vec4(- u_spread));
+
+ RoundedRect inside = create_rect(u_outline_rect);
+ RoundedRect outside = rounded_rect_shrink(inside, vec4(- u_spread));
vec2 offset = vec2(u_offset.x, - u_offset.y);
vec4 color = vec4(u_color.rgb * u_color.a, u_color.a);
- color = color * clamp (rounded_rect_coverage (outline, f.xy - offset) -
- rounded_rect_coverage (u_outline_rect, f.xy),
+ color = color * clamp (rounded_rect_coverage (outside, f.xy - offset) -
+ rounded_rect_coverage (inside, f.xy),
0.0, 1.0);
setOutputColor(color * u_alpha);
}