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, 2006 by David Turner. */
13 /* This file is part of the FreeType project, and may only be used, */
14 /* modified, and distributed under the terms of the FreeType project */
15 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
16 /* this file you indicate that you have read the license and */
17 /* understand and accept it fully. */
19 /***************************************************************************/
22 #include FT_INTERNAL_MEMORY_H
23 #include FT_INTERNAL_STREAM_H
24 #include FT_INTERNAL_DEBUG_H
26 /* refill input buffer, return 0 on success, or -1 if eof */
28 ft_lzwstate_refill( FT_LzwState state
)
35 FT_ULong count
= FT_Stream_TryRead( state
->source
,
37 sizeof ( state
->in_buff
) );
39 state
->in_cursor
= state
->in_buff
;
40 state
->in_limit
= state
->in_buff
+ count
;
41 state
->in_eof
= FT_BOOL( count
< sizeof ( state
->in_buff
) );
50 /* return new code of 'num_bits', or -1 if eof */
52 ft_lzwstate_get_code( FT_LzwState state
,
56 FT_UInt32 pad
= state
->pad
;
57 FT_UInt pad_bits
= state
->pad_bits
;
60 while ( num_bits
> pad_bits
)
62 if ( state
->in_cursor
>= state
->in_limit
&&
63 ft_lzwstate_refill( state
) < 0 )
66 pad
|= (FT_UInt32
)(*state
->in_cursor
++) << pad_bits
;
70 result
= (FT_Int32
)( pad
& LZW_MASK( num_bits
) );
71 state
->pad_bits
= pad_bits
- num_bits
;
72 state
->pad
= pad
>> num_bits
;
79 /* grow the character stack */
81 ft_lzwstate_stack_grow( FT_LzwState state
)
83 if ( state
->stack_top
>= state
->stack_size
)
85 FT_Memory memory
= state
->memory
;
87 FT_UInt old_size
= state
->stack_size
;
88 FT_UInt new_size
= old_size
;
90 new_size
= new_size
+ ( new_size
>> 1 ) + 4;
92 if ( state
->stack
== state
->stack_0
)
98 if ( FT_RENEW_ARRAY( state
->stack
, old_size
, new_size
) )
101 state
->stack_size
= new_size
;
107 /* grow the prefix/suffix arrays */
109 ft_lzwstate_prefix_grow( FT_LzwState state
)
111 FT_UInt old_size
= state
->prefix_size
;
112 FT_UInt new_size
= old_size
;
113 FT_Memory memory
= state
->memory
;
117 if ( new_size
== 0 ) /* first allocation -> 9 bits */
120 new_size
+= new_size
>> 2; /* don't grow too fast */
123 * Note that the `suffix' array is located in the same memory block
124 * pointed to by `prefix'.
126 * I know that sizeof(FT_Byte) == 1 by definition, but it is clearer
127 * to write it literally.
130 if ( FT_REALLOC_MULT( state
->prefix
, old_size
, new_size
,
131 sizeof ( FT_UShort
) + sizeof ( FT_Byte
) ) )
134 /* now adjust `suffix' and move the data accordingly */
135 state
->suffix
= (FT_Byte
*)( state
->prefix
+ new_size
);
137 FT_MEM_MOVE( state
->suffix
,
138 state
->prefix
+ old_size
,
139 old_size
* sizeof ( FT_Byte
) );
141 state
->prefix_size
= new_size
;
147 ft_lzwstate_reset( FT_LzwState state
)
149 state
->in_cursor
= state
->in_buff
;
150 state
->in_limit
= state
->in_buff
;
155 state
->stack_top
= 0;
156 state
->num_bits
= LZW_INIT_BITS
;
157 state
->phase
= FT_LZW_PHASE_START
;
162 ft_lzwstate_init( FT_LzwState state
,
167 state
->source
= source
;
168 state
->memory
= source
->memory
;
170 state
->prefix
= NULL
;
171 state
->suffix
= NULL
;
172 state
->prefix_size
= 0;
174 state
->stack
= state
->stack_0
;
175 state
->stack_size
= sizeof ( state
->stack_0
);
177 ft_lzwstate_reset( state
);
182 ft_lzwstate_done( FT_LzwState state
)
184 FT_Memory memory
= state
->memory
;
187 ft_lzwstate_reset( state
);
189 if ( state
->stack
!= state
->stack_0
)
190 FT_FREE( state
->stack
);
192 FT_FREE( state
->prefix
);
193 state
->suffix
= NULL
;
199 #define FTLZW_STACK_PUSH( c ) \
201 if ( state->stack_top >= state->stack_size && \
202 ft_lzwstate_stack_grow( state ) < 0 ) \
205 state->stack[ state->stack_top++ ] = (FT_Byte)(c); \
209 FT_LOCAL_DEF( FT_ULong
)
210 ft_lzwstate_io( FT_LzwState state
,
216 FT_UInt num_bits
= state
->num_bits
;
217 FT_UInt free_ent
= state
->free_ent
;
218 FT_UInt old_char
= state
->old_char
;
219 FT_UInt old_code
= state
->old_code
;
220 FT_UInt in_code
= state
->in_code
;
226 switch ( state
->phase
)
228 case FT_LZW_PHASE_START
:
234 /* skip magic bytes, and read max_bits + block_flag */
235 if ( FT_Stream_Seek( state
->source
, 2 ) != 0 ||
236 FT_Stream_TryRead( state
->source
, &max_bits
, 1 ) != 1 )
239 state
->max_bits
= max_bits
& LZW_BIT_MASK
;
240 state
->block_mode
= max_bits
& LZW_BLOCK_MASK
;
241 state
->max_free
= (FT_UInt
)( ( 1UL << state
->max_bits
) - 256 );
243 if ( state
->max_bits
> LZW_MAX_BITS
)
246 num_bits
= LZW_INIT_BITS
;
247 free_ent
= ( state
->block_mode
? LZW_FIRST
: LZW_CLEAR
) - 256;
250 state
->free_bits
= num_bits
< state
->max_bits
251 ? (FT_UInt
)( ( 1UL << num_bits
) - 256 )
252 : state
->max_free
+ 1;
254 c
= ft_lzwstate_get_code( state
, num_bits
);
258 old_code
= old_char
= (FT_UInt
)c
;
261 buffer
[result
] = (FT_Byte
)old_char
;
263 if ( ++result
>= out_size
)
266 state
->phase
= FT_LZW_PHASE_CODE
;
270 case FT_LZW_PHASE_CODE
:
277 c
= ft_lzwstate_get_code( state
, num_bits
);
283 if ( code
== LZW_CLEAR
&& state
->block_mode
)
285 free_ent
= ( LZW_FIRST
- 1 ) - 256; /* why not LZW_FIRST-256 ? */
286 num_bits
= LZW_INIT_BITS
;
288 state
->free_bits
= num_bits
< state
->max_bits
289 ? (FT_UInt
)( ( 1UL << num_bits
) - 256 )
290 : state
->max_free
+ 1;
292 c
= ft_lzwstate_get_code( state
, num_bits
);
299 in_code
= code
; /* save code for later */
303 /* special case for KwKwKwK */
304 if ( code
- 256U >= free_ent
)
306 FTLZW_STACK_PUSH( old_char
);
310 while ( code
>= 256U )
312 FTLZW_STACK_PUSH( state
->suffix
[code
- 256] );
313 code
= state
->prefix
[code
- 256];
318 FTLZW_STACK_PUSH( old_char
);
320 state
->phase
= FT_LZW_PHASE_STACK
;
324 case FT_LZW_PHASE_STACK
:
326 while ( state
->stack_top
> 0 )
331 buffer
[result
] = state
->stack
[state
->stack_top
];
333 if ( ++result
== out_size
)
337 /* now create new entry */
338 if ( free_ent
< state
->max_free
)
340 if ( free_ent
>= state
->prefix_size
&&
341 ft_lzwstate_prefix_grow( state
) < 0 )
344 FT_ASSERT( free_ent
< state
->prefix_size
);
346 state
->prefix
[free_ent
] = (FT_UShort
)old_code
;
347 state
->suffix
[free_ent
] = (FT_Byte
) old_char
;
349 if ( ++free_ent
== state
->free_bits
)
353 state
->free_bits
= num_bits
< state
->max_bits
354 ? (FT_UInt
)( ( 1UL << num_bits
) - 256 )
355 : state
->max_free
+ 1;
361 state
->phase
= FT_LZW_PHASE_CODE
;
365 default: /* state == EOF */
370 state
->num_bits
= num_bits
;
371 state
->free_ent
= free_ent
;
372 state
->old_code
= old_code
;
373 state
->old_char
= old_char
;
374 state
->in_code
= in_code
;
379 state
->phase
= FT_LZW_PHASE_EOF
;