gsk_rounded_rect_transform(outside, u_modelview);
gsk_rounded_rect_transform(inside, u_modelview);
+ gsk_rounded_rect_normalize(outside);
+ gsk_rounded_rect_normalize(inside);
+
gsk_rounded_rect_encode(outside, transformed_outside_outline);
gsk_rounded_rect_encode(inside, transformed_inside_outline);
}
void main() {
vec2 frag = gsk_get_frag_coord();
-
- float alpha = clamp(gsk_rounded_rect_coverage(gsk_decode_rect(transformed_outside_outline), frag) -
- gsk_rounded_rect_coverage(gsk_decode_rect(transformed_inside_outline), frag),
- 0.0, 1.0);
+ float outer_coverage = gsk_rounded_rect_coverage(gsk_decode_rect(transformed_outside_outline), frag);
+ float inner_coverage = gsk_rounded_rect_coverage(gsk_decode_rect(transformed_inside_outline), frag);
+ float alpha = clamp(outer_coverage - inner_coverage, 0.0, 1.0);
gskSetScaledOutputColor(final_color, alpha);
}
gsk_rounded_rect_transform(outside, u_modelview);
gsk_rounded_rect_transform(inside, u_modelview);
+ gsk_rounded_rect_normalize(outside);
+ gsk_rounded_rect_normalize(inside);
+
gsk_rounded_rect_encode(outside, transformed_outside_outline);
gsk_rounded_rect_encode(inside, transformed_inside_outline);
}
gsk_rounded_rect_transform(outside, u_modelview);
gsk_rounded_rect_transform(inside, u_modelview);
+ gsk_rounded_rect_normalize(outside);
+ gsk_rounded_rect_normalize(inside);
+
gsk_rounded_rect_encode(outside, transformed_outside_outline);
gsk_rounded_rect_encode(inside, transformed_inside_outline);
}
GskRoundedRect outline = gsk_create_rect(u_outline_rect);
gsk_rounded_rect_transform(outline, u_modelview);
+ gsk_rounded_rect_normalize(outline);
gsk_rounded_rect_encode(outline, transformed_outline);
}
GskRoundedRect gsk_decode_rect(_GSK_ROUNDED_RECT_UNIFORM_ r)
{
+ GskRoundedRect rect;
#if defined(GSK_GLES) || defined(GSK_LEGACY)
- return GskRoundedRect(r[0], r[1], r[2]);
+ rect = GskRoundedRect(r[0], r[1], r[2]);
#else
- return r;
+ rect = r;
#endif
+ gsk_rounded_rect_normalize (rect);
+
+ return rect;
}
float
vec4 corner_points2; // xy = bottom right, zw = bottom left
};
+void gsk_rounded_rect_normalize(inout GskRoundedRect r)
+{
+ if (r.bounds.x > r.bounds.z)
+ {
+ float t = r.bounds.x;
+ r.bounds.x = r.bounds.z;
+ r.bounds.z = t;
+
+ vec2 c = r.corner_points1.xy;
+ r.corner_points1.xy = r.corner_points1.zw;
+ r.corner_points1.zw = c;
+
+ c = r.corner_points2.xy;
+ r.corner_points2.xy = r.corner_points2.zw;
+ r.corner_points2.zw = c;
+ }
+
+ if (r.bounds.y > r.bounds.w)
+ {
+ float t = r.bounds.y;
+ r.bounds.y = r.bounds.w;
+ r.bounds.w = t;
+
+ vec2 c = r.corner_points1.xy;
+ r.corner_points1.xy = r.corner_points2.xy;
+ r.corner_points2.xy = c;
+
+ c = r.corner_points1.zw;
+ r.corner_points1.zw = r.corner_points2.zw;
+ r.corner_points2.zw = c;
+ }
+}
+
+void gsk_bounds_normalize (inout vec4 bounds)
+{
+ if (bounds.x > bounds.z)
+ {
+ float t = bounds.x;
+ bounds.x = bounds.z;
+ bounds.z = t;
+ }
+ if (bounds.y > bounds.w)
+ {
+ float t = bounds.y;
+ bounds.y = bounds.w;
+ bounds.w = t;
+ }
+}
+
// Transform from a C GskRoundedRect to what we need.
GskRoundedRect
gsk_create_rect(vec4[3] data)
vec4 corner_points2 = vec4(bounds.zw + (data[2].xy * vec2(-1, -1)),
bounds.xw + vec2(data[2].zw * vec2(1, -1)));
- return GskRoundedRect(bounds, corner_points1, corner_points2);
+ GskRoundedRect rect = GskRoundedRect(bounds, corner_points1, corner_points2);
+
+ gsk_rounded_rect_normalize (rect);
+
+ return rect;
}
vec4
gsk_get_bounds(vec4[3] data)
{
- return vec4(data[0].xy, data[0].xy + data[0].zw);
+ vec4 bounds = vec4(data[0].xy, data[0].xy + data[0].zw);
+
+ gsk_bounds_normalize (bounds);
+
+ return bounds;
}
vec4 gsk_premultiply(vec4 c) {