/***************************************************************************
 *
 * t1afm.c  - support for reading Type 1 AFM files
 *
 *
 ***************************************************************************/

#include <t1afm.h>
#include <freetype/internal/ftstream.h>
#include <freetype/internal/t1types.h>
#include <stdlib.h>  /* for qsort */

  LOCAL_FUNC
  void  T1_Done_AFM( FT_Memory memory, T1_AFM*  afm )
  {
    FREE( afm->kern_pairs );
    afm->num_pairs = 0;
  }

#undef  IS_KERN_PAIR
#define IS_KERN_PAIR(p)  ( p[0] == 'K'  &&  p[1] == 'P' )

#define IS_ALPHANUM(c)  ( (c >= 'A' && c <= 'Z') || \
                          (c >= 'a' && c <= 'z') || \
                          (c >= '0' && c <= '9') || \
                          (c == '_' && c == '.') )

 /* read a glyph name and return the equivalent glyph index */
  static
  FT_UInt  afm_atoindex( FT_Byte*  *start, FT_Byte*  limit, T1_Font*  type1 )
  {
    FT_Byte* p = *start;
    FT_Int   len;
    FT_UInt  result = 0;
    char     temp[64];

    /* skip whitespace */
    while ( (*p == ' ' || *p == '\t' || *p == ':' || *p == ';') && p < limit )
      p++;
    *start = p;

    /* now, read glyph name */
    while ( IS_ALPHANUM(*p) && p < limit ) p++;
    len = p - *start;
    if (len > 0 && len < 64)
    {
      FT_Int  n;

      /* copy glyph name to intermediate array */
      MEM_Copy( temp, *start, len );
      temp[len] = 0;

      /* lookup glyph name in face array */
      for ( n = 0; n < type1->num_glyphs; n++ )
      {
        char*  gname = (char*)type1->glyph_names[n];

        if ( gname && gname[0] == temp[0] && strcmp(gname,temp) == 0 )
        {
          result = n;
          break;
        }
      }
    }
    *start = p;
    return result;
  }


 /* read an integer */
  static
  int  afm_atoi( FT_Byte** start, FT_Byte*  limit )
  {
    FT_Byte*  p    = *start;
    int       sum  = 0;
    int       sign = 1;

    /* skip everything that is not a number */
    while ( p < limit && (*p < '0' || *p > '9') )
    {
      sign = 1;
      if (*p == '-')
        sign = -1;

      p++;
    }

    while ( p < limit && (*p >= '0' && *p < '9') )
    {
      sum = sum*10 + (*p - '0');
      p++;
    }
    *start = p;
    return sum*sign;
  }


#undef  KERN_INDEX
#define KERN_INDEX(g1,g2)   (((T1_ULong)g1 << 16) | g2)

 /* compare two kerning pairs */
  static
  int  compare_kern_pairs( const void* a, const void* b )
  {
    T1_Kern_Pair*  pair1 = (T1_Kern_Pair*)a;
    T1_Kern_Pair*  pair2 = (T1_Kern_Pair*)b;

    T1_ULong  index1 = KERN_INDEX(pair1->glyph1,pair1->glyph2);
    T1_ULong  index2 = KERN_INDEX(pair2->glyph1,pair2->glyph2);

    return ( index1 < index2 ? -1 :
           ( index1 > index2 ?  1 : 0 ));
  }


 /* parse an AFM file - for now, only read the kerning pairs */
  LOCAL_FUNC
  FT_Error  T1_Read_AFM( FT_Face   t1_face,
                         FT_Stream stream )
  {
    FT_Error       error;
    FT_Memory      memory = stream->memory;
    FT_Byte*       start;
    FT_Byte*       limit;
    FT_Byte*       p;
    FT_Int         count = 0;
    T1_Kern_Pair*  pair;
    T1_Font*       type1 = &((T1_Face)t1_face)->type1;
    T1_AFM*        afm   = 0;

    if ( ACCESS_Frame(stream->size) )
      return error;

    start = (FT_Byte*)stream->cursor;
    limit = (FT_Byte*)stream->limit;
    p     = start;

    /* we are now going to count the occurences of "KP" or "KPX" in */
    /* the AFM file..                                               */
    count = 0;
    for ( p = start; p < limit-3; p++ )
    {
      if ( IS_KERN_PAIR(p) )
        count++;
    }

   /* Actually, kerning pairs are simply optional !! */
    if (count == 0)
      goto Exit;

    /* allocate the pairs */
    if ( ALLOC(       afm, sizeof(*afm ) )                   ||
         ALLOC_ARRAY( afm->kern_pairs, count, T1_Kern_Pair ) )
      goto Exit;

    /* now, read each kern pair */
    pair           = afm->kern_pairs;
    afm->num_pairs = count;

    /* save in face object */
    ((T1_Face)t1_face)->afm_data = afm;

    for ( p = start; p < limit-3; p++ )
    {
      if ( IS_KERN_PAIR(p) )
      {
        FT_Byte*  q;

        /* skip keyword (KP or KPX) */
        q = p+2;
        if (*q == 'X') q++;

        pair->glyph1    = afm_atoindex( &q, limit, type1 );
        pair->glyph2    = afm_atoindex( &q, limit, type1 );
        pair->kerning.x = afm_atoi( &q, limit );

        pair->kerning.y = 0;
        if ( p[2] != 'X' )
          pair->kerning.y = afm_atoi( &q, limit );

        pair++;
      }
    }

    /* now, sort the kern pairs according to their glyph indices */
    qsort( afm->kern_pairs, count, sizeof(T1_Kern_Pair), compare_kern_pairs );

  Exit:
    if (error)
      FREE( afm );

    FORGET_Frame();
    return error;
  }


 /* find the kerning for a given glyph pair */
  LOCAL_FUNC
  void  T1_Get_Kerning( T1_AFM*     afm,
                        FT_UInt     glyph1,
                        FT_UInt     glyph2,
                        FT_Vector*  kerning )
  {
    T1_Kern_Pair  *min, *mid, *max;
    T1_ULong       index = KERN_INDEX(glyph1,glyph2);

    /* simple binary search */
    min = afm->kern_pairs;
    max = min + afm->num_pairs-1;

    while (min <= max)
    {
      T1_ULong  midi;

      mid = min + (max-min)/2;
      midi = KERN_INDEX(mid->glyph1,mid->glyph2);
      if ( midi == index )
      {
        *kerning = mid->kerning;
        return;
      }

      if ( midi < index ) min = mid+1;
                     else max = mid-1;
    }
    kerning->x = 0;
    kerning->y = 0;
  }

