pub struct DynamicReader<T> { /* private fields */ }
Expand description
A reader of a Dynamic<T>
that tracks the last generation accessed.
Implementations§
Source§impl DynamicReader<WidgetInstance>
impl DynamicReader<WidgetInstance>
Sourcepub fn into_switcher(self) -> Switcher
pub fn into_switcher(self) -> Switcher
Returns a new Switcher
widget whose contents is the value of this
dynamic reader.
Sourcepub fn to_switcher(&self) -> Switcher
pub fn to_switcher(&self) -> Switcher
Returns a new Switcher
widget whose contents is the value of this
dynamic reader.
Source§impl<T> DynamicReader<T>
impl<T> DynamicReader<T>
Sourcepub fn lock(&self) -> DynamicGuard<'_, T, true>
pub fn lock(&self) -> DynamicGuard<'_, T, true>
Returns an read-only, exclusive reference to the contents of this dynamic.
This call will block until all other guards for this dynamic have been dropped.
§Panics
This function panics if this value is already locked by the current thread.
Sourcepub fn read_generation(&self) -> Generation
pub fn read_generation(&self) -> Generation
Returns the current generation that has been accessed through this reader.
Sourcepub fn has_updated(&self) -> bool
pub fn has_updated(&self) -> bool
Returns true if the dynamic has been modified since the last time the value was accessed through this reader.
§Panics
This function panics if this value is already locked by the current thread.
Sourcepub fn block_until_updated(&self) -> bool
pub fn block_until_updated(&self) -> bool
Blocks the current thread until the contained value has been updated or there are no remaining writers for the value.
Returns true if a newly updated value was discovered.
§Panics
This function panics if this value is already locked by the current thread.
Sourcepub fn connected(&self) -> bool
pub fn connected(&self) -> bool
Returns true if this reader still has any writers connected to it.
Sourcepub fn wait_until_updated(&self) -> BlockUntilUpdatedFuture<'_, T> ⓘ
pub fn wait_until_updated(&self) -> BlockUntilUpdatedFuture<'_, T> ⓘ
Suspends the current async task until the contained value has been updated or there are no remaining writers for the value.
Returns true if a newly updated value was discovered.
Sourcepub fn on_disconnect<OnDisconnect>(&self, on_disconnect: OnDisconnect)
pub fn on_disconnect<OnDisconnect>(&self, on_disconnect: OnDisconnect)
Invokes on_disconnect
when no instances of Dynamic<T>
exist.
This callback will be invoked even if this DynamicReader
has been
dropped.
§Panics
This function panics if this value is already locked by the current thread.
Trait Implementations§
Source§impl<T> Clone for DynamicReader<T>
impl<T> Clone for DynamicReader<T>
Source§impl<T> Debug for DynamicReader<T>where
T: Debug,
impl<T> Debug for DynamicReader<T>where
T: Debug,
Source§impl<T> Displayable<T> for DynamicReader<T>
impl<T> Displayable<T> for DynamicReader<T>
Source§fn into_displayable(self) -> DynamicReader<T>
fn into_displayable(self) -> DynamicReader<T>
Source§fn into_label(self) -> Label<T>
fn into_label(self) -> Label<T>
Source§impl<T> Drop for DynamicReader<T>
impl<T> Drop for DynamicReader<T>
Source§impl<T> DynamicRead<T> for DynamicReader<T>
impl<T> DynamicRead<T> for DynamicReader<T>
Source§fn read(&self) -> DynamicGuard<'_, T, true>
fn read(&self) -> DynamicGuard<'_, T, true>
Source§fn read_nonblocking(
&self,
) -> Result<DynamicGuard<'_, T, true>, TryLockError<'_>>
fn read_nonblocking( &self, ) -> Result<DynamicGuard<'_, T, true>, TryLockError<'_>>
Source§impl<T> From<Dynamic<T>> for DynamicReader<T>
impl<T> From<Dynamic<T>> for DynamicReader<T>
Source§impl<T> From<DynamicReader<T>> for ReadOnly<T>
impl<T> From<DynamicReader<T>> for ReadOnly<T>
Source§fn from(value: DynamicReader<T>) -> Self
fn from(value: DynamicReader<T>) -> Self
Source§impl<T> IntoReadOnly<T> for DynamicReader<T>
impl<T> IntoReadOnly<T> for DynamicReader<T>
Source§fn into_read_only(self) -> ReadOnly<T>
fn into_read_only(self) -> ReadOnly<T>
self
as a ReadOnly
.Source§impl<T> IntoReader<T> for DynamicReader<T>
impl<T> IntoReader<T> for DynamicReader<T>
Source§fn into_reader(self) -> DynamicReader<T>
fn into_reader(self) -> DynamicReader<T>
Source§impl<T> Source<T> for DynamicReader<T>
impl<T> Source<T> for DynamicReader<T>
Source§fn try_map_generational<R>(
&self,
map: impl FnOnce(DynamicGuard<'_, T, true>) -> R,
) -> Result<R, DeadlockError>
fn try_map_generational<R>( &self, map: impl FnOnce(DynamicGuard<'_, T, true>) -> R, ) -> Result<R, DeadlockError>
Generation
.Source§fn on_change_try<F>(&self, on_change: F) -> CallbackHandle
fn on_change_try<F>(&self, on_change: F) -> CallbackHandle
on_change
when the contents of this dynamic are updated. Read moreSource§fn for_each_subsequent_generational_try<F>(&self, for_each: F) -> CallbackHandlewhere
T: Send + 'static,
F: for<'a> FnMut(DynamicGuard<'_, T, true>) -> Result<(), CallbackDisconnected> + Send + 'static,
fn for_each_subsequent_generational_try<F>(&self, for_each: F) -> CallbackHandlewhere
T: Send + 'static,
F: for<'a> FnMut(DynamicGuard<'_, T, true>) -> Result<(), CallbackDisconnected> + Send + 'static,
for_each
to this value so that it is invoked each time the
source’s contents are updated. Read moreSource§fn for_each_subsequent_generational_cloned_try<F>(
&self,
for_each: F,
) -> CallbackHandlewhere
T: Clone + Send + 'static,
F: FnMut(GenerationalValue<T>) -> Result<(), CallbackDisconnected> + Send + 'static,
fn for_each_subsequent_generational_cloned_try<F>(
&self,
for_each: F,
) -> CallbackHandlewhere
T: Clone + Send + 'static,
F: FnMut(GenerationalValue<T>) -> Result<(), CallbackDisconnected> + Send + 'static,
for_each
with the current contents and each time this source’s
contents are updated. Read moreSource§fn map_generational<R>(
&self,
map: impl FnOnce(DynamicGuard<'_, T, true>) -> R,
) -> R
fn map_generational<R>( &self, map: impl FnOnce(DynamicGuard<'_, T, true>) -> R, ) -> R
Generation
. Read moreSource§fn generation(&self) -> Generation
fn generation(&self) -> Generation
Source§fn map_ref<R>(&self, map: impl FnOnce(&T) -> R) -> R
fn map_ref<R>(&self, map: impl FnOnce(&T) -> R) -> R
Source§fn try_map_ref<R>(&self, map: impl FnOnce(&T) -> R) -> Result<R, DeadlockError>
fn try_map_ref<R>(&self, map: impl FnOnce(&T) -> R) -> Result<R, DeadlockError>
Source§fn try_get(&self) -> Result<T, DeadlockError>where
T: Clone,
fn try_get(&self) -> Result<T, DeadlockError>where
T: Clone,
Source§fn get_tracking_redraw(&self, context: &WidgetContext<'_>) -> T
fn get_tracking_redraw(&self, context: &WidgetContext<'_>) -> T
Source§fn get_tracking_invalidate(&self, context: &WidgetContext<'_>) -> T
fn get_tracking_invalidate(&self, context: &WidgetContext<'_>) -> T
Source§fn on_change<F>(&self, on_change: F) -> CallbackHandle
fn on_change<F>(&self, on_change: F) -> CallbackHandle
on_change
when the contents of this dynamic are updated.Source§fn for_each_subsequent_generational<F>(&self, for_each: F) -> CallbackHandle
fn for_each_subsequent_generational<F>(&self, for_each: F) -> CallbackHandle
for_each
to this value so that it is invoked each time the
source’s contents are updated. Read moreSource§fn for_each_subsequent_try<F>(&self, for_each: F) -> CallbackHandle
fn for_each_subsequent_try<F>(&self, for_each: F) -> CallbackHandle
for_each
to this value so that it is invoked each time the
source’s contents are updated. Read moreSource§fn for_each_subsequent<F>(&self, for_each: F) -> CallbackHandle
fn for_each_subsequent<F>(&self, for_each: F) -> CallbackHandle
for_each
to this value so that it is invoked each time the
source’s contents are updated. Read moreSource§fn for_each_generational_try<F>(&self, for_each: F) -> CallbackHandlewhere
T: Send + 'static,
F: for<'a> FnMut(DynamicGuard<'_, T, true>) -> Result<(), CallbackDisconnected> + Send + 'static,
fn for_each_generational_try<F>(&self, for_each: F) -> CallbackHandlewhere
T: Send + 'static,
F: for<'a> FnMut(DynamicGuard<'_, T, true>) -> Result<(), CallbackDisconnected> + Send + 'static,
for_each
with the current contents and each time this source’s
contents are updated. Read moreSource§fn for_each_generational<F>(&self, for_each: F) -> CallbackHandle
fn for_each_generational<F>(&self, for_each: F) -> CallbackHandle
for_each
with the current contents and each time this source’s
contents are updated.Source§fn for_each_try<F>(&self, for_each: F) -> CallbackHandle
fn for_each_try<F>(&self, for_each: F) -> CallbackHandle
for_each
with the current contents and each time this source’s
contents are updated. Read moreSource§fn for_each<F>(&self, for_each: F) -> CallbackHandle
fn for_each<F>(&self, for_each: F) -> CallbackHandle
for_each
with the current contents and each time this source’s
contents are updated.Source§fn for_each_generational_cloned_try<F>(&self, for_each: F) -> CallbackHandlewhere
T: Clone + Send + 'static,
F: FnMut(GenerationalValue<T>) -> Result<(), CallbackDisconnected> + Send + 'static,
fn for_each_generational_cloned_try<F>(&self, for_each: F) -> CallbackHandlewhere
T: Clone + Send + 'static,
F: FnMut(GenerationalValue<T>) -> Result<(), CallbackDisconnected> + Send + 'static,
for_each
with the current contents and each time this source’s
contents are updated. Read moreSource§fn for_each_cloned_try<F>(&self, for_each: F) -> CallbackHandle
fn for_each_cloned_try<F>(&self, for_each: F) -> CallbackHandle
for_each
with the current contents and each time this source’s
contents are updated. Read moreSource§fn for_each_subsequent_cloned_try<F>(&self, for_each: F) -> CallbackHandle
fn for_each_subsequent_cloned_try<F>(&self, for_each: F) -> CallbackHandle
for_each
each time this source’s contents are updated. Read moreSource§fn for_each_subsequent_cloned<F>(&self, for_each: F) -> CallbackHandle
fn for_each_subsequent_cloned<F>(&self, for_each: F) -> CallbackHandle
for_each
each time this source’s contents are updated.Source§fn for_each_cloned<F>(&self, for_each: F) -> CallbackHandle
fn for_each_cloned<F>(&self, for_each: F) -> CallbackHandle
for_each
with the current contents and each time this source’s
contents are updated.Source§fn for_each_notify(&self, notify: impl Into<Notify<T>>) -> CallbackHandle
fn for_each_notify(&self, notify: impl Into<Notify<T>>) -> CallbackHandle
notify
with a clone of the current contents each time this
source’s contents are updated.Source§fn for_each_try_notify(&self, notify: impl Into<Notify<T>>) -> CallbackHandle
fn for_each_try_notify(&self, notify: impl Into<Notify<T>>) -> CallbackHandle
notify
with a clone of the current contents each time this
source’s contents are updated, disconnecting the callback if the target
is disconnected.Source§fn debounced_every(&self, period: Duration) -> Dynamic<T>
fn debounced_every(&self, period: Duration) -> Dynamic<T>
period
.Source§fn debounced_with_delay(&self, period: Duration) -> Dynamic<T>
fn debounced_with_delay(&self, period: Duration) -> Dynamic<T>
period
. Each time this value is updated, the delay is
reset.Source§fn map_each_generational<R, F>(&self, map: F) -> Dynamic<R>
fn map_each_generational<R, F>(&self, map: F) -> Dynamic<R>
map
each time this value is changed.Source§fn map_each<R, F>(&self, map: F) -> Dynamic<R>
fn map_each<R, F>(&self, map: F) -> Dynamic<R>
map
each time this value is changed.Source§fn map_each_cloned<R, F>(&self, map: F) -> Dynamic<R>
fn map_each_cloned<R, F>(&self, map: F) -> Dynamic<R>
map
each time this value is changed.Source§fn weak_clone(&self) -> Dynamic<T>
fn weak_clone(&self) -> Dynamic<T>
Source§fn map_each_into<U>(&self) -> Dynamic<U>
fn map_each_into<U>(&self) -> Dynamic<U>
U::from(T.clone())
each
time self
is updated.Source§impl<'s, T, U> Unwrapped<U> for &'s DynamicReader<T>
impl<'s, T, U> Unwrapped<U> for &'s DynamicReader<T>
Source§fn unwrapped_or_else(self, initial: impl FnOnce() -> U) -> Dynamic<U>
fn unwrapped_or_else(self, initial: impl FnOnce() -> U) -> Dynamic<U>
Source§fn for_each_unwrapped_try<ForEach>(self, for_each: ForEach) -> CallbackHandle
fn for_each_unwrapped_try<ForEach>(self, for_each: ForEach) -> CallbackHandle
Source§fn unwrapped(self) -> Dynamic<T>where
T: Default,
fn unwrapped(self) -> Dynamic<T>where
T: Default,
Source§fn for_each_unwrapped<ForEach>(self, for_each: ForEach) -> CallbackHandle
fn for_each_unwrapped<ForEach>(self, for_each: ForEach) -> CallbackHandle
for_each
when self
is updated with a value that can be
unwrapped.Auto Trait Implementations§
impl<T> !Freeze for DynamicReader<T>
impl<T> !RefUnwindSafe for DynamicReader<T>
impl<T> Send for DynamicReader<T>where
T: Send,
impl<T> Sync for DynamicReader<T>where
T: Send,
impl<T> Unpin for DynamicReader<T>
impl<T> !UnwindSafe for DynamicReader<T>
Blanket Implementations§
Source§impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for Swhere
T: Real + Zero + Arithmetics + Clone,
Swp: WhitePoint<T>,
Dwp: WhitePoint<T>,
D: AdaptFrom<S, Swp, Dwp, T>,
Source§fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
fn adapt_into_using<M>(self, method: M) -> Dwhere
M: TransformMatrix<T>,
Source§fn adapt_into(self) -> D
fn adapt_into(self) -> D
Source§impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
impl<T, C> ArraysFrom<C> for Twhere
C: IntoArrays<T>,
Source§fn arrays_from(colors: C) -> T
fn arrays_from(colors: C) -> T
Source§impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
impl<T, C> ArraysInto<C> for Twhere
C: FromArrays<T>,
Source§fn arrays_into(self) -> C
fn arrays_into(self) -> C
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for Uwhere
T: FromCam16Unclamped<WpParam, U>,
Source§type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn cam16_into_unclamped(
self,
parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>,
) -> T
fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.§impl<A> Cast for A
impl<A> Cast for A
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
impl<T, C> ComponentsFrom<C> for Twhere
C: IntoComponents<T>,
Source§fn components_from(colors: C) -> T
fn components_from(colors: C) -> T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FromAngle<T> for T
impl<T> FromAngle<T> for T
Source§fn from_angle(angle: T) -> T
fn from_angle(angle: T) -> T
angle
.Source§impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
impl<T, U> FromStimulus<U> for Twhere
U: IntoStimulus<T>,
Source§fn from_stimulus(other: U) -> T
fn from_stimulus(other: U) -> T
other
into Self
, while performing the appropriate scaling,
rounding and clamping.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
impl<T, U> IntoAngle<U> for Twhere
U: FromAngle<T>,
Source§fn into_angle(self) -> U
fn into_angle(self) -> U
T
.Source§impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for Uwhere
T: Cam16FromUnclamped<WpParam, U>,
Source§type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar
parameters
when converting.Source§fn into_cam16_unclamped(
self,
parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>,
) -> T
fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T
self
into C
, using the provided parameters.Source§impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
impl<T, U> IntoColor<U> for Twhere
U: FromColor<T>,
Source§fn into_color(self) -> U
fn into_color(self) -> U
Source§impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
impl<T, U> IntoColorUnclamped<U> for Twhere
U: FromColorUnclamped<T>,
Source§fn into_color_unclamped(self) -> U
fn into_color_unclamped(self) -> U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> IntoReadOnly<T> for T
impl<T> IntoReadOnly<T> for T
Source§fn into_read_only(self) -> ReadOnly<T>
fn into_read_only(self) -> ReadOnly<T>
self
as a ReadOnly
.Source§impl<T> IntoStimulus<T> for T
impl<T> IntoStimulus<T> for T
Source§fn into_stimulus(self) -> T
fn into_stimulus(self) -> T
self
into T
, while performing the appropriate scaling,
rounding and clamping.Source§impl<T> IntoValue<T> for T
impl<T> IntoValue<T> for T
Source§fn into_value(self) -> Value<T>
fn into_value(self) -> Value<T>
Value
.§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T, U> Progressable<U> for T
impl<T, U> Progressable<U> for T
Source§fn progress_bar(self) -> ProgressBar
fn progress_bar(self) -> ProgressBar
T::MIN
to
T::MAX
.Source§fn progress_bar_to(self, max: impl IntoReadOnly<T::Value>) -> ProgressBar
fn progress_bar_to(self, max: impl IntoReadOnly<T::Value>) -> ProgressBar
T::MIN
to
max
. The maximum value can be either a T
or an Option<T>
. If
None
is the maximum value, an indeterminant progress bar will be
displayed.Source§fn progress_bar_between<Range>(self, range: Range) -> ProgressBar
fn progress_bar_between<Range>(self, range: Range) -> ProgressBar
range
of T
. The range can be either a T..=T
or an Option<T>
. If
None
is specified as the range, an indeterminant progress bar will be
displayed.Source§impl<T> Trackable for Twhere
T: Trackable,
impl<T> Trackable for Twhere
T: Trackable,
Source§fn redraw_when_changed(&self, context: &WidgetContext<'_>)where
Self: Sized,
fn redraw_when_changed(&self, context: &WidgetContext<'_>)where
Self: Sized,
Source§fn invalidate_when_changed(&self, context: &WidgetContext<'_>)where
Self: Sized,
fn invalidate_when_changed(&self, context: &WidgetContext<'_>)where
Self: Sized,
Source§impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
impl<T, C> TryComponentsInto<C> for Twhere
C: TryFromComponents<T>,
Source§type Error = <C as TryFromComponents<T>>::Error
type Error = <C as TryFromComponents<T>>::Error
try_into_colors
fails to cast.Source§fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>
Source§impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
impl<T, U> TryIntoColor<U> for Twhere
U: TryFromColor<T>,
Source§fn try_into_color(self) -> Result<U, OutOfBounds<U>>
fn try_into_color(self) -> Result<U, OutOfBounds<U>>
OutOfBounds
error is returned which contains
the unclamped color. Read more