@@ -182,7 +182,8 @@ public void FromCompandedScaledVector4(int count)
182182 this . Configuration ,
183183 s ,
184184 d . GetSpan ( ) ,
185- PixelConversionModifiers . SRgbCompand | PixelConversionModifiers . Scale ) ) ;
185+ PixelConversionModifiers . SRgbCompand | PixelConversionModifiers . Scale ) ,
186+ false ) ;
186187 }
187188
188189 [ Theory ]
@@ -302,7 +303,8 @@ void ExpectedAction(ref Vector4 v)
302303 s ,
303304 d . GetSpan ( ) ,
304305 modifiers | PixelConversionModifiers . SRgbCompand | PixelConversionModifiers . Scale ) ;
305- } ) ;
306+ } ,
307+ false ) ;
306308 }
307309
308310 [ Theory ]
@@ -1030,11 +1032,12 @@ internal static Vector4[] CreateExpectedScaledVector4Data(TPixel[] source, RefAc
10301032 internal static void TestOperation < TSource , TDest > (
10311033 TSource [ ] source ,
10321034 TDest [ ] expected ,
1033- Action < TSource [ ] , IMemoryOwner < TDest > > action )
1035+ Action < TSource [ ] , IMemoryOwner < TDest > > action ,
1036+ bool preferExactComparison = true )
10341037 where TSource : struct
10351038 where TDest : struct
10361039 {
1037- using ( var buffers = new TestBuffers < TSource , TDest > ( source , expected ) )
1040+ using ( var buffers = new TestBuffers < TSource , TDest > ( source , expected , preferExactComparison ) )
10381041 {
10391042 action ( buffers . SourceBuffer , buffers . ActualDestBuffer ) ;
10401043 buffers . Verify ( ) ;
@@ -1135,11 +1138,14 @@ private class TestBuffers<TSource, TDest> : IDisposable
11351138
11361139 public TDest [ ] ExpectedDestBuffer { get ; }
11371140
1138- public TestBuffers ( TSource [ ] source , TDest [ ] expectedDest )
1141+ public bool PreferExactComparison { get ; }
1142+
1143+ public TestBuffers ( TSource [ ] source , TDest [ ] expectedDest , bool preferExactComparison = true )
11391144 {
11401145 this . SourceBuffer = source ;
11411146 this . ExpectedDestBuffer = expectedDest ;
11421147 this . ActualDestBuffer = Configuration . Default . MemoryAllocator . Allocate < TDest > ( expectedDest . Length ) ;
1148+ this . PreferExactComparison = preferExactComparison ;
11431149 }
11441150
11451151 public void Dispose ( ) => this . ActualDestBuffer . Dispose ( ) ;
@@ -1159,7 +1165,7 @@ public void Verify()
11591165 Assert . Equal ( expected [ i ] , actual [ i ] , comparer ) ;
11601166 }
11611167 }
1162- else if ( typeof ( IPixel ) . IsAssignableFrom ( typeof ( TDest ) ) )
1168+ else if ( ! this . PreferExactComparison && typeof ( IPixel ) . IsAssignableFrom ( typeof ( TDest ) ) && IsComplexPixel ( ) )
11631169 {
11641170 Span < TDest > expected = this . ExpectedDestBuffer . AsSpan ( ) ;
11651171 Span < TDest > actual = this . ActualDestBuffer . GetSpan ( ) ;
@@ -1174,12 +1180,32 @@ public void Verify()
11741180 {
11751181 Span < TDest > expected = this . ExpectedDestBuffer . AsSpan ( ) ;
11761182 Span < TDest > actual = this . ActualDestBuffer . GetSpan ( ) ;
1183+
11771184 for ( int i = 0 ; i < count ; i ++ )
11781185 {
11791186 Assert . Equal ( expected [ i ] , actual [ i ] ) ;
11801187 }
11811188 }
11821189 }
1190+
1191+ // TODO: We really need a PixelTypeInfo.BitsPerComponent property!!
1192+ private static bool IsComplexPixel ( )
1193+ {
1194+ switch ( default ( TDest ) )
1195+ {
1196+ case HalfSingle _:
1197+ case HalfVector2 _:
1198+ case L16 _:
1199+ case La32 _:
1200+ case NormalizedShort2 _:
1201+ case Rg32 _:
1202+ case Short2 _:
1203+ return true ;
1204+
1205+ default :
1206+ return Unsafe . SizeOf < TDest > ( ) > sizeof ( int ) ;
1207+ }
1208+ }
11831209 }
11841210 }
11851211}
0 commit comments