Merge pull request #432 from mahkoh/jorth/cm-2
wp-color-management-v1: update to version 2
This commit is contained in:
commit
a93ea07118
21 changed files with 200 additions and 29 deletions
|
|
@ -174,7 +174,7 @@ Jay supports the following wayland protocols:
|
||||||
| wl_shm | 2 | |
|
| wl_shm | 2 | |
|
||||||
| wl_subcompositor | 1 | |
|
| wl_subcompositor | 1 | |
|
||||||
| wp_alpha_modifier_v1 | 1 | |
|
| wp_alpha_modifier_v1 | 1 | |
|
||||||
| wp_color_manager_v1 | 1 | |
|
| wp_color_manager_v1 | 2 | |
|
||||||
| wp_commit_timing_manager_v1 | 1 | |
|
| wp_commit_timing_manager_v1 | 1 | |
|
||||||
| wp_content_type_manager_v1 | 1 | |
|
| wp_content_type_manager_v1 | 1 | |
|
||||||
| wp_cursor_shape_manager_v1 | 2 | |
|
| wp_cursor_shape_manager_v1 | 2 | |
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,10 @@ use {
|
||||||
crate::{
|
crate::{
|
||||||
client::{Client, ClientError},
|
client::{Client, ClientError},
|
||||||
ifs::{
|
ifs::{
|
||||||
color_management::wp_image_description_v1::WpImageDescriptionV1,
|
color_management::{
|
||||||
|
wp_image_description_reference_v1::WpImageDescriptionReferenceV1,
|
||||||
|
wp_image_description_v1::WpImageDescriptionV1,
|
||||||
|
},
|
||||||
ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1,
|
ext_foreign_toplevel_handle_v1::ExtForeignToplevelHandleV1,
|
||||||
ext_image_capture_source_v1::ExtImageCaptureSourceV1,
|
ext_image_capture_source_v1::ExtImageCaptureSourceV1,
|
||||||
ext_image_copy::ext_image_copy_capture_session_v1::ExtImageCopyCaptureSessionV1,
|
ext_image_copy::ext_image_copy_capture_session_v1::ExtImageCopyCaptureSessionV1,
|
||||||
|
|
@ -48,10 +51,11 @@ use {
|
||||||
ExtImageCopyCaptureSessionV1Id, ExtWorkspaceGroupHandleV1Id, JayHeadErrorV1Id,
|
ExtImageCopyCaptureSessionV1Id, ExtWorkspaceGroupHandleV1Id, JayHeadErrorV1Id,
|
||||||
JayOutputId, JayScreencastId, JayToplevelId, JayWorkspaceId, WlBufferId,
|
JayOutputId, JayScreencastId, JayToplevelId, JayWorkspaceId, WlBufferId,
|
||||||
WlDataSourceId, WlOutputId, WlPointerId, WlRegionId, WlRegistryId, WlSeatId,
|
WlDataSourceId, WlOutputId, WlPointerId, WlRegionId, WlRegistryId, WlSeatId,
|
||||||
WlSurfaceId, WpDrmLeaseConnectorV1Id, WpImageDescriptionV1Id,
|
WlSurfaceId, WpDrmLeaseConnectorV1Id, WpImageDescriptionReferenceV1Id,
|
||||||
WpLinuxDrmSyncobjTimelineV1Id, XdgPopupId, XdgPositionerId, XdgSurfaceId,
|
WpImageDescriptionV1Id, WpLinuxDrmSyncobjTimelineV1Id, XdgPopupId, XdgPositionerId,
|
||||||
XdgToplevelId, XdgWmBaseId, ZwlrDataControlSourceV1Id, ZwlrOutputHeadV1Id,
|
XdgSurfaceId, XdgToplevelId, XdgWmBaseId, ZwlrDataControlSourceV1Id,
|
||||||
ZwlrOutputModeV1Id, ZwpPrimarySelectionSourceV1Id, ZwpTabletToolV2Id,
|
ZwlrOutputHeadV1Id, ZwlrOutputModeV1Id, ZwpPrimarySelectionSourceV1Id,
|
||||||
|
ZwpTabletToolV2Id,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
std::{cell::RefCell, rc::Rc},
|
std::{cell::RefCell, rc::Rc},
|
||||||
|
|
@ -94,6 +98,8 @@ pub struct Objects {
|
||||||
pub ext_workspace_groups:
|
pub ext_workspace_groups:
|
||||||
CopyHashMap<ExtWorkspaceGroupHandleV1Id, Rc<ExtWorkspaceGroupHandleV1>>,
|
CopyHashMap<ExtWorkspaceGroupHandleV1Id, Rc<ExtWorkspaceGroupHandleV1>>,
|
||||||
pub wp_image_description: CopyHashMap<WpImageDescriptionV1Id, Rc<WpImageDescriptionV1>>,
|
pub wp_image_description: CopyHashMap<WpImageDescriptionV1Id, Rc<WpImageDescriptionV1>>,
|
||||||
|
pub wp_image_description_reference:
|
||||||
|
CopyHashMap<WpImageDescriptionReferenceV1Id, Rc<WpImageDescriptionReferenceV1>>,
|
||||||
pub jay_head_errors: CopyHashMap<JayHeadErrorV1Id, Rc<JayHeadErrorV1>>,
|
pub jay_head_errors: CopyHashMap<JayHeadErrorV1Id, Rc<JayHeadErrorV1>>,
|
||||||
ids: RefCell<Vec<usize>>,
|
ids: RefCell<Vec<usize>>,
|
||||||
}
|
}
|
||||||
|
|
@ -136,6 +142,7 @@ impl Objects {
|
||||||
ext_data_sources: Default::default(),
|
ext_data_sources: Default::default(),
|
||||||
ext_workspace_groups: Default::default(),
|
ext_workspace_groups: Default::default(),
|
||||||
wp_image_description: Default::default(),
|
wp_image_description: Default::default(),
|
||||||
|
wp_image_description_reference: Default::default(),
|
||||||
jay_head_errors: Default::default(),
|
jay_head_errors: Default::default(),
|
||||||
ids: RefCell::new(vec![]),
|
ids: RefCell::new(vec![]),
|
||||||
}
|
}
|
||||||
|
|
@ -182,6 +189,8 @@ impl Objects {
|
||||||
self.ext_data_sources.clear();
|
self.ext_data_sources.clear();
|
||||||
self.ext_workspace_groups.clear();
|
self.ext_workspace_groups.clear();
|
||||||
self.jay_head_errors.clear();
|
self.jay_head_errors.clear();
|
||||||
|
self.wp_image_description.clear();
|
||||||
|
self.wp_image_description_reference.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn id<T>(&self, client_data: &Client) -> Result<T, ClientError>
|
pub fn id<T>(&self, client_data: &Client) -> Result<T, ClientError>
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ pub enum Eotf {
|
||||||
Log316,
|
Log316,
|
||||||
St428,
|
St428,
|
||||||
Pow(EotfPow),
|
Pow(EotfPow),
|
||||||
|
CompoundPower24,
|
||||||
}
|
}
|
||||||
|
|
||||||
const MUL: u32 = 10_000;
|
const MUL: u32 = 10_000;
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ pub const EOTF_LOG316: u32 = 9;
|
||||||
pub const EOTF_ST428: u32 = 10;
|
pub const EOTF_ST428: u32 = 10;
|
||||||
pub const EOTF_POW: u32 = 11;
|
pub const EOTF_POW: u32 = 11;
|
||||||
pub const EOTF_GAMMA24: u32 = 12;
|
pub const EOTF_GAMMA24: u32 = 12;
|
||||||
|
pub const EOTF_COMPOUND_POWER_2_4: u32 = 13;
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Linearize)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Linearize)]
|
||||||
pub enum VulkanEotf {
|
pub enum VulkanEotf {
|
||||||
|
|
@ -25,6 +26,7 @@ pub enum VulkanEotf {
|
||||||
Log316,
|
Log316,
|
||||||
St428,
|
St428,
|
||||||
Pow,
|
Pow,
|
||||||
|
CompoundPower24,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait EotfExt: Sized {
|
pub trait EotfExt: Sized {
|
||||||
|
|
@ -54,6 +56,7 @@ impl EotfExt for Eotf {
|
||||||
Log316,
|
Log316,
|
||||||
St428,
|
St428,
|
||||||
Pow,
|
Pow,
|
||||||
|
CompoundPower24,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -72,6 +75,7 @@ impl VulkanEotf {
|
||||||
Self::Log316 => EOTF_LOG316,
|
Self::Log316 => EOTF_LOG316,
|
||||||
Self::St428 => EOTF_ST428,
|
Self::St428 => EOTF_ST428,
|
||||||
Self::Pow => EOTF_POW,
|
Self::Pow => EOTF_POW,
|
||||||
|
Self::CompoundPower24 => EOTF_COMPOUND_POWER_2_4,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -766,7 +766,7 @@ impl VulkanRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
for (index, op) in opts.into_iter().enumerate() {
|
for (index, op) in opts.iter().enumerate() {
|
||||||
match op {
|
match op {
|
||||||
GfxApiOpt::Sync => {
|
GfxApiOpt::Sync => {
|
||||||
sync(memory);
|
sync(memory);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
#define TF_ST428 10
|
#define TF_ST428 10
|
||||||
#define TF_POW 11
|
#define TF_POW 11
|
||||||
#define TF_GAMMA24 12
|
#define TF_GAMMA24 12
|
||||||
|
#define TF_COMPOUND_POWER_2_4 13
|
||||||
|
|
||||||
vec3 eotf_bt1886(vec3 c) {
|
vec3 eotf_bt1886(vec3 c) {
|
||||||
c = clamp(c, 0.0, 1.0);
|
c = clamp(c, 0.0, 1.0);
|
||||||
|
|
@ -101,6 +102,22 @@ vec3 inv_eotf_st428(vec3 c) {
|
||||||
return pow(vec3(48.0) * c / vec3(52.37), vec3(1.0 / 2.6));
|
return pow(vec3(48.0) * c / vec3(52.37), vec3(1.0 / 2.6));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3 eotf_compound_power_2_4(vec3 c) {
|
||||||
|
return mix(
|
||||||
|
c * vec3(1.0 / 12.92),
|
||||||
|
pow((c + vec3(0.055)) * vec3(1.0 / 1.055), vec3(2.4)),
|
||||||
|
greaterThanEqual(c, vec3(0.04045))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 inv_eotf_compound_power_2_4(vec3 c) {
|
||||||
|
return mix(
|
||||||
|
vec3(12.92) * c,
|
||||||
|
vec3(1.055) * pow(c, vec3(1.0 / 2.4)) - vec3(0.055),
|
||||||
|
greaterThanEqual(c, vec3(0.0031308))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
vec3 apply_eotf(vec3 c) {
|
vec3 apply_eotf(vec3 c) {
|
||||||
switch (eotf) {
|
switch (eotf) {
|
||||||
case TF_LINEAR: return c;
|
case TF_LINEAR: return c;
|
||||||
|
|
@ -114,6 +131,7 @@ vec3 apply_eotf(vec3 c) {
|
||||||
case TF_LOG316: return eotf_log316(c);
|
case TF_LOG316: return eotf_log316(c);
|
||||||
case TF_ST428: return eotf_st428(c);
|
case TF_ST428: return eotf_st428(c);
|
||||||
case TF_POW: return sign(c) * pow(abs(c), vec3(cm_eotf_args.arg1));
|
case TF_POW: return sign(c) * pow(abs(c), vec3(cm_eotf_args.arg1));
|
||||||
|
case TF_COMPOUND_POWER_2_4: return eotf_compound_power_2_4(c);
|
||||||
default: return c;
|
default: return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -131,6 +149,7 @@ vec3 apply_inv_eotf(vec3 c) {
|
||||||
case TF_LOG316: return inv_eotf_log316(c);
|
case TF_LOG316: return inv_eotf_log316(c);
|
||||||
case TF_ST428: return inv_eotf_st428(c);
|
case TF_ST428: return inv_eotf_st428(c);
|
||||||
case TF_POW: return sign(c) * pow(abs(c), vec3(cm_inv_eotf_args.arg1));
|
case TF_POW: return sign(c) * pow(abs(c), vec3(cm_inv_eotf_args.arg1));
|
||||||
|
case TF_COMPOUND_POWER_2_4: return inv_eotf_compound_power_2_4(c);
|
||||||
default: return c;
|
default: return c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -1,4 +1,4 @@
|
||||||
f49076a6465a6790c72a6d290c13d5f14c7dae8ae3eed6ca71c57424e3306f66 src/gfx_apis/vulkan/shaders/eotfs.glsl
|
b6a0df1e231fab533499329636b7a580384784418baee06c147af5fcc384cf5c src/gfx_apis/vulkan/shaders/eotfs.glsl
|
||||||
8a38df18851cd13884499820f26939fb7319f45d913d867f254d8118d59fb117 src/gfx_apis/vulkan/shaders/fill.common.glsl
|
8a38df18851cd13884499820f26939fb7319f45d913d867f254d8118d59fb117 src/gfx_apis/vulkan/shaders/fill.common.glsl
|
||||||
21c488d12aa5ad2f109ec44cb856dfe837e02ea9025b5ed64439d742c17cbf30 src/gfx_apis/vulkan/shaders/fill.frag
|
21c488d12aa5ad2f109ec44cb856dfe837e02ea9025b5ed64439d742c17cbf30 src/gfx_apis/vulkan/shaders/fill.frag
|
||||||
4fb481d8d73afdfb0d8f077eb8665d86f06c8a32a91e44ed369ef5dff554646d src/gfx_apis/vulkan/shaders/fill.vert
|
4fb481d8d73afdfb0d8f077eb8665d86f06c8a32a91e44ed369ef5dff554646d src/gfx_apis/vulkan/shaders/fill.vert
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::object::Version;
|
||||||
pub use consts::*;
|
pub use consts::*;
|
||||||
|
|
||||||
pub mod wp_color_management_output_v1;
|
pub mod wp_color_management_output_v1;
|
||||||
|
|
@ -6,8 +7,13 @@ pub mod wp_color_manager_v1;
|
||||||
pub mod wp_image_description_creator_icc_v1;
|
pub mod wp_image_description_creator_icc_v1;
|
||||||
pub mod wp_image_description_creator_params_v1;
|
pub mod wp_image_description_creator_params_v1;
|
||||||
pub mod wp_image_description_info_v1;
|
pub mod wp_image_description_info_v1;
|
||||||
|
pub mod wp_image_description_reference_v1;
|
||||||
pub mod wp_image_description_v1;
|
pub mod wp_image_description_v1;
|
||||||
|
|
||||||
|
const UNIQUE_CM_IDS_SINCE: Version = Version(2);
|
||||||
|
const SRGB_DEPRECATED_SINCE: Version = Version(2);
|
||||||
|
const COMPOUND_POWER_2_4_SINCE: Version = Version(2);
|
||||||
|
|
||||||
const PRIMARIES_MUL: f64 = 1_000_000.0;
|
const PRIMARIES_MUL: f64 = 1_000_000.0;
|
||||||
const PRIMARIES_MUL_INV: f64 = 1.0 / PRIMARIES_MUL;
|
const PRIMARIES_MUL_INV: f64 = 1.0 / PRIMARIES_MUL;
|
||||||
|
|
||||||
|
|
@ -55,6 +61,7 @@ mod consts {
|
||||||
pub const TRANSFER_FUNCTION_ST2084_PQ: u32 = 11;
|
pub const TRANSFER_FUNCTION_ST2084_PQ: u32 = 11;
|
||||||
pub const TRANSFER_FUNCTION_ST428: u32 = 12;
|
pub const TRANSFER_FUNCTION_ST428: u32 = 12;
|
||||||
pub const TRANSFER_FUNCTION_HLG: u32 = 13;
|
pub const TRANSFER_FUNCTION_HLG: u32 = 13;
|
||||||
|
pub const TRANSFER_FUNCTION_COMPOUND_POWER_2_4: u32 = 14;
|
||||||
|
|
||||||
pub const CAUSE_LOW_VERSION: u32 = 0;
|
pub const CAUSE_LOW_VERSION: u32 = 0;
|
||||||
pub const CAUSE_UNSUPPORTED: u32 = 1;
|
pub const CAUSE_UNSUPPORTED: u32 = 1;
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,10 @@ use {
|
||||||
client::{Client, ClientError},
|
client::{Client, ClientError},
|
||||||
cmm::cmm_description::ColorDescription,
|
cmm::cmm_description::ColorDescription,
|
||||||
ifs::{
|
ifs::{
|
||||||
color_management::wp_image_description_v1::WpImageDescriptionV1, wl_surface::WlSurface,
|
color_management::{
|
||||||
|
UNIQUE_CM_IDS_SINCE, wp_image_description_v1::WpImageDescriptionV1,
|
||||||
|
},
|
||||||
|
wl_surface::WlSurface,
|
||||||
},
|
},
|
||||||
leaks::Tracker,
|
leaks::Tracker,
|
||||||
object::{Object, Version},
|
object::{Object, Version},
|
||||||
|
|
@ -43,10 +46,18 @@ impl WpColorManagementSurfaceFeedbackV1 {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_preferred_changed(&self, cd: &ColorDescription) {
|
pub fn send_preferred_changed(&self, cd: &ColorDescription) {
|
||||||
self.client.event(PreferredChanged {
|
let identity = cd.id.raw();
|
||||||
self_id: self.id,
|
if self.version >= UNIQUE_CM_IDS_SINCE {
|
||||||
identity: cd.id.raw() as u32,
|
self.client.event(PreferredChanged2 {
|
||||||
});
|
self_id: self.id,
|
||||||
|
identity,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.client.event(PreferredChanged {
|
||||||
|
self_id: self.id,
|
||||||
|
identity: identity as u32,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,9 @@ use {
|
||||||
globals::{Global, GlobalName},
|
globals::{Global, GlobalName},
|
||||||
ifs::{
|
ifs::{
|
||||||
color_management::{
|
color_management::{
|
||||||
FEATURE_EXTENDED_TARGET_VOLUME, FEATURE_SET_MASTERING_DISPLAY_PRIMARIES,
|
COMPOUND_POWER_2_4_SINCE, FEATURE_EXTENDED_TARGET_VOLUME,
|
||||||
FEATURE_SET_TF_POWER,
|
FEATURE_SET_MASTERING_DISPLAY_PRIMARIES, FEATURE_SET_TF_POWER,
|
||||||
|
SRGB_DEPRECATED_SINCE, TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||||
consts::{
|
consts::{
|
||||||
FEATURE_PARAMETRIC, FEATURE_SET_LUMINANCES, FEATURE_SET_PRIMARIES,
|
FEATURE_PARAMETRIC, FEATURE_SET_LUMINANCES, FEATURE_SET_PRIMARIES,
|
||||||
FEATURE_WINDOWS_SCRGB, PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020,
|
FEATURE_WINDOWS_SCRGB, PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020,
|
||||||
|
|
@ -90,10 +91,15 @@ impl WpColorManagerV1 {
|
||||||
self.send_supported_tf_named(TRANSFER_FUNCTION_EXT_LINEAR);
|
self.send_supported_tf_named(TRANSFER_FUNCTION_EXT_LINEAR);
|
||||||
self.send_supported_tf_named(TRANSFER_FUNCTION_LOG_100);
|
self.send_supported_tf_named(TRANSFER_FUNCTION_LOG_100);
|
||||||
self.send_supported_tf_named(TRANSFER_FUNCTION_LOG_316);
|
self.send_supported_tf_named(TRANSFER_FUNCTION_LOG_316);
|
||||||
self.send_supported_tf_named(TRANSFER_FUNCTION_SRGB);
|
if self.version < SRGB_DEPRECATED_SINCE {
|
||||||
self.send_supported_tf_named(TRANSFER_FUNCTION_EXT_SRGB);
|
self.send_supported_tf_named(TRANSFER_FUNCTION_SRGB);
|
||||||
|
self.send_supported_tf_named(TRANSFER_FUNCTION_EXT_SRGB);
|
||||||
|
}
|
||||||
self.send_supported_tf_named(TRANSFER_FUNCTION_ST2084_PQ);
|
self.send_supported_tf_named(TRANSFER_FUNCTION_ST2084_PQ);
|
||||||
self.send_supported_tf_named(TRANSFER_FUNCTION_ST428);
|
self.send_supported_tf_named(TRANSFER_FUNCTION_ST428);
|
||||||
|
if self.version >= COMPOUND_POWER_2_4_SINCE {
|
||||||
|
self.send_supported_tf_named(TRANSFER_FUNCTION_COMPOUND_POWER_2_4);
|
||||||
|
}
|
||||||
self.send_supported_primaries_named(PRIMARIES_SRGB);
|
self.send_supported_primaries_named(PRIMARIES_SRGB);
|
||||||
self.send_supported_primaries_named(PRIMARIES_PAL_M);
|
self.send_supported_primaries_named(PRIMARIES_PAL_M);
|
||||||
self.send_supported_primaries_named(PRIMARIES_PAL);
|
self.send_supported_primaries_named(PRIMARIES_PAL);
|
||||||
|
|
@ -249,6 +255,25 @@ impl WpColorManagerV1RequestHandler for WpColorManagerV1 {
|
||||||
obj.send_ready();
|
obj.send_ready();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_image_description(
|
||||||
|
&self,
|
||||||
|
req: GetImageDescription,
|
||||||
|
_slf: &Rc<Self>,
|
||||||
|
) -> Result<(), Self::Error> {
|
||||||
|
let desc = self.client.lookup(req.reference)?;
|
||||||
|
let obj = Rc::new(WpImageDescriptionV1 {
|
||||||
|
id: req.image_description,
|
||||||
|
client: self.client.clone(),
|
||||||
|
version: self.version,
|
||||||
|
tracker: Default::default(),
|
||||||
|
description: Some(desc.description.clone()),
|
||||||
|
});
|
||||||
|
track!(self.client, obj);
|
||||||
|
self.client.add_client_obj(&obj)?;
|
||||||
|
obj.send_ready();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
global_base!(
|
global_base!(
|
||||||
|
|
@ -263,7 +288,7 @@ impl Global for WpColorManagerV1Global {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn version(&self) -> u32 {
|
fn version(&self) -> u32 {
|
||||||
1
|
2
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exposed(&self, state: &State) -> bool {
|
fn exposed(&self, state: &State) -> bool {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,8 @@ use {
|
||||||
cmm_primaries::{NamedPrimaries, Primaries},
|
cmm_primaries::{NamedPrimaries, Primaries},
|
||||||
},
|
},
|
||||||
ifs::color_management::{
|
ifs::color_management::{
|
||||||
MIN_LUM_MUL_INV, PRIMARIES_MUL_INV,
|
COMPOUND_POWER_2_4_SINCE, MIN_LUM_MUL_INV, PRIMARIES_MUL_INV, SRGB_DEPRECATED_SINCE,
|
||||||
|
TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||||
consts::{
|
consts::{
|
||||||
PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020, PRIMARIES_CIE1931_XYZ, PRIMARIES_DCI_P3,
|
PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020, PRIMARIES_CIE1931_XYZ, PRIMARIES_DCI_P3,
|
||||||
PRIMARIES_DISPLAY_P3, PRIMARIES_GENERIC_FILM, PRIMARIES_NTSC, PRIMARIES_PAL,
|
PRIMARIES_DISPLAY_P3, PRIMARIES_GENERIC_FILM, PRIMARIES_NTSC, PRIMARIES_PAL,
|
||||||
|
|
@ -116,10 +117,13 @@ impl WpImageDescriptionCreatorParamsV1RequestHandler for WpImageDescriptionCreat
|
||||||
TRANSFER_FUNCTION_EXT_LINEAR => Eotf::Linear,
|
TRANSFER_FUNCTION_EXT_LINEAR => Eotf::Linear,
|
||||||
TRANSFER_FUNCTION_LOG_100 => Eotf::Log100,
|
TRANSFER_FUNCTION_LOG_100 => Eotf::Log100,
|
||||||
TRANSFER_FUNCTION_LOG_316 => Eotf::Log316,
|
TRANSFER_FUNCTION_LOG_316 => Eotf::Log316,
|
||||||
TRANSFER_FUNCTION_SRGB => Eotf::Gamma22,
|
TRANSFER_FUNCTION_SRGB if self.version < SRGB_DEPRECATED_SINCE => Eotf::Gamma22,
|
||||||
TRANSFER_FUNCTION_EXT_SRGB => Eotf::Gamma22,
|
TRANSFER_FUNCTION_EXT_SRGB if self.version < SRGB_DEPRECATED_SINCE => Eotf::Gamma22,
|
||||||
TRANSFER_FUNCTION_ST2084_PQ => Eotf::St2084Pq,
|
TRANSFER_FUNCTION_ST2084_PQ => Eotf::St2084Pq,
|
||||||
TRANSFER_FUNCTION_ST428 => Eotf::St428,
|
TRANSFER_FUNCTION_ST428 => Eotf::St428,
|
||||||
|
TRANSFER_FUNCTION_COMPOUND_POWER_2_4 if self.version >= COMPOUND_POWER_2_4_SINCE => {
|
||||||
|
Eotf::CompoundPower24
|
||||||
|
}
|
||||||
_ => {
|
_ => {
|
||||||
return Err(WpImageDescriptionCreatorParamsV1Error::UnsupportedTf(
|
return Err(WpImageDescriptionCreatorParamsV1Error::UnsupportedTf(
|
||||||
req.tf,
|
req.tf,
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,10 @@ use {
|
||||||
MIN_LUM_MUL, PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020, PRIMARIES_CIE1931_XYZ,
|
MIN_LUM_MUL, PRIMARIES_ADOBE_RGB, PRIMARIES_BT2020, PRIMARIES_CIE1931_XYZ,
|
||||||
PRIMARIES_DCI_P3, PRIMARIES_DISPLAY_P3, PRIMARIES_GENERIC_FILM, PRIMARIES_MUL,
|
PRIMARIES_DCI_P3, PRIMARIES_DISPLAY_P3, PRIMARIES_GENERIC_FILM, PRIMARIES_MUL,
|
||||||
PRIMARIES_NTSC, PRIMARIES_PAL, PRIMARIES_PAL_M, PRIMARIES_SRGB,
|
PRIMARIES_NTSC, PRIMARIES_PAL, PRIMARIES_PAL_M, PRIMARIES_SRGB,
|
||||||
TRANSFER_FUNCTION_BT1886, TRANSFER_FUNCTION_EXT_LINEAR, TRANSFER_FUNCTION_GAMMA22,
|
TRANSFER_FUNCTION_BT1886, TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||||
TRANSFER_FUNCTION_GAMMA28, TRANSFER_FUNCTION_LOG_100, TRANSFER_FUNCTION_LOG_316,
|
TRANSFER_FUNCTION_EXT_LINEAR, TRANSFER_FUNCTION_GAMMA22, TRANSFER_FUNCTION_GAMMA28,
|
||||||
TRANSFER_FUNCTION_ST240, TRANSFER_FUNCTION_ST428, TRANSFER_FUNCTION_ST2084_PQ,
|
TRANSFER_FUNCTION_LOG_100, TRANSFER_FUNCTION_LOG_316, TRANSFER_FUNCTION_ST240,
|
||||||
|
TRANSFER_FUNCTION_ST428, TRANSFER_FUNCTION_ST2084_PQ,
|
||||||
},
|
},
|
||||||
leaks::Tracker,
|
leaks::Tracker,
|
||||||
object::{Object, Version},
|
object::{Object, Version},
|
||||||
|
|
@ -51,6 +52,7 @@ impl WpImageDescriptionInfoV1 {
|
||||||
self.send_tf_power(e);
|
self.send_tf_power(e);
|
||||||
break 'tf;
|
break 'tf;
|
||||||
}
|
}
|
||||||
|
Eotf::CompoundPower24 => TRANSFER_FUNCTION_COMPOUND_POWER_2_4,
|
||||||
};
|
};
|
||||||
self.send_tf_named(tf);
|
self.send_tf_named(tf);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
use {
|
||||||
|
crate::{
|
||||||
|
client::{Client, ClientError},
|
||||||
|
cmm::cmm_description::ColorDescription,
|
||||||
|
leaks::Tracker,
|
||||||
|
object::{Object, Version},
|
||||||
|
wire::{WpImageDescriptionReferenceV1Id, wp_image_description_reference_v1::*},
|
||||||
|
},
|
||||||
|
std::rc::Rc,
|
||||||
|
thiserror::Error,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[expect(dead_code)]
|
||||||
|
pub struct WpImageDescriptionReferenceV1 {
|
||||||
|
pub id: WpImageDescriptionReferenceV1Id,
|
||||||
|
pub client: Rc<Client>,
|
||||||
|
pub tracker: Tracker<Self>,
|
||||||
|
pub description: Rc<ColorDescription>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WpImageDescriptionReferenceV1RequestHandler for WpImageDescriptionReferenceV1 {
|
||||||
|
type Error = WpImageDescriptionReferenceV1Error;
|
||||||
|
|
||||||
|
fn destroy(&self, _req: Destroy, _slf: &Rc<Self>) -> Result<(), Self::Error> {
|
||||||
|
self.client.remove_obj(self)?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object_base! {
|
||||||
|
self = WpImageDescriptionReferenceV1;
|
||||||
|
version = Version(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Object for WpImageDescriptionReferenceV1 {}
|
||||||
|
|
||||||
|
dedicated_add_obj!(
|
||||||
|
WpImageDescriptionReferenceV1,
|
||||||
|
WpImageDescriptionReferenceV1Id,
|
||||||
|
wp_image_description_reference
|
||||||
|
);
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
pub enum WpImageDescriptionReferenceV1Error {
|
||||||
|
#[error(transparent)]
|
||||||
|
ClientError(Box<ClientError>),
|
||||||
|
}
|
||||||
|
efrom!(WpImageDescriptionReferenceV1Error, ClientError);
|
||||||
|
|
@ -2,7 +2,9 @@ use {
|
||||||
crate::{
|
crate::{
|
||||||
client::{Client, ClientError},
|
client::{Client, ClientError},
|
||||||
cmm::cmm_description::ColorDescription,
|
cmm::cmm_description::ColorDescription,
|
||||||
ifs::color_management::wp_image_description_info_v1::WpImageDescriptionInfoV1,
|
ifs::color_management::{
|
||||||
|
UNIQUE_CM_IDS_SINCE, wp_image_description_info_v1::WpImageDescriptionInfoV1,
|
||||||
|
},
|
||||||
leaks::Tracker,
|
leaks::Tracker,
|
||||||
object::{Object, Version},
|
object::{Object, Version},
|
||||||
wire::{WpImageDescriptionV1Id, wp_image_description_v1::*},
|
wire::{WpImageDescriptionV1Id, wp_image_description_v1::*},
|
||||||
|
|
@ -29,10 +31,18 @@ impl WpImageDescriptionV1 {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_ready(&self) {
|
pub fn send_ready(&self) {
|
||||||
self.client.event(Ready {
|
let identity = self.description.as_ref().unwrap().id.raw();
|
||||||
self_id: self.id,
|
if self.version >= UNIQUE_CM_IDS_SINCE {
|
||||||
identity: self.description.as_ref().unwrap().id.raw() as u32,
|
self.client.event(Ready2 {
|
||||||
});
|
self_id: self.id,
|
||||||
|
identity,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.client.event(Ready {
|
||||||
|
self_id: self.id,
|
||||||
|
identity: identity as u32,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
16
src/theme.rs
16
src/theme.rs
|
|
@ -108,6 +108,13 @@ impl Color {
|
||||||
fn gamma28(c: f32) -> f32 {
|
fn gamma28(c: f32) -> f32 {
|
||||||
c.signum() * c.abs().powf(2.8)
|
c.signum() * c.abs().powf(2.8)
|
||||||
}
|
}
|
||||||
|
fn compound_power_2_4(c: f32) -> f32 {
|
||||||
|
if c < 0.04045 {
|
||||||
|
c / 12.92
|
||||||
|
} else {
|
||||||
|
((c + 0.055) / 1.055).powf(2.4)
|
||||||
|
}
|
||||||
|
}
|
||||||
macro_rules! convert {
|
macro_rules! convert {
|
||||||
($tf:ident) => {{
|
($tf:ident) => {{
|
||||||
r = $tf(r);
|
r = $tf(r);
|
||||||
|
|
@ -135,6 +142,7 @@ impl Color {
|
||||||
let pow = |c: f32| -> f32 { c.signum() * c.abs().powf(e) };
|
let pow = |c: f32| -> f32 { c.signum() * c.abs().powf(e) };
|
||||||
convert!(pow)
|
convert!(pow)
|
||||||
}
|
}
|
||||||
|
Eotf::CompoundPower24 => convert!(compound_power_2_4),
|
||||||
}
|
}
|
||||||
Self { r, g, b, a: 1.0 }
|
Self { r, g, b, a: 1.0 }
|
||||||
}
|
}
|
||||||
|
|
@ -237,6 +245,13 @@ impl Color {
|
||||||
fn gamma28(c: f32) -> f32 {
|
fn gamma28(c: f32) -> f32 {
|
||||||
c.signum() * c.abs().powf(1.0 / 2.8)
|
c.signum() * c.abs().powf(1.0 / 2.8)
|
||||||
}
|
}
|
||||||
|
fn compound_power_2_4(c: f32) -> f32 {
|
||||||
|
if c < 0.0031308 {
|
||||||
|
12.92 * c
|
||||||
|
} else {
|
||||||
|
1.055 * c.powf(1.0 / 2.4) - 0.055
|
||||||
|
}
|
||||||
|
}
|
||||||
macro_rules! convert {
|
macro_rules! convert {
|
||||||
($tf:ident) => {{
|
($tf:ident) => {{
|
||||||
for c in &mut res[..3] {
|
for c in &mut res[..3] {
|
||||||
|
|
@ -270,6 +285,7 @@ impl Color {
|
||||||
let pow = |c: f32| -> f32 { c.signum() * c.abs().powf(e) };
|
let pow = |c: f32| -> f32 { c.signum() * c.abs().powf(e) };
|
||||||
convert!(pow)
|
convert!(pow)
|
||||||
}
|
}
|
||||||
|
Eotf::CompoundPower24 => convert!(compound_power_2_4),
|
||||||
}
|
}
|
||||||
if self.a < 1.0 {
|
if self.a < 1.0 {
|
||||||
for c in &mut res[..3] {
|
for c in &mut res[..3] {
|
||||||
|
|
|
||||||
|
|
@ -12,3 +12,7 @@ request get_preferred {
|
||||||
request get_preferred_parametric {
|
request get_preferred_parametric {
|
||||||
image_description: id(wp_image_description_v1) (new),
|
image_description: id(wp_image_description_v1) (new),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event preferred_changed2 (since = 2) {
|
||||||
|
identity: u64,
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,3 +46,8 @@ event supported_primaries_named {
|
||||||
|
|
||||||
event done {
|
event done {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
request get_image_description (since = 2) {
|
||||||
|
image_description: id(wp_image_description_v1) (new),
|
||||||
|
reference: id(wp_image_description_reference_v1),
|
||||||
|
}
|
||||||
|
|
|
||||||
2
wire/wp_image_description_reference_v1.txt
Normal file
2
wire/wp_image_description_reference_v1.txt
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
request destroy (destructor) {
|
||||||
|
}
|
||||||
|
|
@ -13,3 +13,7 @@ event ready {
|
||||||
request get_information {
|
request get_information {
|
||||||
information: id(wp_image_description_info_v1) (new),
|
information: id(wp_image_description_info_v1) (new),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event ready2 (since = 2) {
|
||||||
|
identity: u64,
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue