parent
4a71f79a78
commit
aa7e0df514
|
@ -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/.
|
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
|
## Authors
|
||||||
|
|
||||||
The primary author is Patrick Walton (@pcwalton), with contributions from the Servo development
|
The primary author is Patrick Walton (@pcwalton), with contributions from the Servo development
|
||||||
|
|
|
@ -3,6 +3,10 @@ name = "pathfinder_server"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Patrick Walton <pcwalton@mimiga.net>"]
|
authors = ["Patrick Walton <pcwalton@mimiga.net>"]
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = []
|
||||||
|
reftests = ["rsvg", "cairo-rs", "pathfinder_font_renderer/freetype"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
app_units = "0.5"
|
app_units = "0.5"
|
||||||
base64 = "0.6"
|
base64 = "0.6"
|
||||||
|
@ -16,7 +20,6 @@ lru-cache = "0.1"
|
||||||
rocket = "0.3"
|
rocket = "0.3"
|
||||||
rocket_codegen = "0.3"
|
rocket_codegen = "0.3"
|
||||||
rocket_contrib = "0.3"
|
rocket_contrib = "0.3"
|
||||||
rsvg = "0.3"
|
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
@ -24,13 +27,17 @@ serde_json = "1.0"
|
||||||
[dependencies.cairo-rs]
|
[dependencies.cairo-rs]
|
||||||
version = "0.3"
|
version = "0.3"
|
||||||
features = ["png"]
|
features = ["png"]
|
||||||
|
optional = true
|
||||||
|
|
||||||
|
[dependencies.rsvg]
|
||||||
|
version = "0.3"
|
||||||
|
optional = true
|
||||||
|
|
||||||
[dependencies.fontsan]
|
[dependencies.fontsan]
|
||||||
git = "https://github.com/servo/fontsan.git"
|
git = "https://github.com/servo/fontsan.git"
|
||||||
|
|
||||||
[dependencies.pathfinder_font_renderer]
|
[dependencies.pathfinder_font_renderer]
|
||||||
path = "../../font-renderer"
|
path = "../../font-renderer"
|
||||||
features = ["freetype"]
|
|
||||||
|
|
||||||
[dependencies.pathfinder_partitioner]
|
[dependencies.pathfinder_partitioner]
|
||||||
path = "../../partitioner"
|
path = "../../partitioner"
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
|
|
||||||
extern crate app_units;
|
extern crate app_units;
|
||||||
extern crate base64;
|
extern crate base64;
|
||||||
extern crate cairo;
|
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
extern crate euclid;
|
extern crate euclid;
|
||||||
extern crate fontsan;
|
extern crate fontsan;
|
||||||
|
@ -24,16 +23,19 @@ extern crate pathfinder_partitioner;
|
||||||
extern crate pathfinder_path_utils;
|
extern crate pathfinder_path_utils;
|
||||||
extern crate rocket;
|
extern crate rocket;
|
||||||
extern crate rocket_contrib;
|
extern crate rocket_contrib;
|
||||||
extern crate rsvg;
|
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
#[cfg(feature = "reftests")]
|
||||||
|
extern crate cairo;
|
||||||
|
#[cfg(feature = "reftests")]
|
||||||
|
extern crate rsvg;
|
||||||
|
|
||||||
use app_units::Au;
|
use app_units::Au;
|
||||||
use cairo::{Format, ImageSurface};
|
use euclid::{Point2D, Transform2D};
|
||||||
use euclid::{Point2D, Size2D, Transform2D};
|
|
||||||
use image::{DynamicImage, ImageBuffer, ImageFormat, ImageRgba8};
|
use image::{DynamicImage, ImageBuffer, ImageFormat, ImageRgba8};
|
||||||
use lru_cache::LruCache;
|
use lru_cache::LruCache;
|
||||||
use pathfinder_font_renderer::{FontContext, FontInstance, FontKey, GlyphImage};
|
use pathfinder_font_renderer::{FontContext, FontInstance, FontKey, GlyphImage};
|
||||||
|
@ -49,7 +51,6 @@ use rocket::http::{ContentType, Header, Status};
|
||||||
use rocket::request::Request;
|
use rocket::request::Request;
|
||||||
use rocket::response::{NamedFile, Redirect, Responder, Response};
|
use rocket::response::{NamedFile, Redirect, Responder, Response};
|
||||||
use rocket_contrib::json::Json;
|
use rocket_contrib::json::Json;
|
||||||
use rsvg::{Handle, HandleExt};
|
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{self, Cursor, Read};
|
use std::io::{self, Cursor, Read};
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
|
@ -61,6 +62,13 @@ use std::u32;
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
use pathfinder_font_renderer::core_graphics;
|
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 SUGGESTED_JSON_SIZE_LIMIT: u64 = 32 * 1024 * 1024;
|
||||||
|
|
||||||
const CUBIC_ERROR_TOLERANCE: f32 = 0.1;
|
const CUBIC_ERROR_TOLERANCE: f32 = 0.1;
|
||||||
|
@ -192,6 +200,7 @@ enum FontError {
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
|
||||||
enum SvgError {
|
enum SvgError {
|
||||||
|
ReftestsDisabled,
|
||||||
UnknownBuiltinSvg,
|
UnknownBuiltinSvg,
|
||||||
LoadingFailed,
|
LoadingFailed,
|
||||||
ImageWritingFailed,
|
ImageWritingFailed,
|
||||||
|
@ -353,6 +362,7 @@ fn otf_data_from_request(face: &FontRequestFace) -> Result<Arc<Vec<u8>>, FontErr
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetches the SVG data.
|
// Fetches the SVG data.
|
||||||
|
#[cfg(feature = "reftests")]
|
||||||
fn svg_data_from_request(builtin_svg_name: &str) -> Result<Arc<Vec<u8>>, SvgError> {
|
fn svg_data_from_request(builtin_svg_name: &str) -> Result<Arc<Vec<u8>>, SvgError> {
|
||||||
// Read in the builtin SVG.
|
// Read in the builtin SVG.
|
||||||
match BUILTIN_SVGS.iter().filter(|& &(name, _)| name == builtin_svg_name).next() {
|
match BUILTIN_SVGS.iter().filter(|& &(name, _)| name == builtin_svg_name).next() {
|
||||||
|
@ -619,6 +629,7 @@ fn render_reference_text(request: Json<RenderTextReferenceRequest>)
|
||||||
Ok(reference_image)
|
Ok(reference_image)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "reftests")]
|
||||||
#[post("/render-reference/svg", format = "application/json", data = "<request>")]
|
#[post("/render-reference/svg", format = "application/json", data = "<request>")]
|
||||||
fn render_reference_svg(request: Json<RenderSvgReferenceRequest>)
|
fn render_reference_svg(request: Json<RenderSvgReferenceRequest>)
|
||||||
-> Result<ReferenceImage, SvgError> {
|
-> Result<ReferenceImage, SvgError> {
|
||||||
|
@ -656,6 +667,14 @@ fn render_reference_svg(request: Json<RenderSvgReferenceRequest>)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "reftests"))]
|
||||||
|
#[post("/render-reference/svg", format = "application/json", data = "<request>")]
|
||||||
|
#[allow(unused_variables)]
|
||||||
|
fn render_reference_svg(request: Json<RenderSvgReferenceRequest>)
|
||||||
|
-> Result<ReferenceImage, SvgError> {
|
||||||
|
Err(SvgError::ReftestsDisabled)
|
||||||
|
}
|
||||||
|
|
||||||
// Static files
|
// Static files
|
||||||
#[get("/")]
|
#[get("/")]
|
||||||
fn static_index() -> io::Result<NamedFile> {
|
fn static_index() -> io::Result<NamedFile> {
|
||||||
|
|
Loading…
Reference in New Issue