Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change internal clip sources to be a simple array of clips. #1667

Merged
merged 1 commit into from Sep 7, 2017
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Change internal clip sources to be a simple array of clips.

Instead of maintaining a copy of a ClipRegion etc, flatten
any input clip structures into a list of simple clips.

This simplifies some of the mask cache code, and is also
prep work for some further simplifications and optimizations
to how we handle the mask cache structures.
  • Loading branch information
gw3583 committed Sep 6, 2017
commit 94b76a282096f32530e1e01dcaed3a615ee58a52
@@ -228,7 +228,7 @@ impl FrameBuilder {
clip_and_scroll: ClipAndScrollInfo,
local_clip: &LocalClip,
corner_instances: [BorderCornerInstance; 4],
extra_clips: &[ClipSource]) {
clip_sources: Vec<ClipSource>) {
let radius = &border.radius;
let left = &border.left;
let right = &border.right;
@@ -274,7 +274,7 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&rect,
local_clip,
extra_clips,
clip_sources,
PrimitiveContainer::Border(prim_cpu));
}

@@ -425,7 +425,7 @@ impl FrameBuilder {
clip_and_scroll,
local_clip,
corner_instances,
&extra_clips);
extra_clips);
}
}
}
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use api::{ComplexClipRegion, ImageMask, ImageRendering};
use api::{BorderRadius, ComplexClipRegion, ImageMask, ImageRendering};
use api::{LayerPoint, LayerRect, LayerToWorldTransform, LocalClip};
use border::BorderCornerClipSource;
use gpu_cache::GpuCache;
@@ -49,20 +49,6 @@ impl ClipRegion {
};
ClipRegion::create_for_clip_node(*local_clip.clip_rect(), complex_clips, None)
}

pub fn create_for_local_clip(local_clip: &LocalClip) -> ClipRegion {
let complex_clips = match local_clip {
&LocalClip::Rect(_) => Vec::new(),
&LocalClip::RoundedRect(_, ref region) => vec![region.clone()],
};

ClipRegion {
origin: LayerPoint::zero(),
main: *local_clip.clip_rect(),
image_mask: None,
complex_clips,
}
}
}

#[repr(C)]
@@ -83,17 +69,36 @@ impl Not for ClipMode {
}
}

#[derive(Clone, Debug)]
#[derive(Debug)]
pub enum ClipSource {
Complex(LayerRect, f32, ClipMode),
Region(ClipRegion),
Rectangle(LayerRect),

This comment has been minimized.

@kvark

kvark Sep 6, 2017

Member

I'm glad we are getting rid of the complex clips :)

RoundedRectangle(LayerRect, BorderRadius, ClipMode),
Image(ImageMask),
/// TODO(gw): This currently only handles dashed style
/// clips, where the border style is dashed for both
/// adjacent border edges. Expand to handle dotted style
/// and different styles per edge.
BorderCorner(BorderCornerClipSource),
}

impl From<ClipRegion> for ClipSources {
fn from(region: ClipRegion) -> ClipSources {
let mut clips = Vec::new();

if let Some(info) = region.image_mask {
clips.push(ClipSource::Image(info));
}

clips.push(ClipSource::Rectangle(region.main));

for complex in region.complex_clips {
clips.push(ClipSource::RoundedRectangle(complex.rect, complex.radii, ClipMode::Clip));
}

ClipSources::new(clips)
}
}

