diff --git a/README.md b/README.md index 3d2d2524..e513616f 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,14 @@ To run the demo, make sure NPM and nightly Rust are installed, and run the follo Then navigate to http://localhost:8000/. +## Testing + +Pathfinder contains reference tests that compare its output to that of other rendering libraries, +such as Cairo. To run them, install Cairo and FreeType if necessary, then perform the above steps, +substituting the last line with: + + $ cargo run --release --features reftests + ## Authors The primary author is Patrick Walton (@pcwalton), with contributions from the Servo development diff --git a/demo/server/Cargo.toml b/demo/server/Cargo.toml index 16326eac..ea3d0f34 100644 --- a/demo/server/Cargo.toml +++ b/demo/server/Cargo.toml @@ -3,6 +3,10 @@ name = "pathfinder_server" version = "0.1.0" authors = ["Patrick Walton "] +[features] +default = [] +reftests = ["rsvg", "cairo-rs", "pathfinder_font_renderer/freetype"] + [dependencies] app_units = "0.5" base64 = "0.6" @@ -16,7 +20,6 @@ lru-cache = "0.1" rocket = "0.3" rocket_codegen = "0.3" rocket_contrib = "0.3" -rsvg = "0.3" serde = "1.0" serde_derive = "1.0" serde_json = "1.0" @@ -24,13 +27,17 @@ serde_json = "1.0" [dependencies.cairo-rs] version = "0.3" features = ["png"] +optional = true + +[dependencies.rsvg] +version = "0.3" +optional = true [dependencies.fontsan] git = "https://github.com/servo/fontsan.git" [dependencies.pathfinder_font_renderer] path = "../../font-renderer" -features = ["freetype"] [dependencies.pathfinder_partitioner] path = "../../partitioner" diff --git a/demo/server/src/main.rs b/demo/server/src/main.rs index 25a78cc9..f7fa4a76 100644 --- a/demo/server/src/main.rs +++ b/demo/server/src/main.rs @@ -13,7 +13,6 @@ extern crate app_units; extern crate base64; -extern crate cairo; extern crate env_logger; extern crate euclid; extern crate fontsan; @@ -24,16 +23,19 @@ extern crate pathfinder_partitioner; extern crate pathfinder_path_utils; extern crate rocket; extern crate rocket_contrib; -extern crate rsvg; #[macro_use] extern crate lazy_static; #[macro_use] extern crate serde_derive; +#[cfg(feature = "reftests")] +extern crate cairo; +#[cfg(feature = "reftests")] +extern crate rsvg; + use app_units::Au; -use cairo::{Format, ImageSurface}; -use euclid::{Point2D, Size2D, Transform2D}; +use euclid::{Point2D, Transform2D}; use image::{DynamicImage, ImageBuffer, ImageFormat, ImageRgba8}; use lru_cache::LruCache; use pathfinder_font_renderer::{FontContext, FontInstance, FontKey, GlyphImage}; @@ -49,7 +51,6 @@ use rocket::http::{ContentType, Header, Status}; use rocket::request::Request; use rocket::response::{NamedFile, Redirect, Responder, Response}; use rocket_contrib::json::Json; -use rsvg::{Handle, HandleExt}; use std::fs::File; use std::io::{self, Cursor, Read}; use std::ops::Range; @@ -61,6 +62,13 @@ use std::u32; #[cfg(target_os = "macos")] use pathfinder_font_renderer::core_graphics; +#[cfg(feature = "reftests")] +use euclid::Size2D; +#[cfg(feature = "reftests")] +use cairo::{Format, ImageSurface}; +#[cfg(feature = "reftests")] +use rsvg::{Handle, HandleExt}; + const SUGGESTED_JSON_SIZE_LIMIT: u64 = 32 * 1024 * 1024; const CUBIC_ERROR_TOLERANCE: f32 = 0.1; @@ -192,6 +200,7 @@ enum FontError { #[derive(Clone, Copy, Debug, Serialize, Deserialize)] enum SvgError { + ReftestsDisabled, UnknownBuiltinSvg, LoadingFailed, ImageWritingFailed, @@ -353,6 +362,7 @@ fn otf_data_from_request(face: &FontRequestFace) -> Result>, FontErr } // Fetches the SVG data. +#[cfg(feature = "reftests")] fn svg_data_from_request(builtin_svg_name: &str) -> Result>, SvgError> { // Read in the builtin SVG. match BUILTIN_SVGS.iter().filter(|& &(name, _)| name == builtin_svg_name).next() { @@ -619,6 +629,7 @@ fn render_reference_text(request: Json) Ok(reference_image) } +#[cfg(feature = "reftests")] #[post("/render-reference/svg", format = "application/json", data = "")] fn render_reference_svg(request: Json) -> Result { @@ -656,6 +667,14 @@ fn render_reference_svg(request: Json) }) } +#[cfg(not(feature = "reftests"))] +#[post("/render-reference/svg", format = "application/json", data = "")] +#[allow(unused_variables)] +fn render_reference_svg(request: Json) + -> Result { + Err(SvgError::ReftestsDisabled) +} + // Static files #[get("/")] fn static_index() -> io::Result {