diff --git a/ChangeLog b/ChangeLog index 5ac26f091..5e4e8c651 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2002-04-30 Wenlin Institute (Tom Bishop) + + * 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 `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 * descrip.mms (all): Add pfr driver. diff --git a/include/freetype/config/ftconfig.h b/include/freetype/config/ftconfig.h index 3e76bc9d6..72bee0cc5 100644 --- a/include/freetype/config/ftconfig.h +++ b/include/freetype/config/ftconfig.h @@ -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 */ diff --git a/src/base/ftmac.c b/src/base/ftmac.c index 462220df9..d433992e3 100644 --- a/src/base/ftmac.c +++ b/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; + } + + /*************************************************************************/ /* */ /* */ @@ -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 ); } diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c index 18e25c4dd..116826e6c 100644 --- a/src/base/ftobjs.c +++ b/src/base/ftobjs.c @@ -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 */ diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c index b3da35da7..d756563e1 100644 --- a/src/raster/ftraster.c +++ b/src/raster/ftraster.c @@ -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, diff --git a/src/raster/ftrend1.c b/src/raster/ftrend1.c index 05211e673..0b67bbcb5 100644 --- a/src/raster/ftrend1.c +++ b/src/raster/ftrend1.c @@ -167,7 +167,7 @@ } else { - pitch = ( width + 7 ) >> 3; + pitch = ( ( width + 15 ) >> 4 ) << 1; bitmap->pixel_mode = ft_pixel_mode_mono; } diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c index 33b8aae8d..749ff6d87 100644 --- a/src/smooth/ftgrays.c +++ b/src/smooth/ftgrays.c @@ -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;