Skip to content

Commit 51383ac

Browse files
authored
Merge pull request #41 from ShadowMitia/add-feature-flag-formats
Add features flags for each image format
2 parents 017b33d + 014f741 commit 51383ac

File tree

27 files changed

+211
-1
lines changed

27 files changed

+211
-1
lines changed

Cargo.toml

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,52 @@ walkdir = "2.3"
2020

2121
[[bench]]
2222
name = "parse_benchmark"
23-
harness = false
23+
harness = false
24+
25+
[features]
26+
default = [
27+
"aesprite",
28+
"bmp",
29+
"dds",
30+
"exr",
31+
"farbfeld",
32+
"gif",
33+
"hdr",
34+
"ico",
35+
"ilbm",
36+
"jpeg",
37+
"jxl",
38+
"ktx2",
39+
"mod",
40+
"png",
41+
"pnm",
42+
"psd",
43+
"qoi",
44+
"tga",
45+
"tiff",
46+
"vtf",
47+
"webp",
48+
"heif",
49+
]
50+
aesprite = []
51+
bmp = []
52+
dds = []
53+
exr = []
54+
farbfeld = []
55+
gif = []
56+
hdr = []
57+
ico = []
58+
ilbm = []
59+
jpeg = []
60+
jxl = []
61+
ktx2 = []
62+
mod = []
63+
png = []
64+
pnm = []
65+
psd = []
66+
qoi = []
67+
tga = []
68+
tiff = []
69+
vtf = []
70+
webp = []
71+
heif = []

src/formats/mod.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,42 @@
1+
#[cfg(feature = "aesprite")]
12
pub mod aesprite;
3+
#[cfg(feature = "bmp")]
24
pub mod bmp;
5+
#[cfg(feature = "dds")]
36
pub mod dds;
7+
#[cfg(feature = "exr")]
48
pub mod exr;
9+
#[cfg(feature = "farbfeld")]
510
pub mod farbfeld;
11+
#[cfg(feature = "gif")]
612
pub mod gif;
13+
#[cfg(feature = "hdr")]
714
pub mod hdr;
15+
#[cfg(feature = "ico")]
816
pub mod ico;
17+
#[cfg(feature = "ilbm")]
918
pub mod ilbm;
19+
#[cfg(feature = "jpeg")]
1020
pub mod jpeg;
21+
#[cfg(feature = "jxl")]
1122
pub mod jxl;
23+
#[cfg(feature = "ktx2")]
1224
pub mod ktx2;
25+
#[cfg(feature = "png")]
1326
pub mod png;
27+
#[cfg(feature = "pnm")]
1428
pub mod pnm;
29+
#[cfg(feature = "psd")]
1530
pub mod psd;
31+
#[cfg(feature = "qoi")]
1632
pub mod qoi;
33+
#[cfg(feature = "tga")]
1734
pub mod tga;
35+
#[cfg(feature = "tiff")]
1836
pub mod tiff;
37+
#[cfg(feature = "vtf")]
1938
pub mod vtf;
39+
#[cfg(feature = "webp")]
2040
pub mod webp;
2141

