LINUX.ORG.RU

История изменений

Исправление question4, (текущая версия) :

Это обычный gif lzw декодер

Тогда какой смысл несёт данный фрагмент?

PrevPixel=DecodeTable[Index].PixelData;
Stack[StackTop++]=PrevPixel; 
DecodeTable[DecodeTableIndex].Next=PrevIndex;
DecodeTable[DecodeTableIndex].PixelData=PrevPixel;
PrevIndex=TempIndex;
DecodeTableIndex++;

Начальное состояние словаря – 256 однооктетных строчек.

Как реализован словарь? В массиве DecodeTable хранятся только 1-байтные PixelData (инициализируются в 0-255 внутри каждого 256-байтного блока) и 2-байтные Next (инициализирутся в -1). Строк нет. Явных ссылок на строки в раскодированном изображении нет.

Строки как-то строятся через цепочку Next и модифицируются при каждом обращении.

Также я не вижу специальной обработки кодов 256 и 257 для 9 бит. Если это и LZ, то всё же не LZW.

Декодер читает коды парами голова + хвост.

Где это в коде?

CurBits=CurWordValue>>(16-DataBitCount);
while (DataBitCount<BitMaskCount)
{
	CurWordValue=Data[CurIndex++]; // Get next word (Image data:next word)
	CurBits|=(CurWordValue<<DataBitCount)&0xffff;
	DataBitCount+=0x10;
}
DataBitCount=DataBitCount-BitMaskCount; 
Index=CurBits & BitMask;
TempIndex=Index;

Я вижу, как из сжатого массива Data берутся очередые BitMaskCount бит (из CurWordValue оставшиеся с прошлого раза помещаются в CurBits, читаются новые 16 бит в CurWordValue, сдвигаются, OR-ятся с CurBits, накладывается маска в BitMaskCount младших бит) и помещается в TempIndex и Index. Где хвост и голова?

Исходная версия question4, :

Это обычный gif lzw декодер

Тогда какой смысл несёт данный фрагмент?

PrevPixel=DecodeTable[Index].PixelData;
Stack[StackTop++]=PrevPixel; 
DecodeTable[DecodeTableIndex].Next=PrevIndex;
DecodeTable[DecodeTableIndex].PixelData=PrevPixel;
PrevIndex=TempIndex;
DecodeTableIndex++;

Начальное состояние словаря – 256 однооктетных строчек.

Как реализован словарь? В массиве DecodeTable хранятся только 1-байтные PixelData (инициализируются в 0-255 внутри каждого 256-байтного блока) и 2-байтные Next (инициализирутся в -1). Строк нет. Явных ссылок на строки в раскодированном изображении нет.

Также я не вижу специальной обработки кодов 256 и 257 для 9 бит. Если это и LZ, то всё же не LZW.

Декодер читает коды парами голова + хвост.

Где это в коде?

CurBits=CurWordValue>>(16-DataBitCount);
while (DataBitCount<BitMaskCount)
{
	CurWordValue=Data[CurIndex++]; // Get next word (Image data:next word)
	CurBits|=(CurWordValue<<DataBitCount)&0xffff;
	DataBitCount+=0x10;
}
DataBitCount=DataBitCount-BitMaskCount; 
Index=CurBits & BitMask;
TempIndex=Index;

Я вижу, как из сжатого массива Data берутся очередые BitMaskCount бит (из CurWordValue оставшиеся с прошлого раза помещаются в CurBits, читаются новые 16 бит в CurWordValue, сдвигаются, OR-ятся с CurBits, накладывается маска в BitMaskCount младших бит) и помещается в TempIndex и Index. Где хвост и голова?