Skip to content

Commit 3e95dc3

Browse files
Slightly optimise GIF decoder
1 parent 7a01aaa commit 3e95dc3

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

MCGalaxy/util/Imaging/GifDecoder.cs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)