#[derive(Debug)]
pub struct ClipSources {
clips: Vec<ClipSource>,
@@ -130,7 +135,7 @@ impl ClipSources {
device_pixel_ratio);

for clip in &self.clips {
if let ClipSource::Region(ClipRegion{ image_mask: Some(ref mask), .. }, ..) = *clip {
if let ClipSource::Image(ref mask) = *clip {
resource_cache.request_image(mask.image,
ImageRendering::Auto,
None,
@@ -6,7 +6,7 @@ use api::{ClipId, DeviceIntRect, LayerPixel, LayerPoint, LayerRect, LayerSize};
use api::{LayerToScrollTransform, LayerToWorldTransform, LayerVector2D, PipelineId};
use api::{ScrollClamping, ScrollEventPhase, ScrollLocation, ScrollSensitivity, StickyFrameInfo};
use api::WorldPoint;
use clip::{ClipRegion, ClipSource, ClipSources};
use clip::{ClipRegion, ClipSources};
use clip_scroll_tree::TransformUpdateState;
use geometry::ray_intersects_rect;
use spring::{DAMPING, STIFFNESS, Spring};
@@ -42,7 +42,7 @@ impl ClipInfo {
pub fn new(clip_region: ClipRegion, packed_layer_index: PackedLayerIndex) -> ClipInfo {
let clip_rect = LayerRect::new(clip_region.origin, clip_region.main.size);
ClipInfo {
clip_sources: ClipSources::new(vec![ClipSource::Region(clip_region)]),
clip_sources: ClipSources::from(clip_region),
packed_layer_index,
screen_bounding_rect: None,
clip_rect: clip_rect,
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */

use api::{BorderDetails, BorderDisplayItem, BoxShadowClipMode, ClipAndScrollInfo, ClipId, ColorF};
use api::{BorderDetails, BorderDisplayItem, BorderRadius, BoxShadowClipMode, ClipAndScrollInfo, ClipId, ColorF};
use api::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DeviceUintRect, DeviceUintSize};
use api::{ExtendMode, FontInstance, FontRenderMode};
use api::{GlyphInstance, GlyphOptions, GradientStop};
@@ -198,13 +198,13 @@ impl FrameBuilder {
clip_and_scroll: ClipAndScrollInfo,
rect: &LayerRect,
local_clip: &LocalClip,
extra_clips: &[ClipSource],
mut clip_sources: Vec<ClipSource>,
container: PrimitiveContainer) -> PrimitiveIndex {
self.create_clip_scroll_group_if_necessary(clip_and_scroll);

let mut clip_sources = extra_clips.to_vec();
if let &LocalClip::RoundedRect(_, _) = local_clip {
clip_sources.push(ClipSource::Region(ClipRegion::create_for_local_clip(local_clip)))
if let &LocalClip::RoundedRect(main, region) = local_clip {
clip_sources.push(ClipSource::Rectangle(main));
clip_sources.push(ClipSource::RoundedRectangle(region.rect, region.radii, ClipMode::Clip));
}

let clip_sources = ClipSources::new(clip_sources);
@@ -242,12 +242,12 @@ impl FrameBuilder {
clip_and_scroll: ClipAndScrollInfo,
rect: &LayerRect,
local_clip: &LocalClip,
extra_clips: &[ClipSource],
clip_sources: Vec<ClipSource>,
container: PrimitiveContainer) -> PrimitiveIndex {
let prim_index = self.create_primitive(clip_and_scroll,
rect,
local_clip,
extra_clips,
clip_sources,
container);

self.add_primitive_to_draw_list(prim_index, clip_and_scroll);
@@ -445,7 +445,7 @@ impl FrameBuilder {
let prim_index = self.add_primitive(clip_and_scroll,
&LayerRect::zero(),
local_clip,
&[],
Vec::new(),
PrimitiveContainer::TextShadow(prim));

self.shadow_prim_stack.push(prim_index);
@@ -479,7 +479,7 @@ impl FrameBuilder {
let prim_index = self.add_primitive(clip_and_scroll,
rect,
local_clip,
&[],
Vec::new(),
PrimitiveContainer::Rectangle(prim));

match flags {
@@ -535,14 +535,14 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&new_rect.translate(&shadow.offset),
local_clip,
&[],
Vec::new(),
PrimitiveContainer::Line(line));
}

let prim_index = self.create_primitive(clip_and_scroll,
&new_rect,
local_clip,
&[],
Vec::new(),
PrimitiveContainer::Line(line));

if color.a > 0.0 {
@@ -830,7 +830,7 @@ impl FrameBuilder {
PrimitiveContainer::AngleGradient(gradient_cpu)
};

self.add_primitive(clip_and_scroll, &rect, local_clip, &[], prim);
self.add_primitive(clip_and_scroll, &rect, local_clip, Vec::new(), prim);
}

pub fn add_radial_gradient(&mut self,
@@ -862,7 +862,7 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&rect,
local_clip,
&[],
Vec::new(),
PrimitiveContainer::RadialGradient(radial_gradient_cpu));
}

@@ -974,7 +974,7 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&rect.translate(&text_prim.offset),
local_clip,
&[],
Vec::new(),
PrimitiveContainer::TextRun(text_prim));
}

@@ -983,7 +983,7 @@ impl FrameBuilder {
let prim_index = self.create_primitive(clip_and_scroll,
&rect,
local_clip,
&[],
Vec::new(),
PrimitiveContainer::TextRun(prim));

// Only add a visual element if it can contribute to the scene.
@@ -1031,8 +1031,9 @@ impl FrameBuilder {
let box_clip_mode = !bs_clip_mode;

// Clip the inside and then the outside of the box.
let extra_clips = [ClipSource::Complex(bs_rect, border_radius, bs_clip_mode),
ClipSource::Complex(*box_bounds, border_radius, box_clip_mode)];
let border_radius = BorderRadius::uniform(border_radius);
let extra_clips = vec![ClipSource::RoundedRectangle(bs_rect, border_radius, bs_clip_mode),
ClipSource::RoundedRectangle(*box_bounds, border_radius, box_clip_mode)];

let prim = RectanglePrimitive {
color: *color,
@@ -1041,7 +1042,7 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&rect_to_draw,
local_clip,
&extra_clips,
extra_clips,
PrimitiveContainer::Rectangle(prim));
}

@@ -1192,9 +1193,9 @@ impl FrameBuilder {

let mut extra_clips = Vec::new();
if border_radius >= 0.0 {
extra_clips.push(ClipSource::Complex(*box_bounds,
border_radius,
extra_clip_mode));
extra_clips.push(ClipSource::RoundedRectangle(*box_bounds,
BorderRadius::uniform(border_radius),
extra_clip_mode));
}

let prim_cpu = BoxShadowPrimitiveCpu {
@@ -1211,7 +1212,7 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&outer_rect,
local_clip,
extra_clips.as_slice(),
extra_clips,
PrimitiveContainer::BoxShadow(prim_cpu));
}
}
@@ -1245,7 +1246,7 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&rect,
local_clip,
&[],
Vec::new(),
PrimitiveContainer::Image(prim_cpu));
}

@@ -1276,7 +1277,7 @@ impl FrameBuilder {
self.add_primitive(clip_and_scroll,
&rect,
clip_rect,
&[],
Vec::new(),
PrimitiveContainer::YuvImage(prim_cpu));
}

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.