Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wrench multiple transforms and logging #1207

Merged
merged 1 commit into from May 7, 2017
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

@@ -9,6 +9,7 @@ license = "MPL-2.0"
base64 = "0.3"
bincode = "1.0.0-alpha2"
byteorder = "1.0"
env_logger = { version = "0.4", optional = true }
euclid = "0.11"
gleam = "0.4"
servo-glutin = "0.10.1"
@@ -29,6 +30,7 @@ serde = "0.9"

[features]
headless = [ "osmesa-sys", "osmesa-src" ]
logging = [ "env_logger" ]

[target.'cfg(target_os = "windows")'.dependencies]
dwrote = "0.3"
@@ -11,6 +11,8 @@ extern crate clap;
extern crate crossbeam;
#[cfg(target_os = "windows")]
extern crate dwrote;
#[cfg(feature = "logging")]
extern crate env_logger;
extern crate euclid;
#[cfg(any(target_os = "linux", target_os = "macos"))]
extern crate font_loader;
@@ -275,6 +277,9 @@ fn make_window(size: DeviceUintSize,
}

fn main() {
#[cfg(feature = "logging")]
env_logger::init().unwrap();

let args_yaml = load_yaml!("args.yaml");
let args = clap::App::from_yaml(args_yaml)
.setting(clap::AppSettings::ArgRequiredElseHelp)
@@ -10,7 +10,7 @@ fn acceptable_arg_character(c: char) -> bool {
}

// A crapy parser for parsing strings like "translate(1, 3)"
pub fn parse_function(s: &str) -> (&str, Vec<&str>) {
pub fn parse_function(s: &str) -> (&str, Vec<&str>, &str) {
// XXX: This it not particular easy to read. Sorry.
struct Parser<'a> {
itr: CharIndices<'a>,
@@ -51,7 +51,7 @@ pub fn parse_function(s: &str) -> (&str, Vec<&str>) {

if let Some(k) = p.o {
if k.1 != '(' {
return (name, args);
return (name, args, &s[p.start..]);
}
p.start = k.0 + k.1.len_utf8();
p.o = p.itr.next();
@@ -74,16 +74,20 @@ pub fn parse_function(s: &str) -> (&str, Vec<&str>) {
p.skip_whitespace();

if let Some(k) = p.o {
p.start = k.0 + k.1.len_utf8();
p.o = p.itr.next();
// unless we find a comma we're done
if k.1 != ',' {
if k.1 != ')' {
println!("Unexpected closing character: {}", k.1);
}
break;
}
p.start = k.0 + k.1.len_utf8();
p.o = p.itr.next();
} else {
break
}

}
(name, args)
(name, args, &s[p.start..])
}

#[test]
@@ -148,7 +148,7 @@ impl ReftestManifest {
// TODO: This is simple but not great because it does not support having spaces
// in the fuzzy syntax, like between the arguments.
let (max, count, offset) = if item_str.starts_with("fuzzy(") {
let (_, args) = parse_function(item_str);
let (_, args, _) = parse_function(item_str);
(args[0].parse().unwrap(), args[1].parse().unwrap(), 1)
} else {
(0, 0, 0)
@@ -322,13 +322,13 @@ impl Wrench {
// This is a hack but it is convenient when generating test cases and avoids
// bloating the repository.
match parse_function(file.components().last().unwrap().as_os_str().to_str().unwrap()) {
("xy-gradient", args) => {
("xy-gradient", args, _) => {
generate_xy_gradient_image(
args.get(0).unwrap_or(&"1000").parse::<u32>().unwrap(),
args.get(1).unwrap_or(&"1000").parse::<u32>().unwrap()
)
}
("solid-color", args) => {
("solid-color", args, _) => {
generate_solid_color_image(
args.get(0).unwrap_or(&"255").parse::<u8>().unwrap(),
args.get(1).unwrap_or(&"255").parse::<u8>().unwrap(),
@@ -254,25 +254,45 @@ impl YamlHelper for Yaml {
nums[12], nums[13], nums[14], nums[15]))
}
match *self {
Yaml::String(ref string) => match parse_function(string) {
("translate", ref args) if args.len() == 2 => {
Some(LayoutTransform::create_translation(args[0].parse().unwrap(),
args[1].parse().unwrap(),
0.))
}
("rotate", ref args) | ("rotate-z", ref args) if args.len() == 1 => {
Some(make_rotation(transform_origin, args[0].parse::<f32>().unwrap(), 0.0, 0.0, 1.0))
}
("rotate-x", ref args) if args.len() == 1 => {
Some(make_rotation(transform_origin, args[0].parse::<f32>().unwrap(), 1.0, 0.0, 0.0))
}
("rotate-y", ref args) if args.len() == 1 => {
Some(make_rotation(transform_origin, args[0].parse::<f32>().unwrap(), 0.0, 1.0, 0.0))
}
(name, _) => {
println!("unknown function {}", name);
None
Yaml::String(ref string) => {
let mut slice = string.as_str();
let mut transform = LayoutTransform::identity();
while !slice.is_empty() {
let (function, ref args, reminder) = parse_function(slice);
slice = reminder;
let mx = match function {
"translate" if args.len() >= 2 => {
let z = args.get(2).and_then(|a| a.parse().ok()).unwrap_or(0.);
LayoutTransform::create_translation(args[0].parse().unwrap(),
args[1].parse().unwrap(),
z)
}
"rotate" | "rotate-z" if args.len() == 1 => {
make_rotation(transform_origin, args[0].parse().unwrap(), 0.0, 0.0, 1.0)
}
"rotate-x" if args.len() == 1 => {
make_rotation(transform_origin, args[0].parse().unwrap(), 1.0, 0.0, 0.0)
}
"rotate-y" if args.len() == 1 => {
make_rotation(transform_origin, args[0].parse().unwrap(), 0.0, 1.0, 0.0)
}
_ => {
println!("unknown function {}", function);
break
}
};
transform = transform.post_mul(&mx);
}
Some(transform)
},
Yaml::Array(ref array) => {
let transform = array.iter().fold(LayoutTransform::identity(), |u, yaml| {
match yaml.as_matrix4d(transform_origin) {
Some(ref transform) => u.pre_mul(transform),
None => u,
}
});
Some(transform)
},
Yaml::BadValue => None,
_ => {
@@ -404,35 +424,35 @@ impl YamlHelper for Yaml {
fn as_filter_op(&self) -> Option<FilterOp> {
if let Some(s) = self.as_str() {
match parse_function(s) {
("blur", ref args) if args.len() == 1 => {
("blur", ref args, _) if args.len() == 1 => {
Some(FilterOp::Blur(Au(args[0].parse().unwrap())))
}
("brightness", ref args) if args.len() == 1 => {
("brightness", ref args, _) if args.len() == 1 => {
Some(FilterOp::Brightness(args[0].parse().unwrap()))
}
("contrast", ref args) if args.len() == 1 => {
("contrast", ref args, _) if args.len() == 1 => {
Some(FilterOp::Contrast(args[0].parse().unwrap()))
}
("grayscale", ref args) if args.len() == 1 => {
("grayscale", ref args, _) if args.len() == 1 => {
Some(FilterOp::Grayscale(args[0].parse().unwrap()))
}
("hue-rotate", ref args) if args.len() == 1 => {
("hue-rotate", ref args, _) if args.len() == 1 => {
Some(FilterOp::HueRotate(args[0].parse().unwrap()))
}
("invert", ref args) if args.len() == 1 => {
("invert", ref args, _) if args.len() == 1 => {
Some(FilterOp::Invert(args[0].parse().unwrap()))
}
("opacity", ref args) if args.len() == 1 => {
("opacity", ref args, _) if args.len() == 1 => {
let amount: f32 = args[0].parse().unwrap();
Some(FilterOp::Opacity(amount.into()))
}
("saturate", ref args) if args.len() == 1 => {
("saturate", ref args, _) if args.len() == 1 => {
Some(FilterOp::Saturate(args[0].parse().unwrap()))
}
("sepia", ref args) if args.len() == 1 => {
("sepia", ref args, _) if args.len() == 1 => {
Some(FilterOp::Sepia(args[0].parse().unwrap()))
}
(_, _) => { None }
(_, _, _) => { None }
}
} else {
None
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.