Skip to content

Commit ba96329

Browse files
committedJul 19, 2021
Add a MixAssign trait and remove the Float requirement from Mix
1 parent 9420855 commit ba96329

18 files changed

+486
-133
lines changed
 

‎palette/src/alpha/alpha.rs

+24-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use core::fmt;
22
use core::ops::{Add, AddAssign, Deref, DerefMut, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
33

44
use approx::{AbsDiffEq, RelativeEq, UlpsEq};
5+
use num_traits::{One, Zero};
56
#[cfg(feature = "random")]
67
use rand::distributions::uniform::{SampleBorrow, SampleUniform, Uniform, UniformSampler};
78
#[cfg(feature = "random")]
@@ -15,7 +16,7 @@ use crate::encoding::pixel::RawPixel;
1516
use crate::float::Float;
1617
use crate::{
1718
clamp, clamp_assign, Blend, Clamp, ClampAssign, Component, ComponentWise, GetHue, Hue,
18-
IsWithinBounds, Mix, Pixel, Saturate, Shade, WithAlpha,
19+
IsWithinBounds, Mix, MixAssign, Pixel, Saturate, Shade, WithAlpha,
1920
};
2021

2122
/// An alpha component wrapper for colors.
@@ -110,18 +111,37 @@ impl<C, T> DerefMut for Alpha<C, T> {
110111
impl<C> Mix for Alpha<C, C::Scalar>
111112
where
112113
C: Mix,
114+
C::Scalar: Zero + One + PartialOrd + Sub<Output = C::Scalar> + Clone,
113115
{
114116
type Scalar = C::Scalar;
115117

116118
#[inline]
117-
fn mix(mut self, other: Alpha<C, C::Scalar>, factor: C::Scalar) -> Alpha<C, C::Scalar> {
118-
self.color = self.color.mix(other.color, factor);
119-
self.alpha = self.alpha + factor * (other.alpha - self.alpha);
119+
fn mix(mut self, other: Self, factor: C::Scalar) -> Self {
120+
let factor = clamp(factor, C::Scalar::zero(), C::Scalar::one());
121+
122+
self.color = self.color.mix(other.color, factor.clone());
123+
self.alpha = self.alpha.clone() + factor * (other.alpha - self.alpha);
120124

121125
self
122126
}
123127
}
124128

129+
impl<C> MixAssign for Alpha<C, C::Scalar>
130+
where
131+
C: MixAssign,
132+
C::Scalar: Zero + One + PartialOrd + Sub<Output = C::Scalar> + AddAssign + Clone,
133+
{
134+
type Scalar = C::Scalar;
135+
136+
#[inline]
137+
fn mix_assign(&mut self, other: Self, factor: C::Scalar) {
138+
let factor = clamp(factor, C::Scalar::zero(), C::Scalar::one());
139+
140+
self.color.mix_assign(other.color, factor.clone());
141+
self.alpha += factor * (other.alpha - self.alpha.clone());
142+
}
143+
}
144+
125145
impl<C: Shade> Shade for Alpha<C, C::Scalar> {
126146
type Scalar = C::Scalar;
127147

‎palette/src/blend/pre_alpha.rs

+24-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use core::ops::{Add, AddAssign, Deref, DerefMut, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
22

33
use approx::{AbsDiffEq, RelativeEq, UlpsEq};
4+
use num_traits::{One, Zero};
45

56
use crate::encoding::pixel::RawPixel;
67
use crate::float::Float;
7-
use crate::{clamp, Alpha, Blend, ComponentWise, Mix, Pixel};
8+
use crate::{clamp, Alpha, Blend, ComponentWise, Mix, MixAssign, Pixel};
89

910
/// Premultiplied alpha wrapper.
1011
///
@@ -113,18 +114,37 @@ where
113114
impl<C> Mix for PreAlpha<C, C::Scalar>
114115
where
115116
C: Mix,
117+
C::Scalar: Zero + One + PartialOrd + Sub<Output = C::Scalar> + Clone,
116118
{
117119
type Scalar = C::Scalar;
118120

119121
#[inline]
120-
fn mix(mut self, other: PreAlpha<C, C::Scalar>, factor: C::Scalar) -> PreAlpha<C, C::Scalar> {
121-
self.color = self.color.mix(other.color, factor);
122-
self.alpha = self.alpha + factor * (other.alpha - self.alpha);
122+
fn mix(mut self, other: Self, factor: C::Scalar) -> Self {
123+
let factor = clamp(factor, C::Scalar::zero(), C::Scalar::one());
124+
125+
self.color = self.color.mix(other.color, factor.clone());
126+
self.alpha = self.alpha.clone() + factor * (other.alpha - self.alpha);
123127

124128
self
125129
}
126130
}
127131

132+
impl<C> MixAssign for PreAlpha<C, C::Scalar>
133+
where
134+
C: MixAssign,
135+
C::Scalar: Zero + One + PartialOrd + Sub<Output = C::Scalar> + AddAssign + Clone,
136+
{
137+
type Scalar = C::Scalar;
138+
139+
#[inline]
140+
fn mix_assign(&mut self, other: Self, factor: C::Scalar) {
141+
let factor = clamp(factor, C::Scalar::zero(), C::Scalar::one());
142+
143+
self.color.mix_assign(other.color, factor.clone());
144+
self.alpha += factor * (other.alpha - self.alpha.clone());
145+
}
146+
}
147+
128148
impl<C: ComponentWise<Scalar = T>, T: Clone> ComponentWise for PreAlpha<C, T> {
129149
type Scalar = T;
130150

0 commit comments

Comments
 (0)