* src/base/ftmac.c (p2c_str): Removed.
(file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for OS X. (is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X. Handle `nameLen' <= 6 also. (parse_fond): Remove unused variable `name_table'. Use functionality of old p2c_str directly. Add safety checks. (read_lwfn): Initialize `size_p'. Check for size_p == NULL. (new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1. (FT_New_Face_From_LWFN): Remove unused variable `memory'. Remove some dead code. (FT_New_Face_From_SFNT): Remove unused variable `stream'. (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X. (FT_New_Face_From_FOND): Remove unused variable `error'. (ResourceForkSize): New function. (FT_New_Face): Use it. Handle empty resource forks. Conditionalize some code for OS X. Add code to call normal loader as a fallback. Some more variable renames to avoid troubles on the Mac. * src/raster/ftraster.c: s/Unknown|Ascending|Descending|Flat/\1_State/. * src/smooth/ftgrays.c: s/TScan/TCoord/. Other changes for the Mac. * include/freetype/config/ftconfig.h: Define FT_MACINTOSH for Mac platforms. * src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/. * src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always an even number.
This commit is contained in:
parent
b5127306ad
commit
26d737a8a5
40
ChangeLog
40
ChangeLog
@ -1,3 +1,28 @@
|
||||
2002-04-30 Wenlin Institute (Tom Bishop) <wenlin@wenlin.com>
|
||||
|
||||
* src/base/ftmac.c (p2c_str): Removed.
|
||||
(file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for
|
||||
OS X.
|
||||
(is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X.
|
||||
Handle `nameLen' <= 6 also.
|
||||
(parse_fond): Remove unused variable `name_table'.
|
||||
Use functionality of old p2c_str directly.
|
||||
Add safety checks.
|
||||
(read_lwfn): Initialize `size_p'.
|
||||
Check for size_p == NULL.
|
||||
(new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1.
|
||||
(FT_New_Face_From_LWFN): Remove unused variable `memory'.
|
||||
Remove some dead code.
|
||||
(FT_New_Face_From_SFNT): Remove unused variable `stream'.
|
||||
(FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for
|
||||
OS X.
|
||||
(FT_New_Face_From_FOND): Remove unused variable `error'.
|
||||
(ResourceForkSize): New function.
|
||||
(FT_New_Face): Use it.
|
||||
Handle empty resource forks.
|
||||
Conditionalize some code for OS X.
|
||||
Add code to call normal loader as a fallback.
|
||||
|
||||
2002-04-30 Werner Lemberg <wl@gnu.org>
|
||||
|
||||
`interface' is reserved on the Mac.
|
||||
@ -15,6 +40,21 @@
|
||||
* src/truetype/ttdriver.c: s/interface/tt_interface/.
|
||||
* src/type1/t1driver.c: s/interface/t1_interface/.
|
||||
|
||||
Some more variable renames to avoid troubles on the Mac.
|
||||
|
||||
* src/raster/ftraster.c:
|
||||
s/Unknown|Ascending|Descending|Flat/\1_State/.
|
||||
* src/smooth/ftgrays.c: s/TScan/TCoord/.
|
||||
|
||||
Other changes for the Mac.
|
||||
|
||||
* include/freetype/config/ftconfig.h: Define FT_MACINTOSH for
|
||||
Mac platforms.
|
||||
* src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/.
|
||||
|
||||
* src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always
|
||||
an even number.
|
||||
|
||||
2002-04-29 Jouk Jansen <joukj@hrem.stm.tudelft.nl>
|
||||
|
||||
* descrip.mms (all): Add pfr driver.
|
||||
|
@ -101,6 +101,18 @@ FT_BEGIN_HEADER
|
||||
/*************************************************************************/
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* Mac support */
|
||||
/* */
|
||||
/* This is the only necessary change, so it is defined here instead */
|
||||
/* providing a new configuration file. */
|
||||
/* */
|
||||
#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
|
||||
#define FT_MACINTOSH 1
|
||||
#endif
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* IntN types */
|
||||
|
285
src/base/ftmac.c
285
src/base/ftmac.c
@ -19,36 +19,38 @@
|
||||
/*
|
||||
Notes
|
||||
|
||||
Mac suitcase files can (and often do!) contain multiple fonts. To
|
||||
Mac suitcase files can (and often do!) contain multiple fonts. To
|
||||
support this I use the face_index argument of FT_(Open|New)_Face()
|
||||
functions, and pretend the suitcase file is a collection.
|
||||
Warning: although the FOND driver sets face->num_faces field to the
|
||||
|
||||
Warning: Although the FOND driver sets face->num_faces field to the
|
||||
number of available fonts, but the Type 1 driver sets it to 1 anyway.
|
||||
So this field is currently not reliable, and I don't see a clean way
|
||||
to resolve that. The face_index argument translates to
|
||||
to resolve that. The face_index argument translates to
|
||||
|
||||
Get1IndResource( 'FOND', face_index + 1 );
|
||||
|
||||
so clients should figure out the resource index of the FOND.
|
||||
(I'll try to provide some example code for this at some point.)
|
||||
|
||||
|
||||
The Mac FOND support works roughly like this:
|
||||
|
||||
- Check whether the offered stream points to a Mac suitcase file.
|
||||
This is done by checking the file type: it has to be 'FFIL' or 'tfil'.
|
||||
The stream that gets passed to our init_face() routine is a stdio
|
||||
stream, which isn't usable for us, since the FOND resources live
|
||||
in the resource fork. So we just grab the stream->pathname field.
|
||||
in the resource fork. So we just grab the stream->pathname field.
|
||||
|
||||
- Read the FOND resource into memory, then check whether there is
|
||||
a TrueType font and/or (!) a Type 1 font available.
|
||||
a TrueType font and/or(!) a Type 1 font available.
|
||||
|
||||
- If there is a Type 1 font available (as a separate 'LWFN' file),
|
||||
read its data into memory, massage it slightly so it becomes
|
||||
PFB data, wrap it into a memory stream, load the Type 1 driver
|
||||
and delegate the rest of the work to it by calling FT_Open_Face().
|
||||
(XXX TODO: after this has been done, the kerning data from the FOND
|
||||
resource should be appended to the face: on the Mac there are usually
|
||||
no AFM files available. However, this is tricky since we need to map
|
||||
resource should be appended to the face: On the Mac there are usually
|
||||
no AFM files available. However, this is tricky since we need to map
|
||||
Mac char codes to ps glyph names to glyph ID's...)
|
||||
|
||||
- If there is a TrueType font (an 'sfnt' resource), read it into
|
||||
@ -80,26 +82,25 @@
|
||||
#define PREFER_LWFN 1
|
||||
#endif
|
||||
|
||||
|
||||
/* Quick'n'dirty Pascal string to C string converter.
|
||||
Warning: this call is not thread safe! Use with caution. */
|
||||
static char*
|
||||
p2c_str( unsigned char* pstr )
|
||||
{
|
||||
static char cstr[256];
|
||||
|
||||
|
||||
ft_strncpy( cstr, (char*)pstr + 1, pstr[0] );
|
||||
cstr[pstr[0]] = '\0';
|
||||
return cstr;
|
||||
}
|
||||
|
||||
|
||||
/* Given a pathname, fill in a file spec. */
|
||||
static int
|
||||
file_spec_from_path( const char* pathname,
|
||||
FSSpec* spec )
|
||||
{
|
||||
#if TARGET_API_MAC_CARBON
|
||||
|
||||
OSErr e;
|
||||
FSRef ref;
|
||||
|
||||
|
||||
e = FSPathMakeRef( (UInt8 *)pathname, &ref, false /* not a directory */ );
|
||||
if ( e == noErr )
|
||||
e = FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, spec, NULL );
|
||||
|
||||
return ( e == noErr ) ? 0 : (-1);
|
||||
|
||||
#else
|
||||
|
||||
Str255 p_path;
|
||||
FT_ULong path_len;
|
||||
|
||||
@ -115,6 +116,8 @@
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -132,24 +135,21 @@
|
||||
}
|
||||
|
||||
|
||||
#if TARGET_API_MAC_CARBON
|
||||
|
||||
/* is this a Mac OS X .dfont file */
|
||||
static Boolean
|
||||
is_dfont( FSSpec* spec )
|
||||
{
|
||||
int nameLen = spec->name[0];
|
||||
int nameLen = spec->name[0];
|
||||
|
||||
|
||||
if ( spec->name[nameLen - 5] == '.' &&
|
||||
spec->name[nameLen - 4] == 'd' &&
|
||||
spec->name[nameLen - 3] == 'f' &&
|
||||
spec->name[nameLen - 2] == 'o' &&
|
||||
spec->name[nameLen - 1] == 'n' &&
|
||||
spec->name[nameLen ] == 't' )
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
return nameLen >= 6 &&
|
||||
!memcmp( spec->name + nameLen - 5, ".dfont", 6 );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* Given a PostScript font name, create the Macintosh LWFN file name. */
|
||||
static void
|
||||
@ -193,12 +193,12 @@
|
||||
FCBPBRec pb;
|
||||
OSErr error;
|
||||
|
||||
|
||||
pb.ioNamePtr = file_name;
|
||||
pb.ioVRefNum = 0;
|
||||
pb.ioRefNum = ref_num;
|
||||
pb.ioFCBIndx = 0;
|
||||
|
||||
|
||||
error = PBGetFCBInfoSync( &pb );
|
||||
if ( error == noErr )
|
||||
{
|
||||
@ -280,7 +280,6 @@
|
||||
unsigned char* p = (unsigned char*)fond_data;
|
||||
StyleTable* style;
|
||||
unsigned short string_count;
|
||||
unsigned char* name_table = 0;
|
||||
char ps_name[256];
|
||||
unsigned char* names[64];
|
||||
int i;
|
||||
@ -298,16 +297,43 @@
|
||||
p += names[i][0];
|
||||
p++;
|
||||
}
|
||||
ft_strcpy( ps_name, p2c_str( names[0] ) ); /* Family name */
|
||||
|
||||
if ( style->indexes[0] > 1 )
|
||||
{
|
||||
unsigned char* suffixes = names[style->indexes[0] - 1];
|
||||
size_t ps_name_len = (size_t)names[0][0];
|
||||
|
||||
|
||||
for ( i = 1; i <= suffixes[0]; i++ )
|
||||
strcat( ps_name, p2c_str( names[suffixes[i] - 1] ) );
|
||||
if ( ps_name_len != 0 )
|
||||
{
|
||||
memcpy(ps_name, names[0] + 1, ps_name_len);
|
||||
ps_name[ps_name_len] = 0;
|
||||
}
|
||||
if ( style->indexes[0] > 1 )
|
||||
{
|
||||
unsigned char* suffixes = names[style->indexes[0] - 1];
|
||||
|
||||
|
||||
for ( i = 1; i < suffixes[0]; i++ )
|
||||
{
|
||||
unsigned char* s;
|
||||
size_t j = suffixes[i] - 1;
|
||||
|
||||
|
||||
if ( j < string_count && ( s = names[j] ) != NULL )
|
||||
{
|
||||
size_t s_len = (size_t)s[0];
|
||||
|
||||
|
||||
if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
|
||||
{
|
||||
memcpy( ps_name + ps_name_len, s + 1, s_len );
|
||||
ps_name_len += s_len;
|
||||
ps_name[ps_name_len] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
create_lwfn_name( ps_name, lwfn_file_name );
|
||||
}
|
||||
}
|
||||
@ -326,7 +352,7 @@
|
||||
{
|
||||
FT_Error error = FT_Err_Ok;
|
||||
short res_ref, res_id;
|
||||
unsigned char *buffer, *p, *size_p;
|
||||
unsigned char *buffer, *p, *size_p = NULL;
|
||||
FT_ULong total_size = 0;
|
||||
FT_ULong post_size, pfb_chunk_size;
|
||||
Handle post_data;
|
||||
@ -340,7 +366,7 @@
|
||||
|
||||
/* First pass: load all POST resources, and determine the size of
|
||||
the output buffer. */
|
||||
res_id = 501;
|
||||
res_id = 501;
|
||||
last_code = -1;
|
||||
|
||||
for (;;)
|
||||
@ -368,9 +394,9 @@
|
||||
|
||||
/* Second pass: append all POST data to the buffer, add PFB fields.
|
||||
Glue all consecutive chunks of the same type together. */
|
||||
p = buffer;
|
||||
res_id = 501;
|
||||
last_code = -1;
|
||||
p = buffer;
|
||||
res_id = 501;
|
||||
last_code = -1;
|
||||
pfb_chunk_size = 0;
|
||||
|
||||
for (;;)
|
||||
@ -387,10 +413,13 @@
|
||||
if ( last_code != -1 )
|
||||
{
|
||||
/* we're done adding a chunk, fill in the size field */
|
||||
*size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF );
|
||||
*size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF );
|
||||
*size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
|
||||
*size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
|
||||
if ( size_p != NULL )
|
||||
{
|
||||
*size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF );
|
||||
*size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF );
|
||||
*size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
|
||||
*size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
|
||||
}
|
||||
pfb_chunk_size = 0;
|
||||
}
|
||||
|
||||
@ -442,39 +471,36 @@
|
||||
|
||||
/* Create a new memory stream from a buffer and a size. */
|
||||
static FT_Error
|
||||
new_memory_stream( FT_Library library,
|
||||
FT_Byte* base,
|
||||
FT_ULong size,
|
||||
FT_Stream_Close close,
|
||||
FT_Stream* astream )
|
||||
new_memory_stream( FT_Library library,
|
||||
FT_Byte* base,
|
||||
FT_ULong size,
|
||||
FT_Stream_CloseFunc close,
|
||||
FT_Stream *astream )
|
||||
{
|
||||
FT_Error error;
|
||||
FT_Memory memory;
|
||||
FT_Stream stream;
|
||||
FT_Error error;
|
||||
FT_Memory memory;
|
||||
FT_Stream stream;
|
||||
|
||||
|
||||
if ( !library )
|
||||
return FT_Err_Invalid_Library_Handle;
|
||||
if ( !library )
|
||||
return FT_Err_Invalid_Library_Handle;
|
||||
|
||||
if ( !base )
|
||||
return FT_Err_Invalid_Argument;
|
||||
if ( !base )
|
||||
return FT_Err_Invalid_Argument;
|
||||
|
||||
*astream = 0;
|
||||
memory = library->memory;
|
||||
if ( FT_NEW( stream ) )
|
||||
goto Exit;
|
||||
*astream = 0;
|
||||
memory = library->memory;
|
||||
if ( FT_NEW( stream ) )
|
||||
goto Exit;
|
||||
|
||||
FT_Stream_OpenMemory( library,
|
||||
base,
|
||||
size,
|
||||
stream );
|
||||
FT_Stream_OpenMemory( stream, base, size );
|
||||
|
||||
stream->close = close;
|
||||
stream->close = close;
|
||||
|
||||
*astream = stream;
|
||||
*astream = stream;
|
||||
|
||||
Exit:
|
||||
return error;
|
||||
Exit:
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
@ -485,7 +511,7 @@
|
||||
FT_ULong size,
|
||||
FT_Long face_index,
|
||||
char* driver_name,
|
||||
FT_Face* aface )
|
||||
FT_Face *aface )
|
||||
{
|
||||
FT_Open_Args args;
|
||||
FT_Error error;
|
||||
@ -517,9 +543,10 @@
|
||||
(*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
|
||||
else
|
||||
{
|
||||
FT_Stream_Close( stream );
|
||||
FT_Stream_CloseFunc( stream );
|
||||
FT_FREE( stream );
|
||||
}
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
@ -529,35 +556,17 @@
|
||||
FT_New_Face_From_LWFN( FT_Library library,
|
||||
FSSpec* spec,
|
||||
FT_Long face_index,
|
||||
FT_Face* aface )
|
||||
FT_Face *aface )
|
||||
{
|
||||
FT_Byte* pfb_data;
|
||||
FT_ULong pfb_size;
|
||||
FT_Error error;
|
||||
FT_Memory memory = library->memory;
|
||||
FT_Byte* pfb_data;
|
||||
FT_ULong pfb_size;
|
||||
FT_Error error;
|
||||
|
||||
|
||||
error = read_lwfn( library->memory, spec, &pfb_data, &pfb_size );
|
||||
if ( error )
|
||||
return error;
|
||||
|
||||
#if 0
|
||||
{
|
||||
FILE* f;
|
||||
char* path;
|
||||
|
||||
|
||||
path = p2c_str( spec->name );
|
||||
strcat( path, ".PFB" );
|
||||
f = fopen( path, "wb" );
|
||||
if ( f )
|
||||
{
|
||||
fwrite( pfb_data, 1, pfb_size, f );
|
||||
fclose( f );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return open_face_from_buffer( library,
|
||||
pfb_data,
|
||||
pfb_size,
|
||||
@ -572,12 +581,11 @@
|
||||
FT_New_Face_From_SFNT( FT_Library library,
|
||||
short sfnt_id,
|
||||
FT_Long face_index,
|
||||
FT_Face* aface )
|
||||
FT_Face *aface )
|
||||
{
|
||||
Handle sfnt = NULL;
|
||||
FT_Byte* sfnt_data;
|
||||
size_t sfnt_size;
|
||||
FT_Stream stream = NULL;
|
||||
FT_Error error = 0;
|
||||
FT_Memory memory = library->memory;
|
||||
|
||||
@ -612,7 +620,7 @@
|
||||
FT_New_Face_From_Suitcase( FT_Library library,
|
||||
FSSpec* spec,
|
||||
FT_Long face_index,
|
||||
FT_Face* aface )
|
||||
FT_Face *aface )
|
||||
{
|
||||
FT_Error error = FT_Err_Ok;
|
||||
short res_ref, res_index;
|
||||
@ -648,6 +656,8 @@
|
||||
}
|
||||
|
||||
|
||||
#if TARGET_API_MAC_CARBON
|
||||
|
||||
/* Create a new FT_Face from a file spec to a suitcase file. */
|
||||
static FT_Error
|
||||
FT_New_Face_From_dfont( FT_Library library,
|
||||
@ -694,8 +704,10 @@
|
||||
return error;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* documentation in ftmac.h */
|
||||
|
||||
/* documentation is in ftmac.h */
|
||||
|
||||
FT_EXPORT_DEF( FT_Error )
|
||||
FT_New_Face_From_FOND( FT_Library library,
|
||||
@ -703,13 +715,12 @@
|
||||
FT_Long face_index,
|
||||
FT_Face *aface )
|
||||
{
|
||||
short sfnt_id, have_sfnt, have_lwfn = 0;
|
||||
Str255 lwfn_file_name;
|
||||
short fond_id;
|
||||
OSType fond_type;
|
||||
Str255 fond_name;
|
||||
FSSpec lwfn_spec;
|
||||
FT_Error error = FT_Err_Unknown_File_Format;
|
||||
short sfnt_id, have_sfnt, have_lwfn = 0;
|
||||
Str255 lwfn_file_name;
|
||||
short fond_id;
|
||||
OSType fond_type;
|
||||
Str255 fond_name;
|
||||
FSSpec lwfn_spec;
|
||||
|
||||
|
||||
GetResInfo( fond, &fond_id, &fond_type, fond_name );
|
||||
@ -743,7 +754,7 @@
|
||||
}
|
||||
|
||||
|
||||
/* documentation in ftmac.h */
|
||||
/* documentation is in ftmac.h */
|
||||
|
||||
FT_EXPORT_DEF( FT_Error )
|
||||
FT_GetFile_From_Mac_Name( char* fontName,
|
||||
@ -792,7 +803,7 @@
|
||||
&style, &size );
|
||||
if ( stat2 == 0 && size == 0 )
|
||||
{
|
||||
char fullName[256];
|
||||
char fullName[256];
|
||||
|
||||
|
||||
/* build up a complete face name */
|
||||
@ -829,6 +840,25 @@
|
||||
}
|
||||
|
||||
|
||||
static long
|
||||
ResourceForkSize(FSSpec* spec)
|
||||
{
|
||||
long len;
|
||||
short refNum;
|
||||
OSErr e;
|
||||
|
||||
|
||||
e = FSpOpenRF( spec, fsRdPerm, &refNum ); /* I.M. Files 2-155 */
|
||||
if ( e == noErr )
|
||||
{
|
||||
e = GetEOF( refNum, &len );
|
||||
FSClose( refNum );
|
||||
}
|
||||
|
||||
return ( e == noErr ) ? len : 0;
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************/
|
||||
/* */
|
||||
/* <Function> */
|
||||
@ -858,20 +888,31 @@
|
||||
if ( file_spec_from_path( pathname, &spec ) )
|
||||
return FT_Err_Invalid_Argument;
|
||||
|
||||
file_type = get_file_type( &spec );
|
||||
if ( file_type == 'FFIL' || file_type == 'tfil' )
|
||||
return FT_New_Face_From_Suitcase( library, &spec, face_index, aface );
|
||||
else if ( file_type == 'LWFN' )
|
||||
return FT_New_Face_From_LWFN( library, &spec, face_index, aface );
|
||||
else if ( is_dfont( &spec ) )
|
||||
return FT_New_Face_From_dfont( library, &spec, face_index, aface );
|
||||
else /* let it fall through to normal loader (.ttf, .otf, etc.) */
|
||||
{
|
||||
args.flags = ft_open_pathname;
|
||||
args.pathname = (char*)pathname;
|
||||
/* Regardless of type, don't try to use the resource fork if it is */
|
||||
/* empty. Some TTF fonts have type `FFIL', for example, but they */
|
||||
/* only have data forks. */
|
||||
|
||||
return FT_Open_Face( library, &args, face_index, aface );
|
||||
if ( ResourceForkSize( &spec ) != 0 )
|
||||
{
|
||||
file_type = get_file_type( &spec );
|
||||
if ( file_type == 'FFIL' || file_type == 'tfil' )
|
||||
return FT_New_Face_From_Suitcase( library, &spec, face_index, aface );
|
||||
|
||||
if ( file_type == 'LWFN' )
|
||||
return FT_New_Face_From_LWFN( library, &spec, face_index, aface );
|
||||
}
|
||||
|
||||
#if TARGET_API_MAC_CARBON
|
||||
|
||||
if ( is_dfont( &spec ) )
|
||||
return FT_New_Face_From_dfont( library, &spec, face_index, aface );
|
||||
|
||||
#endif
|
||||
|
||||
/* let it fall through to normal loader (.ttf, .otf, etc.) */
|
||||
args.flags = ft_open_pathname;
|
||||
args.pathname = (char*)pathname;
|
||||
return FT_Open_Face( library, &args, face_index, aface );
|
||||
}
|
||||
|
||||
|
||||
|
@ -738,7 +738,7 @@
|
||||
/* there's a Mac-specific extended implementation of FT_New_Face() */
|
||||
/* in src/mac/ftmac.c */
|
||||
|
||||
#ifndef macintosh
|
||||
#ifndef FT_MACINTOSH
|
||||
|
||||
/* documentation is in freetype.h */
|
||||
|
||||
@ -761,7 +761,7 @@
|
||||
return FT_Open_Face( library, &args, face_index, aface );
|
||||
}
|
||||
|
||||
#endif /* !macintosh */
|
||||
#endif /* !FT_MACINTOSH */
|
||||
|
||||
|
||||
/* documentation is in freetype.h */
|
||||
|
@ -271,10 +271,10 @@
|
||||
/* States of each line, arc, and profile */
|
||||
typedef enum TStates_
|
||||
{
|
||||
Unknown,
|
||||
Ascending,
|
||||
Descending,
|
||||
Flat
|
||||
Unknown_State,
|
||||
Ascending_State,
|
||||
Descending_State,
|
||||
Flat_State
|
||||
|
||||
} TStates;
|
||||
|
||||
@ -579,12 +579,12 @@
|
||||
|
||||
switch ( aState )
|
||||
{
|
||||
case Ascending:
|
||||
case Ascending_State:
|
||||
ras.cProfile->flow = Flow_Up;
|
||||
FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile ));
|
||||
break;
|
||||
|
||||
case Descending:
|
||||
case Descending_State:
|
||||
ras.cProfile->flow = Flow_Down;
|
||||
FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile ));
|
||||
break;
|
||||
@ -1265,34 +1265,34 @@
|
||||
|
||||
switch ( ras.state )
|
||||
{
|
||||
case Unknown:
|
||||
case Unknown_State:
|
||||
if ( y > ras.lastY )
|
||||
{
|
||||
if ( New_Profile( RAS_VARS Ascending ) )
|
||||
if ( New_Profile( RAS_VARS Ascending_State ) )
|
||||
return FAILURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( y < ras.lastY )
|
||||
if ( New_Profile( RAS_VARS Descending ) )
|
||||
if ( New_Profile( RAS_VARS Descending_State ) )
|
||||
return FAILURE;
|
||||
}
|
||||
break;
|
||||
|
||||
case Ascending:
|
||||
case Ascending_State:
|
||||
if ( y < ras.lastY )
|
||||
{
|
||||
if ( End_Profile( RAS_VAR ) ||
|
||||
New_Profile( RAS_VARS Descending ) )
|
||||
if ( End_Profile( RAS_VAR ) ||
|
||||
New_Profile( RAS_VARS Descending_State ) )
|
||||
return FAILURE;
|
||||
}
|
||||
break;
|
||||
|
||||
case Descending:
|
||||
case Descending_State:
|
||||
if ( y > ras.lastY )
|
||||
{
|
||||
if ( End_Profile( RAS_VAR ) ||
|
||||
New_Profile( RAS_VARS Ascending ) )
|
||||
if ( End_Profile( RAS_VAR ) ||
|
||||
New_Profile( RAS_VARS Ascending_State ) )
|
||||
return FAILURE;
|
||||
}
|
||||
break;
|
||||
@ -1305,13 +1305,13 @@
|
||||
|
||||
switch ( ras.state )
|
||||
{
|
||||
case Ascending:
|
||||
case Ascending_State:
|
||||
if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
|
||||
x, y, ras.minY, ras.maxY ) )
|
||||
return FAILURE;
|
||||
break;
|
||||
|
||||
case Descending:
|
||||
case Descending_State:
|
||||
if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
|
||||
x, y, ras.minY, ras.maxY ) )
|
||||
return FAILURE;
|
||||
@ -1402,11 +1402,11 @@
|
||||
{
|
||||
/* the arc is y-monotonous, either ascending or descending */
|
||||
/* detect a change of direction */
|
||||
state_bez = y1 < y3 ? Ascending : Descending;
|
||||
state_bez = y1 < y3 ? Ascending_State : Descending_State;
|
||||
if ( ras.state != state_bez )
|
||||
{
|
||||
/* finalize current profile if any */
|
||||
if ( ras.state != Unknown &&
|
||||
if ( ras.state != Unknown_State &&
|
||||
End_Profile( RAS_VAR ) )
|
||||
goto Fail;
|
||||
|
||||
@ -1416,7 +1416,7 @@
|
||||
}
|
||||
|
||||
/* now call the appropriate routine */
|
||||
if ( state_bez == Ascending )
|
||||
if ( state_bez == Ascending_State )
|
||||
{
|
||||
if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
|
||||
goto Fail;
|
||||
@ -1529,12 +1529,12 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
state_bez = ( y1 <= y4 ) ? Ascending : Descending;
|
||||
state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
|
||||
|
||||
/* detect a change of direction */
|
||||
if ( ras.state != state_bez )
|
||||
{
|
||||
if ( ras.state != Unknown &&
|
||||
if ( ras.state != Unknown_State &&
|
||||
End_Profile( RAS_VAR ) )
|
||||
goto Fail;
|
||||
|
||||
@ -1543,7 +1543,7 @@
|
||||
}
|
||||
|
||||
/* compute intersections */
|
||||
if ( state_bez == Ascending )
|
||||
if ( state_bez == Ascending_State )
|
||||
{
|
||||
if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
|
||||
goto Fail;
|
||||
@ -1838,7 +1838,7 @@
|
||||
|
||||
for ( i = 0; i < ras.outline.n_contours; i++ )
|
||||
{
|
||||
ras.state = Unknown;
|
||||
ras.state = Unknown_State;
|
||||
ras.gProfile = NULL;
|
||||
|
||||
if ( Decompose_Curve( RAS_VARS (unsigned short)start,
|
||||
|
@ -167,7 +167,7 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
pitch = ( width + 7 ) >> 3;
|
||||
pitch = ( ( width + 15 ) >> 4 ) << 1;
|
||||
bitmap->pixel_mode = ft_pixel_mode_mono;
|
||||
}
|
||||
|
||||
|
@ -217,8 +217,8 @@
|
||||
/* need to define them to "float" or "double" when experimenting with */
|
||||
/* new algorithms */
|
||||
|
||||
typedef int TScan; /* integer scanline/pixel coordinate */
|
||||
typedef long TPos; /* sub-pixel coordinate */
|
||||
typedef int TCoord; /* integer scanline/pixel coordinate */
|
||||
typedef long TPos; /* sub-pixel coordinate */
|
||||
|
||||
/* determine the type used to store cell areas. This normally takes at */
|
||||
/* least PIXEL_BYTES*2 + 1. On 16-bit systems, we need to use `long' */
|
||||
@ -259,10 +259,10 @@
|
||||
|
||||
typedef struct TCell_
|
||||
{
|
||||
TScan x;
|
||||
TScan y;
|
||||
int cover;
|
||||
TArea area;
|
||||
TCoord x;
|
||||
TCoord y;
|
||||
int cover;
|
||||
TArea area;
|
||||
|
||||
} TCell, *PCell;
|
||||
|
||||
@ -271,22 +271,22 @@
|
||||
|
||||
typedef struct TRaster_
|
||||
{
|
||||
PCell cells;
|
||||
int max_cells;
|
||||
int num_cells;
|
||||
PCell cells;
|
||||
int max_cells;
|
||||
int num_cells;
|
||||
|
||||
TScan min_ex, max_ex;
|
||||
TScan min_ey, max_ey;
|
||||
TCoord min_ex, max_ex;
|
||||
TCoord min_ey, max_ey;
|
||||
|
||||
TArea area;
|
||||
int cover;
|
||||
int invalid;
|
||||
TArea area;
|
||||
int cover;
|
||||
int invalid;
|
||||
|
||||
TScan ex, ey;
|
||||
TScan cx, cy;
|
||||
TPos x, y;
|
||||
TCoord ex, ey;
|
||||
TCoord cx, cy;
|
||||
TPos x, y;
|
||||
|
||||
TScan last_ey;
|
||||
TCoord last_ey;
|
||||
|
||||
FT_Vector bez_stack[32 * 3 + 1];
|
||||
int lev_stack[32];
|
||||
@ -407,8 +407,8 @@
|
||||
/* Set the current cell to a new position. */
|
||||
/* */
|
||||
static void
|
||||
gray_set_cell( RAS_ARG_ TScan ex,
|
||||
TScan ey )
|
||||
gray_set_cell( RAS_ARG_ TCoord ex,
|
||||
TCoord ey )
|
||||
{
|
||||
int invalid, record, clean;
|
||||
|
||||
@ -464,8 +464,8 @@
|
||||
/* Start a new contour at a given cell. */
|
||||
/* */
|
||||
static void
|
||||
gray_start_cell( RAS_ARG_ TScan ex,
|
||||
TScan ey )
|
||||
gray_start_cell( RAS_ARG_ TCoord ex,
|
||||
TCoord ey )
|
||||
{
|
||||
if ( ex < ras.min_ex )
|
||||
ex = ras.min_ex - 1;
|
||||
@ -486,15 +486,15 @@
|
||||
/* Render a scanline as one or more cells. */
|
||||
/* */
|
||||
static void
|
||||
gray_render_scanline( RAS_ARG_ TScan ey,
|
||||
TPos x1,
|
||||
TScan y1,
|
||||
TPos x2,
|
||||
TScan y2 )
|
||||
gray_render_scanline( RAS_ARG_ TCoord ey,
|
||||
TPos x1,
|
||||
TCoord y1,
|
||||
TPos x2,
|
||||
TCoord y2 )
|
||||
{
|
||||
TScan ex1, ex2, fx1, fx2, delta;
|
||||
long p, first, dx;
|
||||
int incr, lift, mod, rem;
|
||||
TCoord ex1, ex2, fx1, fx2, delta;
|
||||
long p, first, dx;
|
||||
int incr, lift, mod, rem;
|
||||
|
||||
|
||||
dx = x2 - x1;
|
||||
@ -596,9 +596,9 @@
|
||||
gray_render_line( RAS_ARG_ TPos to_x,
|
||||
TPos to_y )
|
||||
{
|
||||
TScan ey1, ey2, fy1, fy2;
|
||||
TPos dx, dy, x, x2;
|
||||
int p, rem, mod, lift, delta, first, incr;
|
||||
TCoord ey1, ey2, fy1, fy2;
|
||||
TPos dx, dy, x, x2;
|
||||
int p, rem, mod, lift, delta, first, incr;
|
||||
|
||||
|
||||
ey1 = TRUNC( ras.last_ey );
|
||||
@ -614,7 +614,7 @@
|
||||
|
||||
/* perform vertical clipping */
|
||||
{
|
||||
TScan min, max;
|
||||
TCoord min, max;
|
||||
|
||||
|
||||
min = ey1;
|
||||
@ -640,9 +640,9 @@
|
||||
|
||||
if ( dx == 0 )
|
||||
{
|
||||
TScan ex = TRUNC( ras.x );
|
||||
TScan two_fx = ( ras.x - SUBPIXELS( ex ) ) << 1;
|
||||
TPos area;
|
||||
TCoord ex = TRUNC( ras.x );
|
||||
TCoord two_fx = ( ras.x - SUBPIXELS( ex ) ) << 1;
|
||||
TPos area;
|
||||
|
||||
|
||||
first = ONE_PIXEL;
|
||||
@ -1332,10 +1332,10 @@
|
||||
|
||||
|
||||
static void
|
||||
gray_hline( RAS_ARG_ TScan x,
|
||||
TScan y,
|
||||
TPos area,
|
||||
int acount )
|
||||
gray_hline( RAS_ARG_ TCoord x,
|
||||
TCoord y,
|
||||
TPos area,
|
||||
int acount )
|
||||
{
|
||||
FT_Span* span;
|
||||
int count;
|
||||
@ -1431,12 +1431,13 @@
|
||||
static void
|
||||
gray_sweep( RAS_ARG_ FT_Bitmap* target )
|
||||
{
|
||||
TScan x, y, cover;
|
||||
TArea area;
|
||||
PCell start, cur, limit;
|
||||
TCoord x, y, cover;
|
||||
TArea area;
|
||||
PCell start, cur, limit;
|
||||
|
||||
FT_UNUSED( target );
|
||||
|
||||
|
||||
if ( ras.num_cells == 0 )
|
||||
return;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user