@@ -57,6 +57,7 @@ void SoftwareGifDecoder::end() {
5757 currentFrameIndex_ = 0 ;
5858 endOfStream_ = false ;
5959 errorMessage_.clear ();
60+ dataBuffer_.clear ();
6061}
6162
6263bool SoftwareGifDecoder::hasError (fl::string* msg) const {
@@ -234,7 +235,7 @@ bool SoftwareGifDecoder::loadMoreData() {
234235 return false ;
235236 }
236237
237- // Read available data from stream
238+ // Read available data from stream in chunks and accumulate
238239 const fl::size bufferSize = 4096 ; // Read in chunks
239240 fl::u8 buffer[bufferSize];
240241 fl::size bytesRead = stream_->read (buffer, bufferSize);
@@ -246,8 +247,14 @@ bool SoftwareGifDecoder::loadMoreData() {
246247 return false ;
247248 }
248249
249- // Feed data to libnsgif
250- nsgif_error result = nsgif_data_scan (gif_, bytesRead, buffer);
250+ // Append new data to accumulated buffer
251+ // libnsgif requires ALL data to be provided in each call to nsgif_data_scan
252+ fl::size oldSize = dataBuffer_.size ();
253+ dataBuffer_.resize (oldSize + bytesRead);
254+ memcpy (dataBuffer_.data () + oldSize, buffer, bytesRead);
255+
256+ // Feed ALL accumulated data to libnsgif
257+ nsgif_error result = nsgif_data_scan (gif_, dataBuffer_.size (), dataBuffer_.data ());
251258
252259 // Check if we've read less than requested (likely end of stream)
253260 if (bytesRead < bufferSize) {
0 commit comments