| 1 | #![allow (clippy::assertions_on_constants)] |
| 2 | |
| 3 | use super::*; |
| 4 | use crate::icon::{Pixel, RgbaIcon, PIXEL_SIZE}; |
| 5 | |
| 6 | impl Pixel { |
| 7 | pub fn to_packed_argb(&self) -> Cardinal { |
| 8 | let mut cardinal: u32 = 0; |
| 9 | assert!(CARDINAL_SIZE >= PIXEL_SIZE); |
| 10 | let as_bytes: *mut u8 = &mut cardinal as *mut _ as *mut u8; |
| 11 | unsafe { |
| 12 | *as_bytes.offset(count:0) = self.b; |
| 13 | *as_bytes.offset(count:1) = self.g; |
| 14 | *as_bytes.offset(count:2) = self.r; |
| 15 | *as_bytes.offset(count:3) = self.a; |
| 16 | } |
| 17 | cardinal |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | impl RgbaIcon { |
| 22 | pub(crate) fn to_cardinals(&self) -> Vec<Cardinal> { |
| 23 | assert_eq!(self.rgba.len() % PIXEL_SIZE, 0); |
| 24 | let pixel_count: usize = self.rgba.len() / PIXEL_SIZE; |
| 25 | assert_eq!(pixel_count, (self.width * self.height) as usize); |
| 26 | let mut data: Vec = Vec::with_capacity(pixel_count); |
| 27 | data.push(self.width as Cardinal); |
| 28 | data.push(self.height as Cardinal); |
| 29 | let pixels: *const Pixel = self.rgba.as_ptr() as *const Pixel; |
| 30 | for pixel_index: usize in 0..pixel_count { |
| 31 | let pixel: &Pixel = unsafe { &*pixels.add(count:pixel_index) }; |
| 32 | data.push(pixel.to_packed_argb()); |
| 33 | } |
| 34 | data |
| 35 | } |
| 36 | } |
| 37 | |