mirror of
https://github.com/penpot/penpot.git
synced 2025-06-02 08:51:38 +02:00
✨ Use mem::transmute to deserialize raw fill data
This commit is contained in:
parent
cba65972dd
commit
ec73bd640c
3 changed files with 6 additions and 40 deletions
|
@ -7,6 +7,7 @@ const RAW_GRADIENT_DATA_SIZE: usize =
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
#[repr(align(4))]
|
||||||
pub struct RawGradientData {
|
pub struct RawGradientData {
|
||||||
start_x: f32,
|
start_x: f32,
|
||||||
start_y: f32,
|
start_y: f32,
|
||||||
|
@ -15,31 +16,12 @@ pub struct RawGradientData {
|
||||||
opacity: f32,
|
opacity: f32,
|
||||||
width: f32,
|
width: f32,
|
||||||
stop_count: u8,
|
stop_count: u8,
|
||||||
_pad: [u8; 3],
|
|
||||||
stops: [RawStopData; MAX_GRADIENT_STOPS],
|
stops: [RawStopData; MAX_GRADIENT_STOPS],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<[u8; RAW_GRADIENT_DATA_SIZE]> for RawGradientData {
|
impl From<[u8; RAW_GRADIENT_DATA_SIZE]> for RawGradientData {
|
||||||
fn from(bytes: [u8; RAW_GRADIENT_DATA_SIZE]) -> Self {
|
fn from(bytes: [u8; RAW_GRADIENT_DATA_SIZE]) -> Self {
|
||||||
Self {
|
unsafe { std::mem::transmute(bytes) }
|
||||||
start_x: f32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]),
|
|
||||||
start_y: f32::from_le_bytes([bytes[4], bytes[5], bytes[6], bytes[7]]),
|
|
||||||
end_x: f32::from_le_bytes([bytes[8], bytes[9], bytes[10], bytes[11]]),
|
|
||||||
end_y: f32::from_le_bytes([bytes[12], bytes[13], bytes[14], bytes[15]]),
|
|
||||||
opacity: f32::from_le_bytes([bytes[16], bytes[17], bytes[18], bytes[19]]),
|
|
||||||
width: f32::from_le_bytes([bytes[20], bytes[21], bytes[22], bytes[23]]),
|
|
||||||
stop_count: bytes[24],
|
|
||||||
_pad: [0; 3],
|
|
||||||
// FIXME: 2025-04-22: use `array_chunks` once the next release is out
|
|
||||||
// and we update our devenv.
|
|
||||||
// See https://github.com/rust-lang/rust/issues/74985
|
|
||||||
stops: bytes[28..]
|
|
||||||
.chunks_exact(RAW_STOP_DATA_SIZE)
|
|
||||||
.map(|chunk| RawStopData::try_from(chunk).unwrap())
|
|
||||||
.collect::<Vec<_>>()
|
|
||||||
.try_into()
|
|
||||||
.unwrap(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ const RAW_IMAGE_DATA_SIZE: usize = 28;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq)]
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
#[repr(align(4))]
|
||||||
pub struct RawImageFillData {
|
pub struct RawImageFillData {
|
||||||
a: u32,
|
a: u32,
|
||||||
b: u32,
|
b: u32,
|
||||||
|
@ -25,23 +26,7 @@ impl From<RawImageFillData> for ImageFill {
|
||||||
|
|
||||||
impl From<[u8; RAW_IMAGE_DATA_SIZE]> for RawImageFillData {
|
impl From<[u8; RAW_IMAGE_DATA_SIZE]> for RawImageFillData {
|
||||||
fn from(value: [u8; RAW_IMAGE_DATA_SIZE]) -> Self {
|
fn from(value: [u8; RAW_IMAGE_DATA_SIZE]) -> Self {
|
||||||
let a = u32::from_le_bytes([value[0], value[1], value[2], value[3]]);
|
unsafe { std::mem::transmute(value) }
|
||||||
let b = u32::from_le_bytes([value[4], value[5], value[6], value[7]]);
|
|
||||||
let c = u32::from_le_bytes([value[8], value[9], value[10], value[11]]);
|
|
||||||
let d = u32::from_le_bytes([value[12], value[13], value[14], value[15]]);
|
|
||||||
let opacity = f32::from_le_bytes([value[16], value[17], value[18], value[19]]);
|
|
||||||
let width = i32::from_le_bytes([value[20], value[21], value[22], value[23]]);
|
|
||||||
let height = i32::from_le_bytes([value[24], value[25], value[26], value[27]]);
|
|
||||||
|
|
||||||
Self {
|
|
||||||
a,
|
|
||||||
b,
|
|
||||||
c,
|
|
||||||
d,
|
|
||||||
opacity,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ use crate::shapes::{Color, SolidColor};
|
||||||
const RAW_SOLID_DATA_SIZE: usize = 4;
|
const RAW_SOLID_DATA_SIZE: usize = 4;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
|
#[repr(align(4))]
|
||||||
#[derive(Debug, PartialEq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
pub struct RawSolidData {
|
pub struct RawSolidData {
|
||||||
pub color: u32,
|
pub color: u32,
|
||||||
|
@ -10,9 +11,7 @@ pub struct RawSolidData {
|
||||||
|
|
||||||
impl From<[u8; 4]> for RawSolidData {
|
impl From<[u8; 4]> for RawSolidData {
|
||||||
fn from(value: [u8; RAW_SOLID_DATA_SIZE]) -> Self {
|
fn from(value: [u8; RAW_SOLID_DATA_SIZE]) -> Self {
|
||||||
Self {
|
unsafe { std::mem::transmute(value) }
|
||||||
color: u32::from_le_bytes(value),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue