Skip to main content

interp/
interp.rs

1// Copyright 2024 the Color Authors
2// SPDX-License-Identifier: Apache-2.0 OR MIT
3
4//! Interpolation example
5//!
6//! Outputs a test page to stdout.
7//!
8//! Typical usage:
9//!
10//! ```sh
11//! cargo run --example interp 'oklab(0.5 0.2 0)' 'rgb(0, 200, 0, 0.8)' oklab
12//! ```
13
14use color::{ColorSpaceTag, HueDirection};
15
16fn main() {
17    let mut args = std::env::args().skip(1);
18    let c1_s = args.next().expect("give color as arg");
19    let c1 = color::parse_color(&c1_s).expect("error parsing color 1");
20    let c2_s = args.next().expect("give 2 colors as arg");
21    let c2 = color::parse_color(&c2_s).expect("error parsing color 2");
22    let cs_s_raw = args.next();
23    let cs_s = cs_s_raw.as_deref().unwrap_or("srgb");
24    let cs: ColorSpaceTag = cs_s.parse().expect("error parsing color space");
25    const N: usize = 20;
26    println!("<!DOCTYPE html>");
27    println!("<html>");
28    println!("<head>");
29    println!("<style>");
30    println!("div.g {{ height: 100px }}");
31    let pct = 100.0 / N as f64;
32    println!("span {{ width: {pct}%; display: inline-block; height: 100px; margin: 0 }}");
33    let interpolator = c1.interpolate(c2, cs, HueDirection::default());
34    for i in 0..=N {
35        let t = i as f32 / (N as f32);
36        let c = interpolator.eval(t);
37        if i == 0 || i == N {
38            println!("#s{i} {{ background: {c}; width: {}% }}", pct / 2.0);
39        } else {
40            println!("#s{i} {{ background: {c} }}");
41        }
42    }
43    println!("#basic {{ background: linear-gradient(to right in {cs_s}, {c1_s}, {c2_s}) }}");
44    println!("</style>");
45    println!("</head>");
46    println!("<body>");
47    println!("<div>{c1_s} {c2_s} {cs_s}</div>");
48    println!("<div class='g' id='basic'></div>");
49    println!("<div class='g'>");
50    for i in 0..=N {
51        print!("<span id='s{i}'></span>");
52    }
53    println!();
54    println!("</div>");
55    println!("</body>");
56    println!("</html>");
57}