From 17c5aee6764ee6007a4e7432404333f7e8ea627c Mon Sep 17 00:00:00 2001 From: David Turner Date: Thu, 13 Oct 2005 14:29:53 +0000 Subject: * MANY FILES... Mergin with main branch (HEAD) --- ChangeLog | 65 ++++++++++++++++++++++++++ builds/unix/freetype2.m4 | 5 ++ docs/CHANGES | 20 ++++++++ include/freetype/freetype.h | 108 +++++++++++++++++++++++++++----------------- include/freetype/ftcache.h | 17 +++++-- src/autofit/afangles.c | 108 ++++++++++++++++++++++++++++++++++++++++++++ src/autofit/aflatin.c | 2 +- src/base/Jamfile | 14 ++++-- src/cache/ftccback.h | 85 ++++++++++++++++++++++++++++++++++ src/cff/cffobjs.c | 5 +- src/cid/cidobjs.c | 6 +-- src/gxvalid/gxvbsln.c | 5 +- src/gxvalid/gxvcommn.c | 75 +++++++++++++++++++----------- src/gxvalid/gxvfeat.c | 5 +- src/gxvalid/gxvjust.c | 8 ++-- src/gxvalid/gxvkern.c | 39 +++++++++------- src/gxvalid/gxvlcar.c | 5 +- src/gxvalid/gxvmort.c | 7 +-- src/gxvalid/gxvmort0.c | 14 +++--- src/gxvalid/gxvmort1.c | 35 ++++++++------ src/gxvalid/gxvmort2.c | 14 +++--- src/gxvalid/gxvmort4.c | 5 +- src/gxvalid/gxvmort5.c | 22 +++++---- src/gxvalid/gxvmorx.c | 12 +++-- src/gxvalid/gxvmorx0.c | 11 +++-- src/gxvalid/gxvmorx1.c | 26 +++++++---- src/gxvalid/gxvmorx2.c | 16 ++++--- src/gxvalid/gxvmorx5.c | 24 +++++----- src/gxvalid/gxvopbd.c | 5 +- src/gxvalid/gxvprop.c | 13 +++--- src/sfnt/sfdriver.c | 6 --- src/sfnt/sfobjs.c | 6 ++- src/truetype/ttgload.c | 58 ++++++++++++------------ src/truetype/ttobjs.c | 6 ++- src/type1/t1objs.c | 9 ++-- src/type42/t42objs.c | 10 ++-- 36 files changed, 633 insertions(+), 238 deletions(-) create mode 100644 src/cache/ftccback.h diff --git a/ChangeLog b/ChangeLog index 3c358b85c..5f9c30e9e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,8 @@ moving "ftc_node_destroy" to private headers, it's now a local, non-public, function + * MANY FILES... Mergin with main branch (HEAD) + 2005-09-21 David Turner * massive redesign of the cache sub-system internals. @@ -28,6 +30,69 @@ performance (ftbench shows a 3% improvements in the SBit and Image caches) + +2005-09-05 Werner Lemberg + + Add FT_FACE_FLAG_HINTER to indicate that a specific font driver has + a hinting engine of its own. + + * include/freetype/freetype.h (FT_FACE_FLAG_HINTER): New macro. + + * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c + (cid_face_init), src/truetype/ttobjs.c (tt_face_init) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER], src/type1/t1objs.c + (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init) + [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Update face flags. + + * docs/CHANGES: Document it. + +2005-09-27 Werner Lemberg + + * builds/unix/freetype2.m4: Add license exception so that the file + can be used in any other autoconf script. + +2005-09-26 David Turner + + * src/autofit/aflatin.c (af_latin_compute_stem_width): Fix bad + computation of the `vertical' flag, causing ugly things in LCD mode + and others. + +2005-09-23 David Turner + + * src/autofit/aflatin.c (af_latin_hints_init): Fix a bug that + prevented internal hint mode bitflags from being computed correctly. + + * src/base/Jamfile: Adding src/base/ftgxval.c. + + * src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c, + src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, src/gxvalid/gxvkern.c, + src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c, + src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c, + src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c, + src/gxvalid/gxvmort5.c, src/gxvalid/gxvmorx.c, + src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c, + src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx5.c, + src/gxvalid/gxvopbd.c, src/gxvalid/gxvprop.c, + src/truetype/ttgload.c: Remove _many_ compiler warnings when + compiling with Visual C++ at maximum level (/W4). + + * src/autofit/afangles.c (af_angle_atan): Replaced CORDIC-based + implementation with one using lookup tables. This simple thing + speeds up glyph loading by 18%, according to ftbench! + + * src/sfnt/sfdriver.c (sfnt_get_interface): Don't check for + `get_sfnt' and `load_sfnt' module interfaces. + +2005-09-22 Werner Lemberg + + * docs/CHANGES: Mention SING Glyphlet support. + +2005-09-22 David Turner + + * src/base/Jamfile: Disable compilation of ftgxval module + temporarily. + + 2005-09-19 David Somers * freetype2/src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a diff --git a/builds/unix/freetype2.m4 b/builds/unix/freetype2.m4 index fc2242fbe..cf6b0ab11 100644 --- a/builds/unix/freetype2.m4 +++ b/builds/unix/freetype2.m4 @@ -10,6 +10,11 @@ # indicate that you have read the license and understand and accept it # fully. # +# As a special exception to the FreeType project license, this file may be +# distributed as part of a program that contains a configuration script +# generated by Autoconf, under the same distribution terms as the rest of +# that program. +# # serial 2 # AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) diff --git a/docs/CHANGES b/docs/CHANGES index 44978299f..76947d9a3 100644 --- a/docs/CHANGES +++ b/docs/CHANGES @@ -33,6 +33,13 @@ LATEST CHANGES BETWEEN 2.2.0 and 2.1.10 III. MISCELLANEOUS + - A new face flag `FT_FACE_FLAG_HINTER' has been added which is + set if the font's driver has a hinting engine of its own. This + makes it possible to check at run-time whether the TrueType + bytecode interpreter has been activated. An example use is to + enable the interpretation of the `gasp' table only if native + TrueType hinting is available. + - The demo programs `ftview' and `ftstring' have been rewritten for better readability. @@ -40,6 +47,19 @@ LATEST CHANGES BETWEEN 2.2.0 and 2.1.10 (meaning `left sidebearing point at x=0'). This helps with some buggy fonts. + - Rudimentary support for Adobe's new `SING Glyphlet' format. See + + http://www.adobe.com/products/indesign/sing_gaiji.html + + for more information. + + - The Cache API has been severely updated. However, that doesn't + change the public API located in FT_CACHE_H, only the types and + functions from FT_CACHE_INTERNAL_XXXX_H headers which should + only be included if you want to create custom caches. + + The Cache API is still experimental, don't use it on production + code though !!! ====================================================================== diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h index 7976b4fb2..611902326 100644 --- a/include/freetype/freetype.h +++ b/include/freetype/freetype.h @@ -120,6 +120,7 @@ FT_BEGIN_HEADER /* FT_FACE_FLAG_GLYPH_NAMES */ /* FT_FACE_FLAG_EXTERNAL_STREAM */ /* FT_FACE_FLAG_FAST_GLYPHS */ + /* FT_FACE_FLAG_HINTER */ /* */ /* FT_STYLE_FLAG_BOLD */ /* FT_STYLE_FLAG_ITALIC */ @@ -336,6 +337,9 @@ FT_BEGIN_HEADER /* It also embeds a memory manager (see @FT_Memory), as well as a */ /* scan-line converter object (see @FT_Raster). */ /* */ + /* For multi-threading applications each thread should have its own */ + /* FT_Library object. */ + /* */ /* */ /* Library objects are normally created by @FT_Init_FreeType, and */ /* destroyed with @FT_Done_FreeType. */ @@ -419,7 +423,7 @@ FT_BEGIN_HEADER /* */ /* */ /* Each face object owns one or more sizes. There is however a */ - /* single _active_ size for the face at any time that will be used by */ + /* single _active_ size for the face at any time that is used by */ /* functions like @FT_Load_Glyph, @FT_Get_Kerning, etc. */ /* */ /* You can use the @FT_Activate_Size API to change the current */ @@ -616,8 +620,8 @@ FT_BEGIN_HEADER /* */ /* By default, FreeType automatically synthetizes a Unicode charmap */ /* for Postscript fonts, using their glyph names dictionaries. */ - /* However, it will also report the encodings defined explicitly in */ - /* the font file, for the cases when they are needed, with the Adobe */ + /* However, it also reports the encodings defined explicitly in the */ + /* font file, for the cases when they are needed, with the Adobe */ /* values as well. */ /* */ /* FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap */ @@ -1038,8 +1042,9 @@ FT_BEGIN_HEADER /* FT_FACE_FLAG_KERNING :: */ /* Indicates that the face contains kerning information. If set, */ /* the kerning distance can be retrieved through the function */ - /* @FT_Get_Kerning. Note that if unset, this function will always */ - /* return the vector (0,0). */ + /* @FT_Get_Kerning. Otherwise the function always return the */ + /* vector (0,0). Note that FreeType doesn't handle kerning data */ + /* from the `GPOS' table (as present in some OpenType fonts). */ /* */ /* FT_FACE_FLAG_FAST_GLYPHS :: */ /* THIS FLAG IS DEPRECATED. DO NOT USE OR TEST IT. */ @@ -1060,6 +1065,12 @@ FT_BEGIN_HEADER /* provided by the client application and should not be destroyed */ /* when @FT_Done_Face is called. Don't read or test this flag. */ /* */ + /* FT_FACE_FLAG_HINTER :: */ + /* Set if the font driver has a hinting machine of its own. For */ + /* example, with TrueType fonts, it makes sense to use data from */ + /* the SFNT `gasp' table only if the native TrueType hinting engine */ + /* (with the bytecode interpreter) is available and active. */ + /* */ #define FT_FACE_FLAG_SCALABLE ( 1L << 0 ) #define FT_FACE_FLAG_FIXED_SIZES ( 1L << 1 ) #define FT_FACE_FLAG_FIXED_WIDTH ( 1L << 2 ) @@ -1071,6 +1082,7 @@ FT_BEGIN_HEADER #define FT_FACE_FLAG_MULTIPLE_MASTERS ( 1L << 8 ) #define FT_FACE_FLAG_GLYPH_NAMES ( 1L << 9 ) #define FT_FACE_FLAG_EXTERNAL_STREAM ( 1L << 10 ) +#define FT_FACE_FLAG_HINTER ( 1L << 11 ) /* */ @@ -1485,9 +1497,9 @@ FT_BEGIN_HEADER /* data. */ /* */ /* other :: Really wicked formats can use this pointer to */ - /* present their own glyph image to client apps. */ - /* Note that the app will need to know about the */ - /* image format. */ + /* present their own glyph image to client */ + /* applications. Note that the application */ + /* needs to know about the image format. */ /* */ /* lsb_delta :: The difference between hinted and unhinted */ /* left side bearing while autohinting is */ @@ -1761,8 +1773,8 @@ FT_BEGIN_HEADER /* */ /* driver :: This field is exclusively used by @FT_Open_Face; */ /* it simply specifies the font driver to use to open */ - /* the face. If set to 0, FreeType will try to load */ - /* the face with each one of the drivers in its list. */ + /* the face. If set to 0, FreeType tries to load the */ + /* face with each one of the drivers in its list. */ /* */ /* num_params :: The number of extra parameters. */ /* */ @@ -1782,12 +1794,11 @@ FT_BEGIN_HEADER /* Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this */ /* is a normal file and use `pathname' to open it. */ /* */ - /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face will only try to */ + /* If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to */ /* open the file with the driver whose handler is in `driver'. */ /* */ /* If the `FT_OPEN_PARAMS' bit is set, the parameters given by */ - /* `num_params' and `params' will be used. They are ignored */ - /* otherwise. */ + /* `num_params' and `params' is used. They are ignored otherwise. */ /* */ typedef struct FT_Open_Args_ { @@ -1834,7 +1845,7 @@ FT_BEGIN_HEADER /* */ /* @FT_New_Face can be used to determine and/or check the font format */ /* of a given font resource. If the `face_index' field is negative, */ - /* the function will _not_ return any face handle in `aface'; the */ + /* the function does _not_ return any face handle in `aface'; the */ /* return value is 0 if the font format is recognized, or non-zero */ /* otherwise. */ /* */ @@ -1886,7 +1897,7 @@ FT_BEGIN_HEADER /* */ /* @FT_New_Memory_Face can be used to determine and/or check the font */ /* format of a given font resource. If the `face_index' field is */ - /* negative, the function will _not_ return any face handle in */ + /* negative, the function does _not_ return any face handle in */ /* `aface'; the return value is 0 if the font format is recognized, */ /* or non-zero otherwise. */ /* */ @@ -1906,7 +1917,7 @@ FT_BEGIN_HEADER /* */ /* Opens a face object from a given resource and typeface index using */ /* an `FT_Open_Args' structure. If the face object doesn't exist, it */ - /* will be created. */ + /* is created. */ /* */ /* */ /* library :: A handle to the library resource. */ @@ -1931,7 +1942,7 @@ FT_BEGIN_HEADER /* */ /* @FT_Open_Face can be used to determine and/or check the font */ /* format of a given font resource. If the `face_index' field is */ - /* negative, the function will _not_ return any face handle in */ + /* negative, the function does _not_ return any face handle in */ /* `*aface'; the function's return value is 0 if the font format is */ /* recognized, or non-zero otherwise. */ /* */ @@ -2104,11 +2115,10 @@ FT_BEGIN_HEADER /* */ /* The `character size' is really the size of an abstract square */ /* called the `EM', used to design the font. However, depending */ - /* on the font design, glyphs will be smaller or greater than the */ - /* EM. */ + /* on the font design, glyphs is smaller or greater than the EM. */ /* */ /* This means that setting the pixel size to, say, 8x8 doesn't */ - /* guarantee in any way that you will get glyph bitmaps that all fit */ + /* guarantee in any way that you get glyph bitmaps that all fit */ /* within an 8x8 cell (sometimes even far from it). */ /* */ /* For bitmap fonts, `pixel_height' usually is a reliable value for */ @@ -2136,7 +2146,7 @@ FT_BEGIN_HEADER /* */ /* */ /* face :: A handle to the target face object where the glyph */ - /* will be loaded. */ + /* is loaded. */ /* */ /* */ /* glyph_index :: The index of the glyph in the font file. For */ @@ -2154,8 +2164,8 @@ FT_BEGIN_HEADER /* */ /* */ /* If the glyph image is not a bitmap, and if the bit flag */ - /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be */ - /* transformed with the information passed to a previous call to */ + /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image is transformed */ + /* with the information passed to a previous call to */ /* @FT_Set_Transform. */ /* */ /* Note that this also transforms the `face.glyph.advance' field, but */ @@ -2178,7 +2188,7 @@ FT_BEGIN_HEADER /* */ /* */ /* face :: A handle to a target face object where the glyph */ - /* will be loaded. */ + /* is loaded. */ /* */ /* */ /* char_code :: The glyph's character code, according to the */ @@ -2195,11 +2205,10 @@ FT_BEGIN_HEADER /* */ /* */ /* If the face has no current charmap, or if the character code */ - /* is not defined in the charmap, this function will return an */ - /* error. */ + /* is not defined in the charmap, this function returns an error. */ /* */ /* If the glyph image is not a bitmap, and if the bit flag */ - /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image will be */ + /* FT_LOAD_IGNORE_TRANSFORM is unset, the glyph image is */ /* transformed with the information passed to a previous call to */ /* @FT_Set_Transform. */ /* */ @@ -2224,7 +2233,7 @@ FT_BEGIN_HEADER * @values: * FT_LOAD_DEFAULT :: * Corresponding to 0, this value is used a default glyph load. In this - * case, the following will happen: + * case, the following happens: * * 1. FreeType looks for a bitmap for the glyph corresponding to the * face's current size. If one is found, the function returns. The @@ -2264,7 +2273,7 @@ FT_BEGIN_HEADER * * FT_LOAD_NO_BITMAP :: * Don't look for bitmaps when loading the glyph. Only scalable - * outlines will be loaded when available, and scaled, hinted, or + * outlines are loaded when available, and scaled, hinted, or * rendered depending on other bit flags. * * This does not prevent you from rendering outlines to bitmaps @@ -2272,9 +2281,9 @@ FT_BEGIN_HEADER * * FT_LOAD_VERTICAL_LAYOUT :: * Prepare the glyph image for vertical text layout. This basically - * means that `face.glyph.advance' will correspond to the vertical + * means that `face.glyph.advance' corresponds to the vertical * advance height (instead of the default horizontal advance width), - * and that the glyph image will be translated to match the vertical + * and that the glyph image is translated to match the vertical * bearings positions. * * FT_LOAD_FORCE_AUTOHINT :: @@ -2349,6 +2358,23 @@ FT_BEGIN_HEADER * * FT_LOAD_TARGET_LCD_V :: * Use hinting for @FT_RENDER_MODE_LCD_V. + * + * @note: + * You should use only _one_ of the FT_LOAD_TARGET_XXX values; they + * can't be ORed. + * + * However, FreeType makes a distinction between the hinting algorithm + * being used, and the pixel mode of the target bitmaps. For example, + * it is possible to use the `light' hinting algorithm and have the + * results rendered in horizontal LCD pixel mode, with code like this: + * + * { + * FT_Load_Glyph( face, glyph_index, + * load_flags | FT_LOAD_TARGET_LIGHT ); + * + * FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD ); + * } + * */ #define FT_LOAD_DEFAULT 0x0 #define FT_LOAD_NO_SCALE 0x1 @@ -2644,7 +2670,7 @@ FT_BEGIN_HEADER /* buffer. */ /* */ /* */ - /* buffer :: A pointer to a target buffer where the name will be */ + /* buffer :: A pointer to a target buffer where the name is */ /* copied to. */ /* */ /* */ @@ -2653,7 +2679,7 @@ FT_BEGIN_HEADER /* */ /* An error is returned if the face doesn't provide glyph names or if */ /* the glyph index is invalid. In all cases of failure, the first */ - /* byte of `buffer' will be set to 0 to indicate an empty name. */ + /* byte of `buffer' is set to 0 to indicate an empty name. */ /* */ /* The glyph name is truncated to fit within the buffer if it is too */ /* long. The returned string is always zero-terminated. */ @@ -2711,7 +2737,7 @@ FT_BEGIN_HEADER /* FreeType error code. 0 means success. */ /* */ /* */ - /* This function will return an error if no charmap in the face */ + /* This function returns an error if no charmap in the face */ /* corresponds to the encoding queried here. */ /* */ FT_EXPORT( FT_Error ) @@ -2738,7 +2764,7 @@ FT_BEGIN_HEADER /* FreeType error code. 0 means success. */ /* */ /* */ - /* This function will return an error if the charmap is not part of */ + /* This function returns an error if the charmap is not part of */ /* the face (i.e., if it is not listed in the face->charmaps[] */ /* table). */ /* */ @@ -2801,7 +2827,7 @@ FT_BEGIN_HEADER /* */ /* */ /* This function is used to return the first character code in the */ - /* current charmap of a given face. It will also return the */ + /* current charmap of a given face. It also returns the */ /* corresponding glyph index. */ /* */ /* */ @@ -2833,9 +2859,9 @@ FT_BEGIN_HEADER /* } */ /* } */ /* */ - /* Note that `*agindex' will be set to 0 if the charmap is empty. */ - /* The result itself can be 0 in two cases: if the charmap is empty */ - /* or when the value 0 is the first valid character code. */ + /* Note that `*agindex' is set to 0 if the charmap is empty. The */ + /* result itself can be 0 in two cases: if the charmap is empty or */ + /* when the value 0 is the first valid character code. */ /* */ FT_EXPORT( FT_ULong ) FT_Get_First_Char( FT_Face face, @@ -2868,8 +2894,8 @@ FT_BEGIN_HEADER /* through all character codes available in a given charmap. See */ /* the note for this function for a simple code example. */ /* */ - /* Note that `*agindex' will be set to 0 when there are no more codes */ - /* in the charmap. */ + /* Note that `*agindex' is set to 0 when there are no more codes in */ + /* the charmap. */ /* */ FT_EXPORT( FT_ULong ) FT_Get_Next_Char( FT_Face face, diff --git a/include/freetype/ftcache.h b/include/freetype/ftcache.h index 20e9a1edb..0ec33aceb 100644 --- a/include/freetype/ftcache.h +++ b/include/freetype/ftcache.h @@ -4,7 +4,7 @@ /* */ /* FreeType Cache subsystem (specification). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -272,8 +272,10 @@ FT_BEGIN_HEADER /* */ /* library :: The parent FreeType library handle to use. */ /* */ - /* max_bytes :: Maximum number of bytes to use for cached data. */ - /* Use 0 for defaults. */ + /* max_bytes :: Maximum number of bytes to use for cached data */ + /* nodes. Use 0 for defaults. Note that this value */ + /* does not account for managed FT_Face and FT_Size */ + /* objects. */ /* */ /* requester :: An application-provided callback used to translate */ /* face IDs into real @FT_Face objects. */ @@ -288,6 +290,15 @@ FT_BEGIN_HEADER /* */ /* FreeType error code. 0 means success. */ /* */ + /* */ + /* When you perform a lookup, out-of-memory errors are detected */ + /* _within_ the lookup and force incremental flushes of the cache */ + /* until enough memory is released for the lookup to succeed. */ + /* */ + /* If a lookup fails with FT_Err_Out_Of_Memory the cache has already */ + /* been completely flushed, and still no memory is available for the */ + /* operation. */ + /* */ FT_EXPORT( FT_Error ) FTC_Manager_New( FT_Library library, FT_UInt max_faces, diff --git a/src/autofit/afangles.c b/src/autofit/afangles.c index 7411be72f..a59246dd6 100644 --- a/src/autofit/afangles.c +++ b/src/autofit/afangles.c @@ -20,6 +20,112 @@ #include "aftypes.h" +#if 1 + + /* the following table has been automatically generated with */ + /* the `mather.py' Python script */ + +#define AF_ATAN_BITS 8 + + static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = + { + 0, 0, 1, 1, 1, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 5, + 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, + 10, 10, 11, 11, 11, 12, 12, 12, + 13, 13, 13, 14, 14, 14, 14, 15, + 15, 15, 16, 16, 16, 17, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 20, + 20, 20, 21, 21, 21, 21, 22, 22, + 22, 23, 23, 23, 24, 24, 24, 24, + 25, 25, 25, 26, 26, 26, 26, 27, + 27, 27, 28, 28, 28, 28, 29, 29, + 29, 30, 30, 30, 30, 31, 31, 31, + 31, 32, 32, 32, 33, 33, 33, 33, + 34, 34, 34, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 37, 37, 37, 38, + 38, 38, 38, 39, 39, 39, 39, 40, + 40, 40, 40, 41, 41, 41, 41, 42, + 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 47, 47, 47, + 47, 48, 48, 48, 48, 48, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, + 51, 51, 51, 51, 52, 52, 52, 52, + 52, 53, 53, 53, 53, 53, 54, 54, + 54, 54, 54, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 57, 57, 57, + 57, 57, 57, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 60, 60, + 60, 60, 60, 61, 61, 61, 61, 61, + 61, 62, 62, 62, 62, 62, 62, 63, + 63, 63, 63, 63, 63, 64, 64, 64 + }; + + + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + + + /* check trivial cases */ + if ( dy == 0 ) + { + angle = 0; + if ( dx < 0 ) + angle = AF_ANGLE_PI; + return angle; + } + else if ( dx == 0 ) + { + angle = AF_ANGLE_PI2; + if ( dy < 0 ) + angle = -AF_ANGLE_PI2; + return angle; + } + + angle = 0; + if ( dx < 0 ) + { + dx = -dx; + dy = -dy; + angle = AF_ANGLE_PI; + } + + if ( dy < 0 ) + { + FT_Pos tmp; + + + tmp = dx; + dx = -dy; + dy = tmp; + angle -= AF_ANGLE_PI2; + } + + if ( dx == 0 && dy == 0 ) + return 0; + + if ( dx == dy ) + angle += AF_ANGLE_PI4; + else if ( dx > dy ) + angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; + else + angle += AF_ANGLE_PI2 - + af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; + + if ( angle > AF_ANGLE_PI ) + angle -= AF_ANGLE_2PI; + + return angle; + } + + +#else /* 0 */ + /* * a python script used to generate the following table * @@ -216,6 +322,8 @@ for n in r: return v.y; } +#endif /* 0 */ + FT_LOCAL_DEF( AF_Angle ) af_angle_diff( AF_Angle angle1, diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c index ab47f88e4..b7e04e371 100644 --- a/src/autofit/aflatin.c +++ b/src/autofit/aflatin.c @@ -1409,7 +1409,7 @@ AF_LatinAxis axis = & metrics->axis[dim]; FT_Pos dist = width; FT_Int sign = 0; - FT_Int vertical = AF_HINTS_DO_VERTICAL( hints ); + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) diff --git a/src/base/Jamfile b/src/base/Jamfile index 945b05cd2..2c486d116 100644 --- a/src/base/Jamfile +++ b/src/base/Jamfile @@ -30,11 +30,15 @@ SubDir FT2_TOP $(FT2_SRC_DIR) base ; # Add the optional/replaceable files. # -Library $(FT2_LIB) : ftsystem.c ftinit.c ftglyph.c ftmm.c ftbdf.c - ftbbox.c ftdebug.c ftxf86.c fttype1.c ftpfr.c - ftstroke.c ftwinfnt.c ftotval.c ftgxval.c ftbitmap.c - ftsynth.c - ; +{ + local _sources = system init glyph mm bdf + bbox debug xf86 type1 pfr + stroke winfnt otval bitmap synth + gxval + ; + + Library $(FT2_LIB) : ft$(_sources).c ; +} # Add Macintosh-specific file to the library when necessary. # diff --git a/src/cache/ftccback.h b/src/cache/ftccback.h new file mode 100644 index 000000000..6b47e095e --- /dev/null +++ b/src/cache/ftccback.h @@ -0,0 +1,85 @@ +/***************************************************************************/ +/* */ +/* ftccback.h */ +/* */ +/* Callback functions of the caching sub-system (specification only). */ +/* */ +/* Copyright 2004 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* This file is part of the FreeType project, and may only be used, */ +/* modified, and distributed under the terms of the FreeType project */ +/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ +/* this file you indicate that you have read the license and */ +/* understand and accept it fully. */ +/* */ +/***************************************************************************/ + +#ifndef __FTCCBACK_H__ +#define __FTCCBACK_H__ + +#include +#include FT_CACHE_H +#include FT_CACHE_INTERNAL_MRU_H +#include FT_CACHE_INTERNAL_IMAGE_H +#include FT_CACHE_INTERNAL_MANAGER_H +#include FT_CACHE_INTERNAL_GLYPH_H +#include FT_CACHE_INTERNAL_SBITS_H + + + FT_LOCAL( void ) + ftc_inode_free( FTC_Node inode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_inode_new( FTC_Node *pinode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_ULong ) + ftc_inode_weight( FTC_Node inode, + FTC_Cache cache ); + + + FT_LOCAL( void ) + ftc_snode_free( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Error ) + ftc_snode_new( FTC_Node *psnode, + FT_Pointer gquery, + FTC_Cache cache ); + + FT_LOCAL( FT_ULong ) + ftc_snode_weight( FTC_Node snode, + FTC_Cache cache ); + + FT_LOCAL( FT_Bool ) + ftc_snode_compare( FTC_Node snode, + FT_Pointer gquery, + FTC_Cache cache ); + + + FT_LOCAL( FT_Bool ) + ftc_gnode_compare( FTC_Node gnode, + FT_Pointer gquery, + FTC_Cache cache ); + + + FT_LOCAL( FT_Error ) + ftc_gcache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_gcache_done( FTC_Cache cache ); + + + FT_LOCAL( FT_Error ) + ftc_cache_init( FTC_Cache cache ); + + FT_LOCAL( void ) + ftc_cache_done( FTC_Cache cache ); + + +#endif /* __FTCCBACK_H__ */ + +/* END */ diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c index 8522c1f1f..19ea482ab 100644 --- a/src/cff/cffobjs.c +++ b/src/cff/cffobjs.c @@ -636,8 +636,9 @@ /* */ /* Compute face flags. */ /* */ - flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ - FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ if ( sfnt_format ) flags |= FT_FACE_FLAG_SFNT; diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c index 3fb47bcce..efeb47e78 100644 --- a/src/cid/cidobjs.c +++ b/src/cid/cidobjs.c @@ -362,9 +362,9 @@ cidface->num_charmaps = 0; cidface->face_index = face_index; - cidface->face_flags = FT_FACE_FLAG_SCALABLE; - - cidface->face_flags |= FT_FACE_FLAG_HORIZONTAL; + cidface->face_flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ if ( info->is_fixed_pitch ) cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; diff --git a/src/gxvalid/gxvbsln.c b/src/gxvalid/gxvbsln.c index c330138df..6cca65831 100644 --- a/src/gxvalid/gxvbsln.c +++ b/src/gxvalid/gxvbsln.c @@ -131,8 +131,9 @@ FT_UShort offset; GXV_LookupValueDesc value; - - offset = base_value.u + ( relative_gindex * sizeof ( FT_UShort ) ); + /* XXX: check range ? */ + offset = (FT_UShort)( base_value.u + + ( relative_gindex * sizeof ( FT_UShort ) ) ); p = valid->lookuptbl_head + offset; limit = lookuptbl_limit; diff --git a/src/gxvalid/gxvcommn.c b/src/gxvalid/gxvcommn.c index c7bdfd194..82fd6b3a6 100644 --- a/src/gxvalid/gxvcommn.c +++ b/src/gxvalid/gxvcommn.c @@ -94,7 +94,7 @@ if ( j == nmemb ) FT_INVALID_OFFSET; - *(length[i]) = buff[j + 1] - buff[j]; + *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] ); if ( 0 != offset[i] && 0 == *(length[i]) ) FT_INVALID_OFFSET; @@ -197,8 +197,8 @@ GXV_LIMIT_CHECK( 1 ); val = FT_NEXT_BYTE( p ); - *min = FT_MIN( *min, val ); - *max = FT_MAX( *max, val ); + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); } valid->subtable_length = p - table; @@ -226,8 +226,8 @@ GXV_LIMIT_CHECK( 2 ); val = FT_NEXT_USHORT( p ); - *min = FT_MIN( *min, val ); - *max = FT_MAX( *max, val ); + *min = (FT_Byte)FT_MIN( *min, val ); + *max = (FT_Byte)FT_MAX( *max, val ); } valid->subtable_length = p - table; @@ -282,9 +282,9 @@ ; entrySelector--; - searchRange *= binSrchHeader->unitSize; - rangeShift = binSrchHeader->nUnits * binSrchHeader->unitSize - - searchRange; + searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize ); + rangeShift = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize + - searchRange ); if ( searchRange != binSrchHeader->searchRange || entrySelector != binSrchHeader->entrySelector || @@ -629,8 +629,11 @@ for ( gid = firstGlyph; gid <= lastGlyph; gid++ ) { - value = valid->lookupfmt4_trans( gid - firstGlyph, base_value, - limit, valid ); + value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ), + base_value, + limit, + valid ); + valid->lookupval_func( gid, value, valid ); } } @@ -739,14 +742,14 @@ glyphCount = FT_NEXT_USHORT( p ); gxv_glyphid_validate( firstGlyph, valid ); - gxv_glyphid_validate( firstGlyph + glyphCount, valid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid ); /* valueArray */ for ( i = 0; i < glyphCount; i++ ) { GXV_LIMIT_CHECK( 2 ); value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign ); - valid->lookupval_func( firstGlyph + i, value, valid ); + valid->lookupval_func( (FT_UShort)( firstGlyph + i ), value, valid ); } valid->subtable_length = p - table; @@ -913,12 +916,14 @@ GXV_TRACE(( " nameIndex = %d (UNTITLED)\n", name_index )); FT_INVALID_DATA; + goto Exit; /* make compiler happy */ Out: FT_TRACE1(( " nameIndex = %d (", name_index )); GXV_TRACE_HEXDUMP_SFNTNAME( name ); FT_TRACE1(( ")\n" )); + Exit: GXV_EXIT; } @@ -967,7 +972,7 @@ if ( !nGlyphs ) goto Out; - gxv_glyphid_validate( firstGlyph + nGlyphs, valid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid ); { FT_Byte nGlyphInClass[256]; @@ -1000,12 +1005,12 @@ break; } } - *length_p = p - table; + *length_p = (FT_UShort)( p - table ); /* scan max ClassID in use */ for ( i = 0; i < stateSize; i++ ) if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) ) - *maxClassID_p = i; + *maxClassID_p = (FT_Byte)i; /* XXX: Check Range? */ } Out: @@ -1031,6 +1036,8 @@ FT_Byte clazz; FT_Byte entry; + FT_UNUSED( stateSize ); /* for the non-debugging case */ + GXV_NAME_ENTER( "StateArray" ); @@ -1053,13 +1060,13 @@ for ( clazz = 0; clazz <= maxClassID; clazz++ ) { entry = FT_NEXT_BYTE( p ); - *maxEntry_p = FT_MAX( *maxEntry_p, entry ); + *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry ); } } GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", *maxState_p, *maxEntry_p )); - *length_p = p - table; + *length_p = (FT_UShort)( p - table ); GXV_EXIT; } @@ -1097,7 +1104,7 @@ FT_INVALID_TOO_SHORT; /* ftxvalidator and FontValidator both warn and continue */ - maxEntry = *length_p / entrySize - 1; + maxEntry = (FT_Byte)( *length_p / entrySize - 1 ); GXV_TRACE(( "too large maxEntry, shrinking to %d fit EntryTable length\n", maxEntry )); } @@ -1132,11 +1139,12 @@ continue; } - state = ( newState - stateArray ) / ( 1 + maxClassID ); + state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) ); switch ( GXV_GLYPHOFFSET_FMT( statetable ) ) { case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ break; case GXV_GLYPHOFFSET_UCHAR: @@ -1166,6 +1174,7 @@ default: if ( valid->root->level >= FT_VALIDATE_PARANOID ) FT_INVALID_FORMAT; + goto Exit; } if ( NULL != valid->statetable.entry_validate_func ) @@ -1176,7 +1185,9 @@ statetable_limit, valid ); } - *length_p = p - table; + + Exit: + *length_p = (FT_UShort)( p - table ); GXV_EXIT; } @@ -1258,7 +1269,7 @@ else setup_func = gxv_StateTable_subtable_setup; - setup_func( limit - table, + setup_func( (FT_UShort)( limit - table ), classTable, stateArray, entryTable, @@ -1276,7 +1287,7 @@ &maxClassID, valid ); else - maxClassID = stateSize - 1; + maxClassID = (FT_Byte)( stateSize - 1 ); if ( stateArray != 0 ) gxv_StateArray_validate( table + stateArray, @@ -1389,8 +1400,9 @@ FT_UShort offset; GXV_LookupValueDesc value; - - offset = base_value.u + relative_gindex * sizeof ( FT_UShort ); + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); p = valid->lookuptbl_head + offset; limit = lookuptbl_limit; @@ -1416,6 +1428,8 @@ FT_UShort clazz; FT_UShort entry; + FT_UNUSED( stateSize ); /* for the non-debugging case */ + GXV_NAME_ENTER( "XStateArray" ); @@ -1438,7 +1452,7 @@ for ( clazz = 0; clazz <= maxClassID; clazz++ ) { entry = FT_NEXT_USHORT( p ); - *maxEntry_p = FT_MAX( *maxEntry_p, entry ); + *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry ); } } GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n", @@ -1492,7 +1506,7 @@ FT_INVALID_OFFSET; } - state = newState_idx / ( 1 + maxClassID ); + state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) ); if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) ) { FT_TRACE4(( "-> new state = %d (supposed)\n" @@ -1505,6 +1519,7 @@ switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) ) { case GXV_GLYPHOFFSET_NONE: + glyphOffset.uc = 0; /* make compiler happy */ break; case GXV_GLYPHOFFSET_UCHAR: @@ -1534,6 +1549,7 @@ default: if ( valid->root->level >= FT_VALIDATE_PARANOID ) FT_INVALID_FORMAT; + goto Exit; } if ( NULL != valid->xstatetable.entry_validate_func ) @@ -1545,6 +1561,7 @@ valid ); } + Exit: *length_p = p - table; GXV_EXIT; @@ -1622,7 +1639,11 @@ classTable_length = valid->subtable_length; } else - valid->xstatetable.maxClassID = valid->xstatetable.nClasses - 1; + { + /* XXX: check range? */ + valid->xstatetable.maxClassID = + (FT_UShort)( valid->xstatetable.nClasses - 1 ); + } if ( stateArray != 0 ) gxv_XStateArray_validate( table + stateArray, diff --git a/src/gxvalid/gxvfeat.c b/src/gxvalid/gxvfeat.c index 05e784b91..d7c6ad166 100644 --- a/src/gxvalid/gxvfeat.c +++ b/src/gxvalid/gxvfeat.c @@ -225,14 +225,15 @@ ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 ) FT_INVALID_DATA; - exclusive = featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS; + exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS ); if ( exclusive ) { FT_Byte dynamic_default; if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT ) - dynamic_default = featureFlags & GXV_FEAT_MASK_DEFAULT_SETTING; + dynamic_default = (FT_Byte)( featureFlags & + GXV_FEAT_MASK_DEFAULT_SETTING ); else dynamic_default = 0; diff --git a/src/gxvalid/gxvjust.c b/src/gxvalid/gxvjust.c index ec092ebe2..29bf840b5 100644 --- a/src/gxvalid/gxvjust.c +++ b/src/gxvalid/gxvjust.c @@ -401,10 +401,10 @@ FT_UNUSED( valid ); - setMark = ( 0x8000U & flags ) / 0x8000U; - dontAdvance = ( 0x4000 & flags ) / 0x4000; - markClass = ( 0x3F80 & flags ) / 0x0080; - currentClass = 0x007F & flags ; + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markClass = (FT_UShort)( ( flags >> 7 ) & 0x7F ); + currentClass = (FT_UShort)( flags & 0x7F ); /* TODO: validate markClass & currentClass */ } diff --git a/src/gxvalid/gxvkern.c b/src/gxvalid/gxvkern.c index a17ba9c76..edc9af214 100644 --- a/src/gxvalid/gxvkern.c +++ b/src/gxvalid/gxvkern.c @@ -234,9 +234,9 @@ FT_UNUSED( glyphOffset ); - push = flags / 0x8000U; - dontAdvance = ( flags & 0x4000 ) / 0x4000; - valueOffset = flags & 0x3FFF; + push = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + valueOffset = (FT_UShort)( flags & 0x3FFF ); { GXV_kern_fmt1_StateOptRecData vt_rec = @@ -341,7 +341,7 @@ tag, firstGlyph, nGlyphs )); gxv_glyphid_validate( firstGlyph, valid ); - gxv_glyphid_validate( firstGlyph + nGlyphs - 1, valid ); + gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), valid ); gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ), &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ), @@ -512,15 +512,18 @@ FT_Bool kernCrossStream; FT_Bool kernVariation; + FT_UNUSED( valid ); + /* reserved bits = 0 */ if ( coverage & 0x1FFC ) return 0; - kernVertical = ( coverage >> 15 ) & 1; - kernCrossStream = ( coverage >> 14 ) & 1; - kernVariation = ( coverage >> 13 ) & 1; - *format = coverage & 0x0003; + kernVertical = FT_BOOL( ( coverage >> 15 ) & 1 ); + kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 ); + kernVariation = FT_BOOL( ( coverage >> 13 ) & 1 ); + + *format = (FT_UShort)( coverage & 0x0003 ); GXV_TRACE(( "new Apple-dialect: " "horizontal=%d, cross-stream=%d, variation=%d, format=%d\n", @@ -550,9 +553,10 @@ if ( coverage & 0x02FC ) return 0; - horizontal = ( coverage >> 15 ) & 1; - cross_stream = ( coverage >> 13 ) & 1; - *format = coverage & 0x0003; + horizontal = FT_BOOL( ( coverage >> 15 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 ); + + *format = (FT_UShort)( coverage & 0x0003 ); GXV_TRACE(( "classic Apple-dialect: " "horizontal=%d, cross-stream=%d, format=%d\n", @@ -579,16 +583,19 @@ FT_Bool cross_stream; FT_Bool override; + FT_UNUSED( valid ); + /* reserved bits = 0 */ if ( coverage & 0xFDF0 ) return 0; - horizontal = coverage & 1; - minimum = ( coverage >> 1 ) & 1; - cross_stream = ( coverage >> 2 ) & 1; - override = ( coverage >> 3 ) & 1; - *format = ( coverage >> 8 ) & 0x0003; + horizontal = FT_BOOL( coverage & 1 ); + minimum = FT_BOOL( ( coverage >> 1 ) & 1 ); + cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 ); + override = FT_BOOL( ( coverage >> 3 ) & 1 ); + + *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 ); GXV_TRACE(( "classic Microsoft-dialect: " "horizontal=%d, minimum=%d, cross-stream=%d, " diff --git a/src/gxvalid/gxvlcar.c b/src/gxvalid/gxvlcar.c index 3888358bc..48821ea87 100644 --- a/src/gxvalid/gxvlcar.c +++ b/src/gxvalid/gxvlcar.c @@ -157,8 +157,9 @@ FT_UNUSED( lookuptbl_limit ); - - offset = base_value.u + relative_gindex * sizeof ( FT_UShort ); + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); p = valid->root->base + offset; limit = valid->root->limit; diff --git a/src/gxvalid/gxvmort.c b/src/gxvalid/gxvmort.c index 4cb3a19e3..6fb71b92b 100644 --- a/src/gxvalid/gxvmort.c +++ b/src/gxvalid/gxvmort.c @@ -64,10 +64,9 @@ /* nSettings in gxvfeat.c is halved for exclusive on/off settings */ + nSettings_max = gxv_feat_registry[f->featureType].nSettings; if ( gxv_feat_registry[f->featureType].exclusive ) - nSettings_max = 2 * gxv_feat_registry[f->featureType].nSettings; - else - nSettings_max = gxv_feat_registry[f->featureType].nSettings; + nSettings_max = (FT_Byte)( 2 * nSettings_max ); GXV_TRACE(( "featureType %d is registered", f->featureType )); GXV_TRACE(( "setting %d", f->featureSetting )); @@ -125,6 +124,8 @@ gxv_mort_coverage_validate( FT_UShort coverage, GXV_Validator valid ) { + FT_UNUSED( valid ); + if ( coverage & 0x8000U ) GXV_TRACE(( " this subtable is for vertical text only\n" )); else diff --git a/src/gxvalid/gxvmort0.c b/src/gxvalid/gxvmort0.c index c93ee4d34..bb045892d 100644 --- a/src/gxvalid/gxvmort0.c +++ b/src/gxvalid/gxvmort0.c @@ -79,14 +79,16 @@ FT_UNUSED( table ); FT_UNUSED( limit ); + FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */ + FT_UNUSED( glyphOffset ); /* case */ - markFirst = flags / 0x8000U; - dontAdvance = ( flags & 0x4000 ) / 0x4000; - markLast = ( flags & 0x2000 ) / 0x2000; - reserved = flags & 0x1FF0; - verb = flags & 0x000F; - FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FF0 ); + verb = (FT_UShort)( flags & 0x000F ); GXV_TRACE(( " IndicScript MorphRule for glyphOffset 0x%04x", glyphOffset.u )); diff --git a/src/gxvalid/gxvmort1.c b/src/gxvalid/gxvmort1.c index 86d667c64..0b4c18067 100644 --- a/src/gxvalid/gxvmort1.c +++ b/src/gxvalid/gxvmort1.c @@ -113,15 +113,19 @@ FT_UNUSED( state ); - substTable = ((GXV_mort_subtable_type1_StateOptRec *) - (valid->statetable.optdata))->substitutionTable; - substTable_limit = substTable + - ((GXV_mort_subtable_type1_StateOptRec *) - (valid->statetable.optdata))->substitutionTable_length; + substTable = + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable; + substTable_limit = + (FT_UShort)( substTable + + ((GXV_mort_subtable_type1_StateOptRec *) + (valid->statetable.optdata))->substitutionTable_length ); - min_gid = ( substTable - wordOffset * 2 ) / 2; - max_gid = ( substTable_limit - wordOffset * 2 ) / 2; - max_gid = FT_MAX( max_gid, valid->face->num_glyphs ); + min_gid = (FT_UShort)( ( substTable - wordOffset * 2 ) / 2 ); + max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 ); + max_gid = (FT_UShort)( FT_MAX( max_gid, valid->face->num_glyphs ) ); + + /* XXX: check range? */ /* TODO: min_gid & max_gid comparison with ClassTable contents */ } @@ -146,11 +150,12 @@ FT_UNUSED( limit ); - setMark = flags / 0x8000U; - dontAdvance = ( flags & 0x4000 ) / 0x4000; - reserved = flags & 0x3FFF; - markOffset = GXV_USHORT_TO_SHORT( glyphOffset.ul / 0x00010000UL ); - currentOffset = GXV_USHORT_TO_SHORT( glyphOffset.ul & 0x0000FFFFUL ); + setMark = (FT_UShort)( flags >> 15 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + reserved = (FT_Short)( flags & 0x3FFF ); + + markOffset = (FT_Short)( glyphOffset.ul >> 16 ); + currentOffset = (FT_Short)( glyphOffset.ul ); if ( 0 < reserved ) { @@ -177,9 +182,9 @@ GXV_Validator valid ) { FT_Bytes p = table; - FT_UShort num_gids = + FT_UShort num_gids = (FT_UShort)( ((GXV_mort_subtable_type1_StateOptRec *) - (valid->statetable.optdata))->substitutionTable_length / 2; + (valid->statetable.optdata))->substitutionTable_length / 2 ); FT_UShort i; diff --git a/src/gxvalid/gxvmort2.c b/src/gxvalid/gxvmort2.c index bfbe47372..92ccf064c 100644 --- a/src/gxvalid/gxvmort2.c +++ b/src/gxvalid/gxvmort2.c @@ -177,9 +177,10 @@ lig_action = FT_NEXT_ULONG( p ); - last = (lig_action & 0x80000000UL) / 0x80000000UL; - store = (lig_action & 0x40000000UL) / 0x40000000UL; - offset = lig_action & 0x3FFFFFFFUL; + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); + + offset = lig_action & 0x3FFFFFFFUL; } } @@ -202,9 +203,10 @@ FT_UNUSED( limit ); - setComponent = ( flags & 0x8000U ) / 0x8000U; - dontAdvance = ( flags & 0x4000 ) / 0x4000; - offset = flags & 0x3FFF; + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + + offset = (FT_UShort)( flags & 0x3FFFU ); if ( 0 < offset ) gxv_mort_subtable_type2_ligActionOffset_validate( table, offset, diff --git a/src/gxvalid/gxvmort4.c b/src/gxvalid/gxvmort4.c index 959220e10..a04bc1efa 100644 --- a/src/gxvalid/gxvmort4.c +++ b/src/gxvalid/gxvmort4.c @@ -87,8 +87,9 @@ FT_UShort offset; GXV_LookupValueDesc value; - - offset = base_value.u + relative_gindex * sizeof ( FT_UShort ); + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); p = valid->lookuptbl_head + offset; limit = lookuptbl_limit; diff --git a/src/gxvalid/gxvmort5.c b/src/gxvalid/gxvmort5.c index 5c90ed73b..a7cabc359 100644 --- a/src/gxvalid/gxvmort5.c +++ b/src/gxvalid/gxvmort5.c @@ -158,16 +158,18 @@ FT_UNUSED( state ); - setMark = ( flags >> 15 ) & 1; - dontAdvance = ( flags >> 14 ) & 1; - currentIsKashidaLike = ( flags >> 13 ) & 1; - markedIsKashidaLike = ( flags >> 12 ) & 1; - currentInsertBefore = ( flags >> 11 ) & 1; - markedInsertBefore = ( flags >> 10 ) & 1; - currentInsertCount = ( flags & 0x03E0 ) / 0x0020; - markedInsertCount = ( flags & 0x001F ); - currentInsertList = glyphOffset.ul / 0x00010000UL; - markedInsertList = glyphOffset.ul & 0x0000FFFFUL; + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_UShort)( glyphOffset.ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset.ul ); if ( 0 != currentInsertList && 0 != currentInsertCount ) { diff --git a/src/gxvalid/gxvmorx.c b/src/gxvalid/gxvmorx.c index 5f894c770..849d5e942 100644 --- a/src/gxvalid/gxvmorx.c +++ b/src/gxvalid/gxvmorx.c @@ -85,8 +85,8 @@ GXV_LIMIT_CHECK( rest ); /* morx coverage consists of mort_coverage & 16bit padding */ - gxv_mort_coverage_validate( ( coverage >> 16 ) | coverage, valid ); - + gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ), + valid ); if ( type > 5 ) FT_INVALID_FORMAT; @@ -128,7 +128,13 @@ /* feature-array of morx is same with that of mort */ gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid ); p += valid->subtable_length; - gxv_morx_subtables_validate( p, table + chainLength, nSubtables, valid ); + + if ( nSubtables >= 0x10000 ) + FT_INVALID_DATA; + + gxv_morx_subtables_validate( p, table + chainLength, + (FT_UShort)nSubtables, valid ); + valid->subtable_length = chainLength; GXV_EXIT; diff --git a/src/gxvalid/gxvmorx0.c b/src/gxvalid/gxvmorx0.c index a90294184..ca92b6c39 100644 --- a/src/gxvalid/gxvmorx0.c +++ b/src/gxvalid/gxvmorx0.c @@ -59,11 +59,12 @@ FT_UNUSED( limit ); - markFirst = flags / 0x8000U; - dontAdvance = ( flags & 0x4000 ) / 0x4000; - markLast = ( flags & 0x2000 ) / 0x2000; - reserved = flags & 0x1FF0; - verb = flags & 0x000F; + markFirst = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + markLast = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FF0 ); + verb = (FT_UShort)( flags & 0x000F ); if ( 0 < reserved ) { diff --git a/src/gxvalid/gxvmorx1.c b/src/gxvalid/gxvmorx1.c index 689e4a78a..4090be9e5 100644 --- a/src/gxvalid/gxvmorx1.c +++ b/src/gxvalid/gxvmorx1.c @@ -122,11 +122,13 @@ FT_UNUSED( limit ); - setMark = flags / 0x8000U; - dontAdvance = ( flags & 0x4000 ) / 0x4000; - reserved = flags & 0x3FFF; - markIndex = GXV_USHORT_TO_SHORT( glyphOffset.ul / 0x00010000UL ); - currentIndex = GXV_USHORT_TO_SHORT( glyphOffset.ul & 0x0000FFFFUL ); + setMark = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x3FFF ); + + markIndex = (FT_Short)( glyphOffset.ul >> 16 ); + currentIndex = (FT_Short)( glyphOffset.ul ); GXV_TRACE(( " setMark=%01d dontAdvance=%01d\n", setMark, dontAdvance )); @@ -142,10 +144,12 @@ markIndex, currentIndex )); if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 ) - optdata->substitutionTable_num_lookupTables = markIndex + 1; + optdata->substitutionTable_num_lookupTables = + (FT_Short)( markIndex + 1 ); if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 ) - optdata->substitutionTable_num_lookupTables = currentIndex + 1; + optdata->substitutionTable_num_lookupTables = + (FT_Short)( currentIndex + 1 ); } @@ -154,7 +158,10 @@ GXV_LookupValueDesc value, GXV_Validator valid ) { + FT_UNUSED( glyph ); /* for the non-debugging case */ + GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value.u )); + if ( value.u > valid->face->num_glyphs ) FT_INVALID_GLYPH_ID; } @@ -172,8 +179,9 @@ FT_UShort offset; GXV_LookupValueDesc value; - - offset = base_value.u + relative_gindex * sizeof ( FT_UShort ); + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof ( FT_UShort ) ); p = valid->lookuptbl_head + offset; limit = lookuptbl_limit; diff --git a/src/gxvalid/gxvmorx2.c b/src/gxvalid/gxvmorx2.c index 93fe318e9..5cad5169c 100644 --- a/src/gxvalid/gxvmorx2.c +++ b/src/gxvalid/gxvmorx2.c @@ -174,9 +174,10 @@ lig_action = FT_NEXT_ULONG( p ); - last = (lig_action & 0x80000000UL) / 0x80000000UL; - store = (lig_action & 0x40000000UL) / 0x40000000UL; - offset = lig_action & 0x3FFFFFFFUL; + last = (FT_UShort)( ( lig_action >> 31 ) & 1 ); + store = (FT_UShort)( ( lig_action >> 30 ) & 1 ); + + offset = lig_action & 0x3FFFFFFFUL; } } @@ -200,10 +201,11 @@ FT_UNUSED( limit ); - setComponent = ( flags & 0x8000U ) / 0x8000U; - dontAdvance = ( flags & 0x4000 ) / 0x4000; - performAction = ( flags & 0x2000 ) / 0x2000; - reserved = flags & 0x1FFF; + setComponent = (FT_UShort)( ( flags >> 15 ) & 1 ); + dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 ); + performAction = (FT_UShort)( ( flags >> 13 ) & 1 ); + + reserved = (FT_UShort)( flags & 0x1FFF ); ligActionIndex = glyphOffset.u; if ( reserved > 0 ) diff --git a/src/gxvalid/gxvmorx5.c b/src/gxvalid/gxvmorx5.c index de9aebc41..2920f5471 100644 --- a/src/gxvalid/gxvmorx5.c +++ b/src/gxvalid/gxvmorx5.c @@ -147,7 +147,7 @@ FT_Bool markedIsKashidaLike; FT_Bool currentInsertBefore; FT_Bool markedInsertBefore; - FT_Bool currentInsertCount; + FT_Byte currentInsertCount; FT_Byte markedInsertCount; FT_Byte currentInsertList; FT_UShort markedInsertList; @@ -155,16 +155,18 @@ FT_UNUSED( state ); - setMark = ( flags >> 15 ) & 1; - dontAdvance = ( flags >> 14 ) & 1; - currentIsKashidaLike = ( flags >> 13 ) & 1; - markedIsKashidaLike = ( flags >> 12 ) & 1; - currentInsertBefore = ( flags >> 11 ) & 1; - markedInsertBefore = ( flags >> 10 ) & 1; - currentInsertCount = ( flags & 0x03E0 ) / 0x20; - markedInsertCount = ( flags & 0x001F ); - currentInsertList = glyphOffset.ul / 0x00010000UL; - markedInsertList = glyphOffset.ul & 0x0000FFFFUL; + setMark = FT_BOOL( ( flags >> 15 ) & 1 ); + dontAdvance = FT_BOOL( ( flags >> 14 ) & 1 ); + currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 ); + markedIsKashidaLike = FT_BOOL( ( flags >> 12 ) & 1 ); + currentInsertBefore = FT_BOOL( ( flags >> 11 ) & 1 ); + markedInsertBefore = FT_BOOL( ( flags >> 10 ) & 1 ); + + currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F ); + markedInsertCount = (FT_Byte)( flags & 0x001F ); + + currentInsertList = (FT_Byte) ( glyphOffset.ul >> 16 ); + markedInsertList = (FT_UShort)( glyphOffset.ul ); if ( currentInsertList && 0 != currentInsertCount ) gxv_morx_subtable_type5_InsertList_validate( currentInsertList, diff --git a/src/gxvalid/gxvopbd.c b/src/gxvalid/gxvopbd.c index 12a21d46f..8d6fe669f 100644 --- a/src/gxvalid/gxvopbd.c +++ b/src/gxvalid/gxvopbd.c @@ -141,8 +141,9 @@ FT_UNUSED( lookuptbl_limit ); FT_UNUSED( valid ); - - value.u = base_value.u + relative_gindex * 4 * sizeof ( FT_Short ); + /* XXX: check range? */ + value.u = (FT_UShort)( base_value.u + + relative_gindex * 4 * sizeof ( FT_Short ) ); return value; } diff --git a/src/gxvalid/gxvprop.c b/src/gxvalid/gxvprop.c index b5211f16f..010eeda42 100644 --- a/src/gxvalid/gxvprop.c +++ b/src/gxvalid/gxvprop.c @@ -117,17 +117,17 @@ char complement; - offset = property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET; + offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET ); if ( offset == 0 ) FT_INVALID_DATA; - complement = offset >> 8; + complement = (char)( offset >> 8 ); if ( complement & 0x08 ) { /* Top bit is set: negative */ /* Calculate the absolute offset */ - complement = ( complement & 0x07 ) + 1; + complement = (char)( ( complement & 0x07 ) + 1 ); /* The gid for complement must be greater than 0 */ if ( glyph <= complement ) @@ -136,7 +136,7 @@ else { /* The gid for complement must be the face. */ - gxv_glyphid_validate( glyph + complement, valid ); + gxv_glyphid_validate( (FT_UShort)( glyph + complement ), valid ); } } else @@ -213,8 +213,9 @@ FT_UShort offset; GXV_LookupValueDesc value; - - offset = base_value.u + relative_gindex * sizeof( FT_UShort ); + /* XXX: check range? */ + offset = (FT_UShort)( base_value.u + + relative_gindex * sizeof( FT_UShort ) ); p = valid->lookuptbl_head + offset; limit = lookuptbl_limit; diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c index a282681f8..2c6f34720 100644 --- a/src/sfnt/sfdriver.c +++ b/src/sfnt/sfdriver.c @@ -318,12 +318,6 @@ { FT_UNUSED( module ); - if ( ft_strcmp( module_interface, "get_sfnt" ) == 0 ) - return (FT_Module_Interface)get_sfnt_table; - - if ( ft_strcmp( module_interface, "load_sfnt" ) == 0 ) - return (FT_Module_Interface)tt_face_load_any; - return ft_service_list_lookup( sfnt_services, module_interface ); } diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c index 9e846624a..bb6752a73 100644 --- a/src/sfnt/sfobjs.c +++ b/src/sfnt/sfobjs.c @@ -536,9 +536,11 @@ /* Compute face flags. */ /* */ if ( has_outline == TRUE ) - flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ + flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ - flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ + /* The sfnt driver only supports bitmap fonts natively, thus we */ + /* don't set FT_FACE_FLAG_HINTER. */ + flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c index 1c008661e..d606cdbd2 100644 --- a/src/truetype/ttgload.c +++ b/src/truetype/ttgload.c @@ -755,20 +755,23 @@ /* */ #define cur_to_org( n, zone ) \ FT_ARRAY_COPY( (zone)->org, (zone)->cur, (n) ) + static FT_Error - TT_Hint_Glyph( TT_Loader loader, - FT_Bool is_composite ) + TT_Hint_Glyph( TT_Loader loader, + FT_Bool is_composite ) { TT_GlyphZone zone = &loader->zone; FT_Pos origin; #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - FT_UInt n_ins; +#else + FT_UNUSED( is_composite ); +#endif +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER n_ins = loader->glyph->control_len; - #endif origin = zone->cur[zone->n_points - 4].x; @@ -777,16 +780,16 @@ translate_array( zone->n_points, zone->cur, origin, 0 ); #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER - /* save original point positioin in org */ if ( n_ins > 0 ) cur_to_org( zone->n_points, zone ); - #endif /* round pp2 and pp4 */ - zone->cur[zone->n_points - 3].x = FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); - zone->cur[zone->n_points - 1].y = FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); + zone->cur[zone->n_points - 3].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); + zone->cur[zone->n_points - 1].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER @@ -801,8 +804,8 @@ if ( error ) return error; - loader->exec->is_composite = is_composite; - loader->exec->pts = *zone; + loader->exec->is_composite = is_composite; + loader->exec->pts = *zone; debug = !( loader->load_flags & FT_LOAD_NO_SCALE ) && ( (TT_Size)loader->size )->debug; @@ -840,13 +843,13 @@ static FT_Error TT_Process_Simple_Glyph( TT_Loader loader ) { - FT_GlyphLoader gloader = loader->gloader; - FT_Error error = TT_Err_Ok; + FT_GlyphLoader gloader = loader->gloader; + FT_Error error = TT_Err_Ok; FT_Outline* outline; FT_UInt n_points; - outline = &gloader->current.outline; + outline = &gloader->current.outline; n_points = outline->n_points; /* set phantom points */ @@ -868,9 +871,9 @@ if ( ((TT_Face)loader->face)->doblend ) { /* Deltas apply to the unscaled data. */ - FT_Vector* deltas; - FT_Memory memory = loader->face->memory; - FT_UInt i; + FT_Vector* deltas; + FT_Memory memory = loader->face->memory; + FT_UInt i; error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face), @@ -944,11 +947,11 @@ FT_UInt num_points = gloader->base.outline.n_points; FT_Bool have_scale; FT_Pos x, y; - - have_scale = subglyph->flags & ( WE_HAVE_A_SCALE | - WE_HAVE_AN_XY_SCALE | - WE_HAVE_A_2X2 ); + + have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | + WE_HAVE_AN_XY_SCALE | + WE_HAVE_A_2X2 ) ); /* perform the transform required for this subglyph */ if ( have_scale ) @@ -1004,6 +1007,7 @@ ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) #endif { + #if 0 /*************************************************************************/ @@ -1039,7 +1043,7 @@ FT_MulFix( subglyph->transform.xx, subglyph->transform.xx ) + FT_MulFix( subglyph->transform.xy, - subglyph->transform.xy) ); + subglyph->transform.xy ) ); FT_Fixed mac_yscale = FT_SqrtFixed( FT_MulFix( subglyph->transform.yy, subglyph->transform.yy ) + @@ -1126,7 +1130,7 @@ /* TT_Load_Composite_Glyph only gives us the offset of instructions */ - /* so we read them here */ + /* so we read them here */ if ( FT_STREAM_SEEK( loader->ins_pos ) || FT_READ_USHORT( n_ins ) ) return error; @@ -1198,17 +1202,13 @@ FT_Bool opened_frame = 0; #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT - FT_Vector* deltas = NULL; - #endif #ifdef FT_CONFIG_OPTION_INCREMENTAL - FT_StreamRec inc_stream; FT_Data glyph_data; FT_Bool glyph_data_loaded = 0; - #endif @@ -1276,9 +1276,9 @@ left_bearing = (FT_Short)metrics.bearing_x; advance_width = (FT_UShort)metrics.advance; -# if 0 +#if 0 - /* GWW: Do I do the same for vertical metrics ??? */ + /* GWW: Do I do the same for vertical metrics? */ metrics.bearing_x = 0; metrics.bearing_y = top_bearing; metrics.advance = advance_height; @@ -1290,7 +1290,7 @@ top_bearing = (FT_Short)metrics.bearing_y; advance_height = (FT_UShort)metrics.advance; -# endif +#endif /* 0 */ } diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c index b61d50cb8..e73efb6ae 100644 --- a/src/truetype/ttobjs.c +++ b/src/truetype/ttobjs.c @@ -203,7 +203,11 @@ goto Bad_Format; } - /* If we are performing a simple font format check, exit immediately */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + face->root.face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* If we are performing a simple font format check, exit immediately. */ if ( face_index < 0 ) return TT_Err_Ok; diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c index 519fa08d9..0e5659088 100644 --- a/src/type1/t1objs.c +++ b/src/type1/t1objs.c @@ -4,7 +4,7 @@ /* */ /* Type 1 objects manager (body). */ /* */ -/* Copyright 1996-2001, 2002, 2003, 2004 by */ +/* Copyright 1996-2001, 2002, 2003, 2004, 2005 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ @@ -329,9 +329,10 @@ root->num_glyphs = type1->num_glyphs; root->face_index = face_index; - root->face_flags = FT_FACE_FLAG_SCALABLE; - root->face_flags |= FT_FACE_FLAG_HORIZONTAL; - root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; + root->face_flags = FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES | + FT_FACE_FLAG_HINTER; if ( info->is_fixed_pitch ) root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c index d51a91cd5..814ad90a3 100644 --- a/src/type42/t42objs.c +++ b/src/type42/t42objs.c @@ -202,13 +202,17 @@ root->num_charmaps = 0; root->face_index = face_index; - root->face_flags = FT_FACE_FLAG_SCALABLE; - root->face_flags |= FT_FACE_FLAG_HORIZONTAL; - root->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; + root->face_flags = FT_FACE_FLAG_SCALABLE | + FT_FACE_FLAG_HORIZONTAL | + FT_FACE_FLAG_GLYPH_NAMES; if ( info->is_fixed_pitch ) root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH; +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER + root->face_flags |= FT_FACE_FLAG_HINTER; +#endif + /* XXX: TODO -- add kerning with .afm support */ /* get style name -- be careful, some broken fonts only */ -- cgit v1.2.1