FT_Stream_ExitFrame( FT_Stream stream ) { /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ /* that it is possible to access a frame of length 0 in */ /* some weird fonts (usually, when accessing an array of */ /* 0 records, like in some strange kern tables). */ /* */ /* In this case, the loader code handles the 0-length table */ /* gracefully; however, stream.cursor is really set to 0 by the */ /* FT_Stream_EnterFrame() call, and this is not an error. */ /* */ FT_ASSERT( stream ); if ( stream->read ) { FT_Memory memory = stream->memory; #ifdef FT_DEBUG_MEMORY ft_mem_free( memory, stream->base ); stream->base = NULL; #else FT_FREE( stream->base ); #endif } stream->cursor = 0; stream->limit = 0; }
ft_mem_qrealloc( FT_Memory memory, FT_Long item_size, FT_Long cur_count, FT_Long new_count, void* block, FT_Error *p_error ) { FT_Error error = FT_Err_Ok; /* Note that we now accept `item_size == 0' as a valid parameter, in * order to cover very weird cases where an ALLOC_MULT macro would be * called. */ if ( cur_count < 0 || new_count < 0 || item_size < 0 ) { /* may help catch/prevent nasty security issues */ error = FT_THROW( Invalid_Argument ); } else if ( new_count == 0 || item_size == 0 ) { ft_mem_free( memory, block ); block = NULL; } else if ( new_count > FT_INT_MAX / item_size ) { error = FT_THROW( Array_Too_Large ); } else if ( cur_count == 0 ) { FT_ASSERT( !block ); block = memory->alloc( memory, new_count * item_size ); if ( block == NULL ) error = FT_THROW( Out_Of_Memory ); } else { FT_Pointer block2; FT_Long cur_size = cur_count * item_size; FT_Long new_size = new_count * item_size; block2 = memory->realloc( memory, cur_size, new_size, block ); if ( !block2 ) error = FT_THROW( Out_Of_Memory ); else block = block2; } *p_error = error; return block; }
FT_Stream_ReleaseFrame( FT_Stream stream, FT_Byte** pbytes ) { if ( stream->read ) { FT_Memory memory = stream->memory; #ifdef FT_DEBUG_MEMORY ft_mem_free( memory, *pbytes ); *pbytes = NULL; #else FT_FREE( *pbytes ); #endif } *pbytes = 0; }
ft_mem_qrealloc( FT_Memory memory, FT_Long item_size, FT_Long cur_count, FT_Long new_count, void* block, FT_Error *p_error ) { FT_Error error = FT_Err_Ok; if ( cur_count < 0 || new_count < 0 || item_size <= 0 ) { /* may help catch/prevent nasty security issues */ error = FT_Err_Invalid_Argument; } else if ( new_count == 0 ) { ft_mem_free( memory, block ); block = NULL; } else if ( new_count > FT_INT_MAX/item_size ) { error = FT_Err_Array_Too_Large; } else if ( cur_count == 0 ) { FT_ASSERT( block == NULL ); block = ft_mem_alloc( memory, new_count*item_size, &error ); } else { FT_Pointer block2; FT_Long cur_size = cur_count*item_size; FT_Long new_size = new_count*item_size; block2 = memory->realloc( memory, cur_size, new_size, block ); if ( block2 == NULL ) error = FT_Err_Out_Of_Memory; else block = block2; } *p_error = error; return block; }