1 /***************************************************************************/
5 /* FreeType support for .Z compressed files. */
7 /* This optional component relies on NetBSD's zopen(). It should mainly */
8 /* be used to parse compressed PCF fonts, as found with many X11 server */
11 /* Copyright 2005-2016 by */
14 /* This file is part of the FreeType project, and may only be used, */
15 /* modified, and distributed under the terms of the FreeType project */
16 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
17 /* this file you indicate that you have read the license and */
18 /* understand and accept it fully. */
20 /***************************************************************************/
23 #include FT_INTERNAL_MEMORY_H
24 #include FT_INTERNAL_STREAM_H
25 #include FT_INTERNAL_DEBUG_H
29 ft_lzwstate_refill( FT_LzwState state
)
37 count
= FT_Stream_TryRead( state
->source
,
39 state
->num_bits
); /* WHY? */
41 state
->buf_size
= (FT_UInt
)count
;
42 state
->buf_total
+= count
;
43 state
->in_eof
= FT_BOOL( count
< state
->num_bits
);
44 state
->buf_offset
= 0;
45 state
->buf_size
= ( state
->buf_size
<< 3 ) - ( state
->num_bits
- 1 );
47 if ( count
== 0 ) /* end of file */
55 ft_lzwstate_get_code( FT_LzwState state
)
57 FT_UInt num_bits
= state
->num_bits
;
58 FT_UInt offset
= state
->buf_offset
;
63 if ( state
->buf_clear
||
64 offset
>= state
->buf_size
||
65 state
->free_ent
>= state
->free_bits
)
67 if ( state
->free_ent
>= state
->free_bits
)
69 state
->num_bits
= ++num_bits
;
70 state
->free_bits
= state
->num_bits
< state
->max_bits
71 ? (FT_UInt
)( ( 1UL << num_bits
) - 256 )
72 : state
->max_free
+ 1;
75 if ( state
->buf_clear
)
77 state
->num_bits
= num_bits
= LZW_INIT_BITS
;
78 state
->free_bits
= (FT_UInt
)( ( 1UL << num_bits
) - 256 );
82 if ( ft_lzwstate_refill( state
) < 0 )
88 state
->buf_offset
= offset
+ num_bits
;
90 p
= &state
->buf_tab
[offset
>> 3];
92 result
= *p
++ >> offset
;
98 result
|= *p
++ << offset
;
103 result
|= ( *p
& LZW_MASK( num_bits
) ) << offset
;
109 /* grow the character stack */
111 ft_lzwstate_stack_grow( FT_LzwState state
)
113 if ( state
->stack_top
>= state
->stack_size
)
115 FT_Memory memory
= state
->memory
;
117 FT_Offset old_size
= state
->stack_size
;
118 FT_Offset new_size
= old_size
;
120 new_size
= new_size
+ ( new_size
>> 1 ) + 4;
122 if ( state
->stack
== state
->stack_0
)
128 /* requirement of the character stack larger than 1<<LZW_MAX_BITS */
129 /* implies bug in the decompression code */
130 if ( new_size
> ( 1 << LZW_MAX_BITS
) )
132 new_size
= 1 << LZW_MAX_BITS
;
133 if ( new_size
== old_size
)
137 if ( FT_RENEW_ARRAY( state
->stack
, old_size
, new_size
) )
140 state
->stack_size
= new_size
;
146 /* grow the prefix/suffix arrays */
148 ft_lzwstate_prefix_grow( FT_LzwState state
)
150 FT_UInt old_size
= state
->prefix_size
;
151 FT_UInt new_size
= old_size
;
152 FT_Memory memory
= state
->memory
;
156 if ( new_size
== 0 ) /* first allocation -> 9 bits */
159 new_size
+= new_size
>> 2; /* don't grow too fast */
162 * Note that the `suffix' array is located in the same memory block
163 * pointed to by `prefix'.
165 * I know that sizeof(FT_Byte) == 1 by definition, but it is clearer
166 * to write it literally.
169 if ( FT_REALLOC_MULT( state
->prefix
, old_size
, new_size
,
170 sizeof ( FT_UShort
) + sizeof ( FT_Byte
) ) )
173 /* now adjust `suffix' and move the data accordingly */
174 state
->suffix
= (FT_Byte
*)( state
->prefix
+ new_size
);
176 FT_MEM_MOVE( state
->suffix
,
177 state
->prefix
+ old_size
,
178 old_size
* sizeof ( FT_Byte
) );
180 state
->prefix_size
= new_size
;
186 ft_lzwstate_reset( FT_LzwState state
)
189 state
->buf_offset
= 0;
191 state
->buf_clear
= 0;
192 state
->buf_total
= 0;
193 state
->stack_top
= 0;
194 state
->num_bits
= LZW_INIT_BITS
;
195 state
->phase
= FT_LZW_PHASE_START
;
200 ft_lzwstate_init( FT_LzwState state
,
205 state
->source
= source
;
206 state
->memory
= source
->memory
;
208 state
->prefix
= NULL
;
209 state
->suffix
= NULL
;
210 state
->prefix_size
= 0;
212 state
->stack
= state
->stack_0
;
213 state
->stack_size
= sizeof ( state
->stack_0
);
215 ft_lzwstate_reset( state
);
220 ft_lzwstate_done( FT_LzwState state
)
222 FT_Memory memory
= state
->memory
;
225 ft_lzwstate_reset( state
);
227 if ( state
->stack
!= state
->stack_0
)
228 FT_FREE( state
->stack
);
230 FT_FREE( state
->prefix
);
231 state
->suffix
= NULL
;
237 #define FTLZW_STACK_PUSH( c ) \
239 if ( state->stack_top >= state->stack_size && \
240 ft_lzwstate_stack_grow( state ) < 0 ) \
243 state->stack[state->stack_top++] = (FT_Byte)(c); \
247 FT_LOCAL_DEF( FT_ULong
)
248 ft_lzwstate_io( FT_LzwState state
,
254 FT_UInt old_char
= state
->old_char
;
255 FT_UInt old_code
= state
->old_code
;
256 FT_UInt in_code
= state
->in_code
;
262 switch ( state
->phase
)
264 case FT_LZW_PHASE_START
:
270 /* skip magic bytes, and read max_bits + block_flag */
271 if ( FT_Stream_Seek( state
->source
, 2 ) != 0 ||
272 FT_Stream_TryRead( state
->source
, &max_bits
, 1 ) != 1 )
275 state
->max_bits
= max_bits
& LZW_BIT_MASK
;
276 state
->block_mode
= max_bits
& LZW_BLOCK_MASK
;
277 state
->max_free
= (FT_UInt
)( ( 1UL << state
->max_bits
) - 256 );
279 if ( state
->max_bits
> LZW_MAX_BITS
)
282 state
->num_bits
= LZW_INIT_BITS
;
283 state
->free_ent
= ( state
->block_mode
? LZW_FIRST
287 state
->free_bits
= state
->num_bits
< state
->max_bits
288 ? (FT_UInt
)( ( 1UL << state
->num_bits
) - 256 )
289 : state
->max_free
+ 1;
291 c
= ft_lzwstate_get_code( state
);
292 if ( c
< 0 || c
> 255 )
295 old_code
= old_char
= (FT_UInt
)c
;
298 buffer
[result
] = (FT_Byte
)old_char
;
300 if ( ++result
>= out_size
)
303 state
->phase
= FT_LZW_PHASE_CODE
;
307 case FT_LZW_PHASE_CODE
:
314 c
= ft_lzwstate_get_code( state
);
320 if ( code
== LZW_CLEAR
&& state
->block_mode
)
322 /* why not LZW_FIRST-256 ? */
323 state
->free_ent
= ( LZW_FIRST
- 1 ) - 256;
324 state
->buf_clear
= 1;
326 /* not quite right, but at least more predictable */
333 in_code
= code
; /* save code for later */
337 /* special case for KwKwKwK */
338 if ( code
- 256U >= state
->free_ent
)
340 /* corrupted LZW stream */
341 if ( code
- 256U > state
->free_ent
)
344 FTLZW_STACK_PUSH( old_char
);
348 while ( code
>= 256U )
350 if ( !state
->prefix
)
353 FTLZW_STACK_PUSH( state
->suffix
[code
- 256] );
354 code
= state
->prefix
[code
- 256];
359 FTLZW_STACK_PUSH( old_char
);
361 state
->phase
= FT_LZW_PHASE_STACK
;
365 case FT_LZW_PHASE_STACK
:
367 while ( state
->stack_top
> 0 )
372 buffer
[result
] = state
->stack
[state
->stack_top
];
374 if ( ++result
== out_size
)
378 /* now create new entry */
379 if ( state
->free_ent
< state
->max_free
)
381 if ( state
->free_ent
>= state
->prefix_size
&&
382 ft_lzwstate_prefix_grow( state
) < 0 )
385 FT_ASSERT( state
->free_ent
< state
->prefix_size
);
387 state
->prefix
[state
->free_ent
] = (FT_UShort
)old_code
;
388 state
->suffix
[state
->free_ent
] = (FT_Byte
) old_char
;
390 state
->free_ent
+= 1;
395 state
->phase
= FT_LZW_PHASE_CODE
;
399 default: /* state == EOF */
404 state
->old_code
= old_code
;
405 state
->old_char
= old_char
;
406 state
->in_code
= in_code
;
411 state
->phase
= FT_LZW_PHASE_EOF
;