diff options
Diffstat (limited to 'components/layout')
-rw-r--r-- | components/layout/display_list_builder.rs | 65 | ||||
-rw-r--r-- | components/layout/fragment.rs | 25 | ||||
-rw-r--r-- | components/layout/webrender_helpers.rs | 5 |
3 files changed, 51 insertions, 44 deletions
diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index 3fc63df7c49..75e288e4826 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -12,13 +12,13 @@ use app_units::{AU_PER_PX, Au}; use block::{BlockFlow, BlockStackingContextType}; -use canvas_traits::{CanvasData, CanvasMsg, FromLayoutMsg}; +use canvas_traits::canvas::{CanvasMsg, FromLayoutMsg}; use context::LayoutContext; use euclid::{Transform3D, Point2D, Vector2D, Rect, SideOffsets2D, Size2D, TypedSize2D}; use flex::FlexFlow; use flow::{BaseFlow, Flow, IS_ABSOLUTELY_POSITIONED}; use flow_ref::FlowRef; -use fragment::{CoordinateSystem, Fragment, ImageFragmentInfo, ScannedTextFragmentInfo}; +use fragment::{CanvasFragmentSource, CoordinateSystem, Fragment, ImageFragmentInfo, ScannedTextFragmentInfo}; use fragment::{SpecificFragmentInfo, TruncatedFragmentInfo}; use gfx::display_list; use gfx::display_list::{BLUR_INFLATION_FACTOR, BaseDisplayItem, BorderDetails, BorderDisplayItem}; @@ -28,7 +28,7 @@ use gfx::display_list::{GradientDisplayItem, IframeDisplayItem, ImageBorder, Ima use gfx::display_list::{LineDisplayItem, NormalBorder, OpaqueNode, PushTextShadowDisplayItem}; use gfx::display_list::{PopTextShadowDisplayItem, RadialGradientDisplayItem, ScrollRoot}; use gfx::display_list::{ScrollRootType, SolidColorDisplayItem, StackingContext, StackingContextType}; -use gfx::display_list::{TextDisplayItem, TextOrientation, WebGLDisplayItem, WebRenderImageInfo}; +use gfx::display_list::{TextDisplayItem, TextOrientation, WebRenderImageInfo}; use gfx_traits::{combine_id_with_fragment_type, FragmentType, StackingContextId}; use inline::{FIRST_FRAGMENT_OF_ELEMENT, InlineFlow, LAST_FRAGMENT_OF_ELEMENT}; use ipc_channel::ipc; @@ -1978,15 +1978,22 @@ impl FragmentDisplayListBuilding for Fragment { let computed_width = canvas_fragment_info.dom_width.to_px(); let computed_height = canvas_fragment_info.dom_height.to_px(); - let canvas_data = match canvas_fragment_info.ipc_renderer { - Some(ref ipc_renderer) => { - let ipc_renderer = ipc_renderer.lock().unwrap(); - let (sender, receiver) = ipc::channel().unwrap(); - ipc_renderer.send(CanvasMsg::FromLayout( - FromLayoutMsg::SendData(sender))).unwrap(); - receiver.recv().unwrap() + let (image_key, format) = match canvas_fragment_info.source { + CanvasFragmentSource::WebGL(image_key) => { + (image_key, PixelFormat::BGRA8) }, - None => return, + CanvasFragmentSource::Image(ref ipc_renderer) => { + match *ipc_renderer { + Some(ref ipc_renderer) => { + let ipc_renderer = ipc_renderer.lock().unwrap(); + let (sender, receiver) = ipc::channel().unwrap(); + ipc_renderer.send(CanvasMsg::FromLayout( + FromLayoutMsg::SendData(sender))).unwrap(); + (receiver.recv().unwrap().image_key, PixelFormat::BGRA8) + }, + None => return, + } + } }; let base = state.create_base_display_item( @@ -1995,29 +2002,19 @@ impl FragmentDisplayListBuilding for Fragment { self.node, self.style.get_cursor(Cursor::Default), DisplayListSection::Content); - let display_item = match canvas_data { - CanvasData::Image(canvas_data) => { - DisplayItem::Image(box ImageDisplayItem { - base: base, - webrender_image: WebRenderImageInfo { - width: computed_width as u32, - height: computed_height as u32, - format: PixelFormat::BGRA8, - key: Some(canvas_data.image_key), - }, - image_data: None, - stretch_size: stacking_relative_content_box.size, - tile_spacing: Size2D::zero(), - image_rendering: image_rendering::T::auto, - }) - } - CanvasData::WebGL(context_id) => { - DisplayItem::WebGL(box WebGLDisplayItem { - base: base, - context_id: context_id, - }) - } - }; + let display_item = DisplayItem::Image(box ImageDisplayItem { + base: base, + webrender_image: WebRenderImageInfo { + width: computed_width as u32, + height: computed_height as u32, + format: format, + key: Some(image_key), + }, + image_data: None, + stretch_size: stacking_relative_content_box.size, + tile_spacing: Size2D::zero(), + image_rendering: image_rendering::T::auto, + }); state.add_display_item(display_item); } diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs index 2510b185d1c..f4928262e99 100644 --- a/components/layout/fragment.rs +++ b/components/layout/fragment.rs @@ -8,7 +8,7 @@ use ServoArc; use app_units::Au; -use canvas_traits::CanvasMsg; +use canvas_traits::canvas::CanvasMsg; use context::{LayoutContext, with_thread_local_font_context}; use euclid::{Transform3D, Point2D, Vector2D, Radians, Rect, Size2D}; use floats::ClearType; @@ -30,7 +30,7 @@ use msg::constellation_msg::{BrowsingContextId, PipelineId}; use net_traits::image::base::{Image, ImageMetadata}; use net_traits::image_cache::{ImageOrMetadataAvailable, UsePlaceholder}; use range::*; -use script_layout_interface::HTMLCanvasData; +use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource}; use script_layout_interface::SVGSVGData; use script_layout_interface::wrapper_traits::{PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode}; use serde::ser::{Serialize, SerializeStruct, Serializer}; @@ -53,6 +53,7 @@ use style::values::{self, Either, Auto}; use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto}; use text; use text::TextRunScanner; +use webrender_api; use wrapper::ThreadSafeLayoutNodeHelpers; // From gfxFontConstants.h in Firefox. @@ -322,17 +323,31 @@ impl InlineAbsoluteFragmentInfo { } #[derive(Clone)] +pub enum CanvasFragmentSource { + WebGL(webrender_api::ImageKey), + Image(Option<Arc<Mutex<IpcSender<CanvasMsg>>>>) +} + +#[derive(Clone)] pub struct CanvasFragmentInfo { - pub ipc_renderer: Option<Arc<Mutex<IpcSender<CanvasMsg>>>>, + pub source: CanvasFragmentSource, pub dom_width: Au, pub dom_height: Au, } impl CanvasFragmentInfo { pub fn new(data: HTMLCanvasData) -> CanvasFragmentInfo { + let source = match data.source { + HTMLCanvasDataSource::WebGL(texture_id) => { + CanvasFragmentSource::WebGL(texture_id) + }, + HTMLCanvasDataSource::Image(ipc_sender) => { + CanvasFragmentSource::Image(ipc_sender.map(|renderer| Arc::new(Mutex::new(renderer)))) + } + }; + CanvasFragmentInfo { - ipc_renderer: data.ipc_renderer - .map(|renderer| Arc::new(Mutex::new(renderer))), + source: source, dom_width: Au::from_px(data.width as i32), dom_height: Au::from_px(data.height as i32), } diff --git a/components/layout/webrender_helpers.rs b/components/layout/webrender_helpers.rs index 6b8b334d52d..6e5a774e283 100644 --- a/components/layout/webrender_helpers.rs +++ b/components/layout/webrender_helpers.rs @@ -305,11 +305,6 @@ impl WebRenderDisplayItemConverter for DisplayItem { } } } - DisplayItem::WebGL(ref item) => { - builder.push_webgl_canvas(item.base.bounds.to_rectf(), - Some(item.base.local_clip), - item.context_id); - } DisplayItem::Border(ref item) => { let rect = item.base.bounds.to_rectf(); let widths = item.border_widths.to_border_widths(); |