11using System ;
2+ using System . Diagnostics ;
3+ using System . Numerics ;
24using BCnEncoder . Shared ;
35using BCnEncoder . Shared . Colors ;
46
@@ -97,27 +99,44 @@ internal static Bc1Block EncodeBlock(RawBlock4X4RgbaFloat rawBlock, bool useColo
9799 {
98100 var pixels = rawBlock . AsSpan ;
99101
100- PcaVectors . Create ( pixels , out var mean , out var pa ) ;
102+ int blacks = 0 ;
103+ Vector4 mean , pa ;
104+
105+ if ( useColorModeSwitch )
106+ {
107+ blacks = PcaVectors . CreateIgnoreBlacks ( pixels , out mean , out pa ) ;
108+ }
109+ else
110+ {
111+ PcaVectors . Create ( pixels , out mean , out pa ) ;
112+ }
113+
101114 PcaVectors . GetMinMaxColor565 ( pixels , mean , pa , out var min , out var max ) ;
102115
103116 var c0 = max ;
104117 var c1 = min ;
105118
106- if ( c0 . data < c1 . data )
119+ ( c0 , c1 ) = useColorModeSwitch switch
107120 {
108- ( c0 , c1 ) = ( c1 , c0 ) ;
109- }
121+ true when c0 . data < c1 . data && blacks == 0 => ( c1 , c0 ) ,
122+ true when c0 . data > c1 . data && blacks > 0 => ( c1 , c0 ) ,
123+ false when c0 . data < c1 . data => ( c1 , c0 ) ,
124+ _ => ( c0 , c1 )
125+ } ;
110126
111127 var best = TryColors ( rawBlock , c0 , c1 , useColorModeSwitch , out var bestError ) ;
112128
113129 for ( var i = 0 ; i < MaxTries ; i ++ )
114130 {
115131 var ( newC0 , newC1 ) = ColorVariationGenerator . Variate565 ( c0 , c1 , i ) ;
116132
117- if ( newC0 . data < newC1 . data )
133+ ( newC0 , newC1 ) = useColorModeSwitch switch
118134 {
119- ( newC0 , newC1 ) = ( newC1 , newC0 ) ;
120- }
135+ true when newC0 . data < newC1 . data && blacks == 0 => ( newC1 , newC0 ) ,
136+ true when newC0 . data > newC1 . data && blacks > 0 => ( newC1 , newC0 ) ,
137+ false when newC0 . data < newC1 . data => ( newC1 , newC0 ) ,
138+ _ => ( newC0 , newC1 )
139+ } ;
121140
122141 var block = TryColors ( rawBlock , newC0 , newC1 , useColorModeSwitch , out var error ) ;
123142
@@ -148,16 +167,30 @@ internal static Bc1Block EncodeBlock(RawBlock4X4RgbaFloat rawBlock, bool useColo
148167 {
149168 var pixels = rawBlock . AsSpan ;
150169
151- PcaVectors . Create ( pixels , out var mean , out var pa ) ;
170+ int blacks = 0 ;
171+ Vector4 mean , pa ;
172+
173+ if ( useColorModeSwitch )
174+ {
175+ blacks = PcaVectors . CreateIgnoreBlacks ( pixels , out mean , out pa ) ;
176+ }
177+ else
178+ {
179+ PcaVectors . Create ( pixels , out mean , out pa ) ;
180+ }
181+
152182 PcaVectors . GetMinMaxColor565 ( pixels , mean , pa , out var min , out var max ) ;
153183
154184 var c0 = max ;
155185 var c1 = min ;
156186
157- if ( c0 . data < c1 . data )
187+ ( c0 , c1 ) = useColorModeSwitch switch
158188 {
159- ( c0 , c1 ) = ( c1 , c0 ) ;
160- }
189+ true when c0 . data < c1 . data && blacks == 0 => ( c1 , c0 ) ,
190+ true when c0 . data > c1 . data && blacks > 0 => ( c1 , c0 ) ,
191+ false when c0 . data < c1 . data => ( c1 , c0 ) ,
192+ _ => ( c0 , c1 )
193+ } ;
161194
162195 var best = TryColors ( rawBlock , c0 , c1 , useColorModeSwitch , out var bestError ) ;
163196
@@ -167,10 +200,13 @@ internal static Bc1Block EncodeBlock(RawBlock4X4RgbaFloat rawBlock, bool useColo
167200 {
168201 var ( newC0 , newC1 ) = ColorVariationGenerator . Variate565 ( c0 , c1 , i ) ;
169202
170- if ( newC0 . data < newC1 . data )
203+ ( newC0 , newC1 ) = useColorModeSwitch switch
171204 {
172- ( newC0 , newC1 ) = ( newC1 , newC0 ) ;
173- }
205+ true when newC0 . data < newC1 . data && blacks == 0 => ( newC1 , newC0 ) ,
206+ true when newC0 . data > newC1 . data && blacks > 0 => ( newC1 , newC0 ) ,
207+ false when newC0 . data < newC1 . data => ( newC1 , newC0 ) ,
208+ _ => ( newC0 , newC1 )
209+ } ;
174210
175211 var block = TryColors ( rawBlock , newC0 , newC1 , useColorModeSwitch , out var error ) ;
176212
0 commit comments