2242
use crate::{container, ImageError, ImageResult, ImageType};
@@ -35,87 +55,108 @@ pub fn image_type<R: BufRead + Seek>(reader: &mut R) -> ImageResult<ImageType> {
3555

3656
// This is vaguely organized in what I assume are the most commonly used formats.
3757
// I don't know how much this matters for actual execution time.
58+
#[cfg(feature = "jpeg")]
3859
if jpeg::matches(&header) {
3960
return Ok(ImageType::Jpeg);
4061
}
4162

63+
#[cfg(feature = "png")]
4264
if png::matches(&header) {
4365
return Ok(ImageType::Png);
4466
}
4567

68+
#[cfg(feature = "gif")]
4669
if gif::matches(&header) {
4770
return Ok(ImageType::Gif);
4871
}
4972

73+
#[cfg(feature = "tiff")]
5074
if tiff::matches(&header) {
5175
return Ok(ImageType::Tiff);
5276
}
5377

78+
#[cfg(feature = "webp")]
5479
if webp::matches(&header) {
5580
return Ok(ImageType::Webp);
5681
}
5782

83+
#[cfg(feature = "heif")]
5884
if let Some(c) = container::heif::matches(&header, reader) {
5985
return Ok(ImageType::Heif(c));
6086
}
6187

88+
#[cfg(feature = "jxl")]
6289
if jxl::matches(&header) {
6390
return Ok(ImageType::Jxl);
6491
}
6592

93+
#[cfg(feature = "bmp")]
6694
if bmp::matches(&header) {
6795
return Ok(ImageType::Bmp);
6896
}
6997

98+
#[cfg(feature = "psd")]
7099
if psd::matches(&header) {
71100
return Ok(ImageType::Psd);
72101
}
73102

103+
#[cfg(feature = "ico")]
74104
if ico::matches(&header) {
75105
return Ok(ImageType::Ico);
76106
}
77107

108+
#[cfg(feature = "aesprite")]
78109
if aesprite::matches(&header) {
79110
return Ok(ImageType::Aseprite);
80111
}
81112

113+
#[cfg(feature = "exr")]
82114
if exr::matches(&header) {
83115
return Ok(ImageType::Exr);
84116
}
85117

118+
#[cfg(feature = "hdr")]
86119
if hdr::matches(&header) {
87120
return Ok(ImageType::Hdr);
88121
}
89122

123+
#[cfg(feature = "dds")]
90124
if dds::matches(&header) {
91125
return Ok(ImageType::Dds);
92126
}
93127

128+
#[cfg(feature = "ktx2")]
94129
if ktx2::matches(&header) {
95130
return Ok(ImageType::Ktx2);
96131
}
97132

133+
#[cfg(feature = "qoi")]
98134
if qoi::matches(&header) {
99135
return Ok(ImageType::Qoi);
100136
}
101137

138+
#[cfg(feature = "farbfeld")]
102139
if farbfeld::matches(&header) {
103140
return Ok(ImageType::Farbfeld);
104141
}
105142

143+
#[cfg(feature = "pnm")]
106144
if pnm::matches(&header) {
107145
return Ok(ImageType::Pnm);
108146
}
109147

148+
#[cfg(feature = "vtf")]
110149
if vtf::matches(&header) {
111150
return Ok(ImageType::Vtf);
112151
}
113152

153+
#[cfg(feature = "ilbm")]
114154
if ilbm::matches(&header) {
115155
return Ok(ImageType::Ilbm);
116156
}
117157

118158
// Keep TGA last because it has the highest probability of false positives
159+
#[cfg(feature = "tga")]
119160
if tga::matches(&header, reader) {
120161
return Ok(ImageType::Tga);
121162
}

src/lib.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![allow(dead_code)]
2+
13
use std::error::Error;
24
use std::fmt;
35
use std::fs::File;
@@ -52,48 +54,69 @@ pub type ImageResult<T> = Result<T, ImageError>;
5254
pub enum ImageType {
5355
/// Animated sprite image format
5456
/// <https://github.com/aseprite/aseprite>
57+
#[cfg(feature = "aesprite")]
5558
Aseprite,
5659
/// Standard Bitmap
60+
#[cfg(feature = "bmp")]
5761
Bmp,
5862
/// DirectDraw Surface
63+
#[cfg(feature = "dds")]
5964
Dds,
6065
/// OpenEXR
66+
#[cfg(feature = "exr")]
6167
Exr,
6268
/// Farbfeld
6369
/// <https://tools.suckless.org/farbfeld/>
70+
#[cfg(feature = "farbfeld")]
6471
Farbfeld,
6572
/// Standard GIF
73+
#[cfg(feature = "gif")]
6674
Gif,
6775
/// Radiance HDR
76+
#[cfg(feature = "hdr")]
6877
Hdr,
6978
/// Image Container Format
79+
#[cfg(feature = "heif")]
7080
Heif(Compression),
7181
/// Icon file
82+
#[cfg(feature = "ico")]
7283
Ico,
7384
/// Interleaved Bitmap
85+
#[cfg(feature = "ilbm")]
7486
Ilbm,
7587
/// Standard JPEG
88+
#[cfg(feature = "jpeg")]
7689
Jpeg,
7790
/// JPEG XL
91+
#[cfg(feature = "jxl")]
7892
Jxl,
7993
/// Khronos Texture Container
94+
#[cfg(feature = "ktx2")]
8095
Ktx2,
8196
/// Standard PNG
97+
#[cfg(feature = "png")]
8298
Png,
8399
/// Portable Any Map
100+
#[cfg(feature = "pnm")]
84101
Pnm,
85102
/// Photoshop Document
103+
#[cfg(feature = "psd")]
86104
Psd,
87105
/// Quite OK Image Format
88106
/// <https://qoiformat.org/>
107+
#[cfg(feature = "qoi")]
89108
Qoi,
90109
/// Truevision Graphics Adapter
110+
#[cfg(feature = "tga")]
91111
Tga,
92112
/// Standard TIFF
113+
#[cfg(feature = "tiff")]
93114
Tiff,
94115
/// Valve Texture Format
116+
#[cfg(feature = "vtf")]
95117
Vtf,
96118
/// Standard Webp
119+
#[cfg(feature = "webp")]
97120
Webp,
98121
}
99122

@@ -253,27 +276,48 @@ pub fn reader_size<R: BufRead + Seek>(mut reader: R) -> ImageResult<ImageSize> {
253276
/// * `header` - The header of the file
254277
fn dispatch_header<R: BufRead + Seek>(reader: &mut R) -> ImageResult<ImageSize> {
255278
match formats::image_type(reader)? {
279+
#[cfg(feature = "aesprite")]
256280
ImageType::Aseprite => aesprite::size(reader),
281+
#[cfg(feature = "bmp")]
257282
ImageType::Bmp => bmp::size(reader),
283+
#[cfg(feature = "dds")]
258284
ImageType::Dds => dds::size(reader),
285+
#[cfg(feature = "exr")]
259286
ImageType::Exr => exr::size(reader),
287+
#[cfg(feature = "farbfeld")]
260288
ImageType::Farbfeld => farbfeld::size(reader),
289+
#[cfg(feature = "gif")]
261290
ImageType::Gif => gif::size(reader),
291+
#[cfg(feature = "hdr")]
262292
ImageType::Hdr => hdr::size(reader),
293+
#[cfg(feature = "ico")]
263294
ImageType::Ico => ico::size(reader),
295+
#[cfg(feature = "ilbm")]
264296
ImageType::Ilbm => ilbm::size(reader),
297+
#[cfg(feature = "jpeg")]
265298
ImageType::Jpeg => jpeg::size(reader),
299+
#[cfg(feature = "jxl")]
266300
ImageType::Jxl => jxl::size(reader),
301+
#[cfg(feature = "ktx2")]
267302
ImageType::Ktx2 => ktx2::size(reader),
303+
#[cfg(feature = "png")]
268304
ImageType::Png => png::size(reader),
305+
#[cfg(feature = "pnm")]
269306
ImageType::Pnm => pnm::size(reader),
307+
#[cfg(feature = "psd")]
270308
ImageType::Psd => psd::size(reader),
309+
#[cfg(feature = "qoi")]
271310
ImageType::Qoi => qoi::size(reader),
311+
#[cfg(feature = "tga")]
272312
ImageType::Tga => tga::size(reader),
313+
#[cfg(feature = "tiff")]
273314
ImageType::Tiff => tiff::size(reader),
315+
#[cfg(feature = "vtf")]
274316
ImageType::Vtf => vtf::size(reader),
317+
#[cfg(feature = "webp")]
275318
ImageType::Webp => webp::size(reader),
276319

320+
#[cfg(feature = "heif")]
277321
ImageType::Heif(..) => heif::size(reader),
278322
}
279323
}

tests/aseprite.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use imagesize::{size, ImageSize};
33

44
#[test]
5+
#[cfg(feature = "aesprite")]
56
fn aseprite_test() {
67
let dim = size("tests/images/aseprite/1.ase").unwrap();
78

tests/avif.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use imagesize::{image_type, size, Compression, ImageSize, ImageType};
33

44
#[test]
5+
#[cfg(feature = "heif")]
56
fn avif_test() {
67
let dim = size("tests/images/avif/test.avif").unwrap();
78
assert_eq!(
@@ -14,6 +15,7 @@ fn avif_test() {
1415
}
1516

1617
#[test]
18+
#[cfg(feature = "heif")]
1719
fn avif_multi_picks_largest() {
1820
let dim = size("tests/images/avif/test.avifs").unwrap();
1921
assert_eq!(
@@ -26,6 +28,7 @@ fn avif_multi_picks_largest() {
2628
}
2729

2830
#[test]
31+
#[cfg(feature = "heif")]
2932
fn avif_type() {
3033
use std::{fs::File, io::Read};
3134

@@ -38,6 +41,7 @@ fn avif_type() {
3841
}
3942

4043
#[test]
44+
#[cfg(feature = "heif")]
4145
fn avif_seq_type() {
4246
use std::{fs::File, io::Read};
4347

tests/blob.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use imagesize::{blob_size, ImageSize};
33

44
#[test]
5+
#[cfg(feature = "png")]
56
fn blob_test() {
67
// PNG Header with size 123x321
78
#[rustfmt::skip]
@@ -45,6 +46,7 @@ fn gif_blob_too_small_test() {
4546
}
4647

4748
#[test]
49+
#[cfg(feature = "ico")]
4850
fn blob_test_partial_ico() {
4951
#[rustfmt::skip]
5052
let data = vec![

tests/bmp.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use imagesize::{size, ImageSize};
33

44
#[test]
5+
#[cfg(feature = "bmp")]
56
fn bmp_test() {
67
let dim = size("tests/images/bmp/test.bmp").unwrap();
78
assert_eq!(

0 commit comments

Comments
 (0)