]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcfreetype.c
[int] Define MIN/MAX/ABS macros
[fontconfig.git] / src / fcfreetype.c
index 4ee8a63c34c94c5806ff2f73c8b3c48972b3d233..c30826e52549264ebe7161400ddc4842d0468be0 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $RCSId: xc/lib/fontconfig/src/fcfreetype.c,v 1.11 2002/08/31 22:17:32 keithp Exp $
+ * fontconfig/src/fcfreetype.c
  *
  * Copyright © 2001 Keith Packard
  *
@@ -13,9 +13,9 @@
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
@@ -120,11 +120,11 @@ static const FcFtEncoding   fcFtEncoding[] = {
  {  TT_PLATFORM_MACINTOSH,     TT_MAC_ID_JAPANESE,     "SJIS" },
  {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS,    "UTF-16BE" },
  {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,          "SJIS-WIN" },
- {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,        "GB3212" },
+ {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,        "GB2312" },
  {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,         "BIG-5" },
  {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,       "Wansung" },
  {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,         "Johab" },
- {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,         "UCS4" },
+ {  TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,         "UCS-2BE" },
  {  TT_PLATFORM_ISO,           TT_ISO_ID_7BIT_ASCII,   "ASCII" },
  {  TT_PLATFORM_ISO,           TT_ISO_ID_10646,        "UCS-2BE" },
  {  TT_PLATFORM_ISO,           TT_ISO_ID_8859_1,       "ISO-8859-1" },
@@ -1016,6 +1016,7 @@ static const FcStringConst  widthConsts[] = {
     { (FC8) "extraexpanded",   FC_WIDTH_EXTRAEXPANDED },
     { (FC8) "ultraexpanded",   FC_WIDTH_ULTRAEXPANDED },
     { (FC8) "expanded",                FC_WIDTH_EXPANDED },    /* must be after *expanded */
+    { (FC8) "extended",                FC_WIDTH_EXPANDED },
 };
 
 #define NUM_WIDTH_CONSTS    (int) (sizeof (widthConsts) / sizeof (widthConsts[0]))
@@ -1036,11 +1037,11 @@ static const FcStringConst  slantConsts[] = {
 
 static const FcStringConst  decorativeConsts[] = {
     { (FC8) "shadow",          FcTrue },
-    { (FC8) "smallcaps",       FcTrue },
+    { (FC8) "caps",            FcTrue },
     { (FC8) "antiqua",         FcTrue },
     { (FC8) "romansc",         FcTrue },
     { (FC8) "embosed",         FcTrue },
-    { (FC8) "romansmallcaps",  FcTrue },
+    { (FC8) "dunhill",         FcTrue },
 };
 
 #define NUM_DECORATIVE_CONSTS  (int) (sizeof (decorativeConsts) / sizeof (decorativeConsts[0]))
@@ -1090,10 +1091,16 @@ static const FT_UShort platform_order[] = {
 #define NUM_PLATFORM_ORDER (sizeof (platform_order) / sizeof (platform_order[0]))
 
 static const FT_UShort nameid_order[] = {
+#ifdef TT_NAME_ID_WWS_FAMILY
+    TT_NAME_ID_WWS_FAMILY,
+#endif
     TT_NAME_ID_PREFERRED_FAMILY,
     TT_NAME_ID_FONT_FAMILY,
     TT_NAME_ID_MAC_FULL_NAME,
     TT_NAME_ID_FULL_NAME,
+#ifdef TT_NAME_ID_WWS_SUBFAMILY
+    TT_NAME_ID_WWS_SUBFAMILY,
+#endif
     TT_NAME_ID_PREFERRED_SUBFAMILY,
     TT_NAME_ID_FONT_SUBFAMILY,
     TT_NAME_ID_TRADEMARK,
@@ -1118,7 +1125,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
 #if 0
     FcChar8        *family = 0;
 #endif
-    FcChar8        *complex;
+    FcChar8        *complex_;
     const FcChar8   *foundry = 0;
     int                    spacing;
     TT_OS2         *os2;
@@ -1235,6 +1242,9 @@ FcFreeTypeQueryFace (const FT_Face  face,
                    continue;
 
                switch (sname.name_id) {
+#ifdef TT_NAME_ID_WWS_FAMILY
+               case TT_NAME_ID_WWS_FAMILY:
+#endif
                case TT_NAME_ID_PREFERRED_FAMILY:
                case TT_NAME_ID_FONT_FAMILY:
 #if 0      
@@ -1265,6 +1275,9 @@ FcFreeTypeQueryFace (const FT_Face  face,
                    np = &nfullname;
                    nlangp = &nfullname_lang;
                    break;
+#ifdef TT_NAME_ID_WWS_SUBFAMILY
+               case TT_NAME_ID_WWS_SUBFAMILY:
+#endif
                case TT_NAME_ID_PREFERRED_SUBFAMILY:
                case TT_NAME_ID_FONT_SUBFAMILY:
                    if (FcDebug () & FC_DBG_SCANV)
@@ -1477,14 +1490,14 @@ FcFreeTypeQueryFace (const FT_Face  face,
            printf ("\tos2 width class %d maps to width %d\n",
                    os2->usWidthClass, width);
     }
-    if (os2 && (complex = FcFontCapabilities(face)))
+    if (os2 && (complex_ = FcFontCapabilities(face)))
     {
-       if (!FcPatternAddString (pat, FC_CAPABILITY, complex))
+       if (!FcPatternAddString (pat, FC_CAPABILITY, complex_))
        {
-           free (complex);
+           free (complex_);
            goto bail1;
        }
-       free (complex);
+       free (complex_);
     }
 
     /*
@@ -1661,7 +1674,7 @@ FcFreeTypeQueryFace (const FT_Face  face,
     /*
      * Skip over PCF fonts that have no encoded characters; they're
      * usually just Unicode fonts transcoded to some legacy encoding
-     * ftglue.c forces us to approximate whether a font is a PCF font
+     * FT forces us to approximate whether a font is a PCF font
      * or not by whether it has any BDF properties.  Try PIXEL_SIZE;
      * I don't know how to get a list of BDF properties on the font. -PL
      */
@@ -2524,9 +2537,6 @@ FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4,
     return FcFalse;
 }
 
-#define FC_MIN(a,b) ((a) < (b) ? (a) : (b))
-#define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
-#define FC_ABS(a)   ((a) < 0 ? -(a) : (a))
 #define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33)
 
 static FcCharSet *
@@ -2550,11 +2560,13 @@ FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing
     if (!fcs)
        goto bail0;
     
+#if HAVE_FT_SELECT_SIZE
     if (strike_index >= 0) {
        if (FT_Select_Size (face, strike_index) != FT_Err_Ok)
            goto bail1;
        using_strike = FcTrue;
     }
+#endif
 
 #ifdef CHECK
     printf ("Family %s style %s\n", face->family_name, face->style_name);
@@ -2800,10 +2812,6 @@ FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks)
 #define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
 #define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
 #define TTAG_SILF  FT_MAKE_TAG( 'S', 'i', 'l', 'f')
-#define TT_Err_Ok FT_Err_Ok
-#define TT_Err_Invalid_Face_Handle FT_Err_Invalid_Face_Handle
-#define TTO_Err_Empty_Script              0x1005
-#define TTO_Err_Invalid_SubTable          0x1001
 
 #define OTLAYOUT_HEAD      "otlayout:"
 #define OTLAYOUT_HEAD_LEN   9
@@ -2819,7 +2827,7 @@ FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks)
 #define FcIsValidScript(x)  (FcIsLower(x) || FcIsUpper (x) || FcIsSpace(x))
                             
 static void
-addtag(FcChar8 *complex, FT_ULong tag)
+addtag(FcChar8 *complex_, FT_ULong tag)
 {
     FcChar8 tagstring[OTLAYOUT_ID_LEN + 1];
 
@@ -2838,10 +2846,10 @@ addtag(FcChar8 *complex, FT_ULong tag)
        !FcIsValidScript(tagstring[3]))
        return;
 
-    if (*complex != '\0')
-       strcat ((char *) complex, " ");
-    strcat ((char *) complex, "otlayout:");
-    strcat ((char *) complex, (char *) tagstring);
+    if (*complex_ != '\0')
+       strcat ((char *) complex_, " ");
+    strcat ((char *) complex_, "otlayout:");
+    strcat ((char *) complex_, (char *) tagstring);
 }
 
 static int
@@ -2853,29 +2861,30 @@ compareulong (const void *a, const void *b)
 }
 
 
-static FT_Error
-GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *script_count)
+static int
+GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags)
 {
-    FT_ULong         cur_offset, new_offset, base_offset;
+    FT_ULong   cur_offset, new_offset, base_offset;
     FT_Stream  stream = face->stream;
     FT_Error   error;
-    FT_UShort          n, p;
+    FT_UShort  n, p;
     FT_Memory  memory;
+    int        script_count;
 
-    if ( !stream )
-       return TT_Err_Invalid_Face_Handle;
+    if (!stream)
+        return 0;
 
     memory = stream->memory;
 
     if (( error = ftglue_face_goto_table( face, tabletag, stream ) ))
-       return error;
+       return 0;
 
     base_offset = ftglue_stream_pos ( stream );
 
     /* skip version */
 
     if ( ftglue_stream_seek ( stream, base_offset + 4L ) || ftglue_stream_frame_enter( stream, 2L ) )
-       return error;
+       return 0;
 
     new_offset = GET_UShort() + base_offset;
 
@@ -2883,25 +2892,24 @@ GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *scri
 
     cur_offset = ftglue_stream_pos( stream );
 
-    if ( ftglue_stream_seek( stream, new_offset ) != TT_Err_Ok )
-       return error;
+    if ( ftglue_stream_seek( stream, new_offset ) != FT_Err_Ok )
+       return 0;
 
     base_offset = ftglue_stream_pos( stream );
 
     if ( ftglue_stream_frame_enter( stream, 2L ) )
-       return error;
+       return 0;
 
-    *script_count = GET_UShort ();
+    script_count = GET_UShort ();
 
     ftglue_stream_frame_exit( stream );
 
-    *stags = ftglue_alloc(memory, *script_count * sizeof( FT_ULong ), &error);
-
-    if (error)
-       return error;
+    *stags = malloc(script_count * sizeof (FT_ULong));
+    if (!stags)
+       return 0;
 
     p = 0;
-    for ( n = 0; n < *script_count; n++ )
+    for ( n = 0; n < script_count; n++ )
     {
         if ( ftglue_stream_frame_enter( stream, 6L ) )
            goto Fail;
@@ -2915,28 +2923,24 @@ GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags, FT_UShort *scri
 
        error = ftglue_stream_seek( stream, new_offset );
 
-       if ( error == TT_Err_Ok )
+       if ( error == FT_Err_Ok )
            p++;
 
        (void)ftglue_stream_seek( stream, cur_offset );
     }
 
     if (!p)
-    {
-       error = TTO_Err_Invalid_SubTable;
        goto Fail;
-    }
 
     /* sort the tag list before returning it */
-    qsort(*stags, *script_count, sizeof(FT_ULong), compareulong);
+    qsort(*stags, script_count, sizeof(FT_ULong), compareulong);
 
-    return TT_Err_Ok;
+    return script_count;
 
 Fail:
-    *script_count = 0;
-    ftglue_free( memory, *stags );
+    free(*stags);
     *stags = NULL;
-    return error;
+    return 0;
 }
 
 static FcChar8 *
