From 7b16ab9bf0ddc27db5d79837e307a926fa19b732 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 21 Aug 2012 22:29:18 -0700 Subject: [PATCH] Compare images correctly. Add another working test --- src/reftest/reftest.rs | 45 +++++++++++++++++++++++++++++++--------- src/rust-stb-image | 2 +- src/servo/image/base.rs | 4 ++++ src/test/ref/square.css | 2 ++ src/test/ref/square.html | 6 ++++++ 5 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 src/test/ref/square.css create mode 100644 src/test/ref/square.html diff --git a/src/reftest/reftest.rs b/src/reftest/reftest.rs index de045b144fb..8b910a23d8c 100644 --- a/src/reftest/reftest.rs +++ b/src/reftest/reftest.rs @@ -7,6 +7,7 @@ import std::getopts::{getopts, reqopt, opt_str, fail_str}; import path::{connect, basename}; import os::list_dir_path; import servo::run_pipeline_png; +import servo::image::base::Image; fn main(args: ~[~str]) { let config = parse_config(args); @@ -96,26 +97,48 @@ fn load_test_directives(file: ~str) -> Directives { } fn run_test(config: Config, file: ~str) { - let servo_render = render_servo(config, file); - let ref_render = render_ref(config, file); - if servo_render != ref_render { - fail ~"rendered pages do not match"; + let servo_image = render_servo(config, file); + let ref_image = render_ref(config, file); + + assert servo_image.width == ref_image.width; + assert servo_image.height == ref_image.height; + #debug("image depth: ref: %?, servo: %?", ref_image.depth, servo_image.depth); + + for uint::range(0, servo_image.height) |h| { + for uint::range(0, servo_image.width) |w| { + let i = (h * servo_image.width + w) * 4; + let servo_pixel = ( + servo_image.data[i + 0], + servo_image.data[i + 1], + servo_image.data[i + 2], + servo_image.data[i + 3] + ); + let ref_pixel = ( + ref_image.data[i + 0], + ref_image.data[i + 1], + ref_image.data[i + 2], + ref_image.data[i + 3] + ); + #debug("i: %?, x: %?, y: %?, ref: %?, servo: %?", i, w, h, ref_pixel, servo_pixel); + + if servo_pixel != ref_pixel { + fail #fmt("mismatched pixel. x: %?, y: %?, ref: %?, servo: %?", w, h, ref_pixel, servo_pixel) + } + } } } -type Render = ~[u8]; - const WIDTH: uint = 800; const HEIGHT: uint = 600; -fn render_servo(config: Config, file: ~str) -> Render { +fn render_servo(config: Config, file: ~str) -> Image { let infile = ~"file://" + os::make_absolute(file); let outfile = connect(config.work_dir, basename(file) + ".png"); run_pipeline_png(infile, outfile); return sanitize_image(outfile); } -fn render_ref(config: Config, file: ~str) -> Render { +fn render_ref(config: Config, file: ~str) -> Image { let infile = file; let outfile = connect(config.work_dir, basename(file) + ".ref.png"); // After we've generated the reference image once, we don't need @@ -128,7 +151,7 @@ fn render_ref(config: Config, file: ~str) -> Render { return sanitize_image(outfile); } -fn sanitize_image(file: ~str) -> Render { +fn sanitize_image(file: ~str) -> Image { let buf = io::read_whole_file(file).get(); let image = servo::image::base::load_from_memory(buf).get(); @@ -136,7 +159,9 @@ fn sanitize_image(file: ~str) -> Render { // the Firefox output, so it is larger than we want. Trim it down. assert image.width == WIDTH; assert image.height >= HEIGHT; - vec::slice(image.data, 0, image.width * HEIGHT * 4) + let data = vec::slice(image.data, 0, image.width * HEIGHT * 4); + + return Image(image.width, HEIGHT, image.depth, data); } fn install_rasterize_py(config: Config) { diff --git a/src/rust-stb-image b/src/rust-stb-image index 6c7710f8836..73ae7de3b7d 160000 --- a/src/rust-stb-image +++ b/src/rust-stb-image @@ -1 +1 @@ -Subproject commit 6c7710f8836c13f12c26ccb213106d210e0e6082 +Subproject commit 73ae7de3b7d84e3a42379b802ad945867fdf7ed1 diff --git a/src/servo/image/base.rs b/src/servo/image/base.rs index 791a4617772..fb08171823c 100644 --- a/src/servo/image/base.rs +++ b/src/servo/image/base.rs @@ -11,6 +11,10 @@ import stb_image = stb_image::image; type Image = stb_image::image; +fn Image(width: uint, height: uint, depth: uint, +data: ~[u8]) -> Image { + stb_image::image(width, height, depth, data) +} + const TEST_IMAGE: [u8 * 4962] = #include_bin("test.jpeg"); fn test_image_bin() -> ~[u8] { diff --git a/src/test/ref/square.css b/src/test/ref/square.css new file mode 100644 index 00000000000..f07bbe0595d --- /dev/null +++ b/src/test/ref/square.css @@ -0,0 +1,2 @@ +body {margin : 0px} +.box {background-color : green; height : 400px; width : 400px} diff --git a/src/test/ref/square.html b/src/test/ref/square.html new file mode 100644 index 00000000000..ac9ace5a979 --- /dev/null +++ b/src/test/ref/square.html @@ -0,0 +1,6 @@ + + + + +
+