@@ -50,8 +50,8 @@ public static Vp8LBackwardRefs GetBackwardReferences(
50
50
double bitCostBest = - 1 ;
51
51
int cacheBitsInitial = cacheBits ;
52
52
Vp8LHashChain ? hashChainBox = null ;
53
- var stats = new Vp8LStreaks ( ) ;
54
- var bitsEntropy = new Vp8LBitEntropy ( ) ;
53
+ Vp8LStreaks stats = new ( ) ;
54
+ Vp8LBitEntropy bitsEntropy = new ( ) ;
55
55
for ( int lz77Type = 1 ; lz77TypesToTry > 0 ; lz77TypesToTry &= ~ lz77Type , lz77Type <<= 1 )
56
56
{
57
57
int cacheBitsTmp = cacheBitsInitial ;
@@ -76,21 +76,19 @@ public static Vp8LBackwardRefs GetBackwardReferences(
76
76
}
77
77
78
78
// Next, try with a color cache and update the references.
79
- cacheBitsTmp = CalculateBestCacheSize ( bgra , quality , worst , cacheBitsTmp ) ;
79
+ cacheBitsTmp = CalculateBestCacheSize ( memoryAllocator , bgra , quality , worst , cacheBitsTmp ) ;
80
80
if ( cacheBitsTmp > 0 )
81
81
{
82
82
BackwardRefsWithLocalCache ( bgra , cacheBitsTmp , worst ) ;
83
83
}
84
84
85
85
// Keep the best backward references.
86
- var histo = new Vp8LHistogram ( worst , cacheBitsTmp ) ;
86
+ using Vp8LHistogram histo = new ( memoryAllocator , worst , cacheBitsTmp ) ;
87
87
double bitCost = histo . EstimateBits ( stats , bitsEntropy ) ;
88
88
89
89
if ( lz77TypeBest == 0 || bitCost < bitCostBest )
90
90
{
91
- Vp8LBackwardRefs tmp = worst ;
92
- worst = best ;
93
- best = tmp ;
91
+ ( best , worst ) = ( worst , best ) ;
94
92
bitCostBest = bitCost ;
95
93
cacheBits = cacheBitsTmp ;
96
94
lz77TypeBest = lz77Type ;
@@ -102,7 +100,7 @@ public static Vp8LBackwardRefs GetBackwardReferences(
102
100
{
103
101
Vp8LHashChain hashChainTmp = lz77TypeBest == ( int ) Vp8LLz77Type . Lz77Standard ? hashChain : hashChainBox ! ;
104
102
BackwardReferencesTraceBackwards ( width , height , memoryAllocator , bgra , cacheBits , hashChainTmp , best , worst ) ;
105
- var histo = new Vp8LHistogram ( worst , cacheBits ) ;
103
+ using Vp8LHistogram histo = new ( memoryAllocator , worst , cacheBits ) ;
106
104
double bitCostTrace = histo . EstimateBits ( stats , bitsEntropy ) ;
107
105
if ( bitCostTrace < bitCostBest )
108
106
{
@@ -123,7 +121,12 @@ public static Vp8LBackwardRefs GetBackwardReferences(
123
121
/// The local color cache is also disabled for the lower (smaller then 25) quality.
124
122
/// </summary>
125
123
/// <returns>Best cache size.</returns>
126
- private static int CalculateBestCacheSize ( ReadOnlySpan < uint > bgra , uint quality , Vp8LBackwardRefs refs , int bestCacheBits )
124
+ private static int CalculateBestCacheSize (
125
+ MemoryAllocator memoryAllocator ,
126
+ ReadOnlySpan < uint > bgra ,
127
+ uint quality ,
128
+ Vp8LBackwardRefs refs ,
129
+ int bestCacheBits )
127
130
{
128
131
int cacheBitsMax = quality <= 25 ? 0 : bestCacheBits ;
129
132
if ( cacheBitsMax == 0 )
@@ -134,11 +137,15 @@ private static int CalculateBestCacheSize(ReadOnlySpan<uint> bgra, uint quality,
134
137
135
138
double entropyMin = MaxEntropy ;
136
139
int pos = 0 ;
137
- var colorCache = new ColorCache [ WebpConstants . MaxColorCacheBits + 1 ] ;
138
- var histos = new Vp8LHistogram [ WebpConstants . MaxColorCacheBits + 1 ] ;
140
+
141
+ // TODO: Pass from outer loop and clear.
142
+ ColorCache [ ] colorCache = new ColorCache [ WebpConstants . MaxColorCacheBits + 1 ] ;
143
+
144
+ // TODO: Use fixed size.
145
+ using Vp8LHistogramSet histos = new ( memoryAllocator , WebpConstants . MaxColorCacheBits + 1 , 0 ) ;
139
146
for ( int i = 0 ; i <= WebpConstants . MaxColorCacheBits ; i ++ )
140
147
{
141
- histos [ i ] = new Vp8LHistogram ( paletteCodeBits : i ) ;
148
+ histos [ i ] . PaletteCodeBits = i ;
142
149
colorCache [ i ] = new ColorCache ( i ) ;
143
150
}
144
151
@@ -149,10 +156,10 @@ private static int CalculateBestCacheSize(ReadOnlySpan<uint> bgra, uint quality,
149
156
if ( v . IsLiteral ( ) )
150
157
{
151
158
uint pix = bgra [ pos ++ ] ;
152
- uint a = ( pix >> 24 ) & 0xff ;
153
- uint r = ( pix >> 16 ) & 0xff ;
154
- uint g = ( pix >> 8 ) & 0xff ;
155
- uint b = ( pix >> 0 ) & 0xff ;
159
+ int a = ( int ) ( pix >> 24 ) & 0xff ;
160
+ int r = ( int ) ( pix >> 16 ) & 0xff ;
161
+ int g = ( int ) ( pix >> 8 ) & 0xff ;
162
+ int b = ( int ) ( pix >> 0 ) & 0xff ;
156
163
157
164
// The keys of the caches can be derived from the longest one.
158
165
int key = ColorCache . HashPix ( pix , 32 - cacheBitsMax ) ;
@@ -218,8 +225,8 @@ private static int CalculateBestCacheSize(ReadOnlySpan<uint> bgra, uint quality,
218
225
}
219
226
}
220
227
221
- var stats = new Vp8LStreaks ( ) ;
222
- var bitsEntropy = new Vp8LBitEntropy ( ) ;
228
+ Vp8LStreaks stats = new ( ) ;
229
+ Vp8LBitEntropy bitsEntropy = new ( ) ;
223
230
for ( int i = 0 ; i <= cacheBitsMax ; i ++ )
224
231
{
225
232
double entropy = histos [ i ] . EstimateBits ( stats , bitsEntropy ) ;
@@ -266,7 +273,7 @@ private static void BackwardReferencesHashChainDistanceOnly(
266
273
int pixCount = xSize * ySize ;
267
274
bool useColorCache = cacheBits > 0 ;
268
275
int literalArraySize = WebpConstants . NumLiteralCodes + WebpConstants . NumLengthCodes + ( cacheBits > 0 ? 1 << cacheBits : 0 ) ;
269
- var costModel = new CostModel ( literalArraySize ) ;
276
+ CostModel costModel = new ( memoryAllocator , literalArraySize ) ;
270
277
int offsetPrev = - 1 ;
271
278
int lenPrev = - 1 ;
272
279
double offsetCost = - 1 ;
@@ -280,7 +287,7 @@ private static void BackwardReferencesHashChainDistanceOnly(
280
287
}
281
288
282
289
costModel . Build ( xSize , cacheBits , refs ) ;
283
- using var costManager = new CostManager ( memoryAllocator , distArrayBuffer , pixCount , costModel ) ;
290
+ using CostManager costManager = new ( memoryAllocator , distArrayBuffer , pixCount , costModel ) ;
284
291
Span < float > costManagerCosts = costManager . Costs . GetSpan ( ) ;
285
292
Span < ushort > distArray = distArrayBuffer . GetSpan ( ) ;
286
293
0 commit comments