Lines Matching defs:lzw_info

173 static LZWInfo *RelinquishLZWInfo(LZWInfo *lzw_info)
175 if (lzw_info->table[0] != (size_t *) NULL)
176 lzw_info->table[0]=(size_t *) RelinquishMagickMemory(
177 lzw_info->table[0]);
178 if (lzw_info->table[1] != (size_t *) NULL)
179 lzw_info->table[1]=(size_t *) RelinquishMagickMemory(
180 lzw_info->table[1]);
181 if (lzw_info->stack != (LZWStack *) NULL)
183 if (lzw_info->stack->codes != (size_t *) NULL)
184 lzw_info->stack->codes=(size_t *) RelinquishMagickMemory(
185 lzw_info->stack->codes);
186 lzw_info->stack=(LZWStack *) RelinquishMagickMemory(lzw_info->stack);
188 lzw_info=(LZWInfo *) RelinquishMagickMemory(lzw_info);
192 static inline void ResetLZWInfo(LZWInfo *lzw_info)
197 lzw_info->bits=lzw_info->data_size+1;
199 lzw_info->maximum_code=one << lzw_info->bits;
200 lzw_info->slot=lzw_info->maximum_data_value+3;
201 lzw_info->genesis=MagickTrue;
207 *lzw_info;
215 lzw_info=(LZWInfo *) AcquireMagickMemory(sizeof(*lzw_info));
216 if (lzw_info == (LZWInfo *) NULL)
218 (void) ResetMagickMemory(lzw_info,0,sizeof(*lzw_info));
219 lzw_info->image=image;
220 lzw_info->data_size=data_size;
222 lzw_info->maximum_data_value=(one << data_size)-1;
223 lzw_info->clear_code=lzw_info->maximum_data_value+1;
224 lzw_info->end_code=lzw_info->maximum_data_value+2;
225 lzw_info->table[0]=(size_t *) AcquireQuantumMemory(MaximumLZWCode,
226 sizeof(**lzw_info->table));
227 lzw_info->table[1]=(size_t *) AcquireQuantumMemory(MaximumLZWCode,
228 sizeof(**lzw_info->table));
229 if ((lzw_info->table[0] == (size_t *) NULL) ||
230 (lzw_info->table[1] == (size_t *) NULL))
232 lzw_info=RelinquishLZWInfo(lzw_info);
235 for (i=0; i <= (ssize_t) lzw_info->maximum_data_value; i++)
237 lzw_info->table[0][i]=0;
238 lzw_info->table[1][i]=(size_t) i;
240 ResetLZWInfo(lzw_info);
241 lzw_info->code_info.buffer[0]='\0';
242 lzw_info->code_info.buffer[1]='\0';
243 lzw_info->code_info.count=2;
244 lzw_info->code_info.bit=8*lzw_info->code_info.count;
245 lzw_info->code_info.eof=MagickFalse;
246 lzw_info->genesis=MagickTrue;
247 lzw_info->stack=(LZWStack *) AcquireMagickMemory(sizeof(*lzw_info->stack));
248 if (lzw_info->stack == (LZWStack *) NULL)
250 lzw_info=RelinquishLZWInfo(lzw_info);
253 lzw_info->stack->codes=(size_t *) AcquireQuantumMemory(2UL*
254 MaximumLZWCode,sizeof(*lzw_info->stack->codes));
255 if (lzw_info->stack->codes == (size_t *) NULL)
257 lzw_info=RelinquishLZWInfo(lzw_info);
260 lzw_info->stack->index=lzw_info->stack->codes;
261 lzw_info->stack->top=lzw_info->stack->codes+2*MaximumLZWCode;
262 return(lzw_info);
265 static inline int GetNextLZWCode(LZWInfo *lzw_info,const size_t bits)
276 while (((lzw_info->code_info.bit+bits) > (8*lzw_info->code_info.count)) &&
277 (lzw_info->code_info.eof == MagickFalse))
282 lzw_info->code_info.buffer[0]=lzw_info->code_info.buffer[
283 lzw_info->code_info.count-2];
284 lzw_info->code_info.buffer[1]=lzw_info->code_info.buffer[
285 lzw_info->code_info.count-1];
286 lzw_info->code_info.bit-=8*(lzw_info->code_info.count-2);
287 lzw_info->code_info.count=2;
288 count=ReadBlobBlock(lzw_info->image,&lzw_info->code_info.buffer[
289 lzw_info->code_info.count]);
291 lzw_info->code_info.count+=count;
293 lzw_info->code_info.eof=MagickTrue;
295 if ((lzw_info->code_info.bit+bits) > (8*lzw_info->code_info.count))
301 code|=((lzw_info->code_info.buffer[lzw_info->code_info.bit/8] &
302 (one << (lzw_info->code_info.bit % 8))) != 0) << i;
303 lzw_info->code_info.bit++;
324 static int ReadBlobLZWByte(LZWInfo *lzw_info)
336 if (lzw_info->stack->index != lzw_info->stack->codes)
337 return(PopLZWStack(lzw_info->stack));
338 if (lzw_info->genesis != MagickFalse)
340 lzw_info->genesis=MagickFalse;
343 lzw_info->first_code=(size_t) GetNextLZWCode(lzw_info,lzw_info->bits);
344 lzw_info->last_code=lzw_info->first_code;
345 } while (lzw_info->first_code == lzw_info->clear_code);
346 return((int) lzw_info->first_code);
348 code=GetNextLZWCode(lzw_info,lzw_info->bits);
351 if ((size_t) code == lzw_info->clear_code)
353 ResetLZWInfo(lzw_info);
354 return(ReadBlobLZWByte(lzw_info));
356 if ((size_t) code == lzw_info->end_code)
358 if ((size_t) code < lzw_info->slot)
362 PushLZWStack(lzw_info->stack,lzw_info->first_code);
363 value=lzw_info->last_code;
366 while (value > lzw_info->maximum_data_value)
373 PushLZWStack(lzw_info->stack,lzw_info->table[1][value]);
374 value=lzw_info->table[0][value];
376 lzw_info->first_code=lzw_info->table[1][value];
377 PushLZWStack(lzw_info->stack,lzw_info->first_code);
379 if (lzw_info->slot < MaximumLZWCode)
381 lzw_info->table[0][lzw_info->slot]=lzw_info->last_code;
382 lzw_info->table[1][lzw_info->slot]=lzw_info->first_code;
383 lzw_info->slot++;
384 if ((lzw_info->slot >= lzw_info->maximum_code) &&
385 (lzw_info->bits < MaximumLZWBits))
387 lzw_info->bits++;
388 lzw_info->maximum_code=one << lzw_info->bits;
391 lzw_info->last_code=(size_t) code;
392 return(PopLZWStack(lzw_info->stack));
402 *lzw_info;
425 lzw_info=AcquireLZWInfo(image,data_size);
426 if (lzw_info == (LZWInfo *) NULL)
444 c=ReadBlobLZWByte(lzw_info);
503 lzw_info=RelinquishLZWInfo(lzw_info);