@@ -2949,52 +2953,50 @@ FcFontCapabilities(FT_Face face)
     FT_UShort gsub_count=0, gpos_count=0;
     FT_ULong maxsize;
     FT_Memory  memory = face->stream->memory;
-    FcChar8 *complex = NULL;
+    FcChar8 *complex_ = NULL;
     int indx1 = 0, indx2 = 0;
 
     err = FT_Load_Sfnt_Table(face, TTAG_SILF, 0, 0, &len);
     issilgraphitefont = ( err == FT_Err_Ok);
 
-    if (GetScriptTags(face, TTAG_GPOS, &gpostags, &gpos_count) != FT_Err_Ok)
-       gpos_count = 0;
-    if (GetScriptTags(face, TTAG_GSUB, &gsubtags, &gsub_count) != FT_Err_Ok)
-       gsub_count = 0;
-    
+    gpos_count = GetScriptTags(face, TTAG_GPOS, &gpostags);
+    gsub_count = GetScriptTags(face, TTAG_GSUB, &gsubtags);
+
     if (!issilgraphitefont && !gsub_count && !gpos_count)
        goto bail;
 
     maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN + 
               (issilgraphitefont ? 13 : 0));
-    complex = malloc (sizeof (FcChar8) * maxsize);
-    if (!complex)
+    complex_ = malloc (sizeof (FcChar8) * maxsize);
+    if (!complex_)
        goto bail;
 
