aboutsummaryrefslogtreecommitdiff
path: root/vendor/exr/examples/5c_write_mip_maps.rs
blob: 1096c4eebb50d76bf53fcb8a96122ea8b0877901 (plain) (blame)
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
extern crate smallvec;
extern crate rand;
extern crate half;


// exr imports
extern crate exr;



/// Writes two layers, each with multiple mip maps.
/// All mip maps have solid color for brevity.
fn main() {
    use exr::prelude::*;
    use exr::math::RoundingMode;
    use smallvec::smallvec;

    let full_size = Vec2(512, 512);
    let size_rounding = RoundingMode::Up;

    let mip_levels_sizes = exr::meta::mip_map_levels(
        size_rounding, full_size
    ).collect::<Vec<_>>();

    let red_mip_levels = mip_levels_sizes.iter()
        .map(|(_index, level_size)|{
            FlatSamples::F32(vec![0.1_f32; level_size.area() ])
        })
        .collect();

    let green_mip_levels = mip_levels_sizes.iter()
        .map(|(_index, level_size)|{
            FlatSamples::F32(vec![0.6_f32; level_size.area() ])
        })
        .collect();

    let blue_mip_levels = mip_levels_sizes.iter()
        .map(|(_index, level_size)|{
            FlatSamples::F32(vec![1.0_f32; level_size.area() ])
        })
        .collect();

    let rgb_mip_maps = AnyChannels::sort(smallvec![
        AnyChannel::new("R", Levels::Mip { level_data: red_mip_levels, rounding_mode: size_rounding }),
        AnyChannel::new("G", Levels::Mip { level_data: green_mip_levels, rounding_mode: size_rounding }),
        AnyChannel::new("B", Levels::Mip { level_data: blue_mip_levels, rounding_mode: size_rounding }),
    ]);

    let layer1 = Layer::new(
        full_size,
        LayerAttributes::named("teal rgb"),
        Encoding::FAST_LOSSLESS,
        rgb_mip_maps
    );

    let mut layer2 = layer1.clone();
    layer2.attributes.layer_name = Some("Copied Layer".into());
    layer2.encoding = Encoding::SMALL_FAST_LOSSLESS;

    // define the visible area of the canvas
    let image_attributes = ImageAttributes::new(
        IntegerBounds::from_dimensions(full_size)
    );

    let image = Image::empty(image_attributes)
        .with_layer(layer1).with_layer(layer2);

    println!("writing image...");
    image.write().to_file("mip_maps.exr").unwrap();

    println!("created file mip_maps.exr");
}