История изменений
Исправление 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
. Где хвост и голова?