We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
2 parents 1864e4e + fa2b214 commit 201ca4fCopy full SHA for 201ca4f
Cargo.toml
@@ -1,6 +1,6 @@
1
[package]
2
name = "jpeg-encoder"
3
-version = "0.5.0"
+version = "0.5.1"
4
authors = ["Volker Ströbel <[email protected]>"]
5
edition = "2018"
6
license = "MIT OR Apache-2.0"
src/avx2/ycbcr.rs
@@ -70,7 +70,7 @@ macro_rules! ycbcr_image_avx2 {
70
let yb = _mm256_mullo_epi32(ymulb, b);
71
72
let y = _mm256_add_epi32(_mm256_add_epi32(yr, yg), yb);
73
- let y = _mm256_add_epi32(y, _mm256_set1_epi32(1 << 15));
+ let y = _mm256_add_epi32(y, _mm256_set1_epi32(0x7FFF));
74
let y = _mm256_srli_epi32(y, 16);
75
let y: [i32; 8] = core::mem::transmute(y);
76
@@ -80,7 +80,7 @@ macro_rules! ycbcr_image_avx2 {
80
81
let cb = _mm256_add_epi32(_mm256_sub_epi32(cbr, cbg), cbb);
82
let cb = _mm256_add_epi32(cb, _mm256_set1_epi32(128 << 16));
83
- let cb = _mm256_add_epi32(cb, _mm256_set1_epi32(1 << 15));
+ let cb = _mm256_add_epi32(cb, _mm256_set1_epi32(0x7FFF));
84
let cb = _mm256_srli_epi32(cb, 16);
85
let cb: [i32; 8] = core::mem::transmute(cb);
86
@@ -90,7 +90,7 @@ macro_rules! ycbcr_image_avx2 {
90
91
let cr = _mm256_sub_epi32(_mm256_sub_epi32(crr, crg), crb);
92
let cr = _mm256_add_epi32(cr, _mm256_set1_epi32(128 << 16));
93
- let cr = _mm256_add_epi32(cr, _mm256_set1_epi32(1 << 15));
+ let cr = _mm256_add_epi32(cr, _mm256_set1_epi32(0x7FFF));
94
let cr = _mm256_srli_epi32(cr, 16);
95
let cr: [i32; 8] = core::mem::transmute(cr);
96
src/image_buffer.rs
@@ -23,9 +23,9 @@ pub fn rgb_to_ycbcr(r: u8, g: u8, b: u8) -> (u8, u8, u8) {
23
let cb = -11059 * r - 21709 * g + 32768 * b + (128 << 16);
24
let cr = 32768 * r - 27439 * g - 5329 * b + (128 << 16);
25
26
- let y = (y + (1 << 15)) >> 16;
27
- let cb = (cb + (1 << 15)) >> 16;
28
- let cr = (cr + (1 << 15)) >> 16;
+ let y = (y + 0x7FFF) >> 16;
+ let cb = (cb + 0x7FFF) >> 16;
+ let cr = (cr + 0x7FFF) >> 16;
29
30
(y as u8, cb as u8, cr as u8)
31
}
@@ -287,6 +287,13 @@ mod tests {
287
288
#[test]
289
fn test_rgb_to_ycbcr() {
290
+
291
+ assert_rgb_to_ycbcr([0, 0, 0], [0, 128, 128]);
292
+ assert_rgb_to_ycbcr([255, 255, 255], [255, 128, 128]);
293
+ assert_rgb_to_ycbcr([255, 0, 0], [76, 85, 255]);
294
+ assert_rgb_to_ycbcr([0, 255, 0], [150, 44, 21]);
295
+ assert_rgb_to_ycbcr([0, 0, 255], [29, 255, 107]);
296
297
// Values taken from libjpeg for a common image
298
299
assert_rgb_to_ycbcr([59, 109, 6], [82, 85, 111]);
src/lib.rs
@@ -77,6 +77,26 @@ mod tests {
77
(data, width as u16, height as u16)
78
79
+ fn create_test_img_rgba() -> (Vec<u8>, u16, u16) {
+ // Ensure size which which ensures an odd MCU count per row to test chroma subsampling
+ let width = 258;
+ let height = 128;
+ let mut data = Vec::with_capacity(width * height * 3);
87
+ for y in 0..height {
88
+ for x in 0..width {
89
+ let x = x.min(255);
+ data.push(x as u8);
+ data.push((y * 2) as u8);
+ data.push(((x + y * 2) / 2) as u8);
+ }
97
+ (data, width as u16, height as u16)
98
99
100
fn create_test_img_gray() -> (Vec<u8>, u16, u16) {
101
let width = 258;
102
let height = 128;
@@ -184,6 +204,21 @@ mod tests {
184
204
check_result(data, width, height, &mut result, PixelFormat::RGB24);
185
205
186
206
207
+ #[test]
208
+ fn test_rgba_80() {
209
+ let (data, width, height) = create_test_img_rgba();
210
211
+ let mut result = Vec::new();
212
+ let encoder = Encoder::new(&mut result, 80);
213
+ encoder
214
+ .encode(&data, width, height, ColorType::Rgba)
215
+ .unwrap();
216
217
+ let (data, width, height) = create_test_img_rgb();
218
219
+ check_result(data, width, height, &mut result, PixelFormat::RGB24);
220
221
187
222
188
223
fn test_rgb_custom_q_table() {
189
224
let (data, width, height) = create_test_img_rgb();
0 commit comments