| Index: src/base/ftobjs.c
|
| diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
|
| index 36ee79749fceeb5b50d55a98db3421f63717d9c8..ac2a39c6a73e3f1ba414f197112fdc8e9de2c6b2 100644
|
| --- a/src/base/ftobjs.c
|
| +++ b/src/base/ftobjs.c
|
| @@ -4,7 +4,7 @@
|
| /* */
|
| /* The FreeType private base classes (body). */
|
| /* */
|
| -/* Copyright 1996-2012 by */
|
| +/* Copyright 1996-2013 by */
|
| /* David Turner, Robert Wilhelm, and Werner Lemberg. */
|
| /* */
|
| /* This file is part of the FreeType project, and may only be used, */
|
| @@ -29,6 +29,7 @@
|
| #include FT_TRUETYPE_TAGS_H
|
| #include FT_TRUETYPE_IDS_H
|
|
|
| +#include FT_SERVICE_PROPERTIES_H
|
| #include FT_SERVICE_SFNT_H
|
| #include FT_SERVICE_POSTSCRIPT_NAME_H
|
| #include FT_SERVICE_GLYPH_DICT_H
|
| @@ -40,6 +41,32 @@
|
| #include "ftbase.h"
|
| #endif
|
|
|
| +
|
| +#ifdef FT_DEBUG_LEVEL_TRACE
|
| +
|
| +#include FT_BITMAP_H
|
| +
|
| +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */
|
| + /* We disable the warning `conversion from XXX to YYY, */
|
| + /* possible loss of data' in order to compile cleanly with */
|
| + /* the maximum level of warnings: `md5.c' is non-FreeType */
|
| + /* code, and it gets used during development builds only. */
|
| +#pragma warning( push )
|
| +#pragma warning( disable : 4244 )
|
| +#endif /* _MSC_VER */
|
| +
|
| + /* it's easiest to include `md5.c' directly */
|
| +#define free md5_free /* suppress a shadow warning */
|
| +#include "md5.c"
|
| +#undef free
|
| +
|
| +#if defined( _MSC_VER )
|
| +#pragma warning( pop )
|
| +#endif
|
| +
|
| +#endif /* FT_DEBUG_LEVEL_TRACE */
|
| +
|
| +
|
| #define GRID_FIT_METRICS
|
|
|
|
|
| @@ -136,10 +163,10 @@
|
| *astream = 0;
|
|
|
| if ( !library )
|
| - return FT_Err_Invalid_Library_Handle;
|
| + return FT_THROW( Invalid_Library_Handle );
|
|
|
| if ( !args )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| memory = library->memory;
|
|
|
| @@ -177,7 +204,7 @@
|
| #endif
|
|
|
| else
|
| - error = FT_Err_Invalid_Argument;
|
| + error = FT_THROW( Invalid_Argument );
|
|
|
| if ( error )
|
| FT_FREE( stream );
|
| @@ -384,7 +411,7 @@
|
|
|
|
|
| if ( !face || !face->driver )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| driver = face->driver;
|
| clazz = driver->clazz;
|
| @@ -574,7 +601,7 @@
|
|
|
|
|
| if ( !face || !face->size || !face->glyph )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| /* The validity test for `glyph_index' is performed by the */
|
| /* font drivers. */
|
| @@ -651,7 +678,7 @@
|
|
|
| if ( autohint )
|
| {
|
| - FT_AutoHinter_Service hinting;
|
| + FT_AutoHinter_Interface hinting;
|
|
|
|
|
| /* try to load embedded bitmaps first if available */
|
| @@ -680,7 +707,7 @@
|
| internal->transform_flags = 0;
|
|
|
| /* load auto-hinted outline */
|
| - hinting = (FT_AutoHinter_Service)hinter->clazz->module_interface;
|
| + hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface;
|
|
|
| error = hinting->load_glyph( (FT_AutoHinter)hinter,
|
| slot, face->size,
|
| @@ -814,7 +841,7 @@
|
|
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| glyph_index = (FT_UInt)char_code;
|
| if ( face->charmap )
|
| @@ -965,7 +992,7 @@
|
| first = face->charmaps;
|
|
|
| if ( !first )
|
| - return FT_Err_Invalid_CharMap_Handle;
|
| + return FT_THROW( Invalid_CharMap_Handle );
|
|
|
| /*
|
| * The original TrueType specification(s) only specified charmap
|
| @@ -1043,7 +1070,7 @@
|
| }
|
| }
|
|
|
| - return FT_Err_Invalid_CharMap_Handle;
|
| + return FT_THROW( Invalid_CharMap_Handle );
|
| }
|
|
|
|
|
| @@ -1165,7 +1192,7 @@
|
| /* is returned. */
|
|
|
| /* no error should happen, but we want to play safe */
|
| - if ( error2 && error2 != FT_Err_Invalid_CharMap_Handle )
|
| + if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) )
|
| {
|
| error = error2;
|
| goto Fail;
|
| @@ -1206,7 +1233,7 @@
|
|
|
| /* test for valid `library' and `aface' delayed to FT_Open_Face() */
|
| if ( !pathname )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| args.flags = FT_OPEN_PATHNAME;
|
| args.pathname = (char*)pathname;
|
| @@ -1232,7 +1259,7 @@
|
|
|
| /* test for valid `library' and `face' delayed to FT_Open_Face() */
|
| if ( !file_base )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| args.flags = FT_OPEN_MEMORY;
|
| args.memory_base = file_base;
|
| @@ -1304,10 +1331,10 @@
|
|
|
|
|
| if ( !library )
|
| - return FT_Err_Invalid_Library_Handle;
|
| + return FT_THROW( Invalid_Library_Handle );
|
|
|
| if ( !base )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| *astream = 0;
|
| memory = library->memory;
|
| @@ -1421,7 +1448,7 @@
|
| if ( FT_READ_ULONG( tag ) )
|
| return error;
|
| if ( tag != TTAG_typ1 )
|
| - return FT_Err_Unknown_File_Format;
|
| + return FT_THROW( Unknown_File_Format );
|
|
|
| if ( FT_READ_USHORT( numTables ) )
|
| return error;
|
| @@ -1458,7 +1485,7 @@
|
| if ( face_index >= 0 && pstable_index == face_index )
|
| return FT_Err_Ok;
|
| }
|
| - return FT_Err_Table_Missing;
|
| + return FT_THROW( Table_Missing );
|
| }
|
|
|
|
|
| @@ -1504,7 +1531,7 @@
|
| error = open_face_from_buffer( library,
|
| sfnt_ps,
|
| length,
|
| - face_index < 0 ? face_index : 0,
|
| + FT_MIN( face_index, 0 ),
|
| is_sfnt_cid ? "cid" : "type1",
|
| aface );
|
| Exit:
|
| @@ -1512,7 +1539,7 @@
|
| FT_Error error1;
|
|
|
|
|
| - if ( error == FT_Err_Unknown_File_Format )
|
| + if ( FT_ERR_EQ( error, Unknown_File_Format ) )
|
| {
|
| error1 = FT_Stream_Seek( stream, pos );
|
| if ( error1 )
|
| @@ -1540,7 +1567,7 @@
|
| FT_Long face_index,
|
| FT_Face *aface )
|
| {
|
| - FT_Error error = FT_Err_Cannot_Open_Resource;
|
| + FT_Error error = FT_ERR( Cannot_Open_Resource );
|
| FT_Memory memory = library->memory;
|
| FT_Byte* pfb_data = NULL;
|
| int i, type, flags;
|
| @@ -1633,7 +1660,7 @@
|
| pfb_data[pfb_pos++] = 0;
|
| }
|
|
|
| - error = FT_Err_Cannot_Open_Resource;
|
| + error = FT_ERR( Cannot_Open_Resource );
|
| if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
|
| goto Exit2;
|
|
|
| @@ -1695,7 +1722,7 @@
|
| if ( face_index == -1 )
|
| face_index = 0;
|
| if ( face_index >= resource_cnt )
|
| - return FT_Err_Cannot_Open_Resource;
|
| + return FT_THROW( Cannot_Open_Resource );
|
|
|
| flag_offset = offsets[face_index];
|
| error = FT_Stream_Seek( stream, flag_offset );
|
| @@ -1705,7 +1732,7 @@
|
| if ( FT_READ_LONG( rlen ) )
|
| goto Exit;
|
| if ( rlen == -1 )
|
| - return FT_Err_Cannot_Open_Resource;
|
| + return FT_THROW( Cannot_Open_Resource );
|
|
|
| error = open_face_PS_from_sfnt_stream( library,
|
| stream,
|
| @@ -1812,7 +1839,7 @@
|
|
|
|
|
| if ( NULL == stream )
|
| - return FT_Err_Invalid_Stream_Operation;
|
| + return FT_THROW( Invalid_Stream_Operation );
|
|
|
| error = FT_Stream_Seek( stream, 0 );
|
| if ( error )
|
| @@ -1829,7 +1856,7 @@
|
| header[ 1] > 33 ||
|
| header[63] != 0 ||
|
| header[2 + header[1]] != 0 )
|
| - return FT_Err_Unknown_File_Format;
|
| + return FT_THROW( Unknown_File_Format );
|
|
|
| dlen = ( header[0x53] << 24 ) |
|
| ( header[0x54] << 16 ) |
|
| @@ -1862,7 +1889,7 @@
|
| #define FT_COMPONENT trace_raccess
|
|
|
| FT_Memory memory = library->memory;
|
| - FT_Error error = FT_Err_Unknown_File_Format;
|
| + FT_Error error = FT_ERR( Unknown_File_Format );
|
| int i;
|
|
|
| char * file_names[FT_RACCESS_N_RULES];
|
| @@ -1901,7 +1928,7 @@
|
| i, args2.pathname, offsets[i] ));
|
|
|
| error = FT_Stream_New( library, &args2, &stream2 );
|
| - if ( is_darwin_vfs && error == FT_Err_Cannot_Open_Stream )
|
| + if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) )
|
| vfs_rfork_has_no_font = TRUE;
|
|
|
| if ( error )
|
| @@ -1930,7 +1957,7 @@
|
|
|
| /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */
|
| if ( error )
|
| - error = FT_Err_Unknown_File_Format;
|
| + error = FT_ERR( Unknown_File_Format );
|
|
|
| return error;
|
|
|
| @@ -1959,7 +1986,7 @@
|
|
|
|
|
| error = IsMacBinary( library, stream, face_index, aface );
|
| - if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format )
|
| + if ( FT_ERR_EQ( error, Unknown_File_Format ) )
|
| {
|
|
|
| #undef FT_COMPONENT
|
| @@ -1976,9 +2003,9 @@
|
|
|
| }
|
|
|
| - if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format ||
|
| - FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) &&
|
| - ( args->flags & FT_OPEN_PATHNAME ) )
|
| + if ( ( FT_ERR_EQ( error, Unknown_File_Format ) ||
|
| + FT_ERR_EQ( error, Invalid_Stream_Operation ) ) &&
|
| + ( args->flags & FT_OPEN_PATHNAME ) )
|
| error = load_face_in_embedded_rfork( library, stream,
|
| face_index, aface, args );
|
| return error;
|
| @@ -2011,7 +2038,7 @@
|
| /* FT_Stream_New() */
|
|
|
| if ( ( !aface && face_index >= 0 ) || !args )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&
|
| args->stream );
|
| @@ -2048,18 +2075,19 @@
|
| goto Success;
|
| }
|
| else
|
| - error = FT_Err_Invalid_Handle;
|
| + error = FT_THROW( Invalid_Handle );
|
|
|
| FT_Stream_Free( stream, external_stream );
|
| goto Fail;
|
| }
|
| else
|
| {
|
| + error = FT_ERR( Missing_Module );
|
| +
|
| /* check each font driver for an appropriate format */
|
| cur = library->modules;
|
| limit = cur + library->num_modules;
|
|
|
| -
|
| for ( ; cur < limit; cur++ )
|
| {
|
| /* not all modules are font drivers, so check... */
|
| @@ -2084,7 +2112,7 @@
|
|
|
| #ifdef FT_CONFIG_OPTION_MAC_FONTS
|
| if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 &&
|
| - FT_ERROR_BASE( error ) == FT_Err_Table_Missing )
|
| + FT_ERR_EQ( error, Table_Missing ) )
|
| {
|
| /* TrueType but essential tables are missing */
|
| if ( FT_Stream_Seek( stream, 0 ) )
|
| @@ -2104,39 +2132,39 @@
|
| }
|
| #endif
|
|
|
| - if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format )
|
| + if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
|
| goto Fail3;
|
| }
|
| }
|
|
|
| - Fail3:
|
| - /* If we are on the mac, and we get an FT_Err_Invalid_Stream_Operation */
|
| - /* it may be because we have an empty data fork, so we need to check */
|
| - /* the resource fork. */
|
| - if ( FT_ERROR_BASE( error ) != FT_Err_Cannot_Open_Stream &&
|
| - FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format &&
|
| - FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation )
|
| - goto Fail2;
|
| + Fail3:
|
| + /* If we are on the mac, and we get an */
|
| + /* FT_Err_Invalid_Stream_Operation it may be because we have an */
|
| + /* empty data fork, so we need to check the resource fork. */
|
| + if ( FT_ERR_NEQ( error, Cannot_Open_Stream ) &&
|
| + FT_ERR_NEQ( error, Unknown_File_Format ) &&
|
| + FT_ERR_NEQ( error, Invalid_Stream_Operation ) )
|
| + goto Fail2;
|
|
|
| #if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )
|
| - error = load_mac_face( library, stream, face_index, aface, args );
|
| - if ( !error )
|
| - {
|
| - /* We don't want to go to Success here. We've already done that. */
|
| - /* On the other hand, if we succeeded we still need to close this */
|
| - /* stream (we opened a different stream which extracted the */
|
| - /* interesting information out of this stream here. That stream */
|
| - /* will still be open and the face will point to it). */
|
| - FT_Stream_Free( stream, external_stream );
|
| - return error;
|
| - }
|
| + error = load_mac_face( library, stream, face_index, aface, args );
|
| + if ( !error )
|
| + {
|
| + /* We don't want to go to Success here. We've already done that. */
|
| + /* On the other hand, if we succeeded we still need to close this */
|
| + /* stream (we opened a different stream which extracted the */
|
| + /* interesting information out of this stream here. That stream */
|
| + /* will still be open and the face will point to it). */
|
| + FT_Stream_Free( stream, external_stream );
|
| + return error;
|
| + }
|
|
|
| - if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format )
|
| - goto Fail2;
|
| + if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
|
| + goto Fail2;
|
| #endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
|
|
|
| /* no driver is able to handle this format */
|
| - error = FT_Err_Unknown_File_Format;
|
| + error = FT_THROW( Unknown_File_Format );
|
|
|
| Fail2:
|
| FT_Stream_Free( stream, external_stream );
|
| @@ -2258,7 +2286,7 @@
|
| /* test for valid `face' delayed to FT_Attach_Stream() */
|
|
|
| if ( !filepathname )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| open.stream = NULL;
|
| open.flags = FT_OPEN_PATHNAME;
|
| @@ -2284,11 +2312,11 @@
|
| /* test for valid `parameters' delayed to FT_Stream_New() */
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| driver = face->driver;
|
| if ( !driver )
|
| - return FT_Err_Invalid_Driver_Handle;
|
| + return FT_THROW( Invalid_Driver_Handle );
|
|
|
| error = FT_Stream_New( driver->root.library, parameters, &stream );
|
| if ( error )
|
| @@ -2297,7 +2325,7 @@
|
| /* we implement FT_Attach_Stream in each driver through the */
|
| /* `attach_file' interface */
|
|
|
| - error = FT_Err_Unimplemented_Feature;
|
| + error = FT_ERR( Unimplemented_Feature );
|
| clazz = driver->clazz;
|
| if ( clazz->attach_file )
|
| error = clazz->attach_file( face, stream );
|
| @@ -2334,7 +2362,7 @@
|
| FT_ListNode node;
|
|
|
|
|
| - error = FT_Err_Invalid_Face_Handle;
|
| + error = FT_ERR( Invalid_Face_Handle );
|
| if ( face && face->driver )
|
| {
|
| face->internal->refcount--;
|
| @@ -2380,13 +2408,13 @@
|
|
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| if ( !asize )
|
| - return FT_Err_Invalid_Size_Handle;
|
| + return FT_THROW( Invalid_Size_Handle );
|
|
|
| if ( !face->driver )
|
| - return FT_Err_Invalid_Driver_Handle;
|
| + return FT_THROW( Invalid_Driver_Handle );
|
|
|
| *asize = 0;
|
|
|
| @@ -2438,15 +2466,15 @@
|
|
|
|
|
| if ( !size )
|
| - return FT_Err_Invalid_Size_Handle;
|
| + return FT_THROW( Invalid_Size_Handle );
|
|
|
| face = size->face;
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| driver = face->driver;
|
| if ( !driver )
|
| - return FT_Err_Invalid_Driver_Handle;
|
| + return FT_THROW( Invalid_Driver_Handle );
|
|
|
| memory = driver->root.memory;
|
|
|
| @@ -2467,7 +2495,7 @@
|
| destroy_size( memory, size, driver );
|
| }
|
| else
|
| - error = FT_Err_Invalid_Size_Handle;
|
| + error = FT_THROW( Invalid_Size_Handle );
|
|
|
| return error;
|
| }
|
| @@ -2486,11 +2514,11 @@
|
|
|
|
|
| if ( !FT_HAS_FIXED_SIZES( face ) )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| /* FT_Bitmap_Size doesn't provide enough info... */
|
| if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
|
| - return FT_Err_Unimplemented_Feature;
|
| + return FT_THROW( Unimplemented_Feature );
|
|
|
| w = FT_REQUEST_WIDTH ( req );
|
| h = FT_REQUEST_HEIGHT( req );
|
| @@ -2513,6 +2541,8 @@
|
|
|
| if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )
|
| {
|
| + FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i ));
|
| +
|
| if ( size_index )
|
| *size_index = (FT_ULong)i;
|
|
|
| @@ -2520,7 +2550,7 @@
|
| }
|
| }
|
|
|
| - return FT_Err_Invalid_Pixel_Size;
|
| + return FT_THROW( Invalid_Pixel_Size );
|
| }
|
|
|
|
|
| @@ -2763,10 +2793,10 @@
|
|
|
|
|
| if ( !face || !FT_HAS_FIXED_SIZES( face ) )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| clazz = face->driver->clazz;
|
|
|
| @@ -2816,11 +2846,11 @@
|
|
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| if ( !req || req->width < 0 || req->height < 0 ||
|
| req->type >= FT_SIZE_REQUEST_TYPE_MAX )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| clazz = face->driver->clazz;
|
|
|
| @@ -2869,9 +2899,6 @@
|
| if ( error )
|
| return error;
|
|
|
| - FT_TRACE3(( "FT_Request_Size: bitmap strike %lu matched\n",
|
| - strike_index ));
|
| -
|
| return FT_Select_Size( face, (FT_Int)strike_index );
|
| }
|
|
|
| @@ -2971,10 +2998,10 @@
|
|
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| if ( !akerning )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| driver = face->driver;
|
|
|
| @@ -3030,14 +3057,14 @@
|
|
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| if ( !akerning )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| FT_FACE_FIND_SERVICE( face, service, KERNING );
|
| if ( !service )
|
| - return FT_Err_Unimplemented_Feature;
|
| + return FT_THROW( Unimplemented_Feature );
|
|
|
| error = service->get_track( face,
|
| point_size,
|
| @@ -3059,10 +3086,10 @@
|
|
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| if ( encoding == FT_ENCODING_NONE )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */
|
| /* charmap available, i.e., one with UCS-4 characters, if possible. */
|
| @@ -3073,7 +3100,7 @@
|
|
|
| cur = face->charmaps;
|
| if ( !cur )
|
| - return FT_Err_Invalid_CharMap_Handle;
|
| + return FT_THROW( Invalid_CharMap_Handle );
|
|
|
| limit = cur + face->num_charmaps;
|
|
|
| @@ -3095,7 +3122,7 @@
|
| }
|
| }
|
|
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
| }
|
|
|
|
|
| @@ -3110,13 +3137,13 @@
|
|
|
|
|
| if ( !face )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| cur = face->charmaps;
|
| if ( !cur )
|
| - return FT_Err_Invalid_CharMap_Handle;
|
| + return FT_THROW( Invalid_CharMap_Handle );
|
| if ( FT_Get_CMap_Format( charmap ) == 14 )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| limit = cur + face->num_charmaps;
|
|
|
| @@ -3137,7 +3164,7 @@
|
| return 0;
|
| }
|
| }
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
| }
|
|
|
|
|
| @@ -3176,7 +3203,7 @@
|
| {
|
| FT_CMap_Class clazz = cmap->clazz;
|
| FT_Face face = cmap->charmap.face;
|
| - FT_Memory memory = FT_FACE_MEMORY(face);
|
| + FT_Memory memory = FT_FACE_MEMORY( face );
|
|
|
|
|
| if ( clazz->done )
|
| @@ -3245,7 +3272,7 @@
|
|
|
|
|
| if ( clazz == NULL || charmap == NULL || charmap->face == NULL )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| face = charmap->face;
|
| memory = FT_FACE_MEMORY( face );
|
| @@ -3578,7 +3605,7 @@
|
| FT_Pointer buffer,
|
| FT_UInt buffer_max )
|
| {
|
| - FT_Error error = FT_Err_Invalid_Argument;
|
| + FT_Error error = FT_ERR( Invalid_Argument );
|
|
|
|
|
| /* clean up buffer */
|
| @@ -3667,11 +3694,11 @@
|
|
|
|
|
| if ( !face || !FT_IS_SFNT( face ) )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
|
| if ( service == NULL )
|
| - return FT_Err_Unimplemented_Feature;
|
| + return FT_THROW( Unimplemented_Feature );
|
|
|
| return service->load_table( face, tag, offset, buffer, length );
|
| }
|
| @@ -3690,11 +3717,11 @@
|
|
|
|
|
| if ( !face || !FT_IS_SFNT( face ) )
|
| - return FT_Err_Invalid_Face_Handle;
|
| + return FT_THROW( Invalid_Face_Handle );
|
|
|
| FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
|
| if ( service == NULL )
|
| - return FT_Err_Unimplemented_Feature;
|
| + return FT_THROW( Unimplemented_Feature );
|
|
|
| return service->table_info( face, table_index, tag, &offset, length );
|
| }
|
| @@ -3757,11 +3784,11 @@
|
|
|
|
|
| if ( size == NULL )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| face = size->face;
|
| if ( face == NULL || face->driver == NULL )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| /* we don't need anything more complex than that; all size objects */
|
| /* are already listed by the face */
|
| @@ -3953,15 +3980,15 @@
|
|
|
|
|
| if ( !library )
|
| - return FT_Err_Invalid_Library_Handle;
|
| + return FT_THROW( Invalid_Library_Handle );
|
|
|
| if ( !renderer )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| node = FT_List_Find( &library->renderers, renderer );
|
| if ( !node )
|
| {
|
| - error = FT_Err_Invalid_Argument;
|
| + error = FT_THROW( Invalid_Argument );
|
| goto Exit;
|
| }
|
|
|
| @@ -4019,12 +4046,12 @@
|
| else
|
| renderer = FT_Lookup_Renderer( library, slot->format, &node );
|
|
|
| - error = FT_Err_Unimplemented_Feature;
|
| + error = FT_ERR( Unimplemented_Feature );
|
| while ( renderer )
|
| {
|
| error = renderer->render( renderer, slot, render_mode, NULL );
|
| - if ( !error ||
|
| - FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph )
|
| + if ( !error ||
|
| + FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
|
| break;
|
|
|
| /* FT_Err_Cannot_Render_Glyph is returned if the render mode */
|
| @@ -4044,6 +4071,47 @@
|
| }
|
| }
|
|
|
| +#ifdef FT_DEBUG_LEVEL_TRACE
|
| +
|
| +#undef FT_COMPONENT
|
| +#define FT_COMPONENT trace_bitmap
|
| +
|
| + /* we convert to a single bitmap format for computing the checksum */
|
| + {
|
| + FT_Bitmap bitmap;
|
| + FT_Error err;
|
| +
|
| +
|
| + FT_Bitmap_New( &bitmap );
|
| +
|
| + err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );
|
| + if ( !err )
|
| + {
|
| + MD5_CTX ctx;
|
| + unsigned char md5[16];
|
| + int i;
|
| +
|
| +
|
| + MD5_Init( &ctx);
|
| + MD5_Update( &ctx, bitmap.buffer, bitmap.rows * bitmap.pitch );
|
| + MD5_Final( md5, &ctx );
|
| +
|
| + FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n"
|
| + " ",
|
| + bitmap.rows, bitmap.pitch ));
|
| + for ( i = 0; i < 16; i++ )
|
| + FT_TRACE3(( "%02X", md5[i] ));
|
| + FT_TRACE3(( "\n" ));
|
| + }
|
| +
|
| + FT_Bitmap_Done( library, &bitmap );
|
| + }
|
| +
|
| +#undef FT_COMPONENT
|
| +#define FT_COMPONENT trace_objs
|
| +
|
| +#endif /* FT_DEBUG_LEVEL_TRACE */
|
| +
|
| return error;
|
| }
|
|
|
| @@ -4058,7 +4126,7 @@
|
|
|
|
|
| if ( !slot || !slot->face )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| library = FT_FACE_LIBRARY( slot->face );
|
|
|
| @@ -4138,14 +4206,14 @@
|
| FREETYPE_MINOR )
|
|
|
| if ( !library )
|
| - return FT_Err_Invalid_Library_Handle;
|
| + return FT_THROW( Invalid_Library_Handle );
|
|
|
| if ( !clazz )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| /* check freetype version */
|
| if ( clazz->module_requires > FREETYPE_VER_FIXED )
|
| - return FT_Err_Invalid_Version;
|
| + return FT_THROW( Invalid_Version );
|
|
|
| /* look for a module with the same name in the library's table */
|
| for ( nn = 0; nn < library->num_modules; nn++ )
|
| @@ -4155,7 +4223,7 @@
|
| {
|
| /* this installed module has the same name, compare their versions */
|
| if ( clazz->module_version <= module->clazz->module_version )
|
| - return FT_Err_Lower_Module_Version;
|
| + return FT_THROW( Lower_Module_Version );
|
|
|
| /* remove the module from our list, then exit the loop to replace */
|
| /* it by our new version.. */
|
| @@ -4169,7 +4237,7 @@
|
|
|
| if ( library->num_modules >= FT_MAX_MODULES )
|
| {
|
| - error = FT_Err_Too_Many_Drivers;
|
| + error = FT_THROW( Too_Many_Drivers );
|
| goto Exit;
|
| }
|
|
|
| @@ -4301,19 +4369,18 @@
|
| {
|
| FT_Pointer result = NULL;
|
|
|
| +
|
| if ( module )
|
| {
|
| FT_ASSERT( module->clazz && module->clazz->get_interface );
|
|
|
| - /* first, look for the service in the module
|
| - */
|
| + /* first, look for the service in the module */
|
| if ( module->clazz->get_interface )
|
| result = module->clazz->get_interface( module, service_id );
|
|
|
| if ( result == NULL )
|
| {
|
| - /* we didn't find it, look in all other modules then
|
| - */
|
| + /* we didn't find it, look in all other modules then */
|
| FT_Library library = module->library;
|
| FT_Module* cur = library->modules;
|
| FT_Module* limit = cur + library->num_modules;
|
| @@ -4349,7 +4416,7 @@
|
| /* try to find the module from the table, then remove it from there */
|
|
|
| if ( !library )
|
| - return FT_Err_Invalid_Library_Handle;
|
| + return FT_THROW( Invalid_Library_Handle );
|
|
|
| if ( module )
|
| {
|
| @@ -4378,7 +4445,119 @@
|
| }
|
| }
|
| }
|
| - return FT_Err_Invalid_Driver_Handle;
|
| + return FT_THROW( Invalid_Driver_Handle );
|
| + }
|
| +
|
| +
|
| + FT_Error
|
| + ft_property_do( FT_Library library,
|
| + const FT_String* module_name,
|
| + const FT_String* property_name,
|
| + void* value,
|
| + FT_Bool set )
|
| + {
|
| + FT_Module* cur;
|
| + FT_Module* limit;
|
| + FT_Module_Interface interface;
|
| +
|
| + FT_Service_Properties service;
|
| +
|
| +#ifdef FT_DEBUG_LEVEL_ERROR
|
| + const FT_String* set_name = "FT_Property_Set";
|
| + const FT_String* get_name = "FT_Property_Get";
|
| + const FT_String* func_name = set ? set_name : get_name;
|
| +#endif
|
| +
|
| + FT_Bool missing_func;
|
| +
|
| +
|
| + if ( !library )
|
| + return FT_THROW( Invalid_Library_Handle );
|
| +
|
| + if ( !module_name || !property_name || !value )
|
| + return FT_THROW( Invalid_Argument );
|
| +
|
| + cur = library->modules;
|
| + limit = cur + library->num_modules;
|
| +
|
| + /* search module */
|
| + for ( ; cur < limit; cur++ )
|
| + if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )
|
| + break;
|
| +
|
| + if ( cur == limit )
|
| + {
|
| + FT_ERROR(( "%s: can't find module `%s'\n",
|
| + func_name, module_name ));
|
| + return FT_THROW( Missing_Module );
|
| + }
|
| +
|
| + /* check whether we have a service interface */
|
| + if ( !cur[0]->clazz->get_interface )
|
| + {
|
| + FT_ERROR(( "%s: module `%s' doesn't support properties\n",
|
| + func_name, module_name ));
|
| + return FT_THROW( Unimplemented_Feature );
|
| + }
|
| +
|
| + /* search property service */
|
| + interface = cur[0]->clazz->get_interface( cur[0],
|
| + FT_SERVICE_ID_PROPERTIES );
|
| + if ( !interface )
|
| + {
|
| + FT_ERROR(( "%s: module `%s' doesn't support properties\n",
|
| + func_name, module_name ));
|
| + return FT_THROW( Unimplemented_Feature );
|
| + }
|
| +
|
| + service = (FT_Service_Properties)interface;
|
| +
|
| + if ( set )
|
| + missing_func = !service->set_property;
|
| + else
|
| + missing_func = !service->get_property;
|
| +
|
| + if ( missing_func )
|
| + {
|
| + FT_ERROR(( "%s: property service of module `%s' is broken\n",
|
| + func_name, module_name ));
|
| + return FT_THROW( Unimplemented_Feature );
|
| + }
|
| +
|
| + return set ? service->set_property( cur[0], property_name, value )
|
| + : service->get_property( cur[0], property_name, value );
|
| + }
|
| +
|
| +
|
| + /* documentation is in ftmodapi.h */
|
| +
|
| + FT_EXPORT_DEF( FT_Error )
|
| + FT_Property_Set( FT_Library library,
|
| + const FT_String* module_name,
|
| + const FT_String* property_name,
|
| + const void* value )
|
| + {
|
| + return ft_property_do( library,
|
| + module_name,
|
| + property_name,
|
| + (void*)value,
|
| + TRUE );
|
| + }
|
| +
|
| +
|
| + /* documentation is in ftmodapi.h */
|
| +
|
| + FT_EXPORT_DEF( FT_Error )
|
| + FT_Property_Get( FT_Library library,
|
| + const FT_String* module_name,
|
| + const FT_String* property_name,
|
| + void* value )
|
| + {
|
| + return ft_property_do( library,
|
| + module_name,
|
| + property_name,
|
| + value,
|
| + FALSE );
|
| }
|
|
|
|
|
| @@ -4417,7 +4596,7 @@
|
|
|
|
|
| if ( !memory )
|
| - return FT_Err_Invalid_Argument;
|
| + return FT_THROW( Invalid_Argument );
|
|
|
| #ifdef FT_DEBUG_LEVEL_ERROR
|
| /* init debugging support */
|
| @@ -4504,7 +4683,7 @@
|
|
|
|
|
| if ( !library )
|
| - return FT_Err_Invalid_Library_Handle;
|
| + return FT_THROW( Invalid_Library_Handle );
|
|
|
| library->refcount--;
|
| if ( library->refcount > 0 )
|
| @@ -4651,70 +4830,6 @@
|
| }
|
|
|
|
|
| -#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
|
| -
|
| - FT_BASE_DEF( FT_Error )
|
| - ft_stub_set_char_sizes( FT_Size size,
|
| - FT_F26Dot6 width,
|
| - FT_F26Dot6 height,
|
| - FT_UInt horz_res,
|
| - FT_UInt vert_res )
|
| - {
|
| - FT_Size_RequestRec req;
|
| - FT_Driver driver = size->face->driver;
|
| -
|
| -
|
| - if ( driver->clazz->request_size )
|
| - {
|
| - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
|
| - req.width = width;
|
| - req.height = height;
|
| -
|
| - if ( horz_res == 0 )
|
| - horz_res = vert_res;
|
| -
|
| - if ( vert_res == 0 )
|
| - vert_res = horz_res;
|
| -
|
| - if ( horz_res == 0 )
|
| - horz_res = vert_res = 72;
|
| -
|
| - req.horiResolution = horz_res;
|
| - req.vertResolution = vert_res;
|
| -
|
| - return driver->clazz->request_size( size, &req );
|
| - }
|
| -
|
| - return 0;
|
| - }
|
| -
|
| -
|
| - FT_BASE_DEF( FT_Error )
|
| - ft_stub_set_pixel_sizes( FT_Size size,
|
| - FT_UInt width,
|
| - FT_UInt height )
|
| - {
|
| - FT_Size_RequestRec req;
|
| - FT_Driver driver = size->face->driver;
|
| -
|
| -
|
| - if ( driver->clazz->request_size )
|
| - {
|
| - req.type = FT_SIZE_REQUEST_TYPE_NOMINAL;
|
| - req.width = width << 6;
|
| - req.height = height << 6;
|
| - req.horiResolution = 0;
|
| - req.vertResolution = 0;
|
| -
|
| - return driver->clazz->request_size( size, &req );
|
| - }
|
| -
|
| - return 0;
|
| - }
|
| -
|
| -#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
|
| -
|
| -
|
| /* documentation is in freetype.h */
|
|
|
| FT_EXPORT_DEF( FT_Error )
|
| @@ -4726,7 +4841,7 @@
|
| FT_Int *p_arg2,
|
| FT_Matrix *p_transform )
|
| {
|
| - FT_Error error = FT_Err_Invalid_Argument;
|
| + FT_Error error = FT_ERR( Invalid_Argument );
|
|
|
|
|
| if ( glyph &&
|
|
|