File: g_gimp.rs

package info (click to toggle)
rust-colorgrad 0.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 364 kB
  • sloc: makefile: 15
file content (140 lines) | stat: -rw-r--r-- 5,986 bytes parent folder | download
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());
    }
}