diff options
author | Martin Robinson <mrobinson@igalia.com> | 2024-01-30 09:10:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-30 08:10:13 +0000 |
commit | 7f0d0830e779f37da8aa7f7025edcebe57b2db26 (patch) | |
tree | e440baab928da40b4bba1a41a780b57d6953d998 /third_party/webrender/examples/multiwindow.rs | |
parent | 9b6c473695e14c1a37dd70325657519b901e7efc (diff) | |
download | servo-7f0d0830e779f37da8aa7f7025edcebe57b2db26.tar.gz servo-7f0d0830e779f37da8aa7f7025edcebe57b2db26.zip |
deps: Stop vendoring WebRender (#31212)
The new strategy for dependencies with upstream in Gecko is to manage
them in separate repositories, which will more easily allow rebasing our
changes on top of newer Gecko work.
Diffstat (limited to 'third_party/webrender/examples/multiwindow.rs')
-rw-r--r-- | third_party/webrender/examples/multiwindow.rs | 327 |
1 files changed, 0 insertions, 327 deletions
diff --git a/third_party/webrender/examples/multiwindow.rs b/third_party/webrender/examples/multiwindow.rs deleted file mode 100644 index aa0ac87151a..00000000000 --- a/third_party/webrender/examples/multiwindow.rs +++ /dev/null @@ -1,327 +0,0 @@ -/* 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; - -use gleam::gl; -use glutin::NotCurrent; -use std::fs::File; -use std::io::Read; -use webrender::api::*; -use webrender::api::units::*; -use webrender::render_api::*; -use webrender::DebugFlags; -use winit::dpi::LogicalSize; - -struct Notifier { - events_proxy: winit::EventsLoopProxy, -} - -impl Notifier { - fn new(events_proxy: winit::EventsLoopProxy) -> Notifier { - Notifier { events_proxy } - } -} - -impl RenderNotifier for Notifier { - fn clone(&self) -> Box<dyn RenderNotifier> { - Box::new(Notifier { - events_proxy: self.events_proxy.clone(), - }) - } - - fn wake_up(&self, _composite_needed: bool) { - #[cfg(not(target_os = "android"))] - let _ = self.events_proxy.wakeup(); - } - - fn new_frame_ready(&self, - _: DocumentId, - _scrolled: bool, - composite_needed: bool, - _render_time: Option<u64>) { - self.wake_up(composite_needed); - } -} - -struct Window { - events_loop: winit::EventsLoop, //TODO: share events loop? - context: Option<glutin::WindowedContext<NotCurrent>>, - renderer: webrender::Renderer, - name: &'static str, - pipeline_id: PipelineId, - document_id: DocumentId, - epoch: Epoch, - api: RenderApi, - font_instance_key: FontInstanceKey, -} - -impl Window { - fn new(name: &'static str, clear_color: ColorF) -> Self { - let events_loop = winit::EventsLoop::new(); - let window_builder = winit::WindowBuilder::new() - .with_title(name) - .with_multitouch() - .with_dimensions(LogicalSize::new(800., 600.)); - let context = glutin::ContextBuilder::new() - .with_gl(glutin::GlRequest::GlThenGles { - opengl_version: (3, 2), - opengles_version: (3, 0), - }) - .build_windowed(window_builder, &events_loop) - .unwrap(); - - let context = unsafe { context.make_current().unwrap() }; - - let gl = match context.get_api() { - glutin::Api::OpenGl => unsafe { - gl::GlFns::load_with(|symbol| context.get_proc_address(symbol) as *const _) - }, - glutin::Api::OpenGlEs => unsafe { - gl::GlesFns::load_with(|symbol| context.get_proc_address(symbol) as *const _) - }, - glutin::Api::WebGl => unimplemented!(), - }; - - let device_pixel_ratio = context.window().get_hidpi_factor() as f32; - - let opts = webrender::RendererOptions { - device_pixel_ratio, - clear_color: Some(clear_color), - ..webrender::RendererOptions::default() - }; - - let device_size = { - let size = context - .window() - .get_inner_size() - .unwrap() - .to_physical(device_pixel_ratio as f64); - DeviceIntSize::new(size.width as i32, size.height as i32) - }; - let notifier = Box::new(Notifier::new(events_loop.create_proxy())); - let (renderer, sender) = webrender::Renderer::new(gl.clone(), notifier, opts, None).unwrap(); - let mut api = sender.create_api(); - let document_id = api.add_document(device_size); - - let epoch = Epoch(0); - let pipeline_id = PipelineId(0, 0); - let mut txn = Transaction::new(); - - let font_key = api.generate_font_key(); - let font_bytes = load_file("../wrench/reftests/text/FreeSans.ttf"); - txn.add_raw_font(font_key, font_bytes, 0); - - let font_instance_key = api.generate_font_instance_key(); - txn.add_font_instance(font_instance_key, font_key, 32.0, None, None, Vec::new()); - - api.send_transaction(document_id, txn); - - Window { - events_loop, - context: Some(unsafe { context.make_not_current().unwrap() }), - renderer, - name, - epoch, - pipeline_id, - document_id, - api, - font_instance_key, - } - } - - fn tick(&mut self) -> bool { - let mut do_exit = false; - let my_name = &self.name; - let renderer = &mut self.renderer; - let api = &mut self.api; - - self.events_loop.poll_events(|global_event| match global_event { - winit::Event::WindowEvent { event, .. } => match event { - winit::WindowEvent::CloseRequested | - winit::WindowEvent::KeyboardInput { - input: winit::KeyboardInput { - virtual_keycode: Some(winit::VirtualKeyCode::Escape), - .. - }, - .. - } => { - do_exit = true - } - winit::WindowEvent::KeyboardInput { - input: winit::KeyboardInput { - state: winit::ElementState::Pressed, - virtual_keycode: Some(winit::VirtualKeyCode::P), - .. - }, - .. - } => { - println!("set flags {}", my_name); - api.send_debug_cmd(DebugCommand::SetFlags(DebugFlags::PROFILER_DBG)) - } - _ => {} - } - _ => {} - }); - if do_exit { - return true - } - - let context = unsafe { self.context.take().unwrap().make_current().unwrap() }; - let device_pixel_ratio = context.window().get_hidpi_factor() as f32; - let device_size = { - let size = context - .window() - .get_inner_size() - .unwrap() - .to_physical(device_pixel_ratio as f64); - DeviceIntSize::new(size.width as i32, size.height as i32) - }; - let layout_size = device_size.to_f32() / euclid::Scale::new(device_pixel_ratio); - let mut txn = Transaction::new(); - let mut builder = DisplayListBuilder::new(self.pipeline_id); - let space_and_clip = SpaceAndClipInfo::root_scroll(self.pipeline_id); - - let bounds = LayoutRect::new(LayoutPoint::zero(), layout_size); - builder.push_simple_stacking_context( - bounds.origin, - space_and_clip.spatial_id, - PrimitiveFlags::IS_BACKFACE_VISIBLE, - ); - - builder.push_rect( - &CommonItemProperties::new( - LayoutRect::new( - LayoutPoint::new(100.0, 200.0), - LayoutSize::new(100.0, 200.0), - ), - space_and_clip, - ), - LayoutRect::new( - LayoutPoint::new(100.0, 200.0), - LayoutSize::new(100.0, 200.0), - ), - ColorF::new(0.0, 1.0, 0.0, 1.0)); - - let text_bounds = LayoutRect::new( - LayoutPoint::new(100.0, 50.0), - LayoutSize::new(700.0, 200.0) - ); - let glyphs = vec![ - GlyphInstance { - index: 48, - point: LayoutPoint::new(100.0, 100.0), - }, - GlyphInstance { - index: 68, - point: LayoutPoint::new(150.0, 100.0), - }, - GlyphInstance { - index: 80, - point: LayoutPoint::new(200.0, 100.0), - }, - GlyphInstance { - index: 82, - point: LayoutPoint::new(250.0, 100.0), - }, - GlyphInstance { - index: 81, - point: LayoutPoint::new(300.0, 100.0), - }, - GlyphInstance { - index: 3, - point: LayoutPoint::new(350.0, 100.0), - }, - GlyphInstance { - index: 86, - point: LayoutPoint::new(400.0, 100.0), - }, - GlyphInstance { - index: 79, - point: LayoutPoint::new(450.0, 100.0), - }, - GlyphInstance { - index: 72, - point: LayoutPoint::new(500.0, 100.0), - }, - GlyphInstance { - index: 83, - point: LayoutPoint::new(550.0, 100.0), - }, - GlyphInstance { - index: 87, - point: LayoutPoint::new(600.0, 100.0), - }, - GlyphInstance { - index: 17, - point: LayoutPoint::new(650.0, 100.0), - }, - ]; - - builder.push_text( - &CommonItemProperties::new( - text_bounds, - space_and_clip, - ), - text_bounds, - &glyphs, - self.font_instance_key, - ColorF::new(1.0, 1.0, 0.0, 1.0), - None, - ); - - builder.pop_stacking_context(); - - txn.set_display_list( - self.epoch, - None, - layout_size, - builder.finalize(), - true, - ); - txn.set_root_pipeline(self.pipeline_id); - txn.generate_frame(0); - api.send_transaction(self.document_id, txn); - - renderer.update(); - renderer.render(device_size, 0).unwrap(); - context.swap_buffers().ok(); - - self.context = Some(unsafe { context.make_not_current().unwrap() }); - - false - } - - fn deinit(self) { - self.renderer.deinit(); - } -} - -fn main() { - let mut win1 = Window::new("window1", ColorF::new(0.3, 0.0, 0.0, 1.0)); - let mut win2 = Window::new("window2", ColorF::new(0.0, 0.3, 0.0, 1.0)); - - loop { - if win1.tick() { - break; - } - if win2.tick() { - break; - } - } - - win1.deinit(); - win2.deinit(); -} - -fn load_file(name: &str) -> Vec<u8> { - let mut file = File::open(name).unwrap(); - let mut buffer = vec![]; - file.read_to_end(&mut buffer).unwrap(); - buffer -} |