* include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE,

FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type.
Ugly, I know, but this is needed for compilation with C++ --
maybe someone knows a better solution?
Updated all callers.

* src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove
C++ compiler warnings.

* src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property):
Fix order of arguments passed to FT_FACE_FIND_SERVICE.
This commit is contained in:
Werner Lemberg 2003-09-17 19:20:02 +00:00
parent 013efd1410
commit 46333a118f
6 changed files with 85 additions and 47 deletions

View File

@ -1,5 +1,21 @@
2003-09-16 Werner Lemberg <wl@gnu.org>
* include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE,
FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type.
Ugly, I know, but this is needed for compilation with C++ --
maybe someone knows a better solution?
Updated all callers.
* src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove
C++ compiler warnings.
* src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property):
Fix order of arguments passed to FT_FACE_FIND_SERVICE.
2003-09-15 Werner Lemberg <wl@gnu.org>
Avoid header files with identical names.
* include/freetype/internal/services/bdf.h: Renamed to...
* include/freetype/internal/services/svbdf.h: This.
Add copyright notice.

View File

@ -22,8 +22,8 @@
/* generally corresponds to a structure containing function pointers. */
/* */
/* Note that a service's data cannot be a mere function pointer because */
/* in C it is possible that function pointers might are implemented */
/* differently from data pointers (e.g. 48 bits instead of 32). */
/* in C it is possible that function pointers might be implemented */
/* differently than data pointers (e.g. 48 bits instead of 32). */
/* */
/*************************************************************************/
@ -35,35 +35,39 @@
FT_BEGIN_HEADER
/*
* @macro:
* FT_FACE_FIND_SERVICE
*
* @description:
* This macro is used to lookup a service from a face's driver module.
*
* @input:
* id ::
* A string describing the service as defined in the service's
* header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
* `multi-masters').
*
* face ::
* The source face handle.
*
* @output:
* ptr ::
* A variable that receives the service pointer. Will be NULL
* if not found.
*/
#define FT_FACE_FIND_SERVICE( ptr, face, id ) \
FT_BEGIN_STMNT \
FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \
\
\
(ptr) = NULL; \
if ( module->clazz->get_interface ) \
(ptr) = module->clazz->get_interface( module, id ); \
/*
* @macro:
* FT_FACE_FIND_SERVICE
*
* @description:
* This macro is used to lookup a service from a face's driver module.
*
* @input:
* id ::
* A string describing the service as defined in the service's
* header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
* `multi-masters').
*
* face ::
* The source face handle.
*
* ptrtype ::
* The pointer type of `ptr'. This is needed to make FreeType
* compile cleanly with C++.
*
* @output:
* ptr ::
* A variable that receives the service pointer. Will be NULL
* if not found.
*/
#define FT_FACE_FIND_SERVICE( ptrtype, ptr, face, id ) \
FT_BEGIN_STMNT \
FT_Module module = FT_MODULE( FT_FACE(face)->driver ); \
\
\
(ptr) = NULL; \
if ( module->clazz->get_interface ) \
(ptr) = (ptrtype)module->clazz->get_interface( module, id ); \
FT_END_STMNT
@ -152,18 +156,22 @@ FT_BEGIN_HEADER
* id ::
* The service ID.
*
* ptrtype ::
* The pointer type of `ptr'. This is needed to make FreeType
* compile cleanly with C++.
*
* @output:
* ptr ::
* A variable receiving the service data. NULL if not available.
*/
#define FT_FACE_LOOKUP_SERVICE( face, ptr, field, id ) \
#define FT_FACE_LOOKUP_SERVICE( face, ptrtype, ptr, field, id ) \
FT_BEGIN_STMNT \
(ptr) = FT_FACE(face)->internal->services.field ; \
(ptr) = (ptrtype)FT_FACE(face)->internal->services.field ; \
if ( (ptr) == FT_SERVICE_UNAVAILABLE ) \
(ptr) = NULL; \
else if ( (ptr) == NULL ) \
{ \
FT_FACE_FIND_SERVICE( ptr, face, id ); \
FT_FACE_FIND_SERVICE( ptrtype, ptr, face, id ); \
\
FT_FACE(face)->internal->services.field = \
(FT_Pointer)( (ptr) != NULL ? (ptr) \

View File

@ -39,7 +39,9 @@
FT_Service_BDF service;
FT_FACE_FIND_SERVICE( service, face, FT_SERVICE_ID_BDF );
FT_FACE_FIND_SERVICE( FT_Service_BDF, service,
face,
FT_SERVICE_ID_BDF );
if ( service && service->get_charset_id )
error = service->get_charset_id( face, &encoding, &registry );
@ -72,7 +74,9 @@
FT_Service_BDF service;
FT_FACE_FIND_SERVICE( service, face, FT_SERVICE_ID_BDF );
FT_FACE_FIND_SERVICE( FT_Service_BDF, service,
face,
FT_SERVICE_ID_BDF );
if ( service && service->get_property )
error = service->get_property( face, prop_name, aproperty );

View File

@ -48,7 +48,8 @@
if ( FT_HAS_MULTIPLE_MASTERS( face ) )
{
FT_FACE_LOOKUP_SERVICE( face, *aservice,
FT_FACE_LOOKUP_SERVICE( face,
FT_Service_MultiMasters, *aservice,
multi_masters,
FT_SERVICE_ID_MULTI_MASTERS );
}

View File

@ -2401,13 +2401,14 @@
#if 0
FT_FACE_LOOKUP_SERVICE( face, service,
FT_FACE_LOOKUP_SERVICE( face,
FT_Service_GlyphDict, service,
glyph_dict,
FT_SERVICE_ID_GLYPH_DICT );
#else
service = face->internal->services.glyph_dict;
service = (FT_Service_GlyphDict)face->internal->services.glyph_dict;
if ( service == FT_SERVICE_UNAVAILABLE )
service = NULL;
else if ( service == NULL )
@ -2416,11 +2417,11 @@
if ( module->clazz->get_interface )
service = module->clazz->get_interface( module,
FT_SERVICE_ID_GLYPH_DICT );
service = (FT_Service_GlyphDict)module->clazz->get_interface(
module, FT_SERVICE_ID_GLYPH_DICT );
face->internal->services.glyph_dict =
service != NULL ? service
service != NULL ? (FT_Pointer)service
: FT_SERVICE_UNAVAILABLE;
}
@ -2456,7 +2457,8 @@
FT_Service_GlyphDict service;
FT_FACE_LOOKUP_SERVICE( face, service,
FT_FACE_LOOKUP_SERVICE( face,
FT_Service_GlyphDict, service,
glyph_dict,
FT_SERVICE_ID_GLYPH_DICT );
@ -2484,7 +2486,8 @@
FT_Service_PsName service;
FT_FACE_LOOKUP_SERVICE( face, service,
FT_FACE_LOOKUP_SERVICE( face,
FT_Service_PsName, service,
postscript_name,
FT_SERVICE_ID_POSTSCRIPT_NAME );
@ -2509,7 +2512,9 @@
if ( face && FT_IS_SFNT( face ) )
{
FT_FACE_FIND_SERVICE( face, service, FT_SERVICE_ID_SFNT_TABLE );
FT_FACE_FIND_SERVICE( FT_Service_SFNT_Table, service,
face,
FT_SERVICE_ID_SFNT_TABLE );
if ( service != NULL )
table = service->get_table( face, tag );
}
@ -2533,7 +2538,9 @@
if ( !face || !FT_IS_SFNT( face ) )
return FT_Err_Invalid_Face_Handle;
FT_FACE_FIND_SERVICE( face, service, FT_SERVICE_ID_SFNT_TABLE );
FT_FACE_FIND_SERVICE( FT_Service_SFNT_Table, service,
face,
FT_SERVICE_ID_SFNT_TABLE );
if ( service == NULL )
return FT_Err_Unimplemented_Feature;

View File

@ -26,8 +26,10 @@
{
const char* result = NULL;
if ( face )
FT_FACE_FIND_SERVICE( result, face, FT_SERVICE_ID_XF86_NAME );
FT_FACE_FIND_SERVICE( const char*, result,
face, FT_SERVICE_ID_XF86_NAME );
return result;
}