@@ -206,15 +206,17 @@ public void CopyTo<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> memoryPack
206206 var encoder = new BrotliEncoder ( quality , window ) ;
207207 try
208208 {
209- var writtenNotAdvanced = 0 ;
209+ var bytesWritten = 0 ;
210210 foreach ( var item in bufferWriter )
211211 {
212- writtenNotAdvanced = CompressCore ( ref encoder , item . Span , ref memoryPackWriter , initialLength : null , isFinalBlock : false ) ;
212+ var span = item . Span ;
213+ if ( span . Length <= 0 ) continue ;
214+ bytesWritten += CompressCore ( ref encoder , item . Span , ref memoryPackWriter , initialLength : null , isFinalBlock : false ) ;
213215 }
214216
215217 // call BrotliEncoderOperation.Finish
216- var finalBlockLength = ( writtenNotAdvanced == 0 ) ? null : ( int ? ) ( writtenNotAdvanced + 10 ) ;
217- CompressCore ( ref encoder , ReadOnlySpan < byte > . Empty , ref memoryPackWriter , initialLength : finalBlockLength , isFinalBlock : true) ;
218+ var finalBlockMaxLength = BrotliUtils . BrotliEncoderMaxCompressedSize ( bytesWritten ) - bytesWritten ;
219+ CompressCore ( ref encoder , ReadOnlySpan < byte > . Empty , ref memoryPackWriter , initialLength : finalBlockMaxLength , isFinalBlock : true) ;
218220 }
219221 finally
220222 {
@@ -257,30 +259,29 @@ static int CompressCore<TBufferWriter>(ref BrotliEncoder encoder, ReadOnlySpan<b
257259 where TBufferWriter : class , IBufferWriter< byte >
258260#endif
259261 {
260- var writtenNotAdvanced = 0 ;
262+ var totalWritten = 0 ;
261263
262264 var lastResult = OperationStatus . DestinationTooSmall ;
263265 while ( lastResult == OperationStatus . DestinationTooSmall )
264266 {
265- ref var spanRef = ref destBufferWriter . GetSpanReference ( Math . Max ( initialLength ?? source . Length , 1 ) ) ;
267+ ref var spanRef = ref destBufferWriter . GetSpanReference ( initialLength ?? source . Length ) ;
266268 var dest = MemoryMarshal . CreateSpan ( ref spanRef , destBufferWriter . BufferLength ) ;
267269
268270 lastResult = encoder . Compress ( source , dest , out int bytesConsumed , out int bytesWritten , isFinalBlock : isFinalBlock ) ;
269- writtenNotAdvanced += bytesConsumed ;
271+ totalWritten += bytesWritten ;
270272
271273 if ( lastResult == OperationStatus . InvalidData ) MemoryPackSerializationException . ThrowCompressionFailed ( ) ;
272274 if ( bytesWritten > 0 )
273275 {
274276 destBufferWriter . Advance ( bytesWritten ) ;
275- writtenNotAdvanced = 0 ;
276277 }
277278 if ( bytesConsumed > 0 )
278279 {
279280 source = source . Slice ( bytesConsumed ) ;
280281 }
281282 }
282283
283- return writtenNotAdvanced ;
284+ return totalWritten ;
284285 }
285286
286287 public void Dispose ( )
0 commit comments