1
0
Fork 0
forked from wry/wry

wp-color-management-v1: allocate description ids linearly

This commit is contained in:
Julian Orth 2025-04-22 16:13:49 +02:00
parent 401e8bb0be
commit c9b0e86bf5
6 changed files with 10 additions and 30 deletions

View file

@ -7,35 +7,13 @@ use {
cmm_transfer_function::TransferFunction,
cmm_transform::{ColorMatrix, Local, Xyz, bradford_adjustment},
},
utils::{free_list::FreeList, ordered_float::F64},
utils::ordered_float::F64,
},
std::rc::Rc,
};
linear_ids!(LinearColorDescriptionIds, LinearColorDescriptionId, u64);
pub type ColorDescriptionIds = FreeList<ColorDescriptionId, 3>;
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
pub struct ColorDescriptionId(u32);
impl ColorDescriptionId {
pub fn raw(self) -> u32 {
self.0
}
}
impl From<u32> for ColorDescriptionId {
fn from(value: u32) -> Self {
Self(value)
}
}
impl From<ColorDescriptionId> for u32 {
fn from(value: ColorDescriptionId) -> Self {
value.0
}
}
linear_ids!(ColorDescriptionIds, ColorDescriptionId, u64);
#[derive(Debug)]
pub struct LinearColorDescription {
@ -102,6 +80,5 @@ impl Drop for LinearColorDescription {
impl Drop for ColorDescription {
fn drop(&mut self) {
self.shared.dead_complete.fetch_add(1);
self.shared.complete_ids.release(self.id);
}
}

View file

@ -54,7 +54,7 @@ impl ColorManager {
let linear_descriptions = CopyHashMap::default();
let complete_descriptions = CopyHashMap::default();
let shared = Rc::new(Shared::default());
let _ = shared.complete_ids.acquire();
let _ = shared.complete_ids.next();
let srgb_srgb = get_description(
&shared,
&linear_descriptions,
@ -219,7 +219,7 @@ fn get_description(
transfer_function,
};
let d = Rc::new(ColorDescription {
id: shared.complete_ids.acquire(),
id: shared.complete_ids.next(),
linear: d,
named_primaries,
transfer_function,
@ -248,7 +248,7 @@ fn get_description2(
shared.dead_complete.fetch_sub(1);
}
let d = Rc::new(ColorDescription {
id: shared.complete_ids.acquire(),
id: shared.complete_ids.next(),
linear: ld.clone(),
named_primaries,
transfer_function,

View file

@ -45,7 +45,7 @@ impl WpColorManagementSurfaceFeedbackV1 {
pub fn send_preferred_changed(&self, cd: &ColorDescription) {
self.client.event(PreferredChanged {
self_id: self.id,
identity: cd.id.raw(),
identity: cd.id.raw() as u32,
});
}
}

View file

@ -31,7 +31,7 @@ impl WpImageDescriptionV1 {
pub fn send_ready(&self) {
self.client.event(Ready {
self_id: self.id,
identity: self.description.as_ref().unwrap().id.raw(),
identity: self.description.as_ref().unwrap().id.raw() as u32,
});
}
}

View file

@ -185,6 +185,7 @@ macro_rules! linear_ids {
linear_ids!($(#[$attr1])* $ids, $id, u32);
};
($(#[$attr1:meta])* $ids:ident, $id:ident, $ty:ty $(,)?) => {
#[derive(Debug)]
pub struct $ids {
next: crate::utils::numcell::NumCell<$ty>,
}

View file

@ -41,6 +41,7 @@ impl<T, const N: usize> FreeList<T, N> {
unsafe { self.levels.get().deref_mut() }
}
#[cfg_attr(not(test), expect(dead_code))]
pub fn release(&self, n: T)
where
T: Into<u32>,
@ -58,6 +59,7 @@ impl<T, const N: usize> FreeList<T, N> {
}
}
#[cfg_attr(not(test), expect(dead_code))]
pub fn acquire(&self) -> T
where
u32: Into<T>,