diff --git a/src/servo/gfx/renderer.rs b/src/servo/gfx/renderer.rs index 9157209075c..ec285e123bb 100644 --- a/src/servo/gfx/renderer.rs +++ b/src/servo/gfx/renderer.rs @@ -135,15 +135,18 @@ fn draw_display_list( #debug["drawing %?", item]; alt item.item_type { - dl::display_item_solid_color(r, g, b) { - draw_solid_color(draw_target, item, r, g, b); - } - dl::display_item_image(image) { - draw_image(draw_target, item, image); - } - dl::padding(*) { - fail "should never see padding"; - } + dl::display_item_solid_color(r, g, b) { + draw_solid_color(draw_target, item, r, g, b); + } + dl::display_item_image(image) { + draw_image(draw_target, item, image); + } + dl::display_item_text(text_run) { + // FIXME + } + dl::padding(*) { + fail "should never see padding"; + } } } } diff --git a/src/servo/layout/display_list.rs b/src/servo/layout/display_list.rs index c51d57d3ac7..3743f87055d 100644 --- a/src/servo/layout/display_list.rs +++ b/src/servo/layout/display_list.rs @@ -1,10 +1,12 @@ import gfx::geometry::*; import geom::rect::Rect; import image::base::image; +import servo_text::text_run::text_run; enum item_type { display_item_solid_color(u8, u8, u8), display_item_image(~image), + display_item_text(text_run), // FIXME: Shape code does not understand the alignment without this padding(u8, u8, u8, u8) } diff --git a/src/servo/layout/display_list_builder.rs b/src/servo/layout/display_list_builder.rs index 7a212e139d3..a1f5223b021 100644 --- a/src/servo/layout/display_list_builder.rs +++ b/src/servo/layout/display_list_builder.rs @@ -2,11 +2,15 @@ export build_display_list; import dl = display_list; import dom::rcu::Scope; +import dom::base::{Text, NodeScope}; import gfx::geometry::{au, au_to_px, box, px_to_au}; import gfx::renderer; import layout::base::*; import util::color::methods; - +import util::tree; +import box_builder::box_builder_methods; +import text::text_layout_methods; +import geom::size::Size2D; import geom::point::Point2D; import geom::rect::Rect; @@ -63,21 +67,29 @@ fn box_to_display_item(box: @Box, origin: Point2D) -> dl::display_item { let bounds = Rect(origin, copy box.bounds.size); - alt (box.appearance.background_image, box.appearance.background_color) { - (some(image), some(*)) | (some(image), none) { + alt (box.kind, box.appearance.background_image, box.appearance.background_color) { + (TextBox(subbox), _, _) { + let run = copy subbox.run; + assert run.is_some(); + item = dl::display_item({ + item_type: dl::display_item_text(run.get()), + bounds: bounds + }); + } + (_, some(image), some(*)) | (_, some(image), none) { item = dl::display_item({ item_type: dl::display_item_image(~copy *image), bounds: bounds }); } - (none, some(col)) { + (_, none, some(col)) { #debug("Assigning color %? to box with bounds %?", col, bounds); item = dl::display_item({ item_type: dl::display_item_solid_color(col.red, col.green, col.blue), bounds: bounds }); } - (none, none) { + (_, none, none) { let r = rand::rng(); item = dl::display_item({ item_type: dl::display_item_solid_color(r.next() as u8, @@ -91,3 +103,40 @@ fn box_to_display_item(box: @Box, origin: Point2D) -> dl::display_item { #debug("layout: display item: %?", item); ret item; } + +fn should_convert_text_boxes_to_text_items() { + #[test]; + + let s = Scope(); + let n = s.new_node(Text("firecracker")); + let b = n.construct_boxes(); + let subbox = alt check b.kind { TextBox(subbox) { subbox } }; + b.reflow_text(px_to_au(800), subbox); + let di = box_to_display_item(b, Point2D(px_to_au(0), px_to_au(0))); + + alt di.item_type { + dl::display_item_text(_) { } + _ { fail } + } +} + +fn should_calculate_the_bounds_of_the_text_box() { + #[test]; + + let s = Scope(); + let n = s.new_node(Text("firecracker")); + let b = n.construct_boxes(); + let subbox = alt check b.kind { TextBox(subbox) { subbox } }; + b.reflow_text(px_to_au(800), subbox); + let di = box_to_display_item(b, Point2D(px_to_au(0), px_to_au(0))); + + let expected = Rect( + Point2D(px_to_au(0), px_to_au(0)), + Size2D(px_to_au(110), px_to_au(14)) + ); + + #error("%?", di.bounds); + #error("%?", expected); + + assert di.bounds == expected; +}