* 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:
Werner Lemberg 2002-04-30 14:26:49 +00:00
parent 5f0ee94c06
commit 9ca7a15727
7 changed files with 287 additions and 193 deletions

View File

@ -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> 2002-04-30 Werner Lemberg <wl@gnu.org>
`interface' is reserved on the Mac. `interface' is reserved on the Mac.
@ -15,6 +40,21 @@
* src/truetype/ttdriver.c: s/interface/tt_interface/. * src/truetype/ttdriver.c: s/interface/tt_interface/.
* src/type1/t1driver.c: s/interface/t1_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> 2002-04-29 Jouk Jansen <joukj@hrem.stm.tudelft.nl>
* descrip.mms (all): Add pfr driver. * descrip.mms (all): Add pfr driver.

View File

@ -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 */ /* IntN types */

View File

@ -19,36 +19,38 @@
/* /*
Notes 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() support this I use the face_index argument of FT_(Open|New)_Face()
functions, and pretend the suitcase file is a collection. 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. 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 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 ); Get1IndResource( 'FOND', face_index + 1 );
so clients should figure out the resource index of the FOND. so clients should figure out the resource index of the FOND.
(I'll try to provide some example code for this at some point.) (I'll try to provide some example code for this at some point.)
The Mac FOND support works roughly like this: The Mac FOND support works roughly like this:
- Check whether the offered stream points to a Mac suitcase file. - 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'. 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 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 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 - 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), - If there is a Type 1 font available (as a separate 'LWFN' file),
read its data into memory, massage it slightly so it becomes read its data into memory, massage it slightly so it becomes
PFB data, wrap it into a memory stream, load the Type 1 driver 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(). 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 (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 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 no AFM files available. However, this is tricky since we need to map
Mac char codes to ps glyph names to glyph ID's...) Mac char codes to ps glyph names to glyph ID's...)
- If there is a TrueType font (an 'sfnt' resource), read it into - If there is a TrueType font (an 'sfnt' resource), read it into
@ -80,26 +82,25 @@
#define PREFER_LWFN 1 #define PREFER_LWFN 1
#endif #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. */ /* Given a pathname, fill in a file spec. */
static int static int
file_spec_from_path( const char* pathname, file_spec_from_path( const char* pathname,
FSSpec* spec ) 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; Str255 p_path;
FT_ULong path_len; FT_ULong path_len;
@ -115,6 +116,8 @@
return -1; return -1;
else else
return 0; return 0;
#endif
} }
@ -132,24 +135,21 @@
} }
#if TARGET_API_MAC_CARBON
/* is this a Mac OS X .dfont file */ /* is this a Mac OS X .dfont file */
static Boolean static Boolean
is_dfont( FSSpec* spec ) is_dfont( FSSpec* spec )
{ {
int nameLen = spec->name[0]; int nameLen = spec->name[0];
if ( spec->name[nameLen - 5] == '.' && return nameLen >= 6 &&
spec->name[nameLen - 4] == 'd' && !memcmp( spec->name + nameLen - 5, ".dfont", 6 );
spec->name[nameLen - 3] == 'f' &&
spec->name[nameLen - 2] == 'o' &&
spec->name[nameLen - 1] == 'n' &&
spec->name[nameLen ] == 't' )
return true;
else
return false;
} }
#endif
/* Given a PostScript font name, create the Macintosh LWFN file name. */ /* Given a PostScript font name, create the Macintosh LWFN file name. */
static void static void
@ -193,12 +193,12 @@
FCBPBRec pb; FCBPBRec pb;
OSErr error; OSErr error;
pb.ioNamePtr = file_name; pb.ioNamePtr = file_name;
pb.ioVRefNum = 0; pb.ioVRefNum = 0;
pb.ioRefNum = ref_num; pb.ioRefNum = ref_num;
pb.ioFCBIndx = 0; pb.ioFCBIndx = 0;
error = PBGetFCBInfoSync( &pb ); error = PBGetFCBInfoSync( &pb );
if ( error == noErr ) if ( error == noErr )
{ {
@ -280,7 +280,6 @@
unsigned char* p = (unsigned char*)fond_data; unsigned char* p = (unsigned char*)fond_data;
StyleTable* style; StyleTable* style;
unsigned short string_count; unsigned short string_count;
unsigned char* name_table = 0;
char ps_name[256]; char ps_name[256];
unsigned char* names[64]; unsigned char* names[64];
int i; int i;
@ -298,16 +297,43 @@
p += names[i][0]; p += names[i][0];
p++; 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++ ) if ( ps_name_len != 0 )
strcat( ps_name, p2c_str( names[suffixes[i] - 1] ) ); {
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 ); create_lwfn_name( ps_name, lwfn_file_name );
} }
} }
@ -326,7 +352,7 @@
{ {
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
short res_ref, res_id; 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 total_size = 0;
FT_ULong post_size, pfb_chunk_size; FT_ULong post_size, pfb_chunk_size;
Handle post_data; Handle post_data;
@ -340,7 +366,7 @@
/* First pass: load all POST resources, and determine the size of /* First pass: load all POST resources, and determine the size of
the output buffer. */ the output buffer. */
res_id = 501; res_id = 501;
last_code = -1; last_code = -1;
for (;;) for (;;)
@ -368,9 +394,9 @@
/* Second pass: append all POST data to the buffer, add PFB fields. /* Second pass: append all POST data to the buffer, add PFB fields.
Glue all consecutive chunks of the same type together. */ Glue all consecutive chunks of the same type together. */
p = buffer; p = buffer;
res_id = 501; res_id = 501;
last_code = -1; last_code = -1;
pfb_chunk_size = 0; pfb_chunk_size = 0;
for (;;) for (;;)
@ -387,10 +413,13 @@
if ( last_code != -1 ) if ( last_code != -1 )
{ {
/* we're done adding a chunk, fill in the size field */ /* we're done adding a chunk, fill in the size field */
*size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); if ( size_p != NULL )
*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 & 0xFF );
*size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 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; pfb_chunk_size = 0;
} }
@ -442,39 +471,36 @@
/* Create a new memory stream from a buffer and a size. */ /* Create a new memory stream from a buffer and a size. */
static FT_Error static FT_Error
new_memory_stream( FT_Library library, new_memory_stream( FT_Library library,
FT_Byte* base, FT_Byte* base,
FT_ULong size, FT_ULong size,
FT_Stream_Close close, FT_Stream_CloseFunc close,
FT_Stream* astream ) FT_Stream *astream )
{ {
FT_Error error; FT_Error error;
FT_Memory memory; FT_Memory memory;
FT_Stream stream; FT_Stream stream;
if ( !library ) if ( !library )
return FT_Err_Invalid_Library_Handle; return FT_Err_Invalid_Library_Handle;
if ( !base ) if ( !base )
return FT_Err_Invalid_Argument; return FT_Err_Invalid_Argument;
*astream = 0; *astream = 0;
memory = library->memory; memory = library->memory;
if ( FT_NEW( stream ) ) if ( FT_NEW( stream ) )
goto Exit; goto Exit;
FT_Stream_OpenMemory( library, FT_Stream_OpenMemory( stream, base, size );
base,
size,
stream );
stream->close = close; stream->close = close;
*astream = stream; *astream = stream;
Exit: Exit:
return error; return error;
} }
@ -485,7 +511,7 @@
FT_ULong size, FT_ULong size,
FT_Long face_index, FT_Long face_index,
char* driver_name, char* driver_name,
FT_Face* aface ) FT_Face *aface )
{ {
FT_Open_Args args; FT_Open_Args args;
FT_Error error; FT_Error error;
@ -517,9 +543,10 @@
(*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
else else
{ {
FT_Stream_Close( stream ); FT_Stream_CloseFunc( stream );
FT_FREE( stream ); FT_FREE( stream );
} }
return error; return error;
} }
@ -529,35 +556,17 @@
FT_New_Face_From_LWFN( FT_Library library, FT_New_Face_From_LWFN( FT_Library library,
FSSpec* spec, FSSpec* spec,
FT_Long face_index, FT_Long face_index,
FT_Face* aface ) FT_Face *aface )
{ {
FT_Byte* pfb_data; FT_Byte* pfb_data;
FT_ULong pfb_size; FT_ULong pfb_size;
FT_Error error; FT_Error error;
FT_Memory memory = library->memory;
error = read_lwfn( library->memory, spec, &pfb_data, &pfb_size ); error = read_lwfn( library->memory, spec, &pfb_data, &pfb_size );
if ( error ) if ( error )
return 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, return open_face_from_buffer( library,
pfb_data, pfb_data,
pfb_size, pfb_size,
@ -572,12 +581,11 @@
FT_New_Face_From_SFNT( FT_Library library, FT_New_Face_From_SFNT( FT_Library library,
short sfnt_id, short sfnt_id,
FT_Long face_index, FT_Long face_index,
FT_Face* aface ) FT_Face *aface )
{ {
Handle sfnt = NULL; Handle sfnt = NULL;
FT_Byte* sfnt_data; FT_Byte* sfnt_data;
size_t sfnt_size; size_t sfnt_size;
FT_Stream stream = NULL;
FT_Error error = 0; FT_Error error = 0;
FT_Memory memory = library->memory; FT_Memory memory = library->memory;
@ -612,7 +620,7 @@
FT_New_Face_From_Suitcase( FT_Library library, FT_New_Face_From_Suitcase( FT_Library library,
FSSpec* spec, FSSpec* spec,
FT_Long face_index, FT_Long face_index,
FT_Face* aface ) FT_Face *aface )
{ {
FT_Error error = FT_Err_Ok; FT_Error error = FT_Err_Ok;
short res_ref, res_index; 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. */ /* Create a new FT_Face from a file spec to a suitcase file. */
static FT_Error static FT_Error
FT_New_Face_From_dfont( FT_Library library, FT_New_Face_From_dfont( FT_Library library,
@ -694,8 +704,10 @@
return error; return error;
} }
#endif
/* documentation in ftmac.h */
/* documentation is in ftmac.h */
FT_EXPORT_DEF( FT_Error ) FT_EXPORT_DEF( FT_Error )
FT_New_Face_From_FOND( FT_Library library, FT_New_Face_From_FOND( FT_Library library,
@ -703,13 +715,12 @@
FT_Long face_index, FT_Long face_index,
FT_Face *aface ) FT_Face *aface )
{ {
short sfnt_id, have_sfnt, have_lwfn = 0; short sfnt_id, have_sfnt, have_lwfn = 0;
Str255 lwfn_file_name; Str255 lwfn_file_name;
short fond_id; short fond_id;
OSType fond_type; OSType fond_type;
Str255 fond_name; Str255 fond_name;
FSSpec lwfn_spec; FSSpec lwfn_spec;
FT_Error error = FT_Err_Unknown_File_Format;
GetResInfo( fond, &fond_id, &fond_type, fond_name ); 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_EXPORT_DEF( FT_Error )
FT_GetFile_From_Mac_Name( char* fontName, FT_GetFile_From_Mac_Name( char* fontName,
@ -792,7 +803,7 @@
&style, &size ); &style, &size );
if ( stat2 == 0 && size == 0 ) if ( stat2 == 0 && size == 0 )
{ {
char fullName[256]; char fullName[256];
/* build up a complete face name */ /* 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> */ /* <Function> */
@ -858,20 +888,31 @@
if ( file_spec_from_path( pathname, &spec ) ) if ( file_spec_from_path( pathname, &spec ) )
return FT_Err_Invalid_Argument; return FT_Err_Invalid_Argument;
file_type = get_file_type( &spec ); /* Regardless of type, don't try to use the resource fork if it is */
if ( file_type == 'FFIL' || file_type == 'tfil' ) /* empty. Some TTF fonts have type `FFIL', for example, but they */
return FT_New_Face_From_Suitcase( library, &spec, face_index, aface ); /* only have data forks. */
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;
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 );
} }

View File

@ -738,7 +738,7 @@
/* there's a Mac-specific extended implementation of FT_New_Face() */ /* there's a Mac-specific extended implementation of FT_New_Face() */
/* in src/mac/ftmac.c */ /* in src/mac/ftmac.c */
#ifndef macintosh #ifndef FT_MACINTOSH
/* documentation is in freetype.h */ /* documentation is in freetype.h */
@ -761,7 +761,7 @@
return FT_Open_Face( library, &args, face_index, aface ); return FT_Open_Face( library, &args, face_index, aface );
} }
#endif /* !macintosh */ #endif /* !FT_MACINTOSH */
/* documentation is in freetype.h */ /* documentation is in freetype.h */

View File

@ -271,10 +271,10 @@
/* States of each line, arc, and profile */ /* States of each line, arc, and profile */
typedef enum TStates_ typedef enum TStates_
{ {
Unknown, Unknown_State,
Ascending, Ascending_State,
Descending, Descending_State,
Flat Flat_State
} TStates; } TStates;
@ -579,12 +579,12 @@
switch ( aState ) switch ( aState )
{ {
case Ascending: case Ascending_State:
ras.cProfile->flow = Flow_Up; ras.cProfile->flow = Flow_Up;
FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile )); FT_TRACE6(( "New ascending profile = %lx\n", (long)ras.cProfile ));
break; break;
case Descending: case Descending_State:
ras.cProfile->flow = Flow_Down; ras.cProfile->flow = Flow_Down;
FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile )); FT_TRACE6(( "New descending profile = %lx\n", (long)ras.cProfile ));
break; break;
@ -1265,34 +1265,34 @@
switch ( ras.state ) switch ( ras.state )
{ {
case Unknown: case Unknown_State:
if ( y > ras.lastY ) if ( y > ras.lastY )
{ {
if ( New_Profile( RAS_VARS Ascending ) ) if ( New_Profile( RAS_VARS Ascending_State ) )
return FAILURE; return FAILURE;
} }
else else
{ {
if ( y < ras.lastY ) if ( y < ras.lastY )
if ( New_Profile( RAS_VARS Descending ) ) if ( New_Profile( RAS_VARS Descending_State ) )
return FAILURE; return FAILURE;
} }
break; break;
case Ascending: case Ascending_State:
if ( y < ras.lastY ) if ( y < ras.lastY )
{ {
if ( End_Profile( RAS_VAR ) || if ( End_Profile( RAS_VAR ) ||
New_Profile( RAS_VARS Descending ) ) New_Profile( RAS_VARS Descending_State ) )
return FAILURE; return FAILURE;
} }
break; break;
case Descending: case Descending_State:
if ( y > ras.lastY ) if ( y > ras.lastY )
{ {
if ( End_Profile( RAS_VAR ) || if ( End_Profile( RAS_VAR ) ||
New_Profile( RAS_VARS Ascending ) ) New_Profile( RAS_VARS Ascending_State ) )
return FAILURE; return FAILURE;
} }
break; break;
@ -1305,13 +1305,13 @@
switch ( ras.state ) switch ( ras.state )
{ {
case Ascending: case Ascending_State:
if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
x, y, ras.minY, ras.maxY ) ) x, y, ras.minY, ras.maxY ) )
return FAILURE; return FAILURE;
break; break;
case Descending: case Descending_State:
if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
x, y, ras.minY, ras.maxY ) ) x, y, ras.minY, ras.maxY ) )
return FAILURE; return FAILURE;
@ -1402,11 +1402,11 @@
{ {
/* the arc is y-monotonous, either ascending or descending */ /* the arc is y-monotonous, either ascending or descending */
/* detect a change of direction */ /* detect a change of direction */
state_bez = y1 < y3 ? Ascending : Descending; state_bez = y1 < y3 ? Ascending_State : Descending_State;
if ( ras.state != state_bez ) if ( ras.state != state_bez )
{ {
/* finalize current profile if any */ /* finalize current profile if any */
if ( ras.state != Unknown && if ( ras.state != Unknown_State &&
End_Profile( RAS_VAR ) ) End_Profile( RAS_VAR ) )
goto Fail; goto Fail;
@ -1416,7 +1416,7 @@
} }
/* now call the appropriate routine */ /* 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 ) ) if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
goto Fail; goto Fail;
@ -1529,12 +1529,12 @@
} }
else else
{ {
state_bez = ( y1 <= y4 ) ? Ascending : Descending; state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
/* detect a change of direction */ /* detect a change of direction */
if ( ras.state != state_bez ) if ( ras.state != state_bez )
{ {
if ( ras.state != Unknown && if ( ras.state != Unknown_State &&
End_Profile( RAS_VAR ) ) End_Profile( RAS_VAR ) )
goto Fail; goto Fail;
@ -1543,7 +1543,7 @@
} }
/* compute intersections */ /* compute intersections */
if ( state_bez == Ascending ) if ( state_bez == Ascending_State )
{ {
if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
goto Fail; goto Fail;
@ -1838,7 +1838,7 @@
for ( i = 0; i < ras.outline.n_contours; i++ ) for ( i = 0; i < ras.outline.n_contours; i++ )
{ {
ras.state = Unknown; ras.state = Unknown_State;
ras.gProfile = NULL; ras.gProfile = NULL;
if ( Decompose_Curve( RAS_VARS (unsigned short)start, if ( Decompose_Curve( RAS_VARS (unsigned short)start,

View File

@ -167,7 +167,7 @@
} }
else else
{ {
pitch = ( width + 7 ) >> 3; pitch = ( ( width + 15 ) >> 4 ) << 1;
bitmap->pixel_mode = ft_pixel_mode_mono; bitmap->pixel_mode = ft_pixel_mode_mono;
} }

View File

@ -217,8 +217,8 @@
/* need to define them to "float" or "double" when experimenting with */ /* need to define them to "float" or "double" when experimenting with */
/* new algorithms */ /* new algorithms */
typedef int TScan; /* integer scanline/pixel coordinate */ typedef int TCoord; /* integer scanline/pixel coordinate */
typedef long TPos; /* sub-pixel coordinate */ typedef long TPos; /* sub-pixel coordinate */
/* determine the type used to store cell areas. This normally takes at */ /* 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' */ /* least PIXEL_BYTES*2 + 1. On 16-bit systems, we need to use `long' */
@ -259,10 +259,10 @@
typedef struct TCell_ typedef struct TCell_
{ {
TScan x; TCoord x;
TScan y; TCoord y;
int cover; int cover;
TArea area; TArea area;
} TCell, *PCell; } TCell, *PCell;
@ -271,22 +271,22 @@
typedef struct TRaster_ typedef struct TRaster_
{ {
PCell cells; PCell cells;
int max_cells; int max_cells;
int num_cells; int num_cells;
TScan min_ex, max_ex; TCoord min_ex, max_ex;
TScan min_ey, max_ey; TCoord min_ey, max_ey;
TArea area; TArea area;
int cover; int cover;
int invalid; int invalid;
TScan ex, ey; TCoord ex, ey;
TScan cx, cy; TCoord cx, cy;
TPos x, y; TPos x, y;
TScan last_ey; TCoord last_ey;
FT_Vector bez_stack[32 * 3 + 1]; FT_Vector bez_stack[32 * 3 + 1];
int lev_stack[32]; int lev_stack[32];
@ -407,8 +407,8 @@
/* Set the current cell to a new position. */ /* Set the current cell to a new position. */
/* */ /* */
static void static void
gray_set_cell( RAS_ARG_ TScan ex, gray_set_cell( RAS_ARG_ TCoord ex,
TScan ey ) TCoord ey )
{ {
int invalid, record, clean; int invalid, record, clean;
@ -464,8 +464,8 @@
/* Start a new contour at a given cell. */ /* Start a new contour at a given cell. */
/* */ /* */
static void static void
gray_start_cell( RAS_ARG_ TScan ex, gray_start_cell( RAS_ARG_ TCoord ex,
TScan ey ) TCoord ey )
{ {
if ( ex < ras.min_ex ) if ( ex < ras.min_ex )
ex = ras.min_ex - 1; ex = ras.min_ex - 1;
@ -486,15 +486,15 @@
/* Render a scanline as one or more cells. */ /* Render a scanline as one or more cells. */
/* */ /* */
static void static void
gray_render_scanline( RAS_ARG_ TScan ey, gray_render_scanline( RAS_ARG_ TCoord ey,
TPos x1, TPos x1,
TScan y1, TCoord y1,
TPos x2, TPos x2,
TScan y2 ) TCoord y2 )
{ {
TScan ex1, ex2, fx1, fx2, delta; TCoord ex1, ex2, fx1, fx2, delta;
long p, first, dx; long p, first, dx;
int incr, lift, mod, rem; int incr, lift, mod, rem;
dx = x2 - x1; dx = x2 - x1;
@ -596,9 +596,9 @@
gray_render_line( RAS_ARG_ TPos to_x, gray_render_line( RAS_ARG_ TPos to_x,
TPos to_y ) TPos to_y )
{ {
TScan ey1, ey2, fy1, fy2; TCoord ey1, ey2, fy1, fy2;
TPos dx, dy, x, x2; TPos dx, dy, x, x2;
int p, rem, mod, lift, delta, first, incr; int p, rem, mod, lift, delta, first, incr;
ey1 = TRUNC( ras.last_ey ); ey1 = TRUNC( ras.last_ey );
@ -614,7 +614,7 @@
/* perform vertical clipping */ /* perform vertical clipping */
{ {
TScan min, max; TCoord min, max;
min = ey1; min = ey1;
@ -640,9 +640,9 @@
if ( dx == 0 ) if ( dx == 0 )
{ {
TScan ex = TRUNC( ras.x ); TCoord ex = TRUNC( ras.x );
TScan two_fx = ( ras.x - SUBPIXELS( ex ) ) << 1; TCoord two_fx = ( ras.x - SUBPIXELS( ex ) ) << 1;
TPos area; TPos area;
first = ONE_PIXEL; first = ONE_PIXEL;
@ -1332,10 +1332,10 @@
static void static void
gray_hline( RAS_ARG_ TScan x, gray_hline( RAS_ARG_ TCoord x,
TScan y, TCoord y,
TPos area, TPos area,
int acount ) int acount )
{ {
FT_Span* span; FT_Span* span;
int count; int count;
@ -1431,12 +1431,13 @@
static void static void
gray_sweep( RAS_ARG_ FT_Bitmap* target ) gray_sweep( RAS_ARG_ FT_Bitmap* target )
{ {
TScan x, y, cover; TCoord x, y, cover;
TArea area; TArea area;
PCell start, cur, limit; PCell start, cur, limit;
FT_UNUSED( target ); FT_UNUSED( target );
if ( ras.num_cells == 0 ) if ( ras.num_cells == 0 )
return; return;