Skip to main content

tiff_core/
constants.rs

1// Well-known TIFF tag codes.
2pub const TAG_NEW_SUBFILE_TYPE: u16 = 254;
3pub const TAG_SUBFILE_TYPE: u16 = 255;
4pub const TAG_IMAGE_WIDTH: u16 = 256;
5pub const TAG_IMAGE_LENGTH: u16 = 257;
6pub const TAG_BITS_PER_SAMPLE: u16 = 258;
7pub const TAG_COMPRESSION: u16 = 259;
8pub const TAG_PHOTOMETRIC_INTERPRETATION: u16 = 262;
9pub const TAG_STRIP_OFFSETS: u16 = 273;
10pub const TAG_SAMPLES_PER_PIXEL: u16 = 277;
11pub const TAG_ROWS_PER_STRIP: u16 = 278;
12pub const TAG_STRIP_BYTE_COUNTS: u16 = 279;
13pub const TAG_PLANAR_CONFIGURATION: u16 = 284;
14pub const TAG_PREDICTOR: u16 = 317;
15pub const TAG_TILE_WIDTH: u16 = 322;
16pub const TAG_TILE_LENGTH: u16 = 323;
17pub const TAG_TILE_OFFSETS: u16 = 324;
18pub const TAG_TILE_BYTE_COUNTS: u16 = 325;
19pub const TAG_SAMPLE_FORMAT: u16 = 339;
20pub const TAG_JPEG_TABLES: u16 = 347;
21
22/// TIFF compression scheme.
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24pub enum Compression {
25    None,
26    Lzw,
27    OldJpeg,
28    Jpeg,
29    Deflate,
30    PackBits,
31    DeflateOld,
32    Zstd,
33}
34
35impl Compression {
36    pub fn from_code(code: u16) -> Option<Self> {
37        match code {
38            1 => Some(Self::None),
39            5 => Some(Self::Lzw),
40            6 => Some(Self::OldJpeg),
41            7 => Some(Self::Jpeg),
42            8 => Some(Self::Deflate),
43            32773 => Some(Self::PackBits),
44            32946 => Some(Self::DeflateOld),
45            50000 => Some(Self::Zstd),
46            _ => None,
47        }
48    }
49
50    pub fn to_code(self) -> u16 {
51        match self {
52            Self::None => 1,
53            Self::Lzw => 5,
54            Self::OldJpeg => 6,
55            Self::Jpeg => 7,
56            Self::Deflate => 8,
57            Self::PackBits => 32773,
58            Self::DeflateOld => 32946,
59            Self::Zstd => 50000,
60        }
61    }
62}
63
64/// TIFF predictor scheme.
65#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
66pub enum Predictor {
67    None,
68    Horizontal,
69    FloatingPoint,
70}
71
72impl Predictor {
73    pub fn from_code(code: u16) -> Option<Self> {
74        match code {
75            1 => Some(Self::None),
76            2 => Some(Self::Horizontal),
77            3 => Some(Self::FloatingPoint),
78            _ => None,
79        }
80    }
81
82    pub fn to_code(self) -> u16 {
83        match self {
84            Self::None => 1,
85            Self::Horizontal => 2,
86            Self::FloatingPoint => 3,
87        }
88    }
89}
90
91/// TIFF sample format.
92#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
93pub enum SampleFormat {
94    Uint,
95    Int,
96    Float,
97}
98
99impl SampleFormat {
100    pub fn from_code(code: u16) -> Option<Self> {
101        match code {
102            1 => Some(Self::Uint),
103            2 => Some(Self::Int),
104            3 => Some(Self::Float),
105            _ => None,
106        }
107    }
108
109    pub fn to_code(self) -> u16 {
110        match self {
111            Self::Uint => 1,
112            Self::Int => 2,
113            Self::Float => 3,
114        }
115    }
116}
117
118/// TIFF photometric interpretation.
119#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
120pub enum PhotometricInterpretation {
121    MinIsWhite,
122    MinIsBlack,
123    Rgb,
124    Palette,
125    Mask,
126}
127
128impl PhotometricInterpretation {
129    pub fn from_code(code: u16) -> Option<Self> {
130        match code {
131            0 => Some(Self::MinIsWhite),
132            1 => Some(Self::MinIsBlack),
133            2 => Some(Self::Rgb),
134            3 => Some(Self::Palette),
135            4 => Some(Self::Mask),
136            _ => None,
137        }
138    }
139
140    pub fn to_code(self) -> u16 {
141        match self {
142            Self::MinIsWhite => 0,
143            Self::MinIsBlack => 1,
144            Self::Rgb => 2,
145            Self::Palette => 3,
146            Self::Mask => 4,
147        }
148    }
149}
150
151/// TIFF planar configuration.
152#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
153pub enum PlanarConfiguration {
154    Chunky,
155    Planar,
156}
157
158impl PlanarConfiguration {
159    pub fn from_code(code: u16) -> Option<Self> {
160        match code {
161            1 => Some(Self::Chunky),
162            2 => Some(Self::Planar),
163            _ => None,
164        }
165    }
166
167    pub fn to_code(self) -> u16 {
168        match self {
169            Self::Chunky => 1,
170            Self::Planar => 2,
171        }
172    }
173}