-    complex[0] = '\0';
+    complex_[0] = '\0';
     if (issilgraphitefont)
-        strcpy((char *) complex, "ttable:Silf ");
+        strcpy((char *) complex_, "ttable:Silf ");
 
     while ((indx1 < gsub_count) || (indx2 < gpos_count)) {
        if (indx1 == gsub_count) {
-           addtag(complex, gpostags[indx2]);
+           addtag(complex_, gpostags[indx2]);
            indx2++;
        } else if ((indx2 == gpos_count) || (gsubtags[indx1] < gpostags[indx2])) {
-           addtag(complex, gsubtags[indx1]);
+           addtag(complex_, gsubtags[indx1]);
            indx1++;
        } else if (gsubtags[indx1] == gpostags[indx2]) {
-           addtag(complex, gsubtags[indx1]);
+           addtag(complex_, gsubtags[indx1]);
            indx1++;
            indx2++;
        } else {
-           addtag(complex, gpostags[indx2]);
+           addtag(complex_, gpostags[indx2]);
            indx2++;
        }
     }
     if (FcDebug () & FC_DBG_SCANV)
-       printf("complex features in this font: %s\n", complex);
+       printf("complex_ features in this font: %s\n", complex_);
 bail:
-    ftglue_free(memory, gsubtags);
-    ftglue_free(memory, gpostags);
-    return complex;
+    free(gsubtags);
+    free(gpostags);
+    return complex_;
 }
 
 #define __fcfreetype__