@@ -204,6 +204,7 @@ void ReadImage(byte[] src, SimpleBitmap bmp) {
204204 // Spec says clear code _should_ be sent first, but not required
205205 for ( availCode = 0 ; availCode < ( 1 << minCodeSize ) ; availCode ++ )
206206 {
207+ dict [ availCode ] . first = ( byte ) availCode ;
207208 dict [ availCode ] . value = ( byte ) availCode ;
208209 dict [ availCode ] . prev = - 1 ;
209210 dict [ availCode ] . len = 1 ;
@@ -238,6 +239,7 @@ void ReadImage(byte[] src, SimpleBitmap bmp) {
238239 // Clear dictionary
239240 for ( availCode = 0 ; availCode < ( 1 << minCodeSize ) ; availCode ++ )
240241 {
242+ dict [ availCode ] . first = ( byte ) availCode ;
241243 dict [ availCode ] . value = ( byte ) availCode ;
242244 dict [ availCode ] . prev = - 1 ;
243245 dict [ availCode ] . len = 1 ;
@@ -256,20 +258,15 @@ void ReadImage(byte[] src, SimpleBitmap bmp) {
256258 // Add new entry to code table unless it's full
257259 // GIF spec allows this as per 'deferred clear codes'
258260 if ( prevCode >= 0 && availCode < MAX_CODES ) {
259- int firstCode = code == availCode ? prevCode : code ;
260- // Follow chain back to find first value
261- // TODO optimise this...
262- while ( dict [ firstCode ] . prev != - 1 )
263- {
264- firstCode = dict [ firstCode ] . prev ;
265- }
261+ int chainCode = code == availCode ? prevCode : code ;
266262
267- dict [ availCode ] . value = dict [ firstCode ] . value ;
263+ dict [ availCode ] . first = dict [ prevCode ] . first ;
264+ dict [ availCode ] . value = dict [ chainCode ] . first ;
268265 dict [ availCode ] . prev = ( short ) prevCode ;
269266 dict [ availCode ] . len = ( short ) ( dict [ prevCode ] . len + 1 ) ;
270267 availCode ++ ;
271268
272- // Check if inserted code in last free entry of table
269+ // Check if inserted code was last free entry of table
273270 // If this is the case, then the table is immediately expanded
274271 if ( ( availCode & codeMask ) == 0 && availCode != ( MAX_CODES - 1 ) ) {
275272 codeLen ++ ;
@@ -303,7 +300,7 @@ void ReadImage(byte[] src, SimpleBitmap bmp) {
303300
304301 struct DictEntry
305302 {
306- public byte value ;
303+ public byte first , value ;
307304 public short prev , len ;
308305 }
309306
0 commit comments