Add generic to_channel method
This commit is contained in:
parent
c4728af209
commit
7e70e826f2
3 changed files with 25 additions and 30 deletions
|
@ -15,7 +15,7 @@
|
|||
|
||||
pub trait Channel: Num {
|
||||
pub fn from<T:Channel>(chan: T) -> Self;
|
||||
|
||||
pub fn to_channel<T:Channel>(&self) -> T;
|
||||
pub fn to_channel_u8(&self) -> u8;
|
||||
pub fn to_channel_u16(&self) -> u16;
|
||||
pub fn to_channel_f32(&self) -> f32;
|
||||
|
@ -24,7 +24,7 @@ pub trait Channel: Num {
|
|||
|
||||
impl Channel for u8 {
|
||||
#[inline] pub fn from<T:Channel>(chan: T) -> u8 { chan.to_channel_u8() }
|
||||
|
||||
#[inlune] pub fn to_channel<T:Channel>(&self) -> T { Channel::from(*self) }
|
||||
#[inline] pub fn to_channel_u8(&self) -> u8 { (*self) }
|
||||
#[inline] pub fn to_channel_u16(&self) -> u16 { (*self as u16 << 8) | (*self) as u16 }
|
||||
#[inline] pub fn to_channel_f32(&self) -> f32 { (*self as f32) / (0xFF as f32) }
|
||||
|
@ -33,7 +33,7 @@ impl Channel for u8 {
|
|||
|
||||
impl Channel for u16 {
|
||||
#[inline] pub fn from<T:Channel>(chan: T) -> u16 { chan.to_channel_u16() }
|
||||
|
||||
#[inlune] pub fn to_channel<T:Channel>(&self) -> T { Channel::from(*self) }
|
||||
#[inline] pub fn to_channel_u8(&self) -> u8 { (*self >> 8) as u8 }
|
||||
#[inline] pub fn to_channel_u16(&self) -> u16 { (*self) }
|
||||
#[inline] pub fn to_channel_f32(&self) -> f32 { (*self) / 0xFFFF as f32 }
|
||||
|
@ -42,8 +42,8 @@ impl Channel for u16 {
|
|||
|
||||
impl Channel for f32 {
|
||||
#[inline] pub fn from<T:Channel>(chan: T) -> f32 { chan.to_channel_f32() }
|
||||
|
||||
#[inline] pub fn to_channel_u8(&self) -> u8 { (*self) * (0xFF_u8 as f32) as u8 }
|
||||
#[inlune] pub fn to_channel<T:Channel>(&self) -> T { Channel::from(*self) }
|
||||
#[inline] pub fn to_channel_u8(&self) -> u8 { (*self) * (0xFF_u8 as f32) as u8 }
|
||||
#[inline] pub fn to_channel_u16(&self) -> u16 { (*self) * (0xFFFF_u16 as f32) as u16 }
|
||||
#[inline] pub fn to_channel_f32(&self) -> f32 { (*self) }
|
||||
#[inline] pub fn to_channel_f64(&self) -> f64 { (*self) as f64 }
|
||||
|
@ -51,8 +51,8 @@ impl Channel for f32 {
|
|||
|
||||
impl Channel for f64 {
|
||||
#[inline] pub fn from<T:Channel>(chan: T) -> f64 { chan.to_channel_f64() }
|
||||
|
||||
#[inline] pub fn to_channel_u8(&self) -> u8 { (*self) * (0xFF_u8 as f64) as u8 }
|
||||
#[inlune] pub fn to_channel<T:Channel>(&self) -> T { Channel::from(*self) }
|
||||
#[inline] pub fn to_channel_u8(&self) -> u8 { (*self) * (0xFF_u8 as f64) as u8 }
|
||||
#[inline] pub fn to_channel_u16(&self) -> u16 { (*self) * (0xFFFF_u16 as f64) as u16 }
|
||||
#[inline] pub fn to_channel_f32(&self) -> f32 { (*self) as f32 }
|
||||
#[inline] pub fn to_channel_f64(&self) -> f64 { (*self) }
|
||||
|
@ -118,9 +118,11 @@ mod tests {
|
|||
assert_eq!(0.75f32.to_channel_u16(), 0xBFFF);
|
||||
assert_eq!(1.00f32.to_channel_u16(), 0xFFFF);
|
||||
|
||||
// TODO: test to_channel_f32()
|
||||
assert_eq!(0.00f32.to_channel_f32(), 0.00f32);
|
||||
assert_eq!(1.00f32.to_channel_f32(), 1.00f32);
|
||||
|
||||
// TODO: test to_channel_f64()
|
||||
assert_eq!(0.00f32.to_channel_f64(), 0.00f64);
|
||||
assert_eq!(1.00f32.to_channel_f64(), 1.00f64);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
@ -137,8 +139,10 @@ mod tests {
|
|||
assert_eq!(0.75f64.to_channel_u16(), 0xBFFF);
|
||||
assert_eq!(1.00f64.to_channel_u16(), 0xFFFF);
|
||||
|
||||
// TODO: test to_channel_f32()
|
||||
assert_eq!(0.00f64.to_channel_f32(), 0.00f32);
|
||||
assert_eq!(1.00f64.to_channel_f32(), 1.00f32);
|
||||
|
||||
// TODO: test to_channel_f64()
|
||||
assert_eq!(0.00f64.to_channel_f64(), 0.00f64);
|
||||
assert_eq!(1.00f64.to_channel_f64(), 1.00f64);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,9 +38,9 @@ pub trait ToHSV {
|
|||
impl<T:Clone + Channel + Float> ToHSV for HSV<T> {
|
||||
#[inline]
|
||||
pub fn to_hsv<U:Channel + Float>(&self) -> HSV<U> {
|
||||
HSV::new(Channel::from((*self).h.clone()),
|
||||
Channel::from((*self).s.clone()),
|
||||
Channel::from((*self).v.clone()))
|
||||
HSV::new((*self).h.to_channel(),
|
||||
(*self).s.to_channel(),
|
||||
(*self).v.to_channel())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -110,10 +110,7 @@ impl<C: ToHSV, T:Clone + Channel + Float> ToHSVA for (C, T) {
|
|||
pub fn to_hsva<U:Channel + Float>(&self) -> HSVA<U> {
|
||||
match *self {
|
||||
(ref hsv, ref a) => {
|
||||
HSVA::from_hsv_a(
|
||||
hsv.to_hsv(),
|
||||
Channel::from(a.clone())
|
||||
)
|
||||
HSVA::from_hsv_a(hsv.to_hsv(), a.to_channel())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -122,9 +119,6 @@ impl<C: ToHSV, T:Clone + Channel + Float> ToHSVA for (C, T) {
|
|||
impl<T:Clone + Channel + Float> ToRGBA for HSVA<T> {
|
||||
#[inline]
|
||||
pub fn to_rgba<U:Channel>(&self) -> RGBA<U> {
|
||||
RGBA::from_rgb_a(
|
||||
self.hsv().to_rgb(),
|
||||
Channel::from((*self).a.clone())
|
||||
)
|
||||
RGBA::from_rgb_a(self.hsv().to_rgb(), (*self).a.to_channel())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,9 +39,9 @@ pub trait ToRGB {
|
|||
impl<T:Clone + Channel> ToRGB for RGB<T> {
|
||||
#[inline]
|
||||
pub fn to_rgb<U:Channel>(&self) -> RGB<U> {
|
||||
RGB::new(Channel::from((*self).r.clone()),
|
||||
Channel::from((*self).g.clone()),
|
||||
Channel::from((*self).b.clone()))
|
||||
RGB::new((*self).r.to_channel(),
|
||||
(*self).g.to_channel(),
|
||||
(*self).b.to_channel())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,7 @@ impl<C: ToRGB, T:Clone + Channel> ToRGBA for (C, T) {
|
|||
pub fn to_rgba<U:Channel>(&self) -> RGBA<U> {
|
||||
match *self {
|
||||
(ref rgb, ref a) => {
|
||||
RGBA::from_rgb_a(rgb.to_rgb(), Channel::from(a.clone()))
|
||||
RGBA::from_rgb_a(rgb.to_rgb(), a.to_channel())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -117,10 +117,7 @@ impl<C: ToRGB, T:Clone + Channel> ToRGBA for (C, T) {
|
|||
impl<T:Clone + Channel> ToHSVA for RGBA<T> {
|
||||
#[inline]
|
||||
pub fn to_hsva<U:Channel + Float>(&self) -> HSVA<U> {
|
||||
HSVA::from_hsv_a(
|
||||
self.rgb().to_hsv(),
|
||||
Channel::from((*self).a.clone())
|
||||
)
|
||||
HSVA::from_hsv_a(self.rgb().to_hsv(), (*self).a.to_channel())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue