@@ -10,6 +10,8 @@ namespace SixLabors.ImageSharp.Tests.PixelFormats.PixelBlenders;
10
10
11
11
public class PorterDuffFunctionsTests
12
12
{
13
+ private static readonly ApproximateFloatComparer FloatComparer = new ( .000001F ) ;
14
+
13
15
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > NormalBlendFunctionData { get ; } = new ( )
14
16
{
15
17
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
@@ -33,7 +35,7 @@ public void NormalBlendFunction256(TestVector4 back, TestVector4 source, float a
33
35
34
36
Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
35
37
Vector256 < float > actual = PorterDuffFunctions . NormalSrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
36
- Assert . Equal ( expected256 , actual ) ;
38
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
37
39
}
38
40
39
41
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > MultiplyFunctionData { get ; } = new ( )
@@ -51,21 +53,45 @@ public void MultiplyFunction(TestVector4 back, TestVector4 source, float amount,
51
53
VectorAssert . Equal ( expected , actual , 5 ) ;
52
54
}
53
55
56
+ [ Theory ]
57
+ [ MemberData ( nameof ( MultiplyFunctionData ) ) ]
58
+ public void MultiplyFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
59
+ {
60
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
61
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
62
+
63
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
64
+ Vector256 < float > actual = PorterDuffFunctions . MultiplySrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
65
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
66
+ }
67
+
54
68
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > AddFunctionData { get ; } = new ( )
55
69
{
56
70
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
57
- { new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 0 , 0 , 0 , .8f ) , .5f , new TestVector4 ( .6f , .6f , .6f , 1f ) } ,
58
- { new TestVector4 ( 0.2f , 0.2f , 0.2f , 0.3f ) , new TestVector4 ( 0.3f , 0.3f , 0.3f , 0.2f ) , .5f , new TestVector4 ( .2075676f , .2075676f , .2075676f , .37f ) }
71
+ { new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 0 , 0 , 0 , .8f ) , .5f , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
72
+ { new TestVector4 ( 0.2f , 0.2f , 0.2f , 0.3f ) , new TestVector4 ( 0.3f , 0.3f , 0.3f , 0.2f ) , .5f , new TestVector4 ( 0.24324325f , 0.24324325f , 0.24324325f , .37f ) }
59
73
} ;
60
74
61
75
[ Theory ]
62
76
[ MemberData ( nameof ( AddFunctionData ) ) ]
63
77
public void AddFunction ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
64
78
{
65
- Vector4 actual = PorterDuffFunctions . MultiplySrcOver ( ( Vector4 ) back , source , amount ) ;
79
+ Vector4 actual = PorterDuffFunctions . AddSrcOver ( ( Vector4 ) back , source , amount ) ;
66
80
VectorAssert . Equal ( expected , actual , 5 ) ;
67
81
}
68
82
83
+ [ Theory ]
84
+ [ MemberData ( nameof ( AddFunctionData ) ) ]
85
+ public void AddFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
86
+ {
87
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
88
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
89
+
90
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
91
+ Vector256 < float > actual = PorterDuffFunctions . AddSrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
92
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
93
+ }
94
+
69
95
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > SubtractFunctionData { get ; } = new ( )
70
96
{
71
97
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 0 , 0 , 0 , 1 ) } ,
@@ -81,6 +107,18 @@ public void SubtractFunction(TestVector4 back, TestVector4 source, float amount,
81
107
VectorAssert . Equal ( expected , actual , 5 ) ;
82
108
}
83
109
110
+ [ Theory ]
111
+ [ MemberData ( nameof ( SubtractFunctionData ) ) ]
112
+ public void SubtractFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
113
+ {
114
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
115
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
116
+
117
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
118
+ Vector256 < float > actual = PorterDuffFunctions . SubtractSrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
119
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
120
+ }
121
+
84
122
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > ScreenFunctionData { get ; } = new ( )
85
123
{
86
124
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
@@ -96,6 +134,18 @@ public void ScreenFunction(TestVector4 back, TestVector4 source, float amount, T
96
134
VectorAssert . Equal ( expected , actual , 5 ) ;
97
135
}
98
136
137
+ [ Theory ]
138
+ [ MemberData ( nameof ( ScreenFunctionData ) ) ]
139
+ public void ScreenFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
140
+ {
141
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
142
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
143
+
144
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
145
+ Vector256 < float > actual = PorterDuffFunctions . ScreenSrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
146
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
147
+ }
148
+
99
149
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > DarkenFunctionData { get ; } = new ( )
100
150
{
101
151
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
@@ -111,6 +161,18 @@ public void DarkenFunction(TestVector4 back, TestVector4 source, float amount, T
111
161
VectorAssert . Equal ( expected , actual , 5 ) ;
112
162
}
113
163
164
+ [ Theory ]
165
+ [ MemberData ( nameof ( DarkenFunctionData ) ) ]
166
+ public void DarkenFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
167
+ {
168
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
169
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
170
+
171
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
172
+ Vector256 < float > actual = PorterDuffFunctions . DarkenSrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
173
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
174
+ }
175
+
114
176
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > LightenFunctionData { get ; } = new ( )
115
177
{
116
178
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
@@ -126,6 +188,18 @@ public void LightenFunction(TestVector4 back, TestVector4 source, float amount,
126
188
VectorAssert . Equal ( expected , actual , 5 ) ;
127
189
}
128
190
191
+ [ Theory ]
192
+ [ MemberData ( nameof ( LightenFunctionData ) ) ]
193
+ public void LightenFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
194
+ {
195
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
196
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
197
+
198
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
199
+ Vector256 < float > actual = PorterDuffFunctions . LightenSrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
200
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
201
+ }
202
+
129
203
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > OverlayFunctionData { get ; } = new ( )
130
204
{
131
205
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
@@ -141,6 +215,18 @@ public void OverlayFunction(TestVector4 back, TestVector4 source, float amount,
141
215
VectorAssert . Equal ( expected , actual , 5 ) ;
142
216
}
143
217
218
+ [ Theory ]
219
+ [ MemberData ( nameof ( OverlayFunctionData ) ) ]
220
+ public void OverlayFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
221
+ {
222
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
223
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
224
+
225
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
226
+ Vector256 < float > actual = PorterDuffFunctions . OverlaySrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
227
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
228
+ }
229
+
144
230
public static TheoryData < TestVector4 , TestVector4 , float , TestVector4 > HardLightFunctionData { get ; } = new ( )
145
231
{
146
232
{ new TestVector4 ( 1 , 1 , 1 , 1 ) , new TestVector4 ( 1 , 1 , 1 , 1 ) , 1 , new TestVector4 ( 1 , 1 , 1 , 1 ) } ,
@@ -155,4 +241,16 @@ public void HardLightFunction(TestVector4 back, TestVector4 source, float amount
155
241
Vector4 actual = PorterDuffFunctions . HardLightSrcOver ( ( Vector4 ) back , source , amount ) ;
156
242
VectorAssert . Equal ( expected , actual , 5 ) ;
157
243
}
244
+
245
+ [ Theory ]
246
+ [ MemberData ( nameof ( HardLightFunctionData ) ) ]
247
+ public void HardLightFunction256 ( TestVector4 back , TestVector4 source , float amount , TestVector4 expected )
248
+ {
249
+ Vector256 < float > back256 = Vector256 . Create ( back . X , back . Y , back . Z , back . W , back . X , back . Y , back . Z , back . W ) ;
250
+ Vector256 < float > source256 = Vector256 . Create ( source . X , source . Y , source . Z , source . W , source . X , source . Y , source . Z , source . W ) ;
251
+
252
+ Vector256 < float > expected256 = Vector256 . Create ( expected . X , expected . Y , expected . Z , expected . W , expected . X , expected . Y , expected . Z , expected . W ) ;
253
+ Vector256 < float > actual = PorterDuffFunctions . HardLightSrcOver ( back256 , source256 , Vector256 . Create ( amount ) ) ;
254
+ Assert . Equal ( expected256 , actual , FloatComparer ) ;
255
+ }
158
256
}
0 commit comments