1
- use std:: ops:: { Add , Sub , Mul , Div , Deref , DerefMut } ;
1
+ use std:: ops:: { Add , Deref , DerefMut , Div , Mul , Sub } ;
2
2
use approx:: ApproxEq ;
3
3
use num_traits:: Float ;
4
4
5
- use { Alpha , ComponentWise , Mix , Blend , clamp} ;
5
+ use { clamp, Alpha , Blend , ComponentWise , Mix , Pixel } ;
6
+ use encoding:: pixel:: RawPixel ;
6
7
7
8
///Premultiplied alpha wrapper.
8
9
///
@@ -26,6 +27,7 @@ use {Alpha, ComponentWise, Mix, Blend, clamp};
26
27
///Note that converting to and from premultiplied alpha will cause the alpha
27
28
///component to be clamped to [0.0, 1.0].
28
29
#[ derive( Clone , Copy , PartialEq , Debug ) ]
30
+ #[ repr( C ) ]
29
31
pub struct PreAlpha < C , T : Float > {
30
32
///The premultiplied color components (`original.color * original.alpha`).
31
33
pub color : C ,
@@ -35,31 +37,35 @@ pub struct PreAlpha<C, T: Float> {
35
37
pub alpha : T ,
36
38
}
37
39
38
- impl < C , T > From < Alpha < C , T > > for PreAlpha < C , T > where
39
- C : ComponentWise < Scalar =T > ,
40
+ impl < C , T > From < Alpha < C , T > > for PreAlpha < C , T >
41
+ where
42
+ C : ComponentWise < Scalar = T > ,
40
43
T : Float ,
41
44
{
42
45
fn from ( color : Alpha < C , T > ) -> PreAlpha < C , T > {
43
46
let alpha = clamp ( color. alpha , T :: zero ( ) , T :: one ( ) ) ;
44
47
45
- PreAlpha {
48
+ PreAlpha {
46
49
color : color. color . component_wise_self ( |a| a * alpha) ,
47
- alpha : alpha
50
+ alpha : alpha,
48
51
}
49
52
}
50
53
}
51
54
52
- impl < C , T > From < PreAlpha < C , T > > for Alpha < C , T > where
53
- C : ComponentWise < Scalar =T > ,
55
+ impl < C , T > From < PreAlpha < C , T > > for Alpha < C , T >
56
+ where
57
+ C : ComponentWise < Scalar = T > ,
54
58
T : Float ,
55
59
{
56
60
fn from ( color : PreAlpha < C , T > ) -> Alpha < C , T > {
57
61
let alpha = clamp ( color. alpha , T :: zero ( ) , T :: one ( ) ) ;
58
62
59
- let color = color. color . component_wise_self ( |a| if alpha. is_normal ( ) {
60
- a / alpha
61
- } else {
62
- T :: zero ( )
63
+ let color = color. color . component_wise_self ( |a| {
64
+ if alpha. is_normal ( ) {
65
+ a / alpha
66
+ } else {
67
+ T :: zero ( )
68
+ }
63
69
} ) ;
64
70
65
71
Alpha {
@@ -69,8 +75,9 @@ impl<C, T> From<PreAlpha<C, T>> for Alpha<C, T> where
69
75
}
70
76
}
71
77
72
- impl < C , T > Blend for PreAlpha < C , T > where
73
- C : Blend < Color =C > + ComponentWise < Scalar =T > ,
78
+ impl < C , T > Blend for PreAlpha < C , T >
79
+ where
80
+ C : Blend < Color = C > + ComponentWise < Scalar = T > ,
74
81
T : Float ,
75
82
{
76
83
type Color = C ;
@@ -95,10 +102,14 @@ impl<C: Mix> Mix for PreAlpha<C, C::Scalar> {
95
102
}
96
103
}
97
104
98
- impl < C : ComponentWise < Scalar = T > , T : Float > ComponentWise for PreAlpha < C , T > {
105
+ impl < C : ComponentWise < Scalar = T > , T : Float > ComponentWise for PreAlpha < C , T > {
99
106
type Scalar = T ;
100
107
101
- fn component_wise < F : FnMut ( T , T ) -> T > ( & self , other : & PreAlpha < C , T > , mut f : F ) -> PreAlpha < C , T > {
108
+ fn component_wise < F : FnMut ( T , T ) -> T > (
109
+ & self ,
110
+ other : & PreAlpha < C , T > ,
111
+ mut f : F ,
112
+ ) -> PreAlpha < C , T > {
102
113
PreAlpha {
103
114
alpha : f ( self . alpha , other. alpha ) ,
104
115
color : self . color . component_wise ( & other. color , f) ,
@@ -111,8 +122,24 @@ impl<C: ComponentWise<Scalar=T>, T: Float> ComponentWise for PreAlpha<C, T> {
111
122
color : self . color . component_wise_self ( f) ,
112
123
}
113
124
}
114
- } impl < C , T > ApproxEq for PreAlpha < C , T > where
115
- C : ApproxEq < Epsilon =T :: Epsilon > ,
125
+ }
126
+
127
+ unsafe impl < T : Float , C : Pixel < T > > Pixel < T > for PreAlpha < C , T > {
128
+ const CHANNELS : usize = C :: CHANNELS + 1 ;
129
+ }
130
+
131
+ impl < C : Default , T : Float > Default for PreAlpha < C , T > {
132
+ fn default ( ) -> PreAlpha < C , T > {
133
+ PreAlpha {
134
+ color : C :: default ( ) ,
135
+ alpha : T :: one ( ) ,
136
+ }
137
+ }
138
+ }
139
+
140
+ impl < C , T > ApproxEq for PreAlpha < C , T >
141
+ where
142
+ C : ApproxEq < Epsilon = T :: Epsilon > ,
116
143
T : ApproxEq + Float ,
117
144
T :: Epsilon : Copy ,
118
145
{
@@ -130,14 +157,19 @@ impl<C: ComponentWise<Scalar=T>, T: Float> ComponentWise for PreAlpha<C, T> {
130
157
T :: default_max_ulps ( )
131
158
}
132
159
133
- fn relative_eq ( & self , other : & PreAlpha < C , T > , epsilon : Self :: Epsilon , max_relative : Self :: Epsilon ) -> bool {
134
- self . color . relative_eq ( & other. color , epsilon, max_relative) &&
135
- self . alpha . relative_eq ( & other. alpha , epsilon, max_relative)
160
+ fn relative_eq (
161
+ & self ,
162
+ other : & PreAlpha < C , T > ,
163
+ epsilon : Self :: Epsilon ,
164
+ max_relative : Self :: Epsilon ,
165
+ ) -> bool {
166
+ self . color . relative_eq ( & other. color , epsilon, max_relative)
167
+ && self . alpha . relative_eq ( & other. alpha , epsilon, max_relative)
136
168
}
137
169
138
- fn ulps_eq ( & self , other : & PreAlpha < C , T > , epsilon : Self :: Epsilon , max_ulps : u32 ) -> bool {
139
- self . color . ulps_eq ( & other. color , epsilon, max_ulps) &&
140
- self . alpha . ulps_eq ( & other. alpha , epsilon, max_ulps)
170
+ fn ulps_eq ( & self , other : & PreAlpha < C , T > , epsilon : Self :: Epsilon , max_ulps : u32 ) -> bool {
171
+ self . color . ulps_eq ( & other. color , epsilon, max_ulps)
172
+ && self . alpha . ulps_eq ( & other. alpha , epsilon, max_ulps)
141
173
}
142
174
}
143
175
@@ -229,6 +261,28 @@ impl<T: Float, C: Div<T>> Div<T> for PreAlpha<C, T> {
229
261
}
230
262
}
231
263
264
+ impl < C , T , P > AsRef < P > for PreAlpha < C , T >
265
+ where
266
+ C : Pixel < T > ,
267
+ T : Float ,
268
+ P : RawPixel < T > + ?Sized ,
269
+ {
270
+ fn as_ref ( & self ) -> & P {
271
+ self . as_raw ( )
272
+ }
273
+ }
274
+
275
+ impl < C , T , P > AsMut < P > for PreAlpha < C , T >
276
+ where
277
+ C : Pixel < T > ,
278
+ T : Float ,
279
+ P : RawPixel < T > + ?Sized ,
280
+ {
281
+ fn as_mut ( & mut self ) -> & mut P {
282
+ self . as_raw_mut ( )
283
+ }
284
+ }
285
+
232
286
impl < C , T : Float > Deref for PreAlpha < C , T > {
233
287
type Target = C ;
234
288
0 commit comments