icns_rs/lib.rs
1pub mod builder;
2pub mod encode;
3pub mod formats;
4pub mod packbits;
5
6use builder::ImageBuilder;
7use encode::IconFamily;
8pub use formats::IconFormats;
9use image::DynamicImage;
10
11/// The main encoder struct
12/// Create a new encoder with `IcnsEncoder::new()`
13pub struct IcnsEncoder {
14 data: DynamicImage,
15 formats: Vec<IconFormats>,
16}
17
18impl IcnsEncoder {
19 /// Creates a new IcnsEncoder
20 ///
21 /// Usage:
22 /// ```no_run
23 /// use icns_rs::{IcnsEncoder, IconFormats};
24 /// use image::open;
25 /// use std::fs::File;
26 /// use std::io::prelude::*;
27 ///
28 /// // Open the image
29 /// let image = match open("512x512@2.png") {
30 /// Ok(image) => image,
31 /// Err(e) => {
32 /// println!("Error: {}", e);
33 /// std::process::exit(1);
34 /// }
35 /// };
36 ///
37 /// // Create the encoder
38 /// let mut encoder = IcnsEncoder::new();
39 ///
40 /// encoder.data(image);
41 /// encoder.formats(IconFormats::recommended());
42 ///
43 /// // Encode the image
44 /// let data = match encoder.build() {
45 /// Ok(data) => data,
46 /// Err(e) => {
47 /// println!("Error ould not encode image");
48 /// std::process::exit(1);
49 /// }
50 /// };
51 ///
52 /// // Write data to file
53 /// let mut file = match File::create("example.icns") {
54 /// Ok(file) => file,
55 /// Err(e) => {
56 /// println!("Error: {}", e);
57 /// std::process::exit(1);
58 /// }
59 /// };
60 ///
61 /// match file.write_all(&data) {
62 /// Ok(_) => println!("Successfully wrote to file"),
63 /// Err(e) => {
64 /// println!("Error: {}", e);
65 /// std::process::exit(1);
66 /// }
67 /// };
68 /// ```
69 pub fn new() -> Self {
70 Self {
71 data: DynamicImage::new_rgb8(1, 1),
72 formats: Vec::new(),
73 }
74 }
75
76 /// Sets the image data. Encode a png and pass it as a DynamicImage.
77 pub fn data(&mut self, data: DynamicImage) -> &mut Self {
78 self.data = data;
79
80 self
81 }
82
83 /// Sets the image formats to be encoded
84 pub fn formats(&mut self, formats: Vec<IconFormats>) -> &mut Self {
85 self.formats = formats;
86
87 self
88 }
89
90 /// Encodes the image as an ICNS file
91 pub fn build(&self) -> Result<Box<[u8]>, String> {
92 let mut file = IconFamily::new();
93
94 let mut image_encoder = ImageBuilder::new();
95 image_encoder.data(self.data.clone());
96
97 for format in &self.formats {
98 let image = image_encoder.format(format.clone()).build()?;
99
100 file.add_data(image);
101 }
102
103 Ok(file.build())
104 }
105}