<NME> shm_load.rs
<BEF> ADDFILE
<MSG> anvil: fix shm buffer loading

<DFF> @@ -0,0 +1,58 @@
+use shell::Buffer;
+use smithay::wayland::shm::BufferData;
+use smithay::wayland_server::protocol::wl_shm::Format;
+
+pub fn load_shm_buffer(data: BufferData, pool: &[u8], log: &::slog::Logger) -> Buffer {
+    // ensure consistency, the SHM handler of smithay should ensure this
+    debug_assert!(((data.offset + data.stride * data.height) as usize) <= pool.len());
+
+    let mut out = Vec::with_capacity((data.width * data.height * 4) as usize);
+
+    let offset = data.offset as usize;
+    let width = data.width as usize;
+    let height = data.height as usize;
+    let stride = data.stride as usize;
+
+    match data.format {
+        Format::Argb8888 => {
+            // TODO: this is so slooooow
+            for j in 0..height {
+                for i in 0..width {
+                    // value must be read as native endianness
+                    let val: u32 =
+                        unsafe { *(&pool[offset + j * stride + i * 4] as *const u8 as *const u32) };
+                    out.push(((val & 0x00FF0000) >> 16) as u8); //r
+                    out.push(((val & 0x0000FF00) >> 8) as u8); //g
+                    out.push(((val & 0x000000FF) >> 0) as u8); //b
+                    out.push(((val & 0xFF000000) >> 24) as u8); //a
+                }
+            }
+        }
+        Format::Xrgb8888 => {
+            // TODO: this is so slooooow
+            for j in 0..height {
+                for i in 0..width {
+                    // value must be read as native endianness
+                    let val: u32 =
+                        unsafe { *(&pool[offset + j * stride + i * 4] as *const u8 as *const u32) };
+                    out.push(((val & 0x00FF0000) >> 16) as u8); //r
+                    out.push(((val & 0x0000FF00) >> 8) as u8); //g
+                    out.push(((val & 0x000000FF) >> 0) as u8); //b
+                    out.push(255); // a
+                }
+            }
+        }
+        _ => {
+            error!(log, "Unsupported buffer format"; "format" => format!("{:?}", data.format));
+            // fill in with black
+            for _ in 0..(data.height * data.width) {
+                out.extend(&[0, 0, 0, 255])
+            }
+        }
+    }
+
+    Buffer::Shm {
+        data: out,
+        size: (data.width as u32, data.height as u32),
+    }
+}

anvil: fix shm buffer loading