Also align wl_buffer stride to 4 for any pixel format
bgr888 buffers may have a stride only aligned to 3, this caused issues: https://github.com/gergo-salyi/multibg-sway/issues/6
This commit is contained in:
parent
3d7392b698
commit
ec22b1cb65
1 changed files with 40 additions and 4 deletions
44
src/image.rs
44
src/image.rs
|
@ -173,16 +173,52 @@ fn buffer_bgr888_from_image(
|
||||||
)
|
)
|
||||||
-> Buffer
|
-> Buffer
|
||||||
{
|
{
|
||||||
|
// Align buffer stride to both 4 and pixel format block size
|
||||||
|
// Not being aligned to 4 caused
|
||||||
|
// https://github.com/gergo-salyi/multibg-sway/issues/6
|
||||||
|
const BUFFER_STRIDE_ALIGNEMENT: u32 = 4 * 3;
|
||||||
|
|
||||||
|
let width = image.width();
|
||||||
|
let height = image.height();
|
||||||
|
let image_stride = width * 3;
|
||||||
|
|
||||||
|
let unaligned_bytes = image_stride % BUFFER_STRIDE_ALIGNEMENT;
|
||||||
|
|
||||||
|
let buffer_stride =
|
||||||
|
if unaligned_bytes == 0 {
|
||||||
|
image_stride
|
||||||
|
} else {
|
||||||
|
let padding = BUFFER_STRIDE_ALIGNEMENT - unaligned_bytes;
|
||||||
|
image_stride + padding
|
||||||
|
};
|
||||||
|
|
||||||
let (buffer, canvas) = slot_pool
|
let (buffer, canvas) = slot_pool
|
||||||
.create_buffer(
|
.create_buffer(
|
||||||
image.width() as i32,
|
width.try_into().unwrap(),
|
||||||
image.height() as i32,
|
height.try_into().unwrap(),
|
||||||
image.width() as i32 * 3,
|
buffer_stride.try_into().unwrap(),
|
||||||
wl_shm::Format::Bgr888
|
wl_shm::Format::Bgr888
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
canvas[..image.len()].copy_from_slice(&image);
|
if unaligned_bytes == 0 {
|
||||||
|
canvas[..image.len()].copy_from_slice(&image);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let height: usize = height.try_into().unwrap();
|
||||||
|
let buffer_stride: usize = buffer_stride.try_into().unwrap();
|
||||||
|
let image_stride: usize = image_stride.try_into().unwrap();
|
||||||
|
|
||||||
|
for row in 0..height {
|
||||||
|
let canvas_start = row * buffer_stride;
|
||||||
|
let image_start = row * image_stride;
|
||||||
|
let len = image_stride;
|
||||||
|
|
||||||
|
canvas[canvas_start..(canvas_start + len)].copy_from_slice(
|
||||||
|
&image.as_raw()[image_start..(image_start + len)]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
buffer
|
buffer
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue