130 lines
3.9 KiB
Rust
130 lines
3.9 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* 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/. */
|
|
|
|
extern crate euclid;
|
|
extern crate gleam;
|
|
extern crate glutin;
|
|
extern crate webrender;
|
|
extern crate winit;
|
|
|
|
#[path = "common/boilerplate.rs"]
|
|
mod boilerplate;
|
|
|
|
use crate::boilerplate::{Example, HandyDandyRectBuilder};
|
|
use euclid::vec2;
|
|
use webrender::ShaderPrecacheFlags;
|
|
use webrender::api::*;
|
|
use webrender::render_api::*;
|
|
use webrender::api::units::*;
|
|
|
|
fn main() {
|
|
let mut app = App {
|
|
};
|
|
boilerplate::main_wrapper(&mut app, None);
|
|
}
|
|
|
|
struct App {
|
|
}
|
|
|
|
impl Example for App {
|
|
// Make this the only example to test all shaders for compile errors.
|
|
const PRECACHE_SHADER_FLAGS: ShaderPrecacheFlags = ShaderPrecacheFlags::FULL_COMPILE;
|
|
|
|
fn render(
|
|
&mut self,
|
|
_api: &mut RenderApi,
|
|
builder: &mut DisplayListBuilder,
|
|
_txn: &mut Transaction,
|
|
_: DeviceIntSize,
|
|
pipeline_id: PipelineId,
|
|
_document_id: DocumentId,
|
|
) {
|
|
let content_bounds = LayoutRect::from_size(LayoutSize::new(800.0, 600.0));
|
|
let root_space_and_clip = SpaceAndClipInfo::root_scroll(pipeline_id);
|
|
let spatial_id = root_space_and_clip.spatial_id;
|
|
|
|
builder.push_simple_stacking_context(
|
|
content_bounds.min,
|
|
spatial_id,
|
|
PrimitiveFlags::IS_BACKFACE_VISIBLE,
|
|
);
|
|
|
|
let complex = ComplexClipRegion::new(
|
|
(50, 50).to(150, 150),
|
|
BorderRadius::uniform(20.0),
|
|
ClipMode::Clip
|
|
);
|
|
let clip_id = builder.define_clip_rounded_rect(
|
|
root_space_and_clip.spatial_id,
|
|
complex,
|
|
);
|
|
let clip_chain_id = builder.define_clip_chain(None, [clip_id]);
|
|
|
|
builder.push_rect(
|
|
&CommonItemProperties::new(
|
|
(100, 100).to(200, 200),
|
|
SpaceAndClipInfo { spatial_id, clip_chain_id },
|
|
),
|
|
(100, 100).to(200, 200),
|
|
ColorF::new(0.0, 1.0, 0.0, 1.0),
|
|
);
|
|
|
|
builder.push_rect(
|
|
&CommonItemProperties::new(
|
|
(250, 100).to(350, 200),
|
|
SpaceAndClipInfo { spatial_id, clip_chain_id },
|
|
),
|
|
(250, 100).to(350, 200),
|
|
ColorF::new(0.0, 1.0, 0.0, 1.0),
|
|
);
|
|
let border_side = BorderSide {
|
|
color: ColorF::new(0.0, 0.0, 1.0, 1.0),
|
|
style: BorderStyle::Groove,
|
|
};
|
|
let border_widths = LayoutSideOffsets::new_all_same(10.0);
|
|
let border_details = BorderDetails::Normal(NormalBorder {
|
|
top: border_side,
|
|
right: border_side,
|
|
bottom: border_side,
|
|
left: border_side,
|
|
radius: BorderRadius::uniform(20.0),
|
|
do_aa: true,
|
|
});
|
|
|
|
let bounds = (100, 100).to(200, 200);
|
|
builder.push_border(
|
|
&CommonItemProperties::new(
|
|
bounds,
|
|
SpaceAndClipInfo { spatial_id, clip_chain_id },
|
|
),
|
|
bounds,
|
|
border_widths,
|
|
border_details,
|
|
);
|
|
|
|
if false {
|
|
// draw box shadow?
|
|
let simple_box_bounds = (20, 200).by(50, 50);
|
|
let offset = vec2(10.0, 10.0);
|
|
let color = ColorF::new(1.0, 1.0, 1.0, 1.0);
|
|
let blur_radius = 0.0;
|
|
let spread_radius = 0.0;
|
|
let simple_border_radius = 8.0;
|
|
let box_shadow_type = BoxShadowClipMode::Inset;
|
|
|
|
builder.push_box_shadow(
|
|
&CommonItemProperties::new(content_bounds, root_space_and_clip),
|
|
simple_box_bounds,
|
|
offset,
|
|
color,
|
|
blur_radius,
|
|
spread_radius,
|
|
BorderRadius::uniform(simple_border_radius),
|
|
box_shadow_type,
|
|
);
|
|
}
|
|
|
|
builder.pop_stacking_context();
|
|
}
|
|
}
|