mirror of
https://github.com/servo/servo.git
synced 2025-06-24 09:04:33 +01:00
Auto merge of #13187 - glennw:wr-update-ref, r=pcwalton
Update WR (various reftest fixes). <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13187) <!-- Reviewable:end -->
This commit is contained in:
commit
72279cc7eb
4 changed files with 54 additions and 51 deletions
4
components/servo/Cargo.lock
generated
4
components/servo/Cargo.lock
generated
|
@ -2592,7 +2592,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "webrender"
|
||||
version = "0.5.1"
|
||||
source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc"
|
||||
source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb"
|
||||
dependencies = [
|
||||
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2617,7 +2617,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "webrender_traits"
|
||||
version = "0.5.1"
|
||||
source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc"
|
||||
source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb"
|
||||
dependencies = [
|
||||
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
4
ports/cef/Cargo.lock
generated
4
ports/cef/Cargo.lock
generated
|
@ -2452,7 +2452,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "webrender"
|
||||
version = "0.5.1"
|
||||
source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc"
|
||||
source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb"
|
||||
dependencies = [
|
||||
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
@ -2477,7 +2477,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "webrender_traits"
|
||||
version = "0.5.1"
|
||||
source = "git+https://github.com/servo/webrender#b2cca277407b59c4c3b8122f36b64bd81f83a4dc"
|
||||
source = "git+https://github.com/servo/webrender#f82fad77b938e339be7ccfc9ba23d2ebd7a72fcb"
|
||||
dependencies = [
|
||||
"app_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
#define MAX_STOPS_PER_ANGLE_GRADIENT 8
|
||||
|
||||
#ifdef WR_VERTEX_SHADER
|
||||
uniform sampler2D sLayers;
|
||||
|
||||
struct Layer {
|
||||
mat4 transform;
|
||||
mat4 inv_transform;
|
||||
|
@ -45,31 +47,27 @@ layout(std140) uniform Tiles {
|
|||
vec4 tiles[WR_MAX_UBO_VECTORS];
|
||||
};
|
||||
|
||||
layout(std140) uniform Layers {
|
||||
vec4 layers[WR_MAX_UBO_VECTORS];
|
||||
};
|
||||
|
||||
Layer fetch_layer(int index) {
|
||||
Layer layer;
|
||||
|
||||
int offset = index * 13;
|
||||
ivec2 uv = ivec2(0, index);
|
||||
|
||||
layer.transform[0] = layers[offset + 0];
|
||||
layer.transform[1] = layers[offset + 1];
|
||||
layer.transform[2] = layers[offset + 2];
|
||||
layer.transform[3] = layers[offset + 3];
|
||||
layer.transform[0] = texelFetchOffset(sLayers, uv, 0, ivec2(0, 0));
|
||||
layer.transform[1] = texelFetchOffset(sLayers, uv, 0, ivec2(1, 0));
|
||||
layer.transform[2] = texelFetchOffset(sLayers, uv, 0, ivec2(2, 0));
|
||||
layer.transform[3] = texelFetchOffset(sLayers, uv, 0, ivec2(3, 0));
|
||||
|
||||
layer.inv_transform[0] = layers[offset + 4];
|
||||
layer.inv_transform[1] = layers[offset + 5];
|
||||
layer.inv_transform[2] = layers[offset + 6];
|
||||
layer.inv_transform[3] = layers[offset + 7];
|
||||
layer.inv_transform[0] = texelFetchOffset(sLayers, uv, 0, ivec2(4, 0));
|
||||
layer.inv_transform[1] = texelFetchOffset(sLayers, uv, 0, ivec2(5, 0));
|
||||
layer.inv_transform[2] = texelFetchOffset(sLayers, uv, 0, ivec2(6, 0));
|
||||
layer.inv_transform[3] = texelFetchOffset(sLayers, uv, 0, ivec2(7, 0));
|
||||
|
||||
layer.local_clip_rect = layers[offset + 8];
|
||||
layer.local_clip_rect = texelFetchOffset(sLayers, uv, 0, ivec2(8, 0));
|
||||
|
||||
layer.screen_vertices[0] = layers[offset + 9];
|
||||
layer.screen_vertices[1] = layers[offset + 10];
|
||||
layer.screen_vertices[2] = layers[offset + 11];
|
||||
layer.screen_vertices[3] = layers[offset + 12];
|
||||
layer.screen_vertices[0] = texelFetchOffset(sLayers, uv, 0, ivec2(9, 0));
|
||||
layer.screen_vertices[1] = texelFetchOffset(sLayers, uv, 0, ivec2(10, 0));
|
||||
layer.screen_vertices[2] = texelFetchOffset(sLayers, uv, 0, ivec2(11, 0));
|
||||
layer.screen_vertices[3] = texelFetchOffset(sLayers, uv, 0, ivec2(12, 0));
|
||||
|
||||
return layer;
|
||||
}
|
||||
|
|
|
@ -52,36 +52,43 @@ float alpha_for_solid_border_corner(vec2 local_pos,
|
|||
return alpha_for_solid_border(distance_from_ref, inner_radius, outer_radius, pixels_per_fragment);
|
||||
}
|
||||
|
||||
#ifdef WR_FEATURE_TRANSFORM
|
||||
|
||||
#else
|
||||
vec4 draw_dotted_edge(vec2 position, vec2 edge_size, float pixels_per_fragment) {
|
||||
float two_pixels = 2 * pixels_per_fragment;
|
||||
vec4 draw_dotted_edge(vec2 local_pos, vec4 piece_rect, float pixels_per_fragment) {
|
||||
// We don't use pixels_per_fragment here, since it can change along the edge
|
||||
// of a transformed border edge. We want this calculation to be consistent
|
||||
// across the entire edge so that the positioning of the dots stays the same.
|
||||
float two_pixels = 2 * length(fwidth(vLocalPos.xy));
|
||||
|
||||
// Circle diameter is stroke width, minus a couple pixels to account for anti-aliasing.
|
||||
float circle_diameter = max(edge_size.x - two_pixels, min(edge_size.x, two_pixels));
|
||||
float circle_diameter = max(piece_rect.z - two_pixels, min(piece_rect.z, two_pixels));
|
||||
|
||||
//// Divide the edge into segments which are the size of the circle diameter.
|
||||
float segments_in_edge = floor(edge_size.y / circle_diameter);
|
||||
// We want to spread the circles across the edge, but keep one circle diameter at the end
|
||||
// reserved for two half-circles which connect to the corners.
|
||||
float edge_available = piece_rect.w - (circle_diameter * 2);
|
||||
float number_of_circles = floor(edge_available / (circle_diameter * 2));
|
||||
|
||||
// Every other segment has a circle.
|
||||
float number_of_circles = floor(segments_in_edge / 2);
|
||||
if (number_of_circles <= 0)
|
||||
return vec4(0, 0, 0, 0);
|
||||
// Here we are initializing the distance from the y coordinate of the center of the circle to
|
||||
// the closest end half-circle.
|
||||
vec2 relative_pos = local_pos - piece_rect.xy;
|
||||
float y_distance = min(relative_pos.y, piece_rect.w - relative_pos.y);
|
||||
|
||||
if (number_of_circles > 0) {
|
||||
// Spread the circles throughout the edge, to distribute the extra space evenly. We want
|
||||
// to ensure that we have at last two pixels of space for each circle so that they aren't
|
||||
// touching.
|
||||
float space_for_each_circle = ceil(max(edge_size.y / number_of_circles, two_pixels));
|
||||
float space_for_each_circle = ceil(max(edge_available / number_of_circles, two_pixels));
|
||||
|
||||
// Find the circle index. We adjust the y position here because the first circle is a
|
||||
// half circle at the edge of this border side.
|
||||
float circle_index = floor((position.y + (space_for_each_circle / 2)) / space_for_each_circle);
|
||||
float first_half_circle_space = circle_diameter;
|
||||
|
||||
// Find the center of the circle that is closest to our position. We will then calculate
|
||||
// the distance from the edge of the circle.
|
||||
vec2 circle_center = vec2(edge_size.x / 2, circle_index * space_for_each_circle);
|
||||
float distance_from_circle_edge = length(circle_center - position) - (circle_diameter / 2);
|
||||
float circle_index = (relative_pos.y - first_half_circle_space) / space_for_each_circle;
|
||||
circle_index = floor(clamp(circle_index, 0, number_of_circles - 1));
|
||||
|
||||
float circle_y_pos =
|
||||
circle_index * space_for_each_circle + (space_for_each_circle / 2) + circle_diameter;
|
||||
y_distance = min(abs(circle_y_pos - relative_pos.y), y_distance);
|
||||
}
|
||||
|
||||
float distance_from_circle_center = length(vec2(relative_pos.x - (piece_rect.z / 2), y_distance));
|
||||
float distance_from_circle_edge = distance_from_circle_center - (circle_diameter / 2);
|
||||
|
||||
// Don't anti-alias if the circle diameter is small to avoid a blur of color.
|
||||
if (circle_diameter < two_pixels && distance_from_circle_edge > 0)
|
||||
|
@ -117,22 +124,18 @@ void draw_dotted_border(vec2 local_pos, float distance_from_mix_line) {
|
|||
}
|
||||
case PST_BOTTOM:
|
||||
case PST_TOP: {
|
||||
vec2 piece_relative_position = vLocalPos - vPieceRect.xy;
|
||||
oFragColor = draw_dotted_edge(piece_relative_position.yx, vPieceRect.wz, pixels_per_fragment);
|
||||
oFragColor = draw_dotted_edge(local_pos.yx, vPieceRect.yxwz, pixels_per_fragment);
|
||||
break;
|
||||
}
|
||||
case PST_LEFT:
|
||||
case PST_RIGHT:
|
||||
{
|
||||
vec2 piece_relative_position = vLocalPos - vPieceRect.xy;
|
||||
oFragColor = draw_dotted_edge(piece_relative_position.xy, vPieceRect.zw, pixels_per_fragment);
|
||||
oFragColor = draw_dotted_edge(local_pos.xy, vPieceRect.xyzw, pixels_per_fragment);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
vec4 draw_dashed_edge(float position, float border_width, float pixels_per_fragment) {
|
||||
// TODO: Investigate exactly what FF does.
|
||||
float size = border_width * 3;
|
||||
|
@ -334,6 +337,8 @@ void main(void) {
|
|||
draw_dashed_border(local_pos, distance_from_mix_line);
|
||||
break;
|
||||
case BORDER_STYLE_DOTTED:
|
||||
draw_dotted_border(local_pos, distance_from_mix_line);
|
||||
break;
|
||||
case BORDER_STYLE_OUTSET:
|
||||
case BORDER_STYLE_INSET:
|
||||
case BORDER_STYLE_SOLID:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue