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
// SPDX-FileCopyrightText: 2024 Shun Sakai
//
// SPDX-License-Identifier: Apache-2.0 OR MIT
//! The `xbm` crate is a [XBM] encoding and decoding library.
//!
//! This crate supports the [X version 11 bitmap file format].
//!
//! The width and the height of XBM are unlimited, but in this crate they are
//! limited to [`u32`].
//!
//! # Examples
//!
//! ## Encoding a XBM file
//!
//! ```
//! use std::io::Write;
//!
//! use xbm::Encoder;
//!
//! // "B" (8x7)
//! let pixels = b"\x00\x00\x00\x00\x00\x00\x00\x00\
//! \x00\x00\x01\x01\x01\x00\x00\x00\
//! \x00\x00\x01\x00\x00\x01\x00\x00\
//! \x00\x00\x01\x01\x01\x00\x00\x00\
//! \x00\x00\x01\x00\x00\x01\x00\x00\
//! \x00\x00\x01\x01\x01\x00\x00\x00\
//! \x00\x00\x00\x00\x00\x00\x00\x00";
//!
//! let mut buf = [u8::default(); 131];
//! let encoder = Encoder::new(buf.as_mut_slice());
//! encoder.encode(pixels, "image", 8, 7, None, None).unwrap();
//! assert_eq!(buf, *include_bytes!("../tests/data/basic.xbm"));
//! ```
//!
//! ### `image` crate support
//!
//! ```
//! # #[cfg(feature = "image")]
//! # {
//! use std::io::Write;
//!
//! use xbm::Encoder;
//!
//! let input = image::open("tests/data/qr_code.png").unwrap();
//!
//! let mut buf = Vec::with_capacity(69453);
//! let encoder = Encoder::new(buf.by_ref());
//! input.write_with_encoder(encoder).unwrap();
//! assert_eq!(buf, include_bytes!("../tests/data/qr_code.xbm"));
//! # }
//! ```
//!
//! ## Decoding a XBM file
//!
//! ```
//! use std::{fs::File, io::BufReader};
//!
//! use xbm::Decoder;
//!
//! // "B" (8x7)
//! let expected = b"\x00\x00\x00\x00\x00\x00\x00\x00\
//! \x00\x00\x01\x01\x01\x00\x00\x00\
//! \x00\x00\x01\x00\x00\x01\x00\x00\
//! \x00\x00\x01\x01\x01\x00\x00\x00\
//! \x00\x00\x01\x00\x00\x01\x00\x00\
//! \x00\x00\x01\x01\x01\x00\x00\x00\
//! \x00\x00\x00\x00\x00\x00\x00\x00";
//!
//! let reader = File::open("tests/data/basic.xbm")
//! .map(BufReader::new)
//! .unwrap();
//! let decoder = Decoder::new(reader).unwrap();
//! assert_eq!(decoder.width(), 8);
//! assert_eq!(decoder.height(), 7);
//!
//! let mut buf = [u8::default(); 56];
//! decoder.decode(&mut buf).unwrap();
//! assert_eq!(buf, *expected);
//! ```
//!
//! ### `image` crate support
//!
//! ```
//! # #[cfg(feature = "image")]
//! # {
//! use std::{
//! fs::File,
//! io::{BufReader, Cursor},
//! };
//!
//! use xbm::{
//! Decoder,
//! image::{DynamicImage, ImageDecoder, ImageFormat},
//! };
//!
//! let reader = File::open("tests/data/qr_code.xbm")
//! .map(BufReader::new)
//! .unwrap();
//! let decoder = Decoder::new(reader).unwrap();
//! assert_eq!(decoder.dimensions(), (296, 296));
//! let image = DynamicImage::from_decoder(decoder).unwrap();
//!
//! let mut writer = Cursor::new(Vec::with_capacity(2091));
//! image.write_to(&mut writer, ImageFormat::Png).unwrap();
//!
//! let actual = image::load_from_memory(writer.get_ref()).unwrap();
//! let expected = image::open("tests/data/qr_code.png").unwrap();
//! assert_eq!(actual, expected);
//! # }
//! ```
//!
//! [XBM]: https://en.wikipedia.org/wiki/X_BitMap
//! [X version 11 bitmap file format]: https://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html#Manipulating_Bitmaps
// Lint levels of rustc.
pub use image;
pub use crate::;