mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 18:55:30 +00:00
Bug 1510074 - Update webrender to commit 604c69a40920e34bb1b8fa3f02bca6e5edfe73f4 (WR PR #3352). r=kats
https://github.com/servo/webrender/pull/3352 Differential Revision: https://phabricator.services.mozilla.com/D13056 --HG-- extra : moz-landing-system : lando
This commit is contained in:
parent
e6a8a6668e
commit
347e5a041c
@ -1 +1 @@
|
||||
235273012e08230c07a214e907175c535206098d
|
||||
604c69a40920e34bb1b8fa3f02bca6e5edfe73f4
|
||||
|
@ -908,6 +908,7 @@ impl AlphaBatchBuilder {
|
||||
PrimitiveInstanceKind::Rectangle { .. } |
|
||||
PrimitiveInstanceKind::YuvImage { .. } |
|
||||
PrimitiveInstanceKind::Image { .. } |
|
||||
PrimitiveInstanceKind::LinearGradient { .. } |
|
||||
PrimitiveInstanceKind::Clear => {
|
||||
unreachable!();
|
||||
}
|
||||
@ -1410,8 +1411,7 @@ impl AlphaBatchBuilder {
|
||||
let is_multiple_primitives = match prim.details {
|
||||
PrimitiveDetails::Brush(ref brush) => {
|
||||
match brush.kind {
|
||||
BrushKind::LinearGradient { ref visible_tiles, .. } => !visible_tiles.is_empty(),
|
||||
BrushKind::RadialGradient { ref visible_tiles, .. } => !visible_tiles.is_empty(),
|
||||
BrushKind::RadialGradient { visible_tiles_range, .. } => !visible_tiles_range.is_empty(),
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -1450,22 +1450,9 @@ impl AlphaBatchBuilder {
|
||||
}
|
||||
|
||||
match brush.kind {
|
||||
BrushKind::LinearGradient { ref stops_handle, ref visible_tiles, .. } if !visible_tiles.is_empty() => {
|
||||
add_gradient_tiles(
|
||||
visible_tiles,
|
||||
stops_handle,
|
||||
BrushBatchKind::LinearGradient,
|
||||
specified_blend_mode,
|
||||
bounding_rect,
|
||||
clip_task_address,
|
||||
gpu_cache,
|
||||
&mut self.batch_list,
|
||||
&prim_header,
|
||||
prim_headers,
|
||||
z_id,
|
||||
);
|
||||
}
|
||||
BrushKind::RadialGradient { ref stops_handle, ref visible_tiles, .. } if !visible_tiles.is_empty() => {
|
||||
BrushKind::RadialGradient { ref stops_handle, visible_tiles_range, .. } if !visible_tiles_range.is_empty() => {
|
||||
let visible_tiles = &ctx.scratch.gradient_tiles[visible_tiles_range];
|
||||
|
||||
add_gradient_tiles(
|
||||
visible_tiles,
|
||||
stops_handle,
|
||||
@ -1894,6 +1881,89 @@ impl AlphaBatchBuilder {
|
||||
}
|
||||
}
|
||||
}
|
||||
(
|
||||
PrimitiveInstanceKind::LinearGradient { visible_tiles_range, .. },
|
||||
PrimitiveTemplateKind::LinearGradient { stops_handle, ref brush_segments, .. }
|
||||
) => {
|
||||
let specified_blend_mode = BlendMode::PremultipliedAlpha;
|
||||
|
||||
let mut prim_header = PrimitiveHeader {
|
||||
local_rect: prim_data.prim_rect,
|
||||
local_clip_rect: prim_instance.combined_local_clip_rect,
|
||||
task_address,
|
||||
specific_prim_address: GpuCacheAddress::invalid(),
|
||||
clip_task_address,
|
||||
transform_id,
|
||||
};
|
||||
|
||||
if visible_tiles_range.is_empty() {
|
||||
let non_segmented_blend_mode = if !prim_data.opacity.is_opaque ||
|
||||
prim_instance.clip_task_index != ClipTaskIndex::INVALID ||
|
||||
transform_kind == TransformedRectKind::Complex
|
||||
{
|
||||
specified_blend_mode
|
||||
} else {
|
||||
BlendMode::None
|
||||
};
|
||||
|
||||
let batch_params = BrushBatchParameters::shared(
|
||||
BrushBatchKind::LinearGradient,
|
||||
BatchTextures::no_texture(),
|
||||
[
|
||||
stops_handle.as_int(gpu_cache),
|
||||
0,
|
||||
0,
|
||||
],
|
||||
0,
|
||||
);
|
||||
|
||||
prim_header.specific_prim_address = gpu_cache.get_address(&prim_data.gpu_cache_handle);
|
||||
|
||||
let prim_header_index = prim_headers.push(
|
||||
&prim_header,
|
||||
z_id,
|
||||
batch_params.prim_user_data,
|
||||
);
|
||||
|
||||
let segments = if brush_segments.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(brush_segments.as_slice())
|
||||
};
|
||||
|
||||
self.add_segmented_prim_to_batch(
|
||||
segments,
|
||||
prim_data.opacity,
|
||||
&batch_params,
|
||||
specified_blend_mode,
|
||||
non_segmented_blend_mode,
|
||||
prim_header_index,
|
||||
clip_task_address,
|
||||
bounding_rect,
|
||||
transform_kind,
|
||||
render_tasks,
|
||||
z_id,
|
||||
prim_instance.clip_task_index,
|
||||
ctx,
|
||||
);
|
||||
} else {
|
||||
let visible_tiles = &ctx.scratch.gradient_tiles[*visible_tiles_range];
|
||||
|
||||
add_gradient_tiles(
|
||||
visible_tiles,
|
||||
stops_handle,
|
||||
BrushBatchKind::LinearGradient,
|
||||
specified_blend_mode,
|
||||
bounding_rect,
|
||||
clip_task_address,
|
||||
gpu_cache,
|
||||
&mut self.batch_list,
|
||||
&prim_header,
|
||||
prim_headers,
|
||||
z_id,
|
||||
);
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
unreachable!();
|
||||
}
|
||||
@ -2243,18 +2313,6 @@ impl BrushPrimitive {
|
||||
0,
|
||||
))
|
||||
}
|
||||
BrushKind::LinearGradient { ref stops_handle, .. } => {
|
||||
Some(BrushBatchParameters::shared(
|
||||
BrushBatchKind::LinearGradient,
|
||||
BatchTextures::no_texture(),
|
||||
[
|
||||
stops_handle.as_int(gpu_cache),
|
||||
0,
|
||||
0,
|
||||
],
|
||||
0,
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2286,6 +2344,7 @@ impl PrimitiveInstance {
|
||||
PrimitiveInstanceKind::NormalBorder { .. } |
|
||||
PrimitiveInstanceKind::ImageBorder { .. } |
|
||||
PrimitiveInstanceKind::Rectangle { .. } |
|
||||
PrimitiveInstanceKind::LinearGradient { .. } |
|
||||
PrimitiveInstanceKind::Clear => {
|
||||
return true;
|
||||
}
|
||||
|
@ -7,10 +7,10 @@ use api::{LayoutSideOffsets, LayoutSizeAu, LayoutPrimitiveInfo, LayoutToDeviceSc
|
||||
use api::{DeviceVector2D, DevicePoint, LayoutRect, LayoutSize, NormalBorder, DeviceIntSize};
|
||||
use api::{AuHelpers, LayoutPoint, RepeatMode, TexelRect};
|
||||
use ellipse::Ellipse;
|
||||
use euclid::{SideOffsets2D, vec2};
|
||||
use euclid::vec2;
|
||||
use display_list_flattener::DisplayListFlattener;
|
||||
use gpu_types::{BorderInstance, BorderSegment, BrushFlags};
|
||||
use prim_store::{BorderSegmentInfo, BrushSegment};
|
||||
use prim_store::{BorderSegmentInfo, BrushSegment, NinePatchDescriptor};
|
||||
use prim_store::{EdgeAaSegmentMask, PrimitiveContainer, ScrollNodeAndClipChain};
|
||||
use util::{lerp, RectHelpers};
|
||||
|
||||
@ -1128,176 +1128,171 @@ pub fn build_border_instances(
|
||||
instances
|
||||
}
|
||||
|
||||
pub fn create_nine_patch_segments(
|
||||
rect: &LayoutRect,
|
||||
widths: &LayoutSideOffsets,
|
||||
width: i32,
|
||||
height: i32,
|
||||
slice: SideOffsets2D<i32>,
|
||||
fill: bool,
|
||||
repeat_horizontal: RepeatMode,
|
||||
repeat_vertical: RepeatMode,
|
||||
outset: SideOffsets2D<f32>,
|
||||
) -> Vec<BrushSegment> {
|
||||
// Calculate the modified rect as specific by border-image-outset
|
||||
let origin = LayoutPoint::new(
|
||||
rect.origin.x - outset.left,
|
||||
rect.origin.y - outset.top,
|
||||
);
|
||||
let size = LayoutSize::new(
|
||||
rect.size.width + outset.left + outset.right,
|
||||
rect.size.height + outset.top + outset.bottom,
|
||||
);
|
||||
let rect = LayoutRect::new(origin, size);
|
||||
impl NinePatchDescriptor {
|
||||
pub fn create_segments(
|
||||
&self,
|
||||
rect: &LayoutRect,
|
||||
) -> Vec<BrushSegment> {
|
||||
// Calculate the modified rect as specific by border-image-outset
|
||||
let origin = LayoutPoint::new(
|
||||
rect.origin.x - self.outset.left,
|
||||
rect.origin.y - self.outset.top,
|
||||
);
|
||||
let size = LayoutSize::new(
|
||||
rect.size.width + self.outset.left + self.outset.right,
|
||||
rect.size.height + self.outset.top + self.outset.bottom,
|
||||
);
|
||||
let rect = LayoutRect::new(origin, size);
|
||||
|
||||
// Calculate the local texel coords of the slices.
|
||||
let px0 = 0.0;
|
||||
let px1 = slice.left as f32;
|
||||
let px2 = width as f32 - slice.right as f32;
|
||||
let px3 = width as f32;
|
||||
// Calculate the local texel coords of the slices.
|
||||
let px0 = 0.0;
|
||||
let px1 = self.slice.left as f32;
|
||||
let px2 = self.width as f32 - self.slice.right as f32;
|
||||
let px3 = self.width as f32;
|
||||
|
||||
let py0 = 0.0;
|
||||
let py1 = slice.top as f32;
|
||||
let py2 = height as f32 - slice.bottom as f32;
|
||||
let py3 = height as f32;
|
||||
let py0 = 0.0;
|
||||
let py1 = self.slice.top as f32;
|
||||
let py2 = self.height as f32 - self.slice.bottom as f32;
|
||||
let py3 = self.height as f32;
|
||||
|
||||
let tl_outer = LayoutPoint::new(rect.origin.x, rect.origin.y);
|
||||
let tl_inner = tl_outer + vec2(widths.left, widths.top);
|
||||
let tl_outer = LayoutPoint::new(rect.origin.x, rect.origin.y);
|
||||
let tl_inner = tl_outer + vec2(self.widths.left, self.widths.top);
|
||||
|
||||
let tr_outer = LayoutPoint::new(rect.origin.x + rect.size.width, rect.origin.y);
|
||||
let tr_inner = tr_outer + vec2(-widths.right, widths.top);
|
||||
let tr_outer = LayoutPoint::new(rect.origin.x + rect.size.width, rect.origin.y);
|
||||
let tr_inner = tr_outer + vec2(-self.widths.right, self.widths.top);
|
||||
|
||||
let bl_outer = LayoutPoint::new(rect.origin.x, rect.origin.y + rect.size.height);
|
||||
let bl_inner = bl_outer + vec2(widths.left, -widths.bottom);
|
||||
let bl_outer = LayoutPoint::new(rect.origin.x, rect.origin.y + rect.size.height);
|
||||
let bl_inner = bl_outer + vec2(self.widths.left, -self.widths.bottom);
|
||||
|
||||
let br_outer = LayoutPoint::new(
|
||||
rect.origin.x + rect.size.width,
|
||||
rect.origin.y + rect.size.height,
|
||||
);
|
||||
let br_inner = br_outer - vec2(widths.right, widths.bottom);
|
||||
let br_outer = LayoutPoint::new(
|
||||
rect.origin.x + rect.size.width,
|
||||
rect.origin.y + rect.size.height,
|
||||
);
|
||||
let br_inner = br_outer - vec2(self.widths.right, self.widths.bottom);
|
||||
|
||||
fn add_segment(
|
||||
segments: &mut Vec<BrushSegment>,
|
||||
rect: LayoutRect,
|
||||
uv_rect: TexelRect,
|
||||
repeat_horizontal: RepeatMode,
|
||||
repeat_vertical: RepeatMode
|
||||
) {
|
||||
if uv_rect.uv1.x > uv_rect.uv0.x &&
|
||||
uv_rect.uv1.y > uv_rect.uv0.y {
|
||||
fn add_segment(
|
||||
segments: &mut Vec<BrushSegment>,
|
||||
rect: LayoutRect,
|
||||
uv_rect: TexelRect,
|
||||
repeat_horizontal: RepeatMode,
|
||||
repeat_vertical: RepeatMode
|
||||
) {
|
||||
if uv_rect.uv1.x > uv_rect.uv0.x &&
|
||||
uv_rect.uv1.y > uv_rect.uv0.y {
|
||||
|
||||
// Use segment relative interpolation for all
|
||||
// instances in this primitive.
|
||||
let mut brush_flags =
|
||||
BrushFlags::SEGMENT_RELATIVE |
|
||||
BrushFlags::SEGMENT_TEXEL_RECT;
|
||||
// Use segment relative interpolation for all
|
||||
// instances in this primitive.
|
||||
let mut brush_flags =
|
||||
BrushFlags::SEGMENT_RELATIVE |
|
||||
BrushFlags::SEGMENT_TEXEL_RECT;
|
||||
|
||||
// Enable repeat modes on the segment.
|
||||
if repeat_horizontal == RepeatMode::Repeat {
|
||||
brush_flags |= BrushFlags::SEGMENT_REPEAT_X;
|
||||
// Enable repeat modes on the segment.
|
||||
if repeat_horizontal == RepeatMode::Repeat {
|
||||
brush_flags |= BrushFlags::SEGMENT_REPEAT_X;
|
||||
}
|
||||
if repeat_vertical == RepeatMode::Repeat {
|
||||
brush_flags |= BrushFlags::SEGMENT_REPEAT_Y;
|
||||
}
|
||||
|
||||
let segment = BrushSegment::new(
|
||||
rect,
|
||||
true,
|
||||
EdgeAaSegmentMask::empty(),
|
||||
[
|
||||
uv_rect.uv0.x,
|
||||
uv_rect.uv0.y,
|
||||
uv_rect.uv1.x,
|
||||
uv_rect.uv1.y,
|
||||
],
|
||||
brush_flags,
|
||||
);
|
||||
|
||||
segments.push(segment);
|
||||
}
|
||||
if repeat_vertical == RepeatMode::Repeat {
|
||||
brush_flags |= BrushFlags::SEGMENT_REPEAT_Y;
|
||||
}
|
||||
|
||||
let segment = BrushSegment::new(
|
||||
rect,
|
||||
true,
|
||||
EdgeAaSegmentMask::empty(),
|
||||
[
|
||||
uv_rect.uv0.x,
|
||||
uv_rect.uv0.y,
|
||||
uv_rect.uv1.x,
|
||||
uv_rect.uv1.y,
|
||||
],
|
||||
brush_flags,
|
||||
);
|
||||
|
||||
segments.push(segment);
|
||||
}
|
||||
}
|
||||
|
||||
// Build the list of image segments
|
||||
let mut segments = Vec::new();
|
||||
// Build the list of image segments
|
||||
let mut segments = Vec::new();
|
||||
|
||||
// Top left
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tl_outer.x, tl_outer.y, tl_inner.x, tl_inner.y),
|
||||
TexelRect::new(px0, py0, px1, py1),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
// Top right
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tr_inner.x, tr_outer.y, tr_outer.x, tr_inner.y),
|
||||
TexelRect::new(px2, py0, px3, py1),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
// Bottom right
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(br_inner.x, br_inner.y, br_outer.x, br_outer.y),
|
||||
TexelRect::new(px2, py2, px3, py3),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
// Bottom left
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(bl_outer.x, bl_inner.y, bl_inner.x, bl_outer.y),
|
||||
TexelRect::new(px0, py2, px1, py3),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
|
||||
// Center
|
||||
if fill {
|
||||
// Top left
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tl_inner.x, tl_inner.y, tr_inner.x, bl_inner.y),
|
||||
TexelRect::new(px1, py1, px2, py2),
|
||||
repeat_horizontal,
|
||||
repeat_vertical
|
||||
LayoutRect::from_floats(tl_outer.x, tl_outer.y, tl_inner.x, tl_inner.y),
|
||||
TexelRect::new(px0, py0, px1, py1),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
// Top right
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tr_inner.x, tr_outer.y, tr_outer.x, tr_inner.y),
|
||||
TexelRect::new(px2, py0, px3, py1),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
// Bottom right
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(br_inner.x, br_inner.y, br_outer.x, br_outer.y),
|
||||
TexelRect::new(px2, py2, px3, py3),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
// Bottom left
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(bl_outer.x, bl_inner.y, bl_inner.x, bl_outer.y),
|
||||
TexelRect::new(px0, py2, px1, py3),
|
||||
RepeatMode::Stretch,
|
||||
RepeatMode::Stretch
|
||||
);
|
||||
|
||||
// Center
|
||||
if self.fill {
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tl_inner.x, tl_inner.y, tr_inner.x, bl_inner.y),
|
||||
TexelRect::new(px1, py1, px2, py2),
|
||||
self.repeat_horizontal,
|
||||
self.repeat_vertical
|
||||
);
|
||||
}
|
||||
|
||||
// Add edge segments.
|
||||
|
||||
// Top
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tl_inner.x, tl_outer.y, tr_inner.x, tl_inner.y),
|
||||
TexelRect::new(px1, py0, px2, py1),
|
||||
self.repeat_horizontal,
|
||||
RepeatMode::Stretch,
|
||||
);
|
||||
// Bottom
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(bl_inner.x, bl_inner.y, br_inner.x, bl_outer.y),
|
||||
TexelRect::new(px1, py2, px2, py3),
|
||||
self.repeat_horizontal,
|
||||
RepeatMode::Stretch,
|
||||
);
|
||||
// Left
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tl_outer.x, tl_inner.y, tl_inner.x, bl_inner.y),
|
||||
TexelRect::new(px0, py1, px1, py2),
|
||||
RepeatMode::Stretch,
|
||||
self.repeat_vertical,
|
||||
);
|
||||
// Right
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tr_inner.x, tr_inner.y, br_outer.x, br_inner.y),
|
||||
TexelRect::new(px2, py1, px3, py2),
|
||||
RepeatMode::Stretch,
|
||||
self.repeat_vertical,
|
||||
);
|
||||
|
||||
segments
|
||||
}
|
||||
|
||||
// Add edge segments.
|
||||
|
||||
// Top
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tl_inner.x, tl_outer.y, tr_inner.x, tl_inner.y),
|
||||
TexelRect::new(px1, py0, px2, py1),
|
||||
repeat_horizontal,
|
||||
RepeatMode::Stretch,
|
||||
);
|
||||
// Bottom
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(bl_inner.x, bl_inner.y, br_inner.x, bl_outer.y),
|
||||
TexelRect::new(px1, py2, px2, py3),
|
||||
repeat_horizontal,
|
||||
RepeatMode::Stretch,
|
||||
);
|
||||
// Left
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tl_outer.x, tl_inner.y, tl_inner.x, bl_inner.y),
|
||||
TexelRect::new(px0, py1, px1, py2),
|
||||
RepeatMode::Stretch,
|
||||
repeat_vertical,
|
||||
);
|
||||
// Right
|
||||
add_segment(
|
||||
&mut segments,
|
||||
LayoutRect::from_floats(tr_inner.x, tr_inner.y, br_outer.x, br_inner.y),
|
||||
TexelRect::new(px2, py1, px3, py2),
|
||||
RepeatMode::Stretch,
|
||||
repeat_vertical,
|
||||
);
|
||||
|
||||
segments
|
||||
}
|
||||
|
@ -13,7 +13,6 @@ use api::{LineOrientation, LineStyle, NinePatchBorderSource, PipelineId};
|
||||
use api::{PropertyBinding, ReferenceFrame, ScrollFrameDisplayItem, ScrollSensitivity};
|
||||
use api::{Shadow, SpecificDisplayItem, StackingContext, StickyFrameDisplayItem, TexelRect};
|
||||
use api::{ClipMode, TransformStyle, YuvColorSpace, YuvData};
|
||||
use border::create_nine_patch_segments;
|
||||
use clip::{ClipChainId, ClipRegion, ClipItemKey, ClipStore, ClipItemSceneData};
|
||||
use clip_scroll_tree::{ROOT_SPATIAL_NODE_INDEX, ClipScrollTree, SpatialNodeIndex};
|
||||
use frame_builder::{ChasePrimitive, FrameBuilder, FrameBuilderConfig};
|
||||
@ -24,9 +23,9 @@ use image::simplify_repeated_primitive;
|
||||
use internal_types::{FastHashMap, FastHashSet};
|
||||
use picture::{Picture3DContext, PictureCompositeMode, PicturePrimitive, PrimitiveList};
|
||||
use prim_store::{BrushKind, BrushPrimitive, PrimitiveInstance, PrimitiveDataInterner, PrimitiveKeyKind};
|
||||
use prim_store::{PrimitiveOpacity, PrimitiveKey, PrimitiveSceneData, PrimitiveInstanceKind};
|
||||
use prim_store::{PrimitiveKey, PrimitiveSceneData, PrimitiveInstanceKind, GradientStopKey, NinePatchDescriptor};
|
||||
use prim_store::{PrimitiveContainer, PrimitiveDataHandle, PrimitiveStore, PrimitiveStoreStats, BrushSegmentDescriptor};
|
||||
use prim_store::{ScrollNodeAndClipChain, PictureIndex, register_prim_chase_id};
|
||||
use prim_store::{ScrollNodeAndClipChain, PictureIndex, register_prim_chase_id, GradientTileRange};
|
||||
use render_backend::{DocumentView};
|
||||
use resource_cache::{FontInstanceMap, ImageRequest};
|
||||
use scene::{Scene, ScenePipeline, StackingContextHelpers};
|
||||
@ -581,7 +580,7 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
);
|
||||
}
|
||||
SpecificDisplayItem::Gradient(ref info) => {
|
||||
if let Some(brush_kind) = self.create_brush_kind_for_gradient(
|
||||
if let Some(prim) = self.create_linear_gradient_prim(
|
||||
&prim_info,
|
||||
info.gradient.start_point,
|
||||
info.gradient.end_point,
|
||||
@ -590,9 +589,14 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
info.tile_size,
|
||||
info.tile_spacing,
|
||||
pipeline_id,
|
||||
None,
|
||||
) {
|
||||
let prim = PrimitiveContainer::Brush(BrushPrimitive::new(brush_kind, None));
|
||||
self.add_primitive(clip_and_scroll, &prim_info, Vec::new(), prim);
|
||||
self.add_primitive(
|
||||
clip_and_scroll,
|
||||
&prim_info,
|
||||
Vec::new(),
|
||||
prim,
|
||||
);
|
||||
}
|
||||
}
|
||||
SpecificDisplayItem::RadialGradient(ref info) => {
|
||||
@ -1738,6 +1742,17 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
) {
|
||||
match border_item.details {
|
||||
BorderDetails::NinePatch(ref border) => {
|
||||
let nine_patch = NinePatchDescriptor {
|
||||
width: border.width,
|
||||
height: border.height,
|
||||
slice: border.slice,
|
||||
fill: border.fill,
|
||||
repeat_horizontal: border.repeat_horizontal,
|
||||
repeat_vertical: border.repeat_vertical,
|
||||
outset: border.outset.into(),
|
||||
widths: border_item.widths.into(),
|
||||
};
|
||||
|
||||
let prim = match border.source {
|
||||
NinePatchBorderSource::Image(image_key) => {
|
||||
PrimitiveContainer::ImageBorder {
|
||||
@ -1746,18 +1761,11 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
rendering: ImageRendering::Auto,
|
||||
tile: None,
|
||||
},
|
||||
widths: border_item.widths,
|
||||
width: border.width,
|
||||
height: border.height,
|
||||
slice: border.slice,
|
||||
fill: border.fill,
|
||||
repeat_horizontal: border.repeat_horizontal,
|
||||
repeat_vertical: border.repeat_vertical,
|
||||
outset: border.outset,
|
||||
nine_patch,
|
||||
}
|
||||
}
|
||||
NinePatchBorderSource::Gradient(gradient) => {
|
||||
match self.create_brush_kind_for_gradient(
|
||||
match self.create_linear_gradient_prim(
|
||||
&info,
|
||||
gradient.start_point,
|
||||
gradient.end_point,
|
||||
@ -1766,28 +1774,9 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
LayoutSize::new(border.height as f32, border.width as f32),
|
||||
LayoutSize::zero(),
|
||||
pipeline_id,
|
||||
Some(Box::new(nine_patch)),
|
||||
) {
|
||||
Some(brush_kind) => {
|
||||
let segments = create_nine_patch_segments(
|
||||
&info.rect,
|
||||
&border_item.widths,
|
||||
border.width,
|
||||
border.height,
|
||||
border.slice,
|
||||
border.fill,
|
||||
border.repeat_horizontal,
|
||||
border.repeat_vertical,
|
||||
border.outset,
|
||||
);
|
||||
|
||||
let descriptor = BrushSegmentDescriptor {
|
||||
segments: SmallVec::from_vec(segments),
|
||||
};
|
||||
|
||||
PrimitiveContainer::Brush(
|
||||
BrushPrimitive::new(brush_kind, Some(descriptor))
|
||||
)
|
||||
}
|
||||
Some(prim) => prim,
|
||||
None => return,
|
||||
}
|
||||
}
|
||||
@ -1804,17 +1793,7 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
LayoutSize::zero(),
|
||||
);
|
||||
|
||||
let segments = create_nine_patch_segments(
|
||||
&info.rect,
|
||||
&border_item.widths,
|
||||
border.width,
|
||||
border.height,
|
||||
border.slice,
|
||||
border.fill,
|
||||
border.repeat_horizontal,
|
||||
border.repeat_vertical,
|
||||
border.outset,
|
||||
);
|
||||
let segments = nine_patch.create_segments(&info.rect);
|
||||
|
||||
let descriptor = BrushSegmentDescriptor {
|
||||
segments: SmallVec::from_vec(segments),
|
||||
@ -1844,7 +1823,7 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn create_brush_kind_for_gradient(
|
||||
pub fn create_linear_gradient_prim(
|
||||
&mut self,
|
||||
info: &LayoutPrimitiveInfo,
|
||||
start_point: LayoutPoint,
|
||||
@ -1854,7 +1833,8 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
stretch_size: LayoutSize,
|
||||
mut tile_spacing: LayoutSize,
|
||||
pipeline_id: PipelineId,
|
||||
) -> Option<BrushKind> {
|
||||
nine_patch: Option<Box<NinePatchDescriptor>>,
|
||||
) -> Option<PrimitiveContainer> {
|
||||
let mut prim_rect = info.rect;
|
||||
simplify_repeated_primitive(&stretch_size, &mut tile_spacing, &mut prim_rect);
|
||||
|
||||
@ -1862,13 +1842,15 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
// flatten_root() and pass to all children here to avoid
|
||||
// some hash lookups?
|
||||
let display_list = self.scene.get_display_list_for_pipeline(pipeline_id);
|
||||
|
||||
let mut max_alpha: f32 = 0.0;
|
||||
let mut min_alpha: f32 = 1.0;
|
||||
for stop in display_list.get(stops) {
|
||||
|
||||
let stops = display_list.get(stops).map(|stop| {
|
||||
max_alpha = max_alpha.max(stop.color.a);
|
||||
min_alpha = min_alpha.min(stop.color.a);
|
||||
}
|
||||
GradientStopKey {
|
||||
offset: stop.offset,
|
||||
color: stop.color.into(),
|
||||
}
|
||||
}).collect();
|
||||
|
||||
// If all the stops have no alpha, then this
|
||||
// gradient can't contribute to the scene.
|
||||
@ -1876,11 +1858,6 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
return None;
|
||||
}
|
||||
|
||||
// Save opacity of the stops for use in
|
||||
// selecting which pass this gradient
|
||||
// should be drawn in.
|
||||
let stops_opacity = PrimitiveOpacity::from_alpha(min_alpha);
|
||||
|
||||
// Try to ensure that if the gradient is specified in reverse, then so long as the stops
|
||||
// are also supplied in reverse that the rendered result will be equivalent. To do this,
|
||||
// a reference orientation for the gradient line must be chosen, somewhat arbitrarily, so
|
||||
@ -1899,17 +1876,15 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
(start_point, end_point)
|
||||
};
|
||||
|
||||
Some(BrushKind::LinearGradient {
|
||||
stops_range: stops,
|
||||
Some(PrimitiveContainer::LinearGradient {
|
||||
extend_mode,
|
||||
reverse_stops,
|
||||
start_point: sp,
|
||||
end_point: ep,
|
||||
stops_handle: GpuCacheHandle::new(),
|
||||
stretch_size,
|
||||
tile_spacing,
|
||||
visible_tiles: Vec::new(),
|
||||
stops_opacity,
|
||||
stops,
|
||||
reverse_stops,
|
||||
nine_patch,
|
||||
})
|
||||
}
|
||||
|
||||
@ -1938,7 +1913,7 @@ impl<'a> DisplayListFlattener<'a> {
|
||||
stops_handle: GpuCacheHandle::new(),
|
||||
stretch_size,
|
||||
tile_spacing,
|
||||
visible_tiles: Vec::new(),
|
||||
visible_tiles_range: GradientTileRange::empty(),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -446,6 +446,7 @@ impl TileCache {
|
||||
PrimitiveInstanceKind::LineDecoration { .. } |
|
||||
PrimitiveInstanceKind::Clear |
|
||||
PrimitiveInstanceKind::NormalBorder { .. } |
|
||||
PrimitiveInstanceKind::LinearGradient { .. } |
|
||||
PrimitiveInstanceKind::ImageBorder { .. } => {
|
||||
// These don't contribute dependencies
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -243,6 +243,7 @@ impl SurfaceDescriptor {
|
||||
PrimitiveInstanceKind::Image { .. } |
|
||||
PrimitiveInstanceKind::YuvImage { .. } |
|
||||
PrimitiveInstanceKind::LineDecoration { .. } |
|
||||
PrimitiveInstanceKind::LinearGradient { .. } |
|
||||
PrimitiveInstanceKind::TextRun { .. } |
|
||||
PrimitiveInstanceKind::NormalBorder { .. } |
|
||||
PrimitiveInstanceKind::Rectangle { .. } |
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 7.4 KiB After Width: | Height: | Size: 23 KiB |
Binary file not shown.
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 30 KiB |
Loading…
Reference in New Issue
Block a user