mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
servo: Allow a render backend to be specified on the command line (-r)
This commit is contained in:
parent
b1456dac39
commit
013f747fa8
10 changed files with 159 additions and 130 deletions
|
@ -1,19 +1,20 @@
|
||||||
|
use content::content_task::{ContentTask, ExecuteMsg, ParseMsg, ExitMsg};
|
||||||
|
use content::content_task;
|
||||||
|
use dom::event::Event;
|
||||||
use gfx::compositor::Compositor;
|
use gfx::compositor::Compositor;
|
||||||
use mod gfx::render_task;
|
|
||||||
use gfx::render_task::RenderTask;
|
use gfx::render_task::RenderTask;
|
||||||
use task::spawn_listener;
|
use gfx::render_task;
|
||||||
use layout::layout_task;
|
use layout::layout_task;
|
||||||
use layout_task::LayoutTask;
|
use layout_task::LayoutTask;
|
||||||
use mod content::content_task;
|
use opts::Opts;
|
||||||
use content::content_task::{ContentTask, ExecuteMsg, ParseMsg, ExitMsg};
|
use resource::image_cache_task::{ImageCacheTask, ImageCacheTaskClient};
|
||||||
use resource::resource_task;
|
|
||||||
use resource::resource_task::ResourceTask;
|
use resource::resource_task::ResourceTask;
|
||||||
use std::net::url::Url;
|
use resource::resource_task;
|
||||||
use resource::image_cache_task;
|
|
||||||
use image_cache_task::{ImageCacheTask, image_cache_task, ImageCacheTaskClient};
|
use core::pipes::{Port, Chan};
|
||||||
use pipes::{Port, Chan};
|
use core::task::spawn_listener;
|
||||||
use dom::event::Event;
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
use std::net::url::Url;
|
||||||
|
|
||||||
pub type EngineTask = comm::Chan<Msg>;
|
pub type EngineTask = comm::Chan<Msg>;
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ struct Engine<C:Compositor Send Copy> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn Engine<C:Compositor Send Copy>(compositor: C,
|
fn Engine<C:Compositor Send Copy>(compositor: C,
|
||||||
|
opts: &Opts,
|
||||||
dom_event_port: pipes::Port<Event>,
|
dom_event_port: pipes::Port<Event>,
|
||||||
dom_event_chan: pipes::SharedChan<Event>,
|
dom_event_chan: pipes::SharedChan<Event>,
|
||||||
resource_task: ResourceTask,
|
resource_task: ResourceTask,
|
||||||
|
@ -41,10 +43,11 @@ fn Engine<C:Compositor Send Copy>(compositor: C,
|
||||||
let dom_event_port = Cell(move dom_event_port);
|
let dom_event_port = Cell(move dom_event_port);
|
||||||
let dom_event_chan = Cell(move dom_event_chan);
|
let dom_event_chan = Cell(move dom_event_chan);
|
||||||
|
|
||||||
|
let opts = Cell(copy *opts);
|
||||||
do spawn_listener::<Msg> |request, move dom_event_port, move dom_event_chan,
|
do spawn_listener::<Msg> |request, move dom_event_port, move dom_event_chan,
|
||||||
move image_cache_task| {
|
move image_cache_task, move opts| {
|
||||||
let render_task = RenderTask(compositor);
|
let render_task = RenderTask(compositor, opts.with_ref(|o| copy *o));
|
||||||
let layout_task = LayoutTask(render_task, image_cache_task.clone());
|
let layout_task = LayoutTask(render_task, image_cache_task.clone(), opts.take());
|
||||||
let content_task = ContentTask(layout_task,
|
let content_task = ContentTask(layout_task,
|
||||||
dom_event_port.take(), dom_event_chan.take(),
|
dom_event_port.take(), dom_event_chan.take(),
|
||||||
resource_task, image_cache_task.clone());
|
resource_task, image_cache_task.clone());
|
||||||
|
|
|
@ -13,7 +13,7 @@ use text::{
|
||||||
TextRun,
|
TextRun,
|
||||||
};
|
};
|
||||||
|
|
||||||
use azure::azure_hl::CairoBackend;
|
use azure::azure_hl::BackendType;
|
||||||
use core::dvec::DVec;
|
use core::dvec::DVec;
|
||||||
|
|
||||||
// FontHandle encapsulates access to the platform's font API,
|
// FontHandle encapsulates access to the platform's font API,
|
||||||
|
@ -256,6 +256,7 @@ struct Font {
|
||||||
priv mut shaper: Option<@Shaper>,
|
priv mut shaper: Option<@Shaper>,
|
||||||
style: UsedFontStyle,
|
style: UsedFontStyle,
|
||||||
metrics: FontMetrics,
|
metrics: FontMetrics,
|
||||||
|
backend: BackendType,
|
||||||
|
|
||||||
drop {
|
drop {
|
||||||
use azure::bindgen::AzReleaseScaledFont;
|
use azure::bindgen::AzReleaseScaledFont;
|
||||||
|
@ -265,7 +266,10 @@ struct Font {
|
||||||
|
|
||||||
impl Font {
|
impl Font {
|
||||||
// TODO: who should own fontbuf?
|
// TODO: who should own fontbuf?
|
||||||
static fn new(fontbuf: @~[u8], handle: FontHandle, style: UsedFontStyle) -> Font {
|
static fn new(fontbuf: @~[u8],
|
||||||
|
handle: FontHandle,
|
||||||
|
style: UsedFontStyle,
|
||||||
|
backend: BackendType) -> Font {
|
||||||
let metrics = handle.get_metrics();
|
let metrics = handle.get_metrics();
|
||||||
|
|
||||||
Font {
|
Font {
|
||||||
|
@ -275,6 +279,7 @@ impl Font {
|
||||||
shaper: None,
|
shaper: None,
|
||||||
style: move style,
|
style: move style,
|
||||||
metrics: move metrics,
|
metrics: move metrics,
|
||||||
|
backend: backend
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,7 +304,7 @@ impl Font {
|
||||||
|
|
||||||
let ct_font = &self.handle.ctfont;
|
let ct_font = &self.handle.ctfont;
|
||||||
let size = self.style.pt_size as AzFloat;
|
let size = self.style.pt_size as AzFloat;
|
||||||
let scaled_font = azure::scaled_font::ScaledFont::new(CairoBackend, ct_font, size);
|
let scaled_font = azure::scaled_font::ScaledFont::new(self.backend, ct_font, size);
|
||||||
|
|
||||||
let azure_scaled_font;
|
let azure_scaled_font;
|
||||||
unsafe {
|
unsafe {
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
use dvec::DVec;
|
use gfx::{FontDescriptor, FontList, FontSelector, FontStyle};
|
||||||
|
|
||||||
use util::cache;
|
|
||||||
use gfx::{
|
|
||||||
FontDescriptor,
|
|
||||||
FontList,
|
|
||||||
FontSelector,
|
|
||||||
FontStyle,
|
|
||||||
};
|
|
||||||
use gfx::font::{SelectorPlatformName, SelectorStubDummy, SpecifiedFontStyle};
|
use gfx::font::{SelectorPlatformName, SelectorStubDummy, SpecifiedFontStyle};
|
||||||
use gfx::native::FontHandle;
|
use gfx::native::FontHandle;
|
||||||
|
use util::cache;
|
||||||
|
|
||||||
|
use azure::azure_hl::BackendType;
|
||||||
|
use core::dvec::DVec;
|
||||||
|
|
||||||
// TODO(Issue #164): delete, and get default font from font list
|
// TODO(Issue #164): delete, and get default font from font list
|
||||||
const TEST_FONT: [u8 * 33004] = #include_bin("JosefinSans-SemiBold.ttf");
|
const TEST_FONT: [u8 * 33004] = #include_bin("JosefinSans-SemiBold.ttf");
|
||||||
|
@ -54,10 +50,11 @@ pub struct FontContext {
|
||||||
instance_cache: cache::MonoCache<FontDescriptor, @Font>,
|
instance_cache: cache::MonoCache<FontDescriptor, @Font>,
|
||||||
font_list: Option<FontList>, // only needed by layout
|
font_list: Option<FontList>, // only needed by layout
|
||||||
handle: FontContextHandle,
|
handle: FontContextHandle,
|
||||||
|
backend: BackendType,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub impl FontContext {
|
pub impl FontContext {
|
||||||
static fn new(needs_font_list: bool) -> FontContext {
|
static fn new(backend: BackendType, needs_font_list: bool) -> FontContext {
|
||||||
let handle = FontContextHandle::new();
|
let handle = FontContextHandle::new();
|
||||||
let font_list = if needs_font_list { Some(FontList::new(&handle)) } else { None };
|
let font_list = if needs_font_list { Some(FontList::new(&handle)) } else { None };
|
||||||
FontContext {
|
FontContext {
|
||||||
|
@ -65,6 +62,7 @@ pub impl FontContext {
|
||||||
instance_cache: cache::new::<FontDescriptor, @Font, cache::MonoCache<FontDescriptor, @Font>>(10),
|
instance_cache: cache::new::<FontDescriptor, @Font, cache::MonoCache<FontDescriptor, @Font>>(10),
|
||||||
font_list: move font_list,
|
font_list: move font_list,
|
||||||
handle: move handle,
|
handle: move handle,
|
||||||
|
backend: backend
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,10 +114,10 @@ pub impl FontContext {
|
||||||
return Err(handle.get_err());
|
return Err(handle.get_err());
|
||||||
};
|
};
|
||||||
|
|
||||||
return Ok(@Font::new(font_bin, move handle, copy desc.style));
|
return Ok(@Font::new(font_bin, move handle, copy desc.style, self.backend));
|
||||||
},
|
},
|
||||||
// TODO(Issue #174): implement by-platform-name font selectors.
|
// TODO(Issue #174): implement by-platform-name font selectors.
|
||||||
SelectorPlatformName(_) => { fail ~"FontContext::create_font_instance() can't yet handle SelectorPlatformName." }
|
SelectorPlatformName(_) => { fail ~"FontContext::create_font_instance() can't yet handle SelectorPlatformName." }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,26 @@
|
||||||
use compositor::LayerBuffer;
|
use compositor::LayerBuffer;
|
||||||
use gfx::au;
|
use gfx::au;
|
||||||
use gfx::{
|
use gfx::{Au, Font, FontContext};
|
||||||
Au,
|
|
||||||
Font,
|
|
||||||
FontContext,
|
|
||||||
};
|
|
||||||
use image::base::Image;
|
use image::base::Image;
|
||||||
|
use opts::Opts;
|
||||||
use text::TextRun;
|
use text::TextRun;
|
||||||
use util::range::Range;
|
use util::range::Range;
|
||||||
|
|
||||||
|
use azure::azure_hl::{AsAzureRect, B8G8R8A8, Color, ColorPattern, DrawOptions};
|
||||||
|
use azure::azure_hl::{DrawSurfaceOptions, DrawTarget, Linear, StrokeOptions};
|
||||||
|
use azure::{AzDrawOptions, AzFloat};
|
||||||
|
use core::dvec::DVec;
|
||||||
use core::libc::types::common::c99::uint16_t;
|
use core::libc::types::common::c99::uint16_t;
|
||||||
use core::ptr::to_unsafe_ptr;
|
use core::ptr::to_unsafe_ptr;
|
||||||
use core::dvec::DVec;
|
|
||||||
use std::arc::ARC;
|
|
||||||
use geom::size::Size2D;
|
|
||||||
use geom::point::Point2D;
|
use geom::point::Point2D;
|
||||||
use geom::rect::Rect;
|
use geom::rect::Rect;
|
||||||
use azure::{AzDrawOptions, AzFloat};
|
use geom::size::Size2D;
|
||||||
use azure::azure_hl::{AsAzureRect, B8G8R8A8, Color, ColorPattern, DrawOptions, DrawSurfaceOptions, StrokeOptions};
|
use std::arc::ARC;
|
||||||
use azure::azure_hl::{DrawTarget, Linear};
|
|
||||||
|
|
||||||
struct RenderContext {
|
struct RenderContext {
|
||||||
canvas: &LayerBuffer,
|
canvas: &LayerBuffer,
|
||||||
font_ctx: @FontContext,
|
font_ctx: @FontContext,
|
||||||
|
opts: &Opts
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RenderContext {
|
impl RenderContext {
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
use gfx::display_list::DisplayList;
|
use gfx::display_list::DisplayList;
|
||||||
use gfx::compositor::{LayerBuffer, LayerBufferSet};
|
use gfx::compositor::{LayerBuffer, LayerBufferSet};
|
||||||
|
use opts::Opts;
|
||||||
|
|
||||||
use azure::AzFloat;
|
use azure::AzFloat;
|
||||||
use azure::azure_hl::{B8G8R8A8, CairoBackend, DrawTarget};
|
use azure::azure_hl::{B8G8R8A8, DrawTarget};
|
||||||
use core::libc::c_int;
|
use core::libc::c_int;
|
||||||
use geom::matrix2d::Matrix2D;
|
use geom::matrix2d::Matrix2D;
|
||||||
use geom::point::Point2D;
|
use geom::point::Point2D;
|
||||||
|
@ -23,6 +24,7 @@ pub struct RenderLayer {
|
||||||
/// might be the old layer buffer if it had the appropriate size and format).
|
/// might be the old layer buffer if it had the appropriate size and format).
|
||||||
pub fn render_layers(layer: &RenderLayer,
|
pub fn render_layers(layer: &RenderLayer,
|
||||||
buffer_set: LayerBufferSet,
|
buffer_set: LayerBufferSet,
|
||||||
|
opts: &Opts,
|
||||||
f: &fn(layer: &RenderLayer, buffer: &LayerBuffer) -> bool) -> LayerBufferSet {
|
f: &fn(layer: &RenderLayer, buffer: &LayerBuffer) -> bool) -> LayerBufferSet {
|
||||||
let mut buffers = match move buffer_set { LayerBufferSet { buffers: move b } => move b };
|
let mut buffers = match move buffer_set { LayerBufferSet { buffers: move b } => move b };
|
||||||
|
|
||||||
|
@ -61,7 +63,7 @@ pub fn render_layers(layer: &RenderLayer,
|
||||||
debug!("creating tile, (%u, %u)", x, y);
|
debug!("creating tile, (%u, %u)", x, y);
|
||||||
let size = Size2D(stride as i32, height as i32);
|
let size = Size2D(stride as i32, height as i32);
|
||||||
buffer = LayerBuffer {
|
buffer = LayerBuffer {
|
||||||
draw_target: DrawTarget::new(CairoBackend, size, B8G8R8A8),
|
draw_target: DrawTarget::new(opts.render_backend, size, B8G8R8A8),
|
||||||
rect: tile_rect,
|
rect: tile_rect,
|
||||||
stride: stride
|
stride: stride
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,26 +1,18 @@
|
||||||
use comm::*;
|
|
||||||
use libc::size_t;
|
|
||||||
use libc::types::common::c99::uint16_t;
|
|
||||||
use pipes::{Port, Chan};
|
|
||||||
use std::cell::Cell;
|
|
||||||
|
|
||||||
use azure::AzFloat;
|
|
||||||
use geom::matrix2d::Matrix2D;
|
|
||||||
|
|
||||||
use dl = display_list;
|
use dl = display_list;
|
||||||
use gfx::{
|
use gfx::{FontContext, RenderContext, RenderLayer};
|
||||||
FontContext,
|
use gfx::compositor::{Compositor, LayerBufferSet};
|
||||||
RenderContext,
|
use gfx::render_layers;
|
||||||
RenderLayer,
|
use opts::Opts;
|
||||||
};
|
|
||||||
use gfx::compositor::{
|
|
||||||
Compositor,
|
|
||||||
LayerBufferSet,
|
|
||||||
};
|
|
||||||
use mod gfx::render_layers;
|
|
||||||
use platform::osmain;
|
use platform::osmain;
|
||||||
use render_layers::render_layers;
|
use render_layers::render_layers;
|
||||||
|
|
||||||
|
use azure::AzFloat;
|
||||||
|
use core::comm::*;
|
||||||
|
use core::libc::size_t;
|
||||||
|
use core::libc::types::common::c99::uint16_t;
|
||||||
|
use core::pipes::{Port, Chan};
|
||||||
|
use geom::matrix2d::Matrix2D;
|
||||||
|
use std::cell::Cell;
|
||||||
|
|
||||||
pub enum Msg {
|
pub enum Msg {
|
||||||
RenderMsg(RenderLayer),
|
RenderMsg(RenderLayer),
|
||||||
|
@ -29,9 +21,10 @@ pub enum Msg {
|
||||||
|
|
||||||
pub type RenderTask = comm::Chan<Msg>;
|
pub type RenderTask = comm::Chan<Msg>;
|
||||||
|
|
||||||
pub fn RenderTask<C: Compositor Send>(compositor: C) -> RenderTask {
|
pub fn RenderTask<C: Compositor Send>(compositor: C, opts: Opts) -> RenderTask {
|
||||||
let compositor_cell = Cell(move compositor);
|
let compositor_cell = Cell(move compositor);
|
||||||
do task::spawn_listener |po: comm::Port<Msg>, move compositor_cell| {
|
let opts_cell = Cell(move opts);
|
||||||
|
do task::spawn_listener |po: comm::Port<Msg>, move compositor_cell, move opts_cell| {
|
||||||
let (layer_buffer_channel, layer_buffer_set_port) = pipes::stream();
|
let (layer_buffer_channel, layer_buffer_set_port) = pipes::stream();
|
||||||
|
|
||||||
let compositor = compositor_cell.take();
|
let compositor = compositor_cell.take();
|
||||||
|
@ -41,7 +34,8 @@ pub fn RenderTask<C: Compositor Send>(compositor: C) -> RenderTask {
|
||||||
port: po,
|
port: po,
|
||||||
compositor: move compositor,
|
compositor: move compositor,
|
||||||
mut layer_buffer_set_port: Cell(move layer_buffer_set_port),
|
mut layer_buffer_set_port: Cell(move layer_buffer_set_port),
|
||||||
font_ctx: @FontContext::new(false),
|
font_ctx: @FontContext::new(opts_cell.with_ref(|o| o.render_backend), false),
|
||||||
|
opts: opts_cell.take()
|
||||||
}.start();
|
}.start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,7 +44,8 @@ priv struct Renderer<C: Compositor Send> {
|
||||||
port: comm::Port<Msg>,
|
port: comm::Port<Msg>,
|
||||||
compositor: C,
|
compositor: C,
|
||||||
layer_buffer_set_port: Cell<pipes::Port<LayerBufferSet>>,
|
layer_buffer_set_port: Cell<pipes::Port<LayerBufferSet>>,
|
||||||
font_ctx: @FontContext
|
font_ctx: @FontContext,
|
||||||
|
opts: Opts
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<C: Compositor Send> Renderer<C> {
|
impl<C: Compositor Send> Renderer<C> {
|
||||||
|
@ -92,11 +87,14 @@ impl<C: Compositor Send> Renderer<C> {
|
||||||
let layer_buffer_set = layer_buffer_set_cell.take();
|
let layer_buffer_set = layer_buffer_set_cell.take();
|
||||||
let layer_buffer_set_channel = layer_buffer_set_channel_cell.take();
|
let layer_buffer_set_channel = layer_buffer_set_channel_cell.take();
|
||||||
|
|
||||||
let layer_buffer_set = for render_layers(&render_layer, move layer_buffer_set)
|
let layer_buffer_set = for render_layers(&render_layer,
|
||||||
|
move layer_buffer_set,
|
||||||
|
&self.opts)
|
||||||
|render_layer, layer_buffer| {
|
|render_layer, layer_buffer| {
|
||||||
let ctx = RenderContext {
|
let ctx = RenderContext {
|
||||||
canvas: layer_buffer,
|
canvas: layer_buffer,
|
||||||
font_ctx: self.font_ctx
|
font_ctx: self.font_ctx,
|
||||||
|
opts: &self.opts
|
||||||
};
|
};
|
||||||
|
|
||||||
// Apply the translation to render the tile we want.
|
// Apply the translation to render the tile we want.
|
||||||
|
|
|
@ -4,40 +4,37 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use content::content_task;
|
use content::content_task;
|
||||||
use core::dvec::DVec;
|
use css::select::new_css_select_ctx;
|
||||||
use newcss::stylesheet::Stylesheet;
|
|
||||||
use dom::event::{Event, ReflowEvent};
|
use dom::event::{Event, ReflowEvent};
|
||||||
use dom::node::{Node, LayoutData};
|
use dom::node::{Node, LayoutData};
|
||||||
use geom::point::Point2D;
|
|
||||||
use geom::rect::Rect;
|
|
||||||
use geom::size::Size2D;
|
|
||||||
use gfx::{au, dl};
|
|
||||||
use gfx::{
|
|
||||||
Au,
|
|
||||||
DisplayList,
|
|
||||||
FontContext,
|
|
||||||
RenderLayer,
|
|
||||||
};
|
|
||||||
use gfx::render_task;
|
use gfx::render_task;
|
||||||
|
use gfx::{Au, DisplayList, FontContext, RenderLayer};
|
||||||
|
use gfx::{au, dl};
|
||||||
use layout::box::RenderBox;
|
use layout::box::RenderBox;
|
||||||
use layout::box_builder::LayoutTreeBuilder;
|
use layout::box_builder::LayoutTreeBuilder;
|
||||||
use layout::context::LayoutContext;
|
use layout::context::LayoutContext;
|
||||||
|
use layout::traverse::*;
|
||||||
use opt = core::option;
|
use opt = core::option;
|
||||||
|
use opts::Opts;
|
||||||
use render_task::RenderTask;
|
use render_task::RenderTask;
|
||||||
use resource::image_cache_task::{ImageCacheTask, ImageResponseMsg};
|
use resource::image_cache_task::{ImageCacheTask, ImageResponseMsg};
|
||||||
use resource::local_image_cache::LocalImageCache;
|
use resource::local_image_cache::LocalImageCache;
|
||||||
use std::arc::ARC;
|
|
||||||
use std::net::url::Url;
|
|
||||||
use core::util::replace;
|
|
||||||
use util::time::time;
|
use util::time::time;
|
||||||
use std::cell::Cell;
|
|
||||||
use layout::traverse::*;
|
use core::comm::*;
|
||||||
use comm::*;
|
use core::dvec::DVec;
|
||||||
use task::*;
|
|
||||||
use core::mutable::Mut;
|
use core::mutable::Mut;
|
||||||
|
use core::task::*;
|
||||||
|
use core::util::replace;
|
||||||
|
use geom::point::Point2D;
|
||||||
|
use geom::rect::Rect;
|
||||||
|
use geom::size::Size2D;
|
||||||
use newcss::select::SelectCtx;
|
use newcss::select::SelectCtx;
|
||||||
|
use newcss::stylesheet::Stylesheet;
|
||||||
use newcss::types::OriginAuthor;
|
use newcss::types::OriginAuthor;
|
||||||
use css::select::new_css_select_ctx;
|
use std::arc::ARC;
|
||||||
|
use std::cell::Cell;
|
||||||
|
use std::net::url::Url;
|
||||||
|
|
||||||
pub type LayoutTask = comm::Chan<Msg>;
|
pub type LayoutTask = comm::Chan<Msg>;
|
||||||
|
|
||||||
|
@ -67,9 +64,10 @@ struct BuildData {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn LayoutTask(render_task: RenderTask,
|
fn LayoutTask(render_task: RenderTask,
|
||||||
img_cache_task: ImageCacheTask) -> LayoutTask {
|
img_cache_task: ImageCacheTask,
|
||||||
do spawn_listener::<Msg> |from_content, move img_cache_task| {
|
opts: Opts) -> LayoutTask {
|
||||||
Layout(render_task, img_cache_task.clone(), from_content).start();
|
do spawn_listener::<Msg> |from_content, move img_cache_task, move opts| {
|
||||||
|
Layout(render_task, img_cache_task.clone(), from_content, &opts).start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,10 +84,11 @@ struct Layout {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn Layout(render_task: RenderTask,
|
fn Layout(render_task: RenderTask,
|
||||||
image_cache_task: ImageCacheTask,
|
image_cache_task: ImageCacheTask,
|
||||||
from_content: comm::Port<Msg>) -> Layout {
|
from_content: comm::Port<Msg>,
|
||||||
|
opts: &Opts) -> Layout {
|
||||||
|
|
||||||
let fctx = @FontContext::new(true);
|
let fctx = @FontContext::new(opts.render_backend, true);
|
||||||
|
|
||||||
Layout {
|
Layout {
|
||||||
render_task: render_task,
|
render_task: render_task,
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
//! Configuration options for a single run of the servo application. Created
|
//! Configuration options for a single run of the servo application. Created
|
||||||
//! from command line arguments.
|
//! from command line arguments.
|
||||||
|
|
||||||
|
use azure::azure_hl::{BackendType, CairoBackend, CoreGraphicsBackend};
|
||||||
|
use azure::azure_hl::{CoreGraphicsAcceleratedBackend, Direct2DBackend, SkiaBackend};
|
||||||
|
|
||||||
pub struct Opts {
|
pub struct Opts {
|
||||||
urls: ~[~str],
|
urls: ~[~str],
|
||||||
render_mode: RenderMode
|
render_mode: RenderMode,
|
||||||
|
render_backend: BackendType
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum RenderMode {
|
pub enum RenderMode {
|
||||||
|
@ -18,7 +22,8 @@ pub fn from_cmdline_args(args: &[~str]) -> Opts {
|
||||||
let args = args.tail();
|
let args = args.tail();
|
||||||
|
|
||||||
let opts = ~[
|
let opts = ~[
|
||||||
getopts::optopt(~"o")
|
getopts::optopt(~"o"),
|
||||||
|
getopts::optopt(~"r")
|
||||||
];
|
];
|
||||||
|
|
||||||
let opt_match = match getopts::getopts(args, opts) {
|
let opt_match = match getopts::getopts(args, opts) {
|
||||||
|
@ -32,13 +37,33 @@ pub fn from_cmdline_args(args: &[~str]) -> Opts {
|
||||||
copy opt_match.free
|
copy opt_match.free
|
||||||
};
|
};
|
||||||
|
|
||||||
let render_mode = match getopts::opt_maybe_str(move opt_match, ~"o") {
|
let render_mode = match getopts::opt_maybe_str(copy opt_match, ~"o") {
|
||||||
Some(move output_file) => { Png(move output_file) }
|
Some(move output_file) => { Png(move output_file) }
|
||||||
None => { Screen }
|
None => { Screen }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let render_backend = match getopts::opt_maybe_str(move opt_match, ~"r") {
|
||||||
|
Some(move backend_str) => {
|
||||||
|
if backend_str == ~"direct2d" {
|
||||||
|
Direct2DBackend
|
||||||
|
} else if backend_str == ~"core-graphics" {
|
||||||
|
CoreGraphicsBackend
|
||||||
|
} else if backend_str == ~"core-graphics-accelerated" {
|
||||||
|
CoreGraphicsAcceleratedBackend
|
||||||
|
} else if backend_str == ~"cairo" {
|
||||||
|
CairoBackend
|
||||||
|
} else if backend_str == ~"skia" {
|
||||||
|
SkiaBackend
|
||||||
|
} else {
|
||||||
|
fail ~"unknown backend type"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => CairoBackend
|
||||||
|
};
|
||||||
|
|
||||||
Opts {
|
Opts {
|
||||||
urls: move urls,
|
urls: move urls,
|
||||||
render_mode: move render_mode
|
render_mode: move render_mode,
|
||||||
|
render_backend: move render_backend,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,22 @@
|
||||||
use ShareGlContext = sharegl::platform::Context;
|
use ShareGlContext = sharegl::platform::Context;
|
||||||
use azure::azure_hl;
|
|
||||||
use azure::azure_hl::{B8G8R8A8, CairoBackend, DataSourceSurface, DrawTarget};
|
|
||||||
use azure::azure_hl::{SourceSurfaceMethods};
|
|
||||||
use core::util::replace;
|
|
||||||
use dom::event::{Event, ResizeEvent};
|
use dom::event::{Event, ResizeEvent};
|
||||||
use dvec::DVec;
|
use gfx::compositor::{Compositor, LayerBuffer, LayerBufferSet};
|
||||||
|
use layers::ImageLayer;
|
||||||
|
use opts::Opts;
|
||||||
|
use resize_rate_limiter::ResizeRateLimiter;
|
||||||
|
use util::time;
|
||||||
|
|
||||||
|
use azure::azure_hl::{BackendType, B8G8R8A8, DataSourceSurface, DrawTarget, SourceSurfaceMethods};
|
||||||
|
use core::dvec::DVec;
|
||||||
|
use core::pipes::Chan;
|
||||||
|
use core::task::TaskBuilder;
|
||||||
|
use core::util;
|
||||||
use geom::matrix::{Matrix4, identity};
|
use geom::matrix::{Matrix4, identity};
|
||||||
use geom::point::Point2D;
|
use geom::point::Point2D;
|
||||||
use geom::rect::Rect;
|
use geom::rect::Rect;
|
||||||
use geom::size::Size2D;
|
use geom::size::Size2D;
|
||||||
use gfx::compositor::{Compositor, LayerBuffer, LayerBufferSet};
|
|
||||||
use layers::ImageLayer;
|
|
||||||
use pipes::Chan;
|
|
||||||
use resize_rate_limiter::ResizeRateLimiter;
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::cmp::FuzzyEq;
|
use std::cmp::FuzzyEq;
|
||||||
use task::TaskBuilder;
|
|
||||||
use vec::push;
|
|
||||||
|
|
||||||
pub type OSMain = comm::Chan<Msg>;
|
pub type OSMain = comm::Chan<Msg>;
|
||||||
|
|
||||||
|
@ -38,9 +38,9 @@ pub enum Msg {
|
||||||
Exit
|
Exit
|
||||||
}
|
}
|
||||||
|
|
||||||
fn OSMain(dom_event_chan: pipes::SharedChan<Event>) -> OSMain {
|
fn OSMain(dom_event_chan: pipes::SharedChan<Event>, opts: Opts) -> OSMain {
|
||||||
let dom_event_chan = Cell(move dom_event_chan);
|
let dom_event_chan = Cell(move dom_event_chan);
|
||||||
do on_osmain::<Msg> |po, move dom_event_chan| {
|
do on_osmain::<Msg> |po, move dom_event_chan, move opts| {
|
||||||
do platform::runmain {
|
do platform::runmain {
|
||||||
#debug("preparing to enter main loop");
|
#debug("preparing to enter main loop");
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ fn OSMain(dom_event_chan: pipes::SharedChan<Event>) -> OSMain {
|
||||||
None => mode = GlutMode
|
None => mode = GlutMode
|
||||||
}
|
}
|
||||||
|
|
||||||
mainloop(mode, po, dom_event_chan.take());
|
mainloop(mode, po, dom_event_chan.take(), &opts);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,8 +77,10 @@ impl AzureDrawTargetImageData : layers::layers::ImageData {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<Event>) {
|
fn mainloop(mode: Mode,
|
||||||
|
po: comm::Port<Msg>,
|
||||||
|
dom_event_chan: pipes::SharedChan<Event>,
|
||||||
|
opts: &Opts) {
|
||||||
let key_handlers: @DVec<pipes::Chan<()>> = @DVec();
|
let key_handlers: @DVec<pipes::Chan<()>> = @DVec();
|
||||||
|
|
||||||
let window;
|
let window;
|
||||||
|
@ -97,7 +99,7 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let surfaces = @SurfaceSet();
|
let surfaces = @SurfaceSet(opts.render_backend);
|
||||||
|
|
||||||
let context = layers::rendergl::init_render_context();
|
let context = layers::rendergl::init_render_context();
|
||||||
|
|
||||||
|
@ -137,7 +139,7 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
|
||||||
let mut current_layer_child = root_layer.first_child;
|
let mut current_layer_child = root_layer.first_child;
|
||||||
|
|
||||||
// Replace the image layer data with the buffer data.
|
// Replace the image layer data with the buffer data.
|
||||||
let buffers = replace(&mut surfaces.front.layer_buffer_set.buffers, ~[]);
|
let buffers = util::replace(&mut surfaces.front.layer_buffer_set.buffers, ~[]);
|
||||||
for buffers.each |buffer| {
|
for buffers.each |buffer| {
|
||||||
let width = buffer.rect.size.width as uint;
|
let width = buffer.rect.size.width as uint;
|
||||||
let height = buffer.rect.size.height as uint;
|
let height = buffer.rect.size.height as uint;
|
||||||
|
@ -204,7 +206,7 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
|
||||||
let composite: fn@() = || {
|
let composite: fn@() = || {
|
||||||
//#debug("osmain: drawing to screen");
|
//#debug("osmain: drawing to screen");
|
||||||
|
|
||||||
do util::time::time(~"compositing") {
|
do time::time(~"compositing") {
|
||||||
adjust_for_window_resizing();
|
adjust_for_window_resizing();
|
||||||
layers::rendergl::render_scene(context, scene);
|
layers::rendergl::render_scene(context, scene);
|
||||||
}
|
}
|
||||||
|
@ -236,7 +238,7 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
|
||||||
ShareWindow(share_context) => {
|
ShareWindow(share_context) => {
|
||||||
loop {
|
loop {
|
||||||
check_for_messages();
|
check_for_messages();
|
||||||
do util::time::time(~"compositing") {
|
do time::time(~"compositing") {
|
||||||
layers::rendergl::render_scene(context, scene);
|
layers::rendergl::render_scene(context, scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -268,7 +270,7 @@ fn lend_surface(surfaces: &SurfaceSet, receiver: pipes::Chan<LayerBufferSet>) {
|
||||||
// We are in a position to lend out the surface?
|
// We are in a position to lend out the surface?
|
||||||
assert surfaces.front.have;
|
assert surfaces.front.have;
|
||||||
// Ok then take it
|
// Ok then take it
|
||||||
let old_layer_buffers = replace(&mut surfaces.front.layer_buffer_set.buffers, ~[]);
|
let old_layer_buffers = util::replace(&mut surfaces.front.layer_buffer_set.buffers, ~[]);
|
||||||
let new_layer_buffers = do old_layer_buffers.map |layer_buffer| {
|
let new_layer_buffers = do old_layer_buffers.map |layer_buffer| {
|
||||||
let draw_target_ref = &layer_buffer.draw_target;
|
let draw_target_ref = &layer_buffer.draw_target;
|
||||||
let layer_buffer = LayerBuffer {
|
let layer_buffer = LayerBuffer {
|
||||||
|
@ -303,8 +305,8 @@ fn return_surface(surfaces: &SurfaceSet, layer_buffer_set: LayerBufferSet) {
|
||||||
surfaces.back.have = true;
|
surfaces.back.have = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn SurfaceSet() -> SurfaceSet {
|
fn SurfaceSet(backend: BackendType) -> SurfaceSet {
|
||||||
SurfaceSet { front: Surface(), back: Surface() }
|
SurfaceSet { front: Surface(backend), back: Surface(backend) }
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Surface {
|
struct Surface {
|
||||||
|
@ -312,9 +314,9 @@ struct Surface {
|
||||||
mut have: bool,
|
mut have: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn Surface() -> Surface {
|
fn Surface(backend: BackendType) -> Surface {
|
||||||
let layer_buffer = LayerBuffer {
|
let layer_buffer = LayerBuffer {
|
||||||
draw_target: DrawTarget::new(CairoBackend, Size2D(800i32, 600i32), B8G8R8A8),
|
draw_target: DrawTarget::new(backend, Size2D(800i32, 600i32), B8G8R8A8),
|
||||||
rect: Rect(Point2D(0u, 0u), Size2D(800u, 600u)),
|
rect: Rect(Point2D(0u, 0u), Size2D(800u, 600u)),
|
||||||
stride: 800
|
stride: 800
|
||||||
};
|
};
|
||||||
|
|
|
@ -24,24 +24,23 @@ fn main() {
|
||||||
#[allow(non_implicitly_copyable_typarams)]
|
#[allow(non_implicitly_copyable_typarams)]
|
||||||
fn run(opts: &Opts) {
|
fn run(opts: &Opts) {
|
||||||
match opts.render_mode {
|
match opts.render_mode {
|
||||||
Screen => run_pipeline_screen(opts.urls),
|
Screen => run_pipeline_screen(opts),
|
||||||
Png(outfile) => {
|
Png(outfile) => {
|
||||||
assert opts.urls.is_not_empty();
|
assert opts.urls.is_not_empty();
|
||||||
if opts.urls.len() > 1u {
|
if opts.urls.len() > 1u {
|
||||||
fail ~"servo asks that you stick to a single URL in PNG output mode"
|
fail ~"servo asks that you stick to a single URL in PNG output mode"
|
||||||
}
|
}
|
||||||
run_pipeline_png(opts.urls.head(), outfile)
|
run_pipeline_png(opts, outfile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_pipeline_screen(urls: &[~str]) {
|
fn run_pipeline_screen(opts: &Opts) {
|
||||||
|
|
||||||
let (dom_event_chan, dom_event_port) = pipes::stream();
|
let (dom_event_chan, dom_event_port) = pipes::stream();
|
||||||
let dom_event_chan = pipes::SharedChan(move dom_event_chan);
|
let dom_event_chan = pipes::SharedChan(move dom_event_chan);
|
||||||
|
|
||||||
// The platform event handler thread
|
// The platform event handler thread
|
||||||
let osmain = OSMain(dom_event_chan.clone());
|
let osmain = OSMain(dom_event_chan.clone(), copy *opts);
|
||||||
|
|
||||||
// Send each file to render then wait for keypress
|
// Send each file to render then wait for keypress
|
||||||
let (keypress_to_engine, keypress_from_osmain) = pipes::stream();
|
let (keypress_to_engine, keypress_from_osmain) = pipes::stream();
|
||||||
|
@ -50,10 +49,10 @@ fn run_pipeline_screen(urls: &[~str]) {
|
||||||
// Create a servo instance
|
// Create a servo instance
|
||||||
let resource_task = ResourceTask();
|
let resource_task = ResourceTask();
|
||||||
let image_cache_task = ImageCacheTask(copy resource_task);
|
let image_cache_task = ImageCacheTask(copy resource_task);
|
||||||
let engine_task = Engine(osmain, move dom_event_port, move dom_event_chan, move resource_task,
|
let engine_task = Engine(osmain, opts, move dom_event_port, move dom_event_chan,
|
||||||
move image_cache_task);
|
move resource_task, move image_cache_task);
|
||||||
|
|
||||||
for urls.each |filename| {
|
for opts.urls.each |filename| {
|
||||||
let url = make_url(copy *filename, None);
|
let url = make_url(copy *filename, None);
|
||||||
#debug["master: Sending url `%s`", url.to_str()];
|
#debug["master: Sending url `%s`", url.to_str()];
|
||||||
engine_task.send(LoadURLMsg(move url));
|
engine_task.send(LoadURLMsg(move url));
|
||||||
|
@ -74,7 +73,7 @@ fn run_pipeline_screen(urls: &[~str]) {
|
||||||
osmain.send(osmain::Exit);
|
osmain.send(osmain::Exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_pipeline_png(_url: ~str, _outfile: &str) {
|
fn run_pipeline_png(_opts: &Opts, _outfile: &str) {
|
||||||
fail ~"PNG compositor is broken";
|
fail ~"PNG compositor is broken";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue