/rust/registry/src/index.crates.io-1949cf8c6b5b557f/png-0.18.0/src/chunk.rs
Line | Count | Source |
1 | | //! Chunk types and functions |
2 | | #![allow(dead_code)] |
3 | | #![allow(non_upper_case_globals)] |
4 | | use core::fmt; |
5 | | |
6 | | #[derive(Clone, Copy, PartialEq, Eq, Hash)] |
7 | | pub struct ChunkType(pub [u8; 4]); |
8 | | |
9 | | // -- Critical chunks -- |
10 | | |
11 | | /// Image header |
12 | | pub const IHDR: ChunkType = ChunkType(*b"IHDR"); |
13 | | /// Palette |
14 | | pub const PLTE: ChunkType = ChunkType(*b"PLTE"); |
15 | | /// Image data |
16 | | pub const IDAT: ChunkType = ChunkType(*b"IDAT"); |
17 | | /// Image trailer |
18 | | pub const IEND: ChunkType = ChunkType(*b"IEND"); |
19 | | |
20 | | // -- Ancillary chunks -- |
21 | | |
22 | | /// Transparency |
23 | | pub const tRNS: ChunkType = ChunkType(*b"tRNS"); |
24 | | /// Background colour |
25 | | pub const bKGD: ChunkType = ChunkType(*b"bKGD"); |
26 | | /// Image last-modification time |
27 | | pub const tIME: ChunkType = ChunkType(*b"tIME"); |
28 | | /// Physical pixel dimensions |
29 | | pub const pHYs: ChunkType = ChunkType(*b"pHYs"); |
30 | | /// Source system's pixel chromaticities |
31 | | pub const cHRM: ChunkType = ChunkType(*b"cHRM"); |
32 | | /// Source system's gamma value |
33 | | pub const gAMA: ChunkType = ChunkType(*b"gAMA"); |
34 | | /// sRGB color space chunk |
35 | | pub const sRGB: ChunkType = ChunkType(*b"sRGB"); |
36 | | /// ICC profile chunk |
37 | | pub const iCCP: ChunkType = ChunkType(*b"iCCP"); |
38 | | /// Coding-independent code points for video signal type identification chunk |
39 | | pub const cICP: ChunkType = ChunkType(*b"cICP"); |
40 | | /// Mastering Display Color Volume chunk |
41 | | pub const mDCV: ChunkType = ChunkType(*b"mDCV"); |
42 | | /// Content Light Level Information chunk |
43 | | pub const cLLI: ChunkType = ChunkType(*b"cLLI"); |
44 | | /// EXIF metadata chunk |
45 | | pub const eXIf: ChunkType = ChunkType(*b"eXIf"); |
46 | | /// Latin-1 uncompressed textual data |
47 | | pub const tEXt: ChunkType = ChunkType(*b"tEXt"); |
48 | | /// Latin-1 compressed textual data |
49 | | pub const zTXt: ChunkType = ChunkType(*b"zTXt"); |
50 | | /// UTF-8 textual data |
51 | | pub const iTXt: ChunkType = ChunkType(*b"iTXt"); |
52 | | // Significant bits |
53 | | pub const sBIT: ChunkType = ChunkType(*b"sBIT"); |
54 | | |
55 | | // -- Extension chunks -- |
56 | | |
57 | | /// Animation control |
58 | | pub const acTL: ChunkType = ChunkType(*b"acTL"); |
59 | | /// Frame control |
60 | | pub const fcTL: ChunkType = ChunkType(*b"fcTL"); |
61 | | /// Frame data |
62 | | pub const fdAT: ChunkType = ChunkType(*b"fdAT"); |
63 | | |
64 | | // -- Chunk type determination -- |
65 | | |
66 | | /// Returns true if the chunk is critical. |
67 | 75.5k | pub fn is_critical(ChunkType(type_): ChunkType) -> bool { |
68 | 75.5k | type_[0] & 32 == 0 |
69 | 75.5k | } |
70 | | |
71 | | /// Returns true if the chunk is private. |
72 | 0 | pub fn is_private(ChunkType(type_): ChunkType) -> bool { |
73 | 0 | type_[1] & 32 != 0 |
74 | 0 | } |
75 | | |
76 | | /// Checks whether the reserved bit of the chunk name is set. |
77 | | /// If it is set the chunk name is invalid. |
78 | 0 | pub fn reserved_set(ChunkType(type_): ChunkType) -> bool { |
79 | 0 | type_[2] & 32 != 0 |
80 | 0 | } |
81 | | |
82 | | /// Returns true if the chunk is safe to copy if unknown. |
83 | 0 | pub fn safe_to_copy(ChunkType(type_): ChunkType) -> bool { |
84 | 0 | type_[3] & 32 != 0 |
85 | 0 | } |
86 | | |
87 | | impl fmt::Debug for ChunkType { |
88 | 0 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
89 | | struct DebugType([u8; 4]); |
90 | | |
91 | | impl fmt::Debug for DebugType { |
92 | 0 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
93 | 0 | for &c in &self.0[..] { |
94 | 0 | write!(f, "{}", char::from(c).escape_debug())?; |
95 | | } |
96 | 0 | Ok(()) |
97 | 0 | } |
98 | | } |
99 | | |
100 | 0 | f.debug_struct("ChunkType") |
101 | 0 | .field("type", &DebugType(self.0)) |
102 | 0 | .field("critical", &is_critical(*self)) |
103 | 0 | .field("private", &is_private(*self)) |
104 | 0 | .field("reserved", &reserved_set(*self)) |
105 | 0 | .field("safecopy", &safe_to_copy(*self)) |
106 | 0 | .finish() |
107 | 0 | } |
108 | | } |