Skip to content

Commit 93a6333

Browse files
committed
Add XPM decoder
1 parent 86181f6 commit 93a6333

File tree

16 files changed

+1193
-2
lines changed

16 files changed

+1193
-2
lines changed

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@ publish = false
88
include = ["src", "tests/reference.rs"]
99

1010
[features]
11-
default = ["pcx", "xbm"]
11+
default = ["pcx", "xbm", "xpm"]
1212
pcx = ["dep:pcx"]
1313
xbm = []
14+
xpm = ["dep:x11r6colornames"]
1415

1516
[dependencies]
1617
image = { version = "0.25.5", default-features = false }
1718
pcx = { version = "0.2.4", optional = true }
19+
x11r6colornames = { git = "https://github.com/mstoeckl/x11r6colornames.git", version = "1.0.0", optional = true }
1820

1921
[dev-dependencies]
2022
image = { version = "0.25.5", default-features = false, features = ["png"] }

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Decoding support for additional image formats beyond those provided by the [`ima
77
| --------- | -------------------- |
88
| PCX | [Wikipedia](https://en.wikipedia.org/wiki/PCX#PCX_file_format) |
99
| XBM | [Wikipedia](https://en.wikipedia.org/wiki/X_BitMap) |
10+
| XPM | [Wikipedia](https://en.wikipedia.org/wiki/X_PixMap) |
1011

1112
## New Formats
1213

examples/convert.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ fn make_decoder(path: &Path) -> Result<Box<dyn ImageDecoder>, Box<dyn Error>> {
1414
Ok(match path.extension().and_then(|p| p.to_str()) {
1515
Some("pcx") => Box::new(image_extras::pcx::PCXDecoder::new(reader)?),
1616
Some("xbm") => Box::new(image_extras::xbm::XbmDecoder::new(reader)?),
17+
Some("xpm") => Box::new(image_extras::xpm::XpmDecoder::new(reader)?),
1718
_ => Box::new(ImageReader::new(reader).into_decoder()?),
1819
})
1920
}

fuzz/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ cargo-fuzz = true
1313
image = { version = "0.25.5", default-features = false }
1414
[dependencies.image-extras]
1515
path = ".."
16-
features = ["xbm"]
16+
features = ["xbm", "xpm"]
1717
[dependencies.libfuzzer-sys]
1818
version = "0.3"
1919

@@ -24,3 +24,7 @@ members = ["."]
2424
[[bin]]
2525
name = "fuzzer_script_xbm"
2626
path = "fuzzers/fuzzer_script_xbm.rs"
27+
28+
[[bin]]
29+
name = "fuzzer_script_xpm"
30+
path = "fuzzers/fuzzer_script_xpm.rs"

fuzz/fuzzers/fuzzer_script_xpm.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#![no_main]
2+
#[macro_use] extern crate libfuzzer_sys;
3+
extern crate image_extras;
4+
extern crate image;
5+
6+
use std::io::BufReader;
7+
use image::ImageDecoder;
8+
9+
fuzz_target!(|data: &[u8]| {
10+
let reader = BufReader::new(data);
11+
let Ok(mut decoder) = image_extras::xpm::XpmDecoder::new(reader) else {
12+
return;
13+
};
14+
let mut limits = image::Limits::default();
15+
limits.max_alloc = Some(1024 * 1024); // 1 MiB
16+
if limits.reserve(decoder.total_bytes()).is_err() {
17+
return;
18+
}
19+
if decoder.set_limits(limits).is_err() {
20+
return;
21+
}
22+
let _ = std::hint::black_box(image::DynamicImage::from_decoder(decoder));
23+
});

src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ pub mod pcx;
2121
#[cfg(feature = "xbm")]
2222
pub mod xbm;
2323

24+
#[cfg(feature = "xpm")]
25+
pub mod xpm;
26+
2427
/// Register all enabled extra formats with the image crate.
2528
pub fn register() {
2629
// NOTE: https://github.com/image-rs/image/pull/2372

0 commit comments

Comments
 (0)