/rust/registry/src/index.crates.io-6f17d22bba15001f/qoi-0.4.1/src/pixel.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use crate::consts::{QOI_OP_DIFF, QOI_OP_LUMA, QOI_OP_RGB, QOI_OP_RGBA}; |
2 | | use crate::error::Result; |
3 | | use crate::utils::Writer; |
4 | | use bytemuck::{cast, Pod}; |
5 | | |
6 | | #[derive(Copy, Clone, PartialEq, Eq, Debug)] |
7 | | #[repr(transparent)] |
8 | | pub struct Pixel<const N: usize>([u8; N]); |
9 | | |
10 | | impl<const N: usize> Pixel<N> { |
11 | | #[inline] |
12 | 0 | pub const fn new() -> Self { |
13 | 0 | Self([0; N]) |
14 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<_>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new Unexecuted instantiation: <qoi::pixel::Pixel<3>>::new Unexecuted instantiation: <qoi::pixel::Pixel<4>>::new |
15 | | |
16 | | #[inline] |
17 | 0 | pub fn read(&mut self, s: &[u8]) { |
18 | 0 | if s.len() == N { |
19 | 0 | let mut i = 0; |
20 | 0 | while i < N { |
21 | 0 | self.0[i] = s[i]; |
22 | 0 | i += 1; |
23 | 0 | } |
24 | | } else { |
25 | 0 | unreachable!(); |
26 | | } |
27 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<_>>::read Unexecuted instantiation: <qoi::pixel::Pixel<3>>::read Unexecuted instantiation: <qoi::pixel::Pixel<4>>::read |
28 | | |
29 | | #[inline] |
30 | 0 | pub fn update<const M: usize>(&mut self, px: Pixel<M>) { |
31 | 0 | let mut i = 0; |
32 | 0 | while i < M && i < N { |
33 | 0 | self.0[i] = px.0[i]; |
34 | 0 | i += 1; |
35 | 0 | } |
36 | 0 | } |
37 | | |
38 | | #[inline] |
39 | 0 | pub fn update_rgb(&mut self, r: u8, g: u8, b: u8) { |
40 | 0 | self.0[0] = r; |
41 | 0 | self.0[1] = g; |
42 | 0 | self.0[2] = b; |
43 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<_>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgb Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgb |
44 | | |
45 | | #[inline] |
46 | 0 | pub fn update_rgba(&mut self, r: u8, g: u8, b: u8, a: u8) { |
47 | 0 | self.0[0] = r; |
48 | 0 | self.0[1] = g; |
49 | 0 | self.0[2] = b; |
50 | 0 | if N >= 4 { |
51 | 0 | self.0[3] = a; |
52 | 0 | } |
53 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<_>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_rgba |
54 | | |
55 | | #[inline] |
56 | 0 | pub fn update_diff(&mut self, b1: u8) { |
57 | 0 | self.0[0] = self.0[0].wrapping_add((b1 >> 4) & 0x03).wrapping_sub(2); |
58 | 0 | self.0[1] = self.0[1].wrapping_add((b1 >> 2) & 0x03).wrapping_sub(2); |
59 | 0 | self.0[2] = self.0[2].wrapping_add(b1 & 0x03).wrapping_sub(2); |
60 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<_>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_diff Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_diff |
61 | | |
62 | | #[inline] |
63 | 0 | pub fn update_luma(&mut self, b1: u8, b2: u8) { |
64 | 0 | let vg = (b1 & 0x3f).wrapping_sub(32); |
65 | 0 | let vg_8 = vg.wrapping_sub(8); |
66 | 0 | let vr = vg_8.wrapping_add((b2 >> 4) & 0x0f); |
67 | 0 | let vb = vg_8.wrapping_add(b2 & 0x0f); |
68 | 0 | self.0[0] = self.0[0].wrapping_add(vr); |
69 | 0 | self.0[1] = self.0[1].wrapping_add(vg); |
70 | 0 | self.0[2] = self.0[2].wrapping_add(vb); |
71 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<_>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<3>>::update_luma Unexecuted instantiation: <qoi::pixel::Pixel<4>>::update_luma |
72 | | |
73 | | #[inline] |
74 | 0 | pub const fn as_rgba(self, with_a: u8) -> Pixel<4> { |
75 | 0 | let mut i = 0; |
76 | 0 | let mut out = Pixel::new(); |
77 | 0 | while i < N { |
78 | 0 | out.0[i] = self.0[i]; |
79 | 0 | i += 1; |
80 | 0 | } |
81 | 0 | if N < 4 { |
82 | 0 | out.0[3] = with_a; |
83 | 0 | } |
84 | 0 | out |
85 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<_>>::as_rgba Unexecuted instantiation: <qoi::pixel::Pixel<3>>::as_rgba Unexecuted instantiation: <qoi::pixel::Pixel<4>>::as_rgba |
86 | | |
87 | | #[inline] |
88 | 0 | pub const fn r(self) -> u8 { |
89 | 0 | self.0[0] |
90 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<_>>::r Unexecuted instantiation: <qoi::pixel::Pixel<3>>::r Unexecuted instantiation: <qoi::pixel::Pixel<4>>::r |
91 | | |
92 | | #[inline] |
93 | 0 | pub const fn g(self) -> u8 { |
94 | 0 | self.0[1] |
95 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<_>>::g Unexecuted instantiation: <qoi::pixel::Pixel<3>>::g Unexecuted instantiation: <qoi::pixel::Pixel<4>>::g |
96 | | |
97 | | #[inline] |
98 | 0 | pub const fn b(self) -> u8 { |
99 | 0 | self.0[2] |
100 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<_>>::b Unexecuted instantiation: <qoi::pixel::Pixel<3>>::b Unexecuted instantiation: <qoi::pixel::Pixel<4>>::b |
101 | | |
102 | | #[inline] |
103 | 0 | pub const fn with_a(mut self, value: u8) -> Self { |
104 | 0 | if N >= 4 { |
105 | 0 | self.0[3] = value; |
106 | 0 | } |
107 | 0 | self |
108 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<_>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<3>>::with_a Unexecuted instantiation: <qoi::pixel::Pixel<4>>::with_a |
109 | | |
110 | | #[inline] |
111 | 0 | pub const fn a_or(self, value: u8) -> u8 { |
112 | 0 | if N < 4 { |
113 | 0 | value |
114 | | } else { |
115 | 0 | self.0[3] |
116 | | } |
117 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<_>>::a_or Unexecuted instantiation: <qoi::pixel::Pixel<3>>::a_or Unexecuted instantiation: <qoi::pixel::Pixel<4>>::a_or |
118 | | |
119 | | #[inline] |
120 | | #[allow(clippy::cast_lossless, clippy::cast_possible_truncation)] |
121 | 0 | pub fn hash_index(self) -> u8 |
122 | 0 | where |
123 | 0 | [u8; N]: Pod, |
124 | 0 | { |
125 | | // credits for the initial idea: @zakarumych |
126 | 0 | let v = if N == 4 { |
127 | 0 | u32::from_ne_bytes(cast(self.0)) |
128 | | } else { |
129 | 0 | u32::from_ne_bytes([self.0[0], self.0[1], self.0[2], 0xff]) |
130 | | } as u64; |
131 | 0 | let s = ((v & 0xff00_ff00) << 32) | (v & 0x00ff_00ff); |
132 | 0 | s.wrapping_mul(0x0300_0700_0005_000b_u64).to_le().swap_bytes() as u8 & 63 |
133 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<_>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<3>>::hash_index Unexecuted instantiation: <qoi::pixel::Pixel<4>>::hash_index |
134 | | |
135 | | #[inline] |
136 | 0 | pub fn rgb_add(&mut self, r: u8, g: u8, b: u8) { |
137 | 0 | self.0[0] = self.0[0].wrapping_add(r); |
138 | 0 | self.0[1] = self.0[1].wrapping_add(g); |
139 | 0 | self.0[2] = self.0[2].wrapping_add(b); |
140 | 0 | } |
141 | | |
142 | | #[inline] |
143 | 0 | pub fn encode_into<W: Writer>(&self, px_prev: Self, buf: W) -> Result<W> { |
144 | 0 | if N == 3 || self.a_or(0) == px_prev.a_or(0) { |
145 | 0 | let vg = self.g().wrapping_sub(px_prev.g()); |
146 | 0 | let vg_32 = vg.wrapping_add(32); |
147 | 0 | if vg_32 | 63 == 63 { |
148 | 0 | let vr = self.r().wrapping_sub(px_prev.r()); |
149 | 0 | let vb = self.b().wrapping_sub(px_prev.b()); |
150 | 0 | let vg_r = vr.wrapping_sub(vg); |
151 | 0 | let vg_b = vb.wrapping_sub(vg); |
152 | 0 | let (vr_2, vg_2, vb_2) = |
153 | 0 | (vr.wrapping_add(2), vg.wrapping_add(2), vb.wrapping_add(2)); |
154 | 0 | if vr_2 | vg_2 | vb_2 | 3 == 3 { |
155 | 0 | buf.write_one(QOI_OP_DIFF | vr_2 << 4 | vg_2 << 2 | vb_2) |
156 | | } else { |
157 | 0 | let (vg_r_8, vg_b_8) = (vg_r.wrapping_add(8), vg_b.wrapping_add(8)); |
158 | 0 | if vg_r_8 | vg_b_8 | 15 == 15 { |
159 | 0 | buf.write_many(&[QOI_OP_LUMA | vg_32, vg_r_8 << 4 | vg_b_8]) |
160 | | } else { |
161 | 0 | buf.write_many(&[QOI_OP_RGB, self.r(), self.g(), self.b()]) |
162 | | } |
163 | | } |
164 | | } else { |
165 | 0 | buf.write_many(&[QOI_OP_RGB, self.r(), self.g(), self.b()]) |
166 | | } |
167 | | } else { |
168 | 0 | buf.write_many(&[QOI_OP_RGBA, self.r(), self.g(), self.b(), self.a_or(0xff)]) |
169 | | } |
170 | 0 | } Unexecuted instantiation: <qoi::pixel::Pixel<_>>::encode_into::<_> Unexecuted instantiation: <qoi::pixel::Pixel<3>>::encode_into::<qoi::utils::BytesMut> Unexecuted instantiation: <qoi::pixel::Pixel<4>>::encode_into::<qoi::utils::BytesMut> |
171 | | } |
172 | | |
173 | | impl<const N: usize> From<Pixel<N>> for [u8; N] { |
174 | | #[inline(always)] |
175 | 0 | fn from(px: Pixel<N>) -> Self { |
176 | 0 | px.0 |
177 | 0 | } Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; _] as core::convert::From<qoi::pixel::Pixel<_>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from Unexecuted instantiation: <[u8; 3] as core::convert::From<qoi::pixel::Pixel<3>>>::from Unexecuted instantiation: <[u8; 4] as core::convert::From<qoi::pixel::Pixel<4>>>::from |
178 | | } |
179 | | |
180 | | pub trait SupportedChannels {} |
181 | | |
182 | | impl SupportedChannels for Pixel<3> {} |
183 | | impl SupportedChannels for Pixel<4> {} |