X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Fftglue.c;h=d5af810b4142ad3200242661d8c6e6f2233e5340;hb=HEAD;hp=ebddfa74b056100372718e4110a8f2c9bb1712a2;hpb=824c7bf02515cde1cc562eb6a64b9857d03913fc;p=fontconfig.git diff --git a/src/ftglue.c b/src/ftglue.c index ebddfa7..d5af810 100644 --- a/src/ftglue.c +++ b/src/ftglue.c @@ -18,7 +18,7 @@ static void ftglue_log( const char* format, ... ) { va_list ap; - + va_start( ap, format ); vfprintf( stderr, format, ap ); va_end( ap ); @@ -50,66 +50,17 @@ ftglue_qalloc( FT_Memory memory, #undef QALLOC /* just in case */ #define QALLOC(ptr,size) ( (ptr) = ftglue_qalloc( memory, (size), &error ), error != 0 ) +#define FREE(_ptr) \ + do { \ + if ( (_ptr) ) \ + { \ + ftglue_free( memory, _ptr ); \ + _ptr = NULL; \ + } \ + } while (0) -FTGLUE_APIDEF( FT_Pointer ) -ftglue_alloc( FT_Memory memory, - FT_ULong size, - FT_Error *perror ) -{ - FT_Error error = 0; - FT_Pointer block = NULL; - - if ( size > 0 ) - { - block = memory->alloc( memory, size ); - if ( !block ) - error = FT_Err_Out_Of_Memory; - else - memset( (char*)block, 0, (size_t)size ); - } - - *perror = error; - return block; -} - - -FTGLUE_APIDEF( FT_Pointer ) -ftglue_realloc( FT_Memory memory, - FT_Pointer block, - FT_ULong old_size, - FT_ULong new_size, - FT_Error *perror ) -{ - FT_Pointer block2 = NULL; - FT_Error error = 0; - - if ( old_size == 0 || block == NULL ) - { - block2 = ftglue_alloc( memory, new_size, &error ); - } - else if ( new_size == 0 ) - { - ftglue_free( memory, block ); - } - else - { - block2 = memory->realloc( memory, old_size, new_size, block ); - if ( block2 == NULL ) - error = FT_Err_Out_Of_Memory; - else if ( new_size > old_size ) - memset( (char*)block2 + old_size, 0, (size_t)(new_size - old_size) ); - } - - if ( !error ) - block = block2; - - *perror = error; - return block; -} - - -FTGLUE_APIDEF( void ) +static void ftglue_free( FT_Memory memory, FT_Pointer block ) { @@ -117,7 +68,6 @@ ftglue_free( FT_Memory memory, memory->free( memory, block ); } - FTGLUE_APIDEF( FT_Long ) ftglue_stream_pos( FT_Stream stream ) { @@ -212,53 +162,6 @@ ftglue_stream_frame_exit( FT_Stream stream ) } -FTGLUE_APIDEF( FT_Byte ) -ftglue_stream_get_byte( FT_Stream stream ) -{ - FT_Byte result = 0; - - if ( stream->cursor < stream->limit ) - result = *stream->cursor++; - - return result; -} - - -FTGLUE_APIDEF( FT_Short ) -ftglue_stream_get_short( FT_Stream stream ) -{ - FT_Byte* p; - FT_Short result = 0; - - p = stream->cursor; - if ( p + 2 <= stream->limit ) - { - result = (FT_Short)((p[0] << 8) | p[1]); - stream->cursor = p+2; - } - return result; -} - - -FTGLUE_APIDEF( FT_Long ) -ftglue_stream_get_long( FT_Stream stream ) -{ - FT_Byte* p; - FT_Long result = 0; - - p = stream->cursor; - if ( p + 4 <= stream->limit ) - { - result = (FT_Long)(((FT_Long)p[0] << 24) | - ((FT_Long)p[1] << 16) | - ((FT_Long)p[2] << 8) | - p[3] ); - stream->cursor = p+4; - } - return result; -} - - FTGLUE_APIDEF( FT_Error ) ftglue_face_goto_table( FT_Face face, FT_ULong the_tag, @@ -267,10 +170,10 @@ ftglue_face_goto_table( FT_Face face, FT_Error error; LOG(( "ftglue_face_goto_table( %p, %c%c%c%c, %p )\n", - face, - (int)((the_tag >> 24) & 0xFF), - (int)((the_tag >> 16) & 0xFF), - (int)((the_tag >> 8) & 0xFF), + face, + (int)((the_tag >> 24) & 0xFF), + (int)((the_tag >> 16) & 0xFF), + (int)((the_tag >> 8) & 0xFF), (int)(the_tag & 0xFF), stream )); @@ -284,13 +187,19 @@ ftglue_face_goto_table( FT_Face face, /* parse the directory table directly, without using * FreeType's built-in data structures */ - FT_ULong offset = 0; + FT_ULong offset = 0, sig; FT_UInt count, nn; - if ( face->num_faces > 1 ) + if ( FILE_Seek( 0 ) || ACCESS_Frame( 4 ) ) + goto Exit; + + sig = GET_Tag4(); + + FORGET_Frame(); + + if ( sig == FT_MAKE_TAG( 't', 't', 'c', 'f' ) ) { /* deal with TrueType collections */ - FT_ULong offset; LOG(( ">> This is a TrueType Collection\n" )); @@ -326,15 +235,15 @@ ftglue_face_goto_table( FT_Face face, FT_UNUSED(checksum); FT_UNUSED(size); - + if ( tag == the_tag ) { LOG(( "TrueType table (start: %ld) (size: %ld)\n", start, size )); - error = ftglue_stream_seek( stream, offset+start ); + error = ftglue_stream_seek( stream, start ); goto FoundIt; } } - error = TT_Err_Table_Missing; + error = FT_Err_Table_Missing; FoundIt: FORGET_Frame(); @@ -342,8 +251,11 @@ ftglue_face_goto_table( FT_Face face, Exit: LOG(( "TrueType error=%d\n", error )); - + return error; -} +} #undef QALLOC +#define __ftglue__ +#include "fcaliastail.h" +#undef __ftglue__