Skip to main content

Cicp

Struct Cicp 

Source
pub struct Cicp {
    pub primaries: CicpColorPrimaries,
    pub transfer: CicpTransferCharacteristics,
    pub matrix: CicpMatrixCoefficients,
    pub full_range: CicpVideoFullRangeFlag,
}
Expand description

Fields§

§primaries: CicpColorPrimaries

Defines the exact color of red, green, blue primary colors.

§transfer: CicpTransferCharacteristics

The electro-optical transfer function (EOTF) that maps color components to linear values.

§matrix: CicpMatrixCoefficients

A matrix between linear values and primary color representation.

For an RGB space this is the identity matrix.

§full_range: CicpVideoFullRangeFlag

Whether the color components use all bits of the encoded values, or have headroom.

For compute purposes, image only supports CicpVideoFullRangeFlag::FullRange and you get errors when trying to pass a non-full-range color profile to transform APIs such as DynamicImage::apply_color_space or CicpTransform::new.

Implementations§

Source§

impl Cicp

Source

pub const SRGB: Self

The sRGB color space, BT.709 transfer function and D65 whitepoint.

Source

pub const SRGB_LINEAR: Self

SRGB primaries and whitepoint with linear samples.

Source

pub const DISPLAY_P3: Self

The Display-P3 color space, a wide-gamut choice with SMPTE RP 432-2 primaries.

Note that this modern Display P3 uses a D65 whitepoint. Use the primaries SmpteRp431 for the previous standard. The advantage of the new standard is the color system shares its whitepoint with sRGB and BT.2020.

Source

fn to_moxcms_compute_profile(self) -> Option<ColorProfile>

Get an compute representation of an ICC profile for RGB.

Note you should not be using this profile for export in a file, as discussed below.

This is straightforward for Rgb and RgbA representations.

Our luma models a Y component of a YCbCr color space. It turns out that ICC V4 does not support pure Luma in any other whitepoint apart from D50 (the native profile connection space). The use of a grayTRC does not take the chromatic adaptation matrix into account. Of course we can encode the adaptation into the TRC as a coefficient, the Y component of the product of the whitepoint adaptation matrix inverse and the pcs’s whitepoint XYZ, but that is only correct for gray -> gray conversion (and that coefficient should generally be 1).

Hence we use a YCbCr. The data->pcs path could be modelled by (“M” curves, matrix, “B” curves) where B curves or M curves are all the identity, depending on whether constant or non-constant luma is in use. This is a subset of the capabilities that a lutAToBType allows. Unfortunately, this is not implemented in moxcms yet and for efficiency we would like to have a masked create_transform_* in which the CbCr channels are discarded / assumed 0 instead of them being in memory. Due to this special case and for supporting conversions between sample types, we implement said promotion as part of conversion to Rgba32F in this crate.

For export to file, it would arguably correct to use a carefully crafted gray profile which we may implement in another function. That is, we could setup a tone reproduction curve which maps each sample value (which ICC regards as D50) into XYZ D50 in such a way that it appears with the correct D50 luminance that we would get if we had used the conversion unders its true input whitepoint. The resulting color has a slightly wrong chroma as it is linearly dependent on D50 instead, but it’s brightness would be correctly presented. At least for perceptual intent this might be alright.

Source

pub(crate) const fn qualify_stability(&self) -> bool

Whether we have invested enough testing to ensure that color values can be assumed to be stable and correspond to an intended effect, in particular if there even is a well-defined meaning to these color spaces.

For instance, our current code for the ‘luma’ equivalent space assumes that the color space has a shared transfer function for all its color components. Also the judgment should not depend on whether we can represent the profile in moxcms but rather if we understand the profile well enough so that conversion implemented through another library can be derived. (Consider the case of a builtin transform-while-encoding that may be more performant for a format that does not support CICP or ICC profiles.)

A stable profile should also have derived_luminance implemented.

Source

pub(crate) const fn into_rgb(self) -> CicpRgb

Discard matrix and range information.

Source

pub(crate) fn try_into_rgb(self) -> Result<CicpRgb, ImageError>

Trait Implementations§

Source§

impl Clone for Cicp

Source§

fn clone(&self) -> Cicp

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Cicp

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<CicpRgb> for Cicp

Source§

fn from(cicp: CicpRgb) -> Self

Converts to this type from the input type.
Source§

impl Hash for Cicp

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Cicp

Source§

fn eq(&self, other: &Cicp) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for Cicp

Source§

impl Eq for Cicp

Source§

impl StructuralPartialEq for Cicp

Auto Trait Implementations§

§

impl Freeze for Cicp

§

impl RefUnwindSafe for Cicp

§

impl Send for Cicp

§

impl Sync for Cicp

§

impl Unpin for Cicp

§

impl UnsafeUnpin for Cicp

§

impl UnwindSafe for Cicp

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.