1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#[cfg(feature = "ggr")]
use std::io::BufReader;
#[cfg(feature = "ggr")]
use colorgrad::{Color, GimpGradient, Gradient};
#[cfg(feature = "ggr")]
#[test]
fn parse_gimp_gradients() {
let col = Color::default();
let red = Color::new(1.0, 0.0, 0.0, 1.0);
let blue = Color::new(0.0, 0.0, 1.0, 1.0);
// Black to white
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 0 0";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &col, &col).unwrap();
assert_eq!(grad.name(), "My Gradient");
assert_eq!(grad.domain(), (0.0, 1.0));
assert_eq!(grad.at(0.0).to_rgba8(), [0, 0, 0, 255]);
assert_eq!(grad.at(1.0).to_rgba8(), [255, 255, 255, 255]);
assert_eq!(grad.at(-0.5).to_rgba8(), [0, 0, 0, 255]);
assert_eq!(grad.at(1.5).to_rgba8(), [0, 0, 0, 255]);
assert_eq!(grad.at(f32::NAN).to_rgba8(), [0, 0, 0, 255]);
// Foreground to background
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 1 3";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &red, &blue).unwrap();
assert_eq!(grad.at(0.0).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(1.0).to_rgba8(), [0, 0, 255, 255]);
// Background to foreground
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 3 1";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &red, &blue).unwrap();
assert_eq!(grad.at(0.0).to_rgba8(), [0, 0, 255, 255]);
assert_eq!(grad.at(1.0).to_rgba8(), [255, 0, 0, 255]);
// Foreground transparent to background transparent
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 2 4";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &red, &blue).unwrap();
assert_eq!(grad.at(0.0).to_rgba8(), [255, 0, 0, 0]);
assert_eq!(grad.at(1.0).to_rgba8(), [0, 0, 255, 0]);
// Background transparent to foreground transparent
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 4 2";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &red, &blue).unwrap();
assert_eq!(grad.at(0.0).to_rgba8(), [0, 0, 255, 0]);
assert_eq!(grad.at(1.0).to_rgba8(), [255, 0, 0, 0]);
// Blending function: step
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 1 0 0 1 0 0 1 1 5 0 0 0";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &col, &col).unwrap();
assert_eq!(grad.at(0.00).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(0.25).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(0.49).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(0.51).to_rgba8(), [0, 0, 255, 255]);
assert_eq!(grad.at(0.75).to_rgba8(), [0, 0, 255, 255]);
assert_eq!(grad.at(1.00).to_rgba8(), [0, 0, 255, 255]);
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.75 1 1 0 0 1 0 0 1 1 5 0 0 0";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &col, &col).unwrap();
assert_eq!(grad.at(0.00).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(0.25).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(0.50).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(0.74).to_rgba8(), [255, 0, 0, 255]);
assert_eq!(grad.at(0.76).to_rgba8(), [0, 0, 255, 255]);
assert_eq!(grad.at(0.90).to_rgba8(), [0, 0, 255, 255]);
assert_eq!(grad.at(1.00).to_rgba8(), [0, 0, 255, 255]);
// Coloring type: HSV CCW (white to blue)
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 1 1 1 1 0 0 1 1 0 1 0 0";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &red, &blue).unwrap();
assert_eq!(grad.at(0.0).to_rgba8(), [255, 255, 255, 255]);
assert_eq!(grad.at(0.5).to_rgba8(), [128, 255, 128, 255]);
assert_eq!(grad.at(1.0).to_rgba8(), [0, 0, 255, 255]);
// Coloring type: HSV CW (white to blue)
let ggr = "GIMP Gradient\nName: My Gradient\n1\n0 0.5 1 1 1 1 1 0 0 1 1 0 2 0 0";
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &red, &blue).unwrap();
assert_eq!(grad.at(0.0).to_rgba8(), [255, 255, 255, 255]);
assert_eq!(grad.at(0.5).to_rgba8(), [255, 128, 255, 255]);
assert_eq!(grad.at(1.0).to_rgba8(), [0, 0, 255, 255]);
// UTF-8 with BOM
let ggr = include_str!("../examples/ggr/UTF_8_BOM.ggr");
let grad = GimpGradient::new(BufReader::new(ggr.as_bytes()), &red, &blue).unwrap();
assert_eq!(grad.name(), "Pelangi");
assert_eq!(grad.at(0.0).to_rgba8(), [36, 87, 158, 255]);
assert_eq!(grad.at(1.0).to_rgba8(), [72, 120, 168, 255]);
}
#[cfg(feature = "ggr")]
#[test]
fn invalid_format() {
let col = Color::default();
let test_data = vec![
("GIMP Pallete\n9", "invalid header (line 1)"),
("GIMP Gradient\n6", "invalid header (line 2)"),
(
"GIMP Gradient\nName: Gradient\nx",
"invalid header (line 3)",
),
(
"GIMP Gradient\nName: Gradient\n1\n0 0.5 1",
"invalid segment (line 4)",
),
(
"GIMP Gradient\nName: Gradient\n3\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 0 0",
"wrong segments count (line 3)",
),
("GIMP Gradient\nName: Gradient\n0", "no segment (line 4)"),
];
for (ggr, err_msg) in test_data {
let res = GimpGradient::new(BufReader::new(ggr.as_bytes()), &col, &col);
assert_eq!(res.unwrap_err().to_string(), err_msg);
}
let invalid_segments = vec![
"GIMP Gradient\nName: Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 6 0 0 0",
"GIMP Gradient\nName: Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 3 0 0",
"GIMP Gradient\nName: Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 5 0",
"GIMP Gradient\nName: Gradient\n1\n0 0.5 1 0 0 0 1 1 1 1 1 0 0 0 5",
"GIMP Gradient\nName: Gradient\n1\n0 0.5 1 0 0 0 A 1 1 1 A 0 0 0 0",
];
for ggr in invalid_segments {
let res = GimpGradient::new(BufReader::new(ggr.as_bytes()), &col, &col);
assert!(res.is_err());
}
}
|