misc/libfreetype/src/sfnt/ttcmap.c
author sheepluva
Tue, 04 Sep 2012 13:18:26 +0200
changeset 7669 a85e1c167b69
parent 5172 88f2e05288ba
permissions -rw-r--r--
I didn't want to do this since it seems less clean, but... moving the stats-fix into CheckForWin, since that function is the one sending the damage stats (whyyyy?) therefore it's not sufficient to update stats after calling it, some of the stats won't be transfered to frontend then
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5172
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     1
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     2
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     3
/*  ttcmap.c                                                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     4
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     5
/*    TrueType character mapping table (cmap) support (body).              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     6
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     7
/*  Copyright 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 by      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     8
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
     9
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    10
/*  This file is part of the FreeType project, and may only be used,       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    11
/*  modified, and distributed under the terms of the FreeType project      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    12
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    13
/*  this file you indicate that you have read the license and              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    14
/*  understand and accept it fully.                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    15
/*                                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    16
/***************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    17
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    18
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    19
#include <ft2build.h>
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    20
#include FT_INTERNAL_DEBUG_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    21
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    22
#include "sferrors.h"           /* must come before FT_INTERNAL_VALIDATE_H */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    23
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    24
#include FT_INTERNAL_VALIDATE_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    25
#include FT_INTERNAL_STREAM_H
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    26
#include "ttload.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    27
#include "ttcmap.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    28
#include "sfntpic.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    29
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    30
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    31
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    32
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    33
  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    34
  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    35
  /* messages during execution.                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    36
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    37
#undef  FT_COMPONENT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    38
#define FT_COMPONENT  trace_ttcmap
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    39
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    40
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    41
#define TT_PEEK_SHORT   FT_PEEK_SHORT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    42
#define TT_PEEK_USHORT  FT_PEEK_USHORT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    43
#define TT_PEEK_UINT24  FT_PEEK_UOFF3
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    44
#define TT_PEEK_LONG    FT_PEEK_LONG
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    45
#define TT_PEEK_ULONG   FT_PEEK_ULONG
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    46
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    47
#define TT_NEXT_SHORT   FT_NEXT_SHORT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    48
#define TT_NEXT_USHORT  FT_NEXT_USHORT
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    49
#define TT_NEXT_UINT24  FT_NEXT_UOFF3
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    50
#define TT_NEXT_LONG    FT_NEXT_LONG
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    51
#define TT_NEXT_ULONG   FT_NEXT_ULONG
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    52
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    53
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    54
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    55
  tt_cmap_init( TT_CMap   cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    56
                FT_Byte*  table )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    57
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    58
    cmap->data = table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    59
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    60
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    61
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    62
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    63
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    64
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    65
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    66
  /*****                           FORMAT 0                            *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    67
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    68
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    69
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    70
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    71
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    72
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    73
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    74
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    75
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    76
  /*   NAME        OFFSET         TYPE          DESCRIPTION                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    77
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    78
  /*   format      0              USHORT        must be 0                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    79
  /*   length      2              USHORT        table length in bytes      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    80
  /*   language    4              USHORT        Mac language code          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    81
  /*   glyph_ids   6              BYTE[256]     array of glyph indices     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    82
  /*               262                                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    83
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    84
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    85
#ifdef TT_CONFIG_CMAP_FORMAT_0
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    86
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    87
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    88
  tt_cmap0_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    89
                     FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    90
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    91
    FT_Byte*  p      = table + 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    92
    FT_UInt   length = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    93
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    94
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    95
    if ( table + length > valid->limit || length < 262 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    96
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    97
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    98
    /* check glyph indices whenever necessary */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
    99
    if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   100
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   101
      FT_UInt  n, idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   102
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   103
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   104
      p = table + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   105
      for ( n = 0; n < 256; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   106
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   107
        idx = *p++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   108
        if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   109
          FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   110
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   111
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   112
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   113
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   114
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   115
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   116
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   117
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   118
  tt_cmap0_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   119
                       FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   120
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   121
    FT_Byte*  table = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   122
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   123
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   124
    return char_code < 256 ? table[6 + char_code] : 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   125
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   126
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   127
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   128
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   129
  tt_cmap0_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   130
                      FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   131
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   132
    FT_Byte*   table    = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   133
    FT_UInt32  charcode = *pchar_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   134
    FT_UInt32  result   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   135
    FT_UInt    gindex   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   136
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   137
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   138
    table += 6;  /* go to glyph IDs */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   139
    while ( ++charcode < 256 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   140
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   141
      gindex = table[charcode];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   142
      if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   143
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   144
        result = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   145
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   146
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   147
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   148
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   149
    *pchar_code = result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   150
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   151
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   152
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   153
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   154
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   155
  tt_cmap0_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   156
                     TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   157
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   158
    FT_Byte*  p = cmap->data + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   159
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   160
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   161
    cmap_info->format   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   162
    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   163
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   164
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   165
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   166
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   167
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   168
  FT_DEFINE_TT_CMAP(tt_cmap0_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   169
      sizeof ( TT_CMapRec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   170
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   171
      (FT_CMap_InitFunc)     tt_cmap_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   172
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   173
      (FT_CMap_CharIndexFunc)tt_cmap0_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   174
      (FT_CMap_CharNextFunc) tt_cmap0_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   175
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   176
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   177
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   178
    0,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   179
    (TT_CMap_ValidateFunc)   tt_cmap0_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   180
    (TT_CMap_Info_GetFunc)   tt_cmap0_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   181
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   182
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   183
#endif /* TT_CONFIG_CMAP_FORMAT_0 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   184
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   185
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   186
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   187
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   188
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   189
  /*****                          FORMAT 2                             *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   190
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   191
  /***** This is used for certain CJK encodings that encode text in a  *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   192
  /***** mixed 8/16 bits encoding along the following lines:           *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   193
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   194
  /***** * Certain byte values correspond to an 8-bit character code   *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   195
  /*****   (typically in the range 0..127 for ASCII compatibility).    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   196
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   197
  /***** * Certain byte values signal the first byte of a 2-byte       *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   198
  /*****   character code (but these values are also valid as the      *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   199
  /*****   second byte of a 2-byte character).                         *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   200
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   201
  /***** The following charmap lookup and iteration functions all      *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   202
  /***** assume that the value "charcode" correspond to following:     *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   203
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   204
  /*****   - For one byte characters, "charcode" is simply the         *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   205
  /*****     character code.                                           *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   206
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   207
  /*****   - For two byte characters, "charcode" is the 2-byte         *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   208
  /*****     character code in big endian format.  More exactly:       *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   209
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   210
  /*****       (charcode >> 8)    is the first byte value              *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   211
  /*****       (charcode & 0xFF)  is the second byte value             *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   212
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   213
  /***** Note that not all values of "charcode" are valid according    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   214
  /***** to these rules, and the function moderately check the         *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   215
  /***** arguments.                                                    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   216
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   217
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   218
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   219
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   220
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   221
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   222
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   223
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   224
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   225
  /*   NAME        OFFSET         TYPE            DESCRIPTION              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   226
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   227
  /*   format      0              USHORT          must be 2                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   228
  /*   length      2              USHORT          table length in bytes    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   229
  /*   language    4              USHORT          Mac language code        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   230
  /*   keys        6              USHORT[256]     sub-header keys          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   231
  /*   subs        518            SUBHEAD[NSUBS]  sub-headers array        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   232
  /*   glyph_ids   518+NSUB*8     USHORT[]        glyph ID array           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   233
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   234
  /* The `keys' table is used to map charcode high-bytes to sub-headers.   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   235
  /* The value of `NSUBS' is the number of sub-headers defined in the      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   236
  /* table and is computed by finding the maximum of the `keys' table.     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   237
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   238
  /* Note that for any n, `keys[n]' is a byte offset within the `subs'     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   239
  /* table, i.e., it is the corresponding sub-header index multiplied      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   240
  /* by 8.                                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   241
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   242
  /* Each sub-header has the following format:                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   243
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   244
  /*   NAME        OFFSET      TYPE            DESCRIPTION                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   245
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   246
  /*   first       0           USHORT          first valid low-byte        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   247
  /*   count       2           USHORT          number of valid low-bytes   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   248
  /*   delta       4           SHORT           see below                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   249
  /*   offset      6           USHORT          see below                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   250
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   251
  /* A sub-header defines, for each high-byte, the range of valid          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   252
  /* low-bytes within the charmap.  Note that the range defined by `first' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   253
  /* and `count' must be completely included in the interval [0..255]      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   254
  /* according to the specification.                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   255
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   256
  /* If a character code is contained within a given sub-header, then      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   257
  /* mapping it to a glyph index is done as follows:                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   258
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   259
  /* * The value of `offset' is read.  This is a _byte_ distance from the  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   260
  /*   location of the `offset' field itself into a slice of the           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   261
  /*   `glyph_ids' table.  Let's call it `slice' (it is a USHORT[] too).   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   262
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   263
  /* * The value `slice[char.lo - first]' is read.  If it is 0, there is   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   264
  /*   no glyph for the charcode.  Otherwise, the value of `delta' is      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   265
  /*   added to it (modulo 65536) to form a new glyph index.               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   266
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   267
  /* It is up to the validation routine to check that all offsets fall     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   268
  /* within the glyph IDs table (and not within the `subs' table itself or */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   269
  /* outside of the CMap).                                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   270
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   271
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   272
#ifdef TT_CONFIG_CMAP_FORMAT_2
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   273
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   274
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   275
  tt_cmap2_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   276
                     FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   277
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   278
    FT_Byte*  p      = table + 2;           /* skip format */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   279
    FT_UInt   length = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   280
    FT_UInt   n, max_subs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   281
    FT_Byte*  keys;                         /* keys table */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   282
    FT_Byte*  subs;                         /* sub-headers */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   283
    FT_Byte*  glyph_ids;                    /* glyph ID array */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   284
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   285
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   286
    if ( table + length > valid->limit || length < 6 + 512 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   287
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   288
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   289
    keys = table + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   290
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   291
    /* parse keys to compute sub-headers count */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   292
    p        = keys;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   293
    max_subs = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   294
    for ( n = 0; n < 256; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   295
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   296
      FT_UInt  idx = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   297
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   298
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   299
      /* value must be multiple of 8 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   300
      if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   301
        FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   302
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   303
      idx >>= 3;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   304
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   305
      if ( idx > max_subs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   306
        max_subs = idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   307
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   308
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   309
    FT_ASSERT( p == table + 518 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   310
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   311
    subs      = p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   312
    glyph_ids = subs + (max_subs + 1) * 8;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   313
    if ( glyph_ids > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   314
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   315
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   316
    /* parse sub-headers */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   317
    for ( n = 0; n <= max_subs; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   318
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   319
      FT_UInt   first_code, code_count, offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   320
      FT_Int    delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   321
      FT_Byte*  ids;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   322
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   323
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   324
      first_code = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   325
      code_count = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   326
      delta      = TT_NEXT_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   327
      offset     = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   328
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   329
      /* many Dynalab fonts have empty sub-headers */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   330
      if ( code_count == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   331
        continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   332
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   333
      /* check range within 0..255 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   334
      if ( valid->level >= FT_VALIDATE_PARANOID )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   335
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   336
        if ( first_code >= 256 || first_code + code_count > 256 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   337
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   338
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   339
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   340
      /* check offset */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   341
      if ( offset != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   342
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   343
        ids = p - 2 + offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   344
        if ( ids < glyph_ids || ids + code_count*2 > table + length )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   345
          FT_INVALID_OFFSET;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   346
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   347
        /* check glyph IDs */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   348
        if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   349
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   350
          FT_Byte*  limit = p + code_count * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   351
          FT_UInt   idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   352
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   353
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   354
          for ( ; p < limit; )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   355
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   356
            idx = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   357
            if ( idx != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   358
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   359
              idx = ( idx + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   360
              if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   361
                FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   362
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   363
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   364
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   365
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   366
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   367
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   368
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   369
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   370
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   371
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   372
  /* return sub header corresponding to a given character code */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   373
  /* NULL on invalid charcode                                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   374
  static FT_Byte*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   375
  tt_cmap2_get_subheader( FT_Byte*   table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   376
                          FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   377
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   378
    FT_Byte*  result = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   379
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   380
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   381
    if ( char_code < 0x10000UL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   382
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   383
      FT_UInt   char_lo = (FT_UInt)( char_code & 0xFF );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   384
      FT_UInt   char_hi = (FT_UInt)( char_code >> 8 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   385
      FT_Byte*  p       = table + 6;    /* keys table */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   386
      FT_Byte*  subs    = table + 518;  /* subheaders table */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   387
      FT_Byte*  sub;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   388
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   389
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   390
      if ( char_hi == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   391
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   392
        /* an 8-bit character code -- we use subHeader 0 in this case */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   393
        /* to test whether the character code is in the charmap       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   394
        /*                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   395
        sub = subs;  /* jump to first sub-header */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   396
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   397
        /* check that the sub-header for this byte is 0, which */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   398
        /* indicates that it is really a valid one-byte value  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   399
        /* Otherwise, return 0                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   400
        /*                                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   401
        p += char_lo * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   402
        if ( TT_PEEK_USHORT( p ) != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   403
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   404
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   405
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   406
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   407
        /* a 16-bit character code */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   408
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   409
        /* jump to key entry  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   410
        p  += char_hi * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   411
        /* jump to sub-header */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   412
        sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   413
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   414
        /* check that the high byte isn't a valid one-byte value */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   415
        if ( sub == subs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   416
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   417
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   418
      result = sub;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   419
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   420
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   421
    return result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   422
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   423
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   424
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   425
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   426
  tt_cmap2_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   427
                       FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   428
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   429
    FT_Byte*  table   = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   430
    FT_UInt   result  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   431
    FT_Byte*  subheader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   432
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   433
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   434
    subheader = tt_cmap2_get_subheader( table, char_code );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   435
    if ( subheader )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   436
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   437
      FT_Byte*  p   = subheader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   438
      FT_UInt   idx = (FT_UInt)(char_code & 0xFF);
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   439
      FT_UInt   start, count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   440
      FT_Int    delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   441
      FT_UInt   offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   442
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   443
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   444
      start  = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   445
      count  = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   446
      delta  = TT_NEXT_SHORT ( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   447
      offset = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   448
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   449
      idx -= start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   450
      if ( idx < count && offset != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   451
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   452
        p  += offset + 2 * idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   453
        idx = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   454
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   455
        if ( idx != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   456
          result = (FT_UInt)( idx + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   457
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   458
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   459
    return result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   460
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   461
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   462
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   463
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   464
  tt_cmap2_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   465
                      FT_UInt32  *pcharcode )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   466
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   467
    FT_Byte*   table    = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   468
    FT_UInt    gindex   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   469
    FT_UInt32  result   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   470
    FT_UInt32  charcode = *pcharcode + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   471
    FT_Byte*   subheader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   472
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   473
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   474
    while ( charcode < 0x10000UL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   475
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   476
      subheader = tt_cmap2_get_subheader( table, charcode );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   477
      if ( subheader )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   478
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   479
        FT_Byte*  p       = subheader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   480
        FT_UInt   start   = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   481
        FT_UInt   count   = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   482
        FT_Int    delta   = TT_NEXT_SHORT ( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   483
        FT_UInt   offset  = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   484
        FT_UInt   char_lo = (FT_UInt)( charcode & 0xFF );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   485
        FT_UInt   pos, idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   486
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   487
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   488
        if ( offset == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   489
          goto Next_SubHeader;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   490
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   491
        if ( char_lo < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   492
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   493
          char_lo = start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   494
          pos     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   495
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   496
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   497
          pos = (FT_UInt)( char_lo - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   498
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   499
        p       += offset + pos * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   500
        charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   501
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   502
        for ( ; pos < count; pos++, charcode++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   503
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   504
          idx = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   505
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   506
          if ( idx != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   507
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   508
            gindex = ( idx + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   509
            if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   510
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   511
              result = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   512
              goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   513
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   514
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   515
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   516
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   517
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   518
      /* jump to next sub-header, i.e. higher byte value */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   519
    Next_SubHeader:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   520
      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   521
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   522
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   523
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   524
    *pcharcode = result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   525
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   526
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   527
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   528
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   529
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   530
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   531
  tt_cmap2_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   532
                     TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   533
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   534
    FT_Byte*  p = cmap->data + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   535
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   536
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   537
    cmap_info->format   = 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   538
    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   539
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   540
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   541
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   542
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   543
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   544
  FT_DEFINE_TT_CMAP(tt_cmap2_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   545
      sizeof ( TT_CMapRec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   546
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   547
      (FT_CMap_InitFunc)     tt_cmap_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   548
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   549
      (FT_CMap_CharIndexFunc)tt_cmap2_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   550
      (FT_CMap_CharNextFunc) tt_cmap2_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   551
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   552
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   553
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   554
    2,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   555
    (TT_CMap_ValidateFunc)   tt_cmap2_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   556
    (TT_CMap_Info_GetFunc)   tt_cmap2_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   557
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   558
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   559
#endif /* TT_CONFIG_CMAP_FORMAT_2 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   560
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   561
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   562
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   563
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   564
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   565
  /*****                           FORMAT 4                            *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   566
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   567
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   568
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   569
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   570
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   571
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   572
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   573
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   574
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   575
  /*   NAME          OFFSET         TYPE              DESCRIPTION          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   576
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   577
  /*   format        0              USHORT            must be 4            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   578
  /*   length        2              USHORT            table length         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   579
  /*                                                  in bytes             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   580
  /*   language      4              USHORT            Mac language code    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   581
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   582
  /*   segCountX2    6              USHORT            2*NUM_SEGS           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   583
  /*   searchRange   8              USHORT            2*(1 << LOG_SEGS)    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   584
  /*   entrySelector 10             USHORT            LOG_SEGS             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   585
  /*   rangeShift    12             USHORT            segCountX2 -         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   586
  /*                                                    searchRange        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   587
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   588
  /*   endCount      14             USHORT[NUM_SEGS]  end charcode for     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   589
  /*                                                  each segment; last   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   590
  /*                                                  is 0xFFFF            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   591
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   592
  /*   pad           14+NUM_SEGS*2  USHORT            padding              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   593
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   594
  /*   startCount    16+NUM_SEGS*2  USHORT[NUM_SEGS]  first charcode for   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   595
  /*                                                  each segment         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   596
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   597
  /*   idDelta       16+NUM_SEGS*4  SHORT[NUM_SEGS]   delta for each       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   598
  /*                                                  segment              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   599
  /*   idOffset      16+NUM_SEGS*6  SHORT[NUM_SEGS]   range offset for     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   600
  /*                                                  each segment; can be */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   601
  /*                                                  zero                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   602
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   603
  /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph ID    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   604
  /*                                                  ranges               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   605
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   606
  /* Character codes are modelled by a series of ordered (increasing)      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   607
  /* intervals called segments.  Each segment has start and end codes,     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   608
  /* provided by the `startCount' and `endCount' arrays.  Segments must    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   609
  /* not overlap, and the last segment should always contain the value     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   610
  /* 0xFFFF for `endCount'.                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   611
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   612
  /* The fields `searchRange', `entrySelector' and `rangeShift' are better */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   613
  /* ignored (they are traces of over-engineering in the TrueType          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   614
  /* specification).                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   615
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   616
  /* Each segment also has a signed `delta', as well as an optional offset */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   617
  /* within the `glyphIds' table.                                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   618
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   619
  /* If a segment's idOffset is 0, the glyph index corresponding to any    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   620
  /* charcode within the segment is obtained by adding the value of        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   621
  /* `idDelta' directly to the charcode, modulo 65536.                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   622
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   623
  /* Otherwise, a glyph index is taken from the glyph IDs sub-array for    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   624
  /* the segment, and the value of `idDelta' is added to it.               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   625
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   626
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   627
  /* Finally, note that a lot of fonts contain an invalid last segment,    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   628
  /* where `start' and `end' are correctly set to 0xFFFF but both `delta'  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   629
  /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   630
  /* OpenOffice.org).  We need special code to deal with them correctly.   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   631
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   632
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   633
#ifdef TT_CONFIG_CMAP_FORMAT_4
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   634
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   635
  typedef struct  TT_CMap4Rec_
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   636
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   637
    TT_CMapRec  cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   638
    FT_UInt32   cur_charcode;   /* current charcode */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   639
    FT_UInt     cur_gindex;     /* current glyph index */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   640
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   641
    FT_UInt     num_ranges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   642
    FT_UInt     cur_range;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   643
    FT_UInt     cur_start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   644
    FT_UInt     cur_end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   645
    FT_Int      cur_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   646
    FT_Byte*    cur_values;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   647
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   648
  } TT_CMap4Rec, *TT_CMap4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   649
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   650
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   651
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   652
  tt_cmap4_init( TT_CMap4  cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   653
                 FT_Byte*  table )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   654
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   655
    FT_Byte*  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   656
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   657
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   658
    cmap->cmap.data    = table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   659
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   660
    p                  = table + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   661
    cmap->num_ranges   = FT_PEEK_USHORT( p ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   662
    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   663
    cmap->cur_gindex   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   664
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   665
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   666
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   667
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   668
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   669
  static FT_Int
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   670
  tt_cmap4_set_range( TT_CMap4  cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   671
                      FT_UInt   range_index )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   672
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   673
    FT_Byte*  table = cmap->cmap.data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   674
    FT_Byte*  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   675
    FT_UInt   num_ranges = cmap->num_ranges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   676
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   677
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   678
    while ( range_index < num_ranges )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   679
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   680
      FT_UInt  offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   681
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   682
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   683
      p             = table + 14 + range_index * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   684
      cmap->cur_end = FT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   685
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   686
      p              += 2 + num_ranges * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   687
      cmap->cur_start = FT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   688
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   689
      p              += num_ranges * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   690
      cmap->cur_delta = FT_PEEK_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   691
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   692
      p     += num_ranges * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   693
      offset = FT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   694
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   695
      /* some fonts have an incorrect last segment; */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   696
      /* we have to catch it                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   697
      if ( range_index     >= num_ranges - 1 &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   698
           cmap->cur_start == 0xFFFFU        &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   699
           cmap->cur_end   == 0xFFFFU        )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   700
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   701
        TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   702
        FT_Byte*  limit = face->cmap_table + face->cmap_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   703
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   704
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   705
        if ( offset && p + offset + 2 > limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   706
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   707
          cmap->cur_delta = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   708
          offset          = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   709
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   710
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   711
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   712
      if ( offset != 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   713
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   714
        cmap->cur_values = offset ? p + offset : NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   715
        cmap->cur_range  = range_index;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   716
        return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   717
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   718
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   719
      /* we skip empty segments */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   720
      range_index++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   721
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   722
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   723
    return -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   724
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   725
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   726
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   727
  /* search the index of the charcode next to cmap->cur_charcode; */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   728
  /* caller should call tt_cmap4_set_range with proper range      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   729
  /* before calling this function                                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   730
  /*                                                              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   731
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   732
  tt_cmap4_next( TT_CMap4  cmap )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   733
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   734
    FT_UInt  charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   735
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   736
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   737
    if ( cmap->cur_charcode >= 0xFFFFUL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   738
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   739
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   740
    charcode = (FT_UInt)cmap->cur_charcode + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   741
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   742
    if ( charcode < cmap->cur_start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   743
      charcode = cmap->cur_start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   744
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   745
    for ( ;; )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   746
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   747
      FT_Byte*  values = cmap->cur_values;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   748
      FT_UInt   end    = cmap->cur_end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   749
      FT_Int    delta  = cmap->cur_delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   750
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   751
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   752
      if ( charcode <= end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   753
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   754
        if ( values )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   755
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   756
          FT_Byte*  p = values + 2 * ( charcode - cmap->cur_start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   757
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   758
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   759
          do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   760
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   761
            FT_UInt  gindex = FT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   762
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   763
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   764
            if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   765
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   766
              gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   767
              if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   768
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   769
                cmap->cur_charcode = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   770
                cmap->cur_gindex   = gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   771
                return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   772
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   773
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   774
          } while ( ++charcode <= end );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   775
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   776
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   777
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   778
          do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   779
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   780
            FT_UInt  gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   781
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   782
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   783
            if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   784
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   785
              cmap->cur_charcode = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   786
              cmap->cur_gindex   = gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   787
              return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   788
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   789
          } while ( ++charcode <= end );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   790
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   791
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   792
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   793
      /* we need to find another range */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   794
      if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   795
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   796
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   797
      if ( charcode < cmap->cur_start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   798
        charcode = cmap->cur_start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   799
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   800
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   801
  Fail:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   802
    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   803
    cmap->cur_gindex   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   804
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   805
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   806
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   807
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   808
  tt_cmap4_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   809
                     FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   810
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   811
    FT_Byte*  p      = table + 2;               /* skip format */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   812
    FT_UInt   length = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   813
    FT_Byte   *ends, *starts, *offsets, *deltas, *glyph_ids;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   814
    FT_UInt   num_segs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   815
    FT_Error  error = SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   816
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   817
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   818
    if ( length < 16 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   819
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   820
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   821
    /* in certain fonts, the `length' field is invalid and goes */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   822
    /* out of bound.  We try to correct this here...            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   823
    if ( table + length > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   824
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   825
      if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   826
        FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   827
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   828
      length = (FT_UInt)( valid->limit - table );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   829
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   830
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   831
    p        = table + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   832
    num_segs = TT_NEXT_USHORT( p );   /* read segCountX2 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   833
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   834
    if ( valid->level >= FT_VALIDATE_PARANOID )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   835
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   836
      /* check that we have an even value here */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   837
      if ( num_segs & 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   838
        FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   839
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   840
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   841
    num_segs /= 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   842
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   843
    if ( length < 16 + num_segs * 2 * 4 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   844
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   845
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   846
    /* check the search parameters - even though we never use them */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   847
    /*                                                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   848
    if ( valid->level >= FT_VALIDATE_PARANOID )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   849
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   850
      /* check the values of `searchRange', `entrySelector', `rangeShift' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   851
      FT_UInt  search_range   = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   852
      FT_UInt  entry_selector = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   853
      FT_UInt  range_shift    = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   854
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   855
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   856
      if ( ( search_range | range_shift ) & 1 )  /* must be even values */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   857
        FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   858
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   859
      search_range /= 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   860
      range_shift  /= 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   861
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   862
      /* `search range' is the greatest power of 2 that is <= num_segs */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   863
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   864
      if ( search_range                > num_segs                 ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   865
           search_range * 2            < num_segs                 ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   866
           search_range + range_shift != num_segs                 ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   867
           search_range               != ( 1U << entry_selector ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   868
        FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   869
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   870
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   871
    ends      = table   + 14;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   872
    starts    = table   + 16 + num_segs * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   873
    deltas    = starts  + num_segs * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   874
    offsets   = deltas  + num_segs * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   875
    glyph_ids = offsets + num_segs * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   876
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   877
    /* check last segment; its end count value must be 0xFFFF */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   878
    if ( valid->level >= FT_VALIDATE_PARANOID )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   879
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   880
      p = ends + ( num_segs - 1 ) * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   881
      if ( TT_PEEK_USHORT( p ) != 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   882
        FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   883
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   884
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   885
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   886
      FT_UInt   start, end, offset, n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   887
      FT_UInt   last_start = 0, last_end = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   888
      FT_Int    delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   889
      FT_Byte*  p_start   = starts;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   890
      FT_Byte*  p_end     = ends;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   891
      FT_Byte*  p_delta   = deltas;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   892
      FT_Byte*  p_offset  = offsets;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   893
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   894
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   895
      for ( n = 0; n < num_segs; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   896
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   897
        p      = p_offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   898
        start  = TT_NEXT_USHORT( p_start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   899
        end    = TT_NEXT_USHORT( p_end );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   900
        delta  = TT_NEXT_SHORT( p_delta );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   901
        offset = TT_NEXT_USHORT( p_offset );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   902
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   903
        if ( start > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   904
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   905
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   906
        /* this test should be performed at default validation level; */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   907
        /* unfortunately, some popular Asian fonts have overlapping   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   908
        /* ranges in their charmaps                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   909
        /*                                                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   910
        if ( start <= last_end && n > 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   911
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   912
          if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   913
            FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   914
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   915
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   916
            /* allow overlapping segments, provided their start points */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   917
            /* and end points, respectively, are in ascending order    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   918
            /*                                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   919
            if ( last_start > start || last_end > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   920
              error |= TT_CMAP_FLAG_UNSORTED;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   921
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   922
              error |= TT_CMAP_FLAG_OVERLAPPING;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   923
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   924
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   925
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   926
        if ( offset && offset != 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   927
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   928
          p += offset;  /* start of glyph ID array */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   929
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   930
          /* check that we point within the glyph IDs table only */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   931
          if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   932
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   933
            if ( p < glyph_ids                                ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   934
                 p + ( end - start + 1 ) * 2 > table + length )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   935
              FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   936
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   937
          /* Some fonts handle the last segment incorrectly.  In */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   938
          /* theory, 0xFFFF might point to an ordinary glyph --  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   939
          /* a cmap 4 is versatile and could be used for any     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   940
          /* encoding, not only Unicode.  However, reality shows */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   941
          /* that far too many fonts are sloppy and incorrectly  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   942
          /* set all fields but `start' and `end' for the last   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   943
          /* segment if it contains only a single character.     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   944
          /*                                                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   945
          /* We thus omit the test here, delaying it to the      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   946
          /* routines which actually access the cmap.            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   947
          else if ( n != num_segs - 1                       ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   948
                    !( start == 0xFFFFU && end == 0xFFFFU ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   949
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   950
            if ( p < glyph_ids                              ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   951
                 p + ( end - start + 1 ) * 2 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   952
              FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   953
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   954
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   955
          /* check glyph indices within the segment range */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   956
          if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   957
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   958
            FT_UInt  i, idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   959
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   960
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   961
            for ( i = start; i < end; i++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   962
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   963
              idx = FT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   964
              if ( idx != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   965
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   966
                idx = (FT_UInt)( idx + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   967
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   968
                if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   969
                  FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   970
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   971
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   972
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   973
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   974
        else if ( offset == 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   975
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   976
          /* some fonts (erroneously?) use a range offset of 0xFFFF */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   977
          /* to mean missing glyph in cmap table                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   978
          /*                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   979
          if ( valid->level >= FT_VALIDATE_PARANOID    ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   980
               n != num_segs - 1                       ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   981
               !( start == 0xFFFFU && end == 0xFFFFU ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   982
            FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   983
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   984
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   985
        last_start = start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   986
        last_end   = end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   987
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   988
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   989
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   990
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   991
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   992
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   993
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   994
  static FT_UInt
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   995
  tt_cmap4_char_map_linear( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   996
                            FT_UInt32*  pcharcode,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   997
                            FT_Bool     next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   998
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
   999
    FT_UInt    num_segs2, start, end, offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1000
    FT_Int     delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1001
    FT_UInt    i, num_segs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1002
    FT_UInt32  charcode = *pcharcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1003
    FT_UInt    gindex   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1004
    FT_Byte*   p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1005
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1006
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1007
    p = cmap->data + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1008
    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1009
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1010
    num_segs = num_segs2 >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1011
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1012
    if ( !num_segs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1013
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1014
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1015
    if ( next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1016
      charcode++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1017
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1018
    /* linear search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1019
    for ( ; charcode <= 0xFFFFU; charcode++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1020
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1021
      FT_Byte*  q;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1022
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1023
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1024
      p = cmap->data + 14;               /* ends table   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1025
      q = cmap->data + 16 + num_segs2;   /* starts table */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1026
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1027
      for ( i = 0; i < num_segs; i++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1028
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1029
        end   = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1030
        start = TT_NEXT_USHORT( q );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1031
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1032
        if ( charcode >= start && charcode <= end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1033
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1034
          p       = q - 2 + num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1035
          delta   = TT_PEEK_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1036
          p      += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1037
          offset  = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1038
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1039
          /* some fonts have an incorrect last segment; */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1040
          /* we have to catch it                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1041
          if ( i >= num_segs - 1                  &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1042
               start == 0xFFFFU && end == 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1043
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1044
            TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1045
            FT_Byte*  limit = face->cmap_table + face->cmap_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1046
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1047
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1048
            if ( offset && p + offset + 2 > limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1049
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1050
              delta  = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1051
              offset = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1052
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1053
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1054
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1055
          if ( offset == 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1056
            continue;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1057
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1058
          if ( offset )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1059
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1060
            p += offset + ( charcode - start ) * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1061
            gindex = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1062
            if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1063
              gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1064
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1065
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1066
            gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1067
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1068
          break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1069
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1070
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1071
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1072
      if ( !next || gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1073
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1074
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1075
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1076
    if ( next && gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1077
      *pcharcode = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1078
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1079
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1080
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1081
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1082
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1083
  static FT_UInt
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1084
  tt_cmap4_char_map_binary( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1085
                            FT_UInt32*  pcharcode,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1086
                            FT_Bool     next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1087
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1088
    FT_UInt   num_segs2, start, end, offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1089
    FT_Int    delta;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1090
    FT_UInt   max, min, mid, num_segs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1091
    FT_UInt   charcode = (FT_UInt)*pcharcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1092
    FT_UInt   gindex   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1093
    FT_Byte*  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1094
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1095
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1096
    p = cmap->data + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1097
    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1098
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1099
    if ( !num_segs2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1100
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1101
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1102
    num_segs = num_segs2 >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1103
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1104
    /* make compiler happy */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1105
    mid = num_segs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1106
    end = 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1107
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1108
    if ( next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1109
      charcode++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1110
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1111
    min = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1112
    max = num_segs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1113
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1114
    /* binary search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1115
    while ( min < max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1116
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1117
      mid    = ( min + max ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1118
      p      = cmap->data + 14 + mid * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1119
      end    = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1120
      p     += 2 + num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1121
      start  = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1122
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1123
      if ( charcode < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1124
        max = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1125
      else if ( charcode > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1126
        min = mid + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1127
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1128
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1129
        p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1130
        delta  = TT_PEEK_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1131
        p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1132
        offset = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1133
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1134
        /* some fonts have an incorrect last segment; */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1135
        /* we have to catch it                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1136
        if ( mid >= num_segs - 1                &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1137
             start == 0xFFFFU && end == 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1138
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1139
          TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1140
          FT_Byte*  limit = face->cmap_table + face->cmap_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1141
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1142
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1143
          if ( offset && p + offset + 2 > limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1144
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1145
            delta  = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1146
            offset = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1147
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1148
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1149
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1150
        /* search the first segment containing `charcode' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1151
        if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1152
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1153
          FT_UInt  i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1154
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1155
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1156
          /* call the current segment `max' */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1157
          max = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1158
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1159
          if ( offset == 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1160
            mid = max + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1161
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1162
          /* search in segments before the current segment */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1163
          for ( i = max ; i > 0; i-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1164
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1165
            FT_UInt   prev_end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1166
            FT_Byte*  old_p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1167
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1168
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1169
            old_p    = p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1170
            p        = cmap->data + 14 + ( i - 1 ) * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1171
            prev_end = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1172
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1173
            if ( charcode > prev_end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1174
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1175
              p = old_p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1176
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1177
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1178
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1179
            end    = prev_end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1180
            p     += 2 + num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1181
            start  = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1182
            p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1183
            delta  = TT_PEEK_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1184
            p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1185
            offset = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1186
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1187
            if ( offset != 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1188
              mid = i - 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1189
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1190
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1191
          /* no luck */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1192
          if ( mid == max + 1 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1193
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1194
            if ( i != max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1195
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1196
              p      = cmap->data + 14 + max * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1197
              end    = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1198
              p     += 2 + num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1199
              start  = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1200
              p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1201
              delta  = TT_PEEK_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1202
              p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1203
              offset = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1204
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1205
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1206
            mid = max;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1207
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1208
            /* search in segments after the current segment */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1209
            for ( i = max + 1; i < num_segs; i++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1210
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1211
              FT_UInt  next_end, next_start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1212
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1213
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1214
              p          = cmap->data + 14 + i * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1215
              next_end   = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1216
              p         += 2 + num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1217
              next_start = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1218
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1219
              if ( charcode < next_start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1220
                break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1221
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1222
              end    = next_end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1223
              start  = next_start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1224
              p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1225
              delta  = TT_PEEK_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1226
              p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1227
              offset = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1228
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1229
              if ( offset != 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1230
                mid = i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1231
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1232
            i--;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1233
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1234
            /* still no luck */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1235
            if ( mid == max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1236
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1237
              mid = i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1238
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1239
              break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1240
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1241
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1242
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1243
          /* end, start, delta, and offset are for the i'th segment */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1244
          if ( mid != i )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1245
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1246
            p      = cmap->data + 14 + mid * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1247
            end    = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1248
            p     += 2 + num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1249
            start  = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1250
            p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1251
            delta  = TT_PEEK_SHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1252
            p     += num_segs2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1253
            offset = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1254
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1255
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1256
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1257
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1258
          if ( offset == 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1259
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1260
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1261
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1262
        if ( offset )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1263
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1264
          p += offset + ( charcode - start ) * 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1265
          gindex = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1266
          if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1267
            gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1268
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1269
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1270
          gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1271
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1272
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1273
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1274
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1275
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1276
    if ( next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1277
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1278
      TT_CMap4  cmap4 = (TT_CMap4)cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1279
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1280
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1281
      /* if `charcode' is not in any segment, then `mid' is */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1282
      /* the segment nearest to `charcode'                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1283
      /*                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1284
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1285
      if ( charcode > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1286
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1287
        mid++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1288
        if ( mid == num_segs )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1289
          return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1290
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1291
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1292
      if ( tt_cmap4_set_range( cmap4, mid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1293
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1294
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1295
          *pcharcode = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1296
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1297
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1298
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1299
        cmap4->cur_charcode = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1300
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1301
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1302
          cmap4->cur_gindex = gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1303
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1304
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1305
          cmap4->cur_charcode = charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1306
          tt_cmap4_next( cmap4 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1307
          gindex = cmap4->cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1308
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1309
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1310
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1311
          *pcharcode = cmap4->cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1312
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1313
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1314
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1315
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1316
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1317
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1318
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1319
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1320
  tt_cmap4_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1321
                       FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1322
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1323
    if ( char_code >= 0x10000UL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1324
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1325
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1326
    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1327
      return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1328
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1329
      return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1330
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1331
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1332
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1333
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1334
  tt_cmap4_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1335
                      FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1336
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1337
    FT_UInt  gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1338
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1339
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1340
    if ( *pchar_code >= 0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1341
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1342
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1343
    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1344
      gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1345
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1346
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1347
      TT_CMap4  cmap4 = (TT_CMap4)cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1348
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1349
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1350
      /* no need to search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1351
      if ( *pchar_code == cmap4->cur_charcode )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1352
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1353
        tt_cmap4_next( cmap4 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1354
        gindex = cmap4->cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1355
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1356
          *pchar_code = cmap4->cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1357
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1358
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1359
        gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1360
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1361
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1362
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1363
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1364
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1365
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1366
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1367
  tt_cmap4_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1368
                     TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1369
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1370
    FT_Byte*  p = cmap->data + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1371
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1372
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1373
    cmap_info->format   = 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1374
    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1375
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1376
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1377
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1378
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1379
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1380
  FT_DEFINE_TT_CMAP(tt_cmap4_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1381
      sizeof ( TT_CMap4Rec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1382
      (FT_CMap_InitFunc)     tt_cmap4_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1383
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1384
      (FT_CMap_CharIndexFunc)tt_cmap4_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1385
      (FT_CMap_CharNextFunc) tt_cmap4_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1386
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1387
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1388
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1389
    4,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1390
    (TT_CMap_ValidateFunc)   tt_cmap4_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1391
    (TT_CMap_Info_GetFunc)   tt_cmap4_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1392
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1393
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1394
#endif /* TT_CONFIG_CMAP_FORMAT_4 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1395
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1396
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1397
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1398
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1399
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1400
  /*****                          FORMAT 6                             *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1401
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1402
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1403
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1404
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1405
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1406
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1407
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1408
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1409
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1410
  /*   NAME        OFFSET          TYPE             DESCRIPTION            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1411
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1412
  /*   format       0              USHORT           must be 4              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1413
  /*   length       2              USHORT           table length in bytes  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1414
  /*   language     4              USHORT           Mac language code      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1415
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1416
  /*   first        6              USHORT           first segment code     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1417
  /*   count        8              USHORT           segment size in chars  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1418
  /*   glyphIds     10             USHORT[count]    glyph IDs              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1419
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1420
  /* A very simplified segment mapping.                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1421
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1422
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1423
#ifdef TT_CONFIG_CMAP_FORMAT_6
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1424
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1425
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1426
  tt_cmap6_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1427
                     FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1428
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1429
    FT_Byte*  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1430
    FT_UInt   length, count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1431
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1432
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1433
    if ( table + 10 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1434
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1435
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1436
    p      = table + 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1437
    length = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1438
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1439
    p      = table + 8;             /* skip language and start index */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1440
    count  = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1441
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1442
    if ( table + length > valid->limit || length < 10 + count * 2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1443
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1444
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1445
    /* check glyph indices */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1446
    if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1447
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1448
      FT_UInt  gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1449
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1450
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1451
      for ( ; count > 0; count-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1452
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1453
        gindex = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1454
        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1455
          FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1456
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1457
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1458
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1459
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1460
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1461
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1462
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1463
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1464
  tt_cmap6_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1465
                       FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1466
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1467
    FT_Byte*  table  = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1468
    FT_UInt   result = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1469
    FT_Byte*  p      = table + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1470
    FT_UInt   start  = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1471
    FT_UInt   count  = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1472
    FT_UInt   idx    = (FT_UInt)( char_code - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1473
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1474
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1475
    if ( idx < count )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1476
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1477
      p += 2 * idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1478
      result = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1479
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1480
    return result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1481
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1482
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1483
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1484
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1485
  tt_cmap6_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1486
                      FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1487
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1488
    FT_Byte*   table     = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1489
    FT_UInt32  result    = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1490
    FT_UInt32  char_code = *pchar_code + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1491
    FT_UInt    gindex    = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1492
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1493
    FT_Byte*   p         = table + 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1494
    FT_UInt    start     = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1495
    FT_UInt    count     = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1496
    FT_UInt    idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1497
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1498
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1499
    if ( char_code >= 0x10000UL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1500
      goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1501
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1502
    if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1503
      char_code = start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1504
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1505
    idx = (FT_UInt)( char_code - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1506
    p  += 2 * idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1507
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1508
    for ( ; idx < count; idx++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1509
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1510
      gindex = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1511
      if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1512
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1513
        result = char_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1514
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1515
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1516
      char_code++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1517
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1518
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1519
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1520
    *pchar_code = result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1521
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1522
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1523
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1524
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1525
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1526
  tt_cmap6_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1527
                     TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1528
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1529
    FT_Byte*  p = cmap->data + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1530
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1531
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1532
    cmap_info->format   = 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1533
    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1534
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1535
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1536
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1537
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1538
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1539
  FT_DEFINE_TT_CMAP(tt_cmap6_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1540
      sizeof ( TT_CMapRec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1541
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1542
      (FT_CMap_InitFunc)     tt_cmap_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1543
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1544
      (FT_CMap_CharIndexFunc)tt_cmap6_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1545
      (FT_CMap_CharNextFunc) tt_cmap6_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1546
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1547
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1548
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1549
    6,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1550
    (TT_CMap_ValidateFunc)   tt_cmap6_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1551
    (TT_CMap_Info_GetFunc)   tt_cmap6_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1552
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1553
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1554
#endif /* TT_CONFIG_CMAP_FORMAT_6 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1555
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1556
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1557
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1558
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1559
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1560
  /*****                          FORMAT 8                             *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1561
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1562
  /***** It is hard to completely understand what the OpenType spec    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1563
  /***** says about this format, but here is my conclusion.            *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1564
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1565
  /***** The purpose of this format is to easily map UTF-16 text to    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1566
  /***** glyph indices.  Basically, the `char_code' must be in one of  *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1567
  /***** the following formats:                                        *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1568
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1569
  /*****   - A 16-bit value that isn't part of the Unicode Surrogates  *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1570
  /*****     Area (i.e. U+D800-U+DFFF).                                *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1571
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1572
  /*****   - A 32-bit value, made of two surrogate values, i.e.. if    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1573
  /*****     `char_code = (char_hi << 16) | char_lo', then both        *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1574
  /*****     `char_hi' and `char_lo' must be in the Surrogates Area.   *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1575
  /*****      Area.                                                    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1576
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1577
  /***** The `is32' table embedded in the charmap indicates whether a  *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1578
  /***** given 16-bit value is in the surrogates area or not.          *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1579
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1580
  /***** So, for any given `char_code', we can assert the following:   *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1581
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1582
  /*****   If `char_hi == 0' then we must have `is32[char_lo] == 0'.   *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1583
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1584
  /*****   If `char_hi != 0' then we must have both                    *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1585
  /*****   `is32[char_hi] != 0' and `is32[char_lo] != 0'.              *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1586
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1587
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1588
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1589
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1590
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1591
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1592
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1593
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1594
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1595
  /*   NAME        OFFSET         TYPE        DESCRIPTION                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1596
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1597
  /*   format      0              USHORT      must be 8                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1598
  /*   reserved    2              USHORT      reserved                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1599
  /*   length      4              ULONG       length in bytes              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1600
  /*   language    8              ULONG       Mac language code            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1601
  /*   is32        12             BYTE[8192]  32-bitness bitmap            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1602
  /*   count       8204           ULONG       number of groups             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1603
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1604
  /* This header is followed by `count' groups of the following format:    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1605
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1606
  /*   start       0              ULONG       first charcode               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1607
  /*   end         4              ULONG       last charcode                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1608
  /*   startId     8              ULONG       start glyph ID for the group */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1609
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1610
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1611
#ifdef TT_CONFIG_CMAP_FORMAT_8
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1612
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1613
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1614
  tt_cmap8_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1615
                     FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1616
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1617
    FT_Byte*   p = table + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1618
    FT_Byte*   is32;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1619
    FT_UInt32  length;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1620
    FT_UInt32  num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1621
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1622
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1623
    if ( table + 16 + 8192 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1624
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1625
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1626
    length = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1627
    if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1628
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1629
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1630
    is32       = table + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1631
    p          = is32  + 8192;          /* skip `is32' array */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1632
    num_groups = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1633
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1634
    if ( p + num_groups * 12 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1635
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1636
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1637
    /* check groups, they must be in increasing order */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1638
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1639
      FT_UInt32  n, start, end, start_id, count, last = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1640
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1641
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1642
      for ( n = 0; n < num_groups; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1643
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1644
        FT_UInt   hi, lo;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1645
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1646
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1647
        start    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1648
        end      = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1649
        start_id = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1650
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1651
        if ( start > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1652
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1653
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1654
        if ( n > 0 && start <= last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1655
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1656
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1657
        if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1658
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1659
          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1660
            FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1661
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1662
          count = (FT_UInt32)( end - start + 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1663
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1664
          if ( start & ~0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1665
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1666
            /* start_hi != 0; check that is32[i] is 1 for each i in */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1667
            /* the `hi' and `lo' of the range [start..end]          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1668
            for ( ; count > 0; count--, start++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1669
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1670
              hi = (FT_UInt)( start >> 16 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1671
              lo = (FT_UInt)( start & 0xFFFFU );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1672
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1673
              if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1674
                FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1675
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1676
              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1677
                FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1678
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1679
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1680
          else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1681
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1682
            /* start_hi == 0; check that is32[i] is 0 for each i in */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1683
            /* the range [start..end]                               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1684
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1685
            /* end_hi cannot be != 0! */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1686
            if ( end & ~0xFFFFU )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1687
              FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1688
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1689
            for ( ; count > 0; count--, start++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1690
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1691
              lo = (FT_UInt)( start & 0xFFFFU );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1692
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1693
              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1694
                FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1695
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1696
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1697
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1698
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1699
        last = end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1700
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1701
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1702
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1703
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1704
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1705
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1706
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1707
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1708
  tt_cmap8_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1709
                       FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1710
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1711
    FT_Byte*   table      = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1712
    FT_UInt    result     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1713
    FT_Byte*   p          = table + 8204;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1714
    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1715
    FT_UInt32  start, end, start_id;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1716
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1717
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1718
    for ( ; num_groups > 0; num_groups-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1719
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1720
      start    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1721
      end      = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1722
      start_id = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1723
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1724
      if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1725
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1726
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1727
      if ( char_code <= end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1728
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1729
        result = (FT_UInt)( start_id + char_code - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1730
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1731
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1732
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1733
    return result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1734
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1735
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1736
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1737
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1738
  tt_cmap8_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1739
                      FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1740
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1741
    FT_UInt32  result     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1742
    FT_UInt32  char_code  = *pchar_code + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1743
    FT_UInt    gindex     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1744
    FT_Byte*   table      = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1745
    FT_Byte*   p          = table + 8204;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1746
    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1747
    FT_UInt32  start, end, start_id;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1748
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1749
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1750
    p = table + 8208;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1751
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1752
    for ( ; num_groups > 0; num_groups-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1753
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1754
      start    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1755
      end      = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1756
      start_id = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1757
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1758
      if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1759
        char_code = start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1760
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1761
      if ( char_code <= end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1762
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1763
        gindex = (FT_UInt)( char_code - start + start_id );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1764
        if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1765
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1766
          result = char_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1767
          goto Exit;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1768
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1769
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1770
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1771
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1772
  Exit:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1773
    *pchar_code = result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1774
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1775
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1776
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1777
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1778
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1779
  tt_cmap8_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1780
                     TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1781
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1782
    FT_Byte*  p = cmap->data + 8;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1783
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1784
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1785
    cmap_info->format   = 8;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1786
    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1787
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1788
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1789
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1790
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1791
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1792
  FT_DEFINE_TT_CMAP(tt_cmap8_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1793
      sizeof ( TT_CMapRec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1794
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1795
      (FT_CMap_InitFunc)     tt_cmap_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1796
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1797
      (FT_CMap_CharIndexFunc)tt_cmap8_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1798
      (FT_CMap_CharNextFunc) tt_cmap8_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1799
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1800
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1801
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1802
    8,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1803
    (TT_CMap_ValidateFunc)   tt_cmap8_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1804
    (TT_CMap_Info_GetFunc)   tt_cmap8_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1805
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1806
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1807
#endif /* TT_CONFIG_CMAP_FORMAT_8 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1808
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1809
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1810
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1811
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1812
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1813
  /*****                          FORMAT 10                            *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1814
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1815
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1816
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1817
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1818
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1819
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1820
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1821
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1822
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1823
  /*   NAME      OFFSET  TYPE               DESCRIPTION                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1824
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1825
  /*   format     0      USHORT             must be 10                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1826
  /*   reserved   2      USHORT             reserved                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1827
  /*   length     4      ULONG              length in bytes                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1828
  /*   language   8      ULONG              Mac language code              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1829
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1830
  /*   start     12      ULONG              first char in range            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1831
  /*   count     16      ULONG              number of chars in range       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1832
  /*   glyphIds  20      USHORT[count]      glyph indices covered          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1833
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1834
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1835
#ifdef TT_CONFIG_CMAP_FORMAT_10
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1836
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1837
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1838
  tt_cmap10_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1839
                      FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1840
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1841
    FT_Byte*  p = table + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1842
    FT_ULong  length, count;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1843
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1844
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1845
    if ( table + 20 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1846
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1847
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1848
    length = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1849
    p      = table + 16;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1850
    count  = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1851
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1852
    if ( length > (FT_ULong)( valid->limit - table ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1853
         length < 20 + count * 2                     )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1854
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1855
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1856
    /* check glyph indices */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1857
    if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1858
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1859
      FT_UInt  gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1860
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1861
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1862
      for ( ; count > 0; count-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1863
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1864
        gindex = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1865
        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1866
          FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1867
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1868
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1869
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1870
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1871
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1872
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1873
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1874
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1875
  tt_cmap10_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1876
                        FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1877
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1878
    FT_Byte*   table  = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1879
    FT_UInt    result = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1880
    FT_Byte*   p      = table + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1881
    FT_UInt32  start  = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1882
    FT_UInt32  count  = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1883
    FT_UInt32  idx    = (FT_ULong)( char_code - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1884
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1885
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1886
    if ( idx < count )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1887
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1888
      p     += 2 * idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1889
      result = TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1890
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1891
    return result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1892
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1893
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1894
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1895
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1896
  tt_cmap10_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1897
                       FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1898
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1899
    FT_Byte*   table     = cmap->data;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1900
    FT_UInt32  char_code = *pchar_code + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1901
    FT_UInt    gindex    = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1902
    FT_Byte*   p         = table + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1903
    FT_UInt32  start     = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1904
    FT_UInt32  count     = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1905
    FT_UInt32  idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1906
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1907
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1908
    if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1909
      char_code = start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1910
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1911
    idx = (FT_UInt32)( char_code - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1912
    p  += 2 * idx;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1913
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1914
    for ( ; idx < count; idx++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1915
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1916
      gindex = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1917
      if ( gindex != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1918
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1919
      char_code++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1920
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1921
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1922
    *pchar_code = char_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1923
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1924
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1925
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1926
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1927
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1928
  tt_cmap10_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1929
                      TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1930
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1931
    FT_Byte*  p = cmap->data + 8;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1932
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1933
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1934
    cmap_info->format   = 10;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1935
    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1936
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1937
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1938
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1939
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1940
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1941
  FT_DEFINE_TT_CMAP(tt_cmap10_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1942
      sizeof ( TT_CMapRec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1943
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1944
      (FT_CMap_InitFunc)     tt_cmap_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1945
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1946
      (FT_CMap_CharIndexFunc)tt_cmap10_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1947
      (FT_CMap_CharNextFunc) tt_cmap10_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1948
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1949
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1950
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1951
    10,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1952
    (TT_CMap_ValidateFunc)   tt_cmap10_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1953
    (TT_CMap_Info_GetFunc)   tt_cmap10_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1954
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1955
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1956
#endif /* TT_CONFIG_CMAP_FORMAT_10 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1957
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1958
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1959
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1960
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1961
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1962
  /*****                          FORMAT 12                            *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1963
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1964
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1965
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1966
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1967
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1968
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1969
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1970
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1971
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1972
  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1973
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1974
  /*   format      0          USHORT     must be 12                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1975
  /*   reserved    2          USHORT     reserved                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1976
  /*   length      4          ULONG      length in bytes                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1977
  /*   language    8          ULONG      Mac language code                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1978
  /*   count       12         ULONG      number of groups                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1979
  /*               16                                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1980
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1981
  /* This header is followed by `count' groups of the following format:    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1982
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1983
  /*   start       0          ULONG      first charcode                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1984
  /*   end         4          ULONG      last charcode                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1985
  /*   startId     8          ULONG      start glyph ID for the group      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1986
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1987
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1988
#ifdef TT_CONFIG_CMAP_FORMAT_12
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1989
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1990
  typedef struct  TT_CMap12Rec_
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1991
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1992
    TT_CMapRec  cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1993
    FT_Bool     valid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1994
    FT_ULong    cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1995
    FT_UInt     cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1996
    FT_ULong    cur_group;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1997
    FT_ULong    num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1998
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  1999
  } TT_CMap12Rec, *TT_CMap12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2000
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2001
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2002
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2003
  tt_cmap12_init( TT_CMap12  cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2004
                  FT_Byte*   table )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2005
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2006
    cmap->cmap.data  = table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2007
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2008
    table           += 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2009
    cmap->num_groups = FT_PEEK_ULONG( table );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2010
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2011
    cmap->valid      = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2012
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2013
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2014
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2015
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2016
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2017
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2018
  tt_cmap12_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2019
                      FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2020
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2021
    FT_Byte*   p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2022
    FT_ULong   length;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2023
    FT_ULong   num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2024
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2025
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2026
    if ( table + 16 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2027
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2028
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2029
    p      = table + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2030
    length = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2031
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2032
    p          = table + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2033
    num_groups = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2034
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2035
    if ( length > (FT_ULong)( valid->limit - table ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2036
         length < 16 + 12 * num_groups               )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2037
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2038
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2039
    /* check groups, they must be in increasing order */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2040
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2041
      FT_ULong  n, start, end, start_id, last = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2042
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2043
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2044
      for ( n = 0; n < num_groups; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2045
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2046
        start    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2047
        end      = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2048
        start_id = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2049
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2050
        if ( start > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2051
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2052
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2053
        if ( n > 0 && start <= last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2054
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2055
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2056
        if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2057
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2058
          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2059
            FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2060
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2061
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2062
        last = end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2063
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2064
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2065
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2066
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2067
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2068
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2069
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2070
  /* search the index of the charcode next to cmap->cur_charcode */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2071
  /* cmap->cur_group should be set up properly by caller         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2072
  /*                                                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2073
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2074
  tt_cmap12_next( TT_CMap12  cmap )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2075
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2076
    FT_Byte*  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2077
    FT_ULong  start, end, start_id, char_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2078
    FT_ULong  n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2079
    FT_UInt   gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2080
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2081
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2082
    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2083
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2084
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2085
    char_code = cmap->cur_charcode + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2086
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2087
    n = cmap->cur_group;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2088
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2089
    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2090
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2091
      p        = cmap->cmap.data + 16 + 12 * n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2092
      start    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2093
      end      = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2094
      start_id = TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2095
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2096
      if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2097
        char_code = start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2098
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2099
      for ( ; char_code <= end; char_code++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2100
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2101
        gindex = (FT_UInt)( start_id + char_code - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2102
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2103
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2104
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2105
          cmap->cur_charcode = char_code;;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2106
          cmap->cur_gindex   = gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2107
          cmap->cur_group    = n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2108
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2109
          return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2110
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2111
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2112
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2113
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2114
  Fail:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2115
    cmap->valid = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2116
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2117
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2118
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2119
  static FT_UInt
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2120
  tt_cmap12_char_map_binary( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2121
                             FT_UInt32*  pchar_code,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2122
                             FT_Bool     next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2123
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2124
    FT_UInt    gindex     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2125
    FT_Byte*   p          = cmap->data + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2126
    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2127
    FT_UInt32  char_code  = *pchar_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2128
    FT_UInt32  start, end, start_id;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2129
    FT_UInt32  max, min, mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2130
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2131
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2132
    if ( !num_groups )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2133
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2134
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2135
    /* make compiler happy */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2136
    mid = num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2137
    end = 0xFFFFFFFFUL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2138
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2139
    if ( next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2140
      char_code++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2141
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2142
    min = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2143
    max = num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2144
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2145
    /* binary search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2146
    while ( min < max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2147
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2148
      mid = ( min + max ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2149
      p   = cmap->data + 16 + 12 * mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2150
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2151
      start = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2152
      end   = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2153
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2154
      if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2155
        max = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2156
      else if ( char_code > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2157
        min = mid + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2158
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2159
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2160
        start_id = TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2161
        gindex = (FT_UInt)( start_id + char_code - start );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2162
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2163
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2164
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2165
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2166
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2167
    if ( next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2168
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2169
      TT_CMap12  cmap12 = (TT_CMap12)cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2170
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2171
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2172
      /* if `char_code' is not in any group, then `mid' is */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2173
      /* the group nearest to `char_code'                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2174
      /*                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2175
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2176
      if ( char_code > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2177
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2178
        mid++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2179
        if ( mid == num_groups )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2180
          return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2181
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2182
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2183
      cmap12->valid        = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2184
      cmap12->cur_charcode = char_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2185
      cmap12->cur_group    = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2186
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2187
      if ( !gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2188
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2189
        tt_cmap12_next( cmap12 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2190
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2191
        if ( cmap12->valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2192
          gindex = cmap12->cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2193
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2194
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2195
        cmap12->cur_gindex = gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2196
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2197
      if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2198
        *pchar_code = cmap12->cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2199
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2200
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2201
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2202
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2203
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2204
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2205
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2206
  tt_cmap12_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2207
                        FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2208
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2209
    return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2210
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2211
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2212
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2213
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2214
  tt_cmap12_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2215
                       FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2216
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2217
    TT_CMap12  cmap12 = (TT_CMap12)cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2218
    FT_ULong   gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2219
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2220
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2221
    if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2222
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2223
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2224
    /* no need to search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2225
    if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2226
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2227
      tt_cmap12_next( cmap12 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2228
      if ( cmap12->valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2229
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2230
        gindex = cmap12->cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2231
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2232
        /* XXX: check cur_charcode overflow is expected */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2233
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2234
          *pchar_code = (FT_UInt32)cmap12->cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2235
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2236
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2237
        gindex = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2238
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2239
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2240
      gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2241
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2242
    /* XXX: check gindex overflow is expected */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2243
    return (FT_UInt32)gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2244
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2245
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2246
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2247
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2248
  tt_cmap12_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2249
                      TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2250
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2251
    FT_Byte*  p = cmap->data + 8;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2252
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2253
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2254
    cmap_info->format   = 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2255
    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2256
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2257
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2258
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2259
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2260
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2261
  FT_DEFINE_TT_CMAP(tt_cmap12_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2262
      sizeof ( TT_CMap12Rec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2263
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2264
      (FT_CMap_InitFunc)     tt_cmap12_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2265
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2266
      (FT_CMap_CharIndexFunc)tt_cmap12_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2267
      (FT_CMap_CharNextFunc) tt_cmap12_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2268
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2269
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2270
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2271
    12,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2272
    (TT_CMap_ValidateFunc)   tt_cmap12_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2273
    (TT_CMap_Info_GetFunc)   tt_cmap12_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2274
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2275
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2276
#endif /* TT_CONFIG_CMAP_FORMAT_12 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2277
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2278
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2279
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2280
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2281
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2282
  /*****                          FORMAT 13                            *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2283
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2284
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2285
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2286
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2287
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2288
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2289
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2290
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2291
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2292
  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2293
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2294
  /*   format      0          USHORT     must be 13                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2295
  /*   reserved    2          USHORT     reserved                          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2296
  /*   length      4          ULONG      length in bytes                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2297
  /*   language    8          ULONG      Mac language code                 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2298
  /*   count       12         ULONG      number of groups                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2299
  /*               16                                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2300
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2301
  /* This header is followed by `count' groups of the following format:    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2302
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2303
  /*   start       0          ULONG      first charcode                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2304
  /*   end         4          ULONG      last charcode                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2305
  /*   glyphId     8          ULONG      glyph ID for the whole group      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2306
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2307
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2308
#ifdef TT_CONFIG_CMAP_FORMAT_13
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2309
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2310
  typedef struct  TT_CMap13Rec_
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2311
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2312
    TT_CMapRec  cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2313
    FT_Bool     valid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2314
    FT_ULong    cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2315
    FT_UInt     cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2316
    FT_ULong    cur_group;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2317
    FT_ULong    num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2318
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2319
  } TT_CMap13Rec, *TT_CMap13;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2320
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2321
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2322
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2323
  tt_cmap13_init( TT_CMap13  cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2324
                  FT_Byte*   table )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2325
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2326
    cmap->cmap.data  = table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2327
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2328
    table           += 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2329
    cmap->num_groups = FT_PEEK_ULONG( table );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2330
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2331
    cmap->valid      = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2332
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2333
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2334
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2335
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2336
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2337
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2338
  tt_cmap13_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2339
                      FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2340
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2341
    FT_Byte*   p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2342
    FT_ULong   length;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2343
    FT_ULong   num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2344
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2345
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2346
    if ( table + 16 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2347
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2348
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2349
    p      = table + 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2350
    length = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2351
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2352
    p          = table + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2353
    num_groups = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2354
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2355
    if ( length > (FT_ULong)( valid->limit - table ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2356
         length < 16 + 12 * num_groups               )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2357
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2358
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2359
    /* check groups, they must be in increasing order */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2360
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2361
      FT_ULong  n, start, end, glyph_id, last = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2362
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2363
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2364
      for ( n = 0; n < num_groups; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2365
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2366
        start    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2367
        end      = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2368
        glyph_id = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2369
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2370
        if ( start > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2371
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2372
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2373
        if ( n > 0 && start <= last )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2374
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2375
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2376
        if ( valid->level >= FT_VALIDATE_TIGHT )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2377
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2378
          if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2379
            FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2380
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2381
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2382
        last = end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2383
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2384
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2385
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2386
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2387
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2388
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2389
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2390
  /* search the index of the charcode next to cmap->cur_charcode */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2391
  /* cmap->cur_group should be set up properly by caller         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2392
  /*                                                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2393
  static void
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2394
  tt_cmap13_next( TT_CMap13  cmap )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2395
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2396
    FT_Byte*  p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2397
    FT_ULong  start, end, glyph_id, char_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2398
    FT_ULong  n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2399
    FT_UInt   gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2400
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2401
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2402
    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2403
      goto Fail;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2404
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2405
    char_code = cmap->cur_charcode + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2406
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2407
    n = cmap->cur_group;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2408
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2409
    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2410
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2411
      p        = cmap->cmap.data + 16 + 12 * n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2412
      start    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2413
      end      = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2414
      glyph_id = TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2415
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2416
      if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2417
        char_code = start;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2418
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2419
      if ( char_code <= end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2420
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2421
        gindex = (FT_UInt)glyph_id;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2422
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2423
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2424
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2425
          cmap->cur_charcode = char_code;;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2426
          cmap->cur_gindex   = gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2427
          cmap->cur_group    = n;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2428
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2429
          return;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2430
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2431
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2432
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2433
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2434
  Fail:
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2435
    cmap->valid = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2436
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2437
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2438
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2439
  static FT_UInt
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2440
  tt_cmap13_char_map_binary( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2441
                             FT_UInt32*  pchar_code,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2442
                             FT_Bool     next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2443
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2444
    FT_UInt    gindex     = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2445
    FT_Byte*   p          = cmap->data + 12;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2446
    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2447
    FT_UInt32  char_code  = *pchar_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2448
    FT_UInt32  start, end;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2449
    FT_UInt32  max, min, mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2450
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2451
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2452
    if ( !num_groups )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2453
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2454
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2455
    /* make compiler happy */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2456
    mid = num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2457
    end = 0xFFFFFFFFUL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2458
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2459
    if ( next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2460
      char_code++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2461
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2462
    min = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2463
    max = num_groups;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2464
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2465
    /* binary search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2466
    while ( min < max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2467
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2468
      mid = ( min + max ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2469
      p   = cmap->data + 16 + 12 * mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2470
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2471
      start = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2472
      end   = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2473
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2474
      if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2475
        max = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2476
      else if ( char_code > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2477
        min = mid + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2478
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2479
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2480
        gindex = (FT_UInt)TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2481
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2482
        break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2483
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2484
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2485
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2486
    if ( next )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2487
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2488
      TT_CMap13  cmap13 = (TT_CMap13)cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2489
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2490
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2491
      /* if `char_code' is not in any group, then `mid' is */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2492
      /* the group nearest to `char_code'                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2493
      /*                                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2494
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2495
      if ( char_code > end )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2496
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2497
        mid++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2498
        if ( mid == num_groups )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2499
          return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2500
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2501
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2502
      cmap13->valid        = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2503
      cmap13->cur_charcode = char_code;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2504
      cmap13->cur_group    = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2505
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2506
      if ( !gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2507
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2508
        tt_cmap13_next( cmap13 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2509
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2510
        if ( cmap13->valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2511
          gindex = cmap13->cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2512
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2513
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2514
        cmap13->cur_gindex = gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2515
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2516
      if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2517
        *pchar_code = cmap13->cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2518
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2519
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2520
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2521
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2522
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2523
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2524
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2525
  tt_cmap13_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2526
                        FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2527
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2528
    return tt_cmap13_char_map_binary( cmap, &char_code, 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2529
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2530
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2531
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2532
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2533
  tt_cmap13_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2534
                       FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2535
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2536
    TT_CMap13  cmap13 = (TT_CMap13)cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2537
    FT_UInt    gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2538
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2539
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2540
    if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2541
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2542
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2543
    /* no need to search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2544
    if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2545
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2546
      tt_cmap13_next( cmap13 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2547
      if ( cmap13->valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2548
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2549
        gindex = cmap13->cur_gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2550
        if ( gindex )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2551
          *pchar_code = cmap13->cur_charcode;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2552
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2553
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2554
        gindex = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2555
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2556
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2557
      gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2558
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2559
    return gindex;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2560
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2561
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2562
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2563
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2564
  tt_cmap13_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2565
                      TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2566
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2567
    FT_Byte*  p = cmap->data + 8;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2568
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2569
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2570
    cmap_info->format   = 13;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2571
    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2572
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2573
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2574
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2575
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2576
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2577
  FT_DEFINE_TT_CMAP(tt_cmap13_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2578
      sizeof ( TT_CMap13Rec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2579
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2580
      (FT_CMap_InitFunc)     tt_cmap13_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2581
      (FT_CMap_DoneFunc)     NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2582
      (FT_CMap_CharIndexFunc)tt_cmap13_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2583
      (FT_CMap_CharNextFunc) tt_cmap13_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2584
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2585
      NULL, NULL, NULL, NULL, NULL
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2586
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2587
    13,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2588
    (TT_CMap_ValidateFunc)   tt_cmap13_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2589
    (TT_CMap_Info_GetFunc)   tt_cmap13_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2590
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2591
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2592
#endif /* TT_CONFIG_CMAP_FORMAT_13 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2593
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2594
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2595
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2596
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2597
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2598
  /*****                           FORMAT 14                           *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2599
  /*****                                                               *****/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2600
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2601
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2602
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2603
  /*************************************************************************/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2604
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2605
  /* TABLE OVERVIEW                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2606
  /* --------------                                                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2607
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2608
  /*   NAME         OFFSET  TYPE    DESCRIPTION                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2609
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2610
  /*   format         0     USHORT  must be 14                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2611
  /*   length         2     ULONG   table length in bytes                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2612
  /*   numSelector    6     ULONG   number of variation sel. records       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2613
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2614
  /* Followed by numSelector records, each of which looks like             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2615
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2616
  /*   varSelector    0     UINT24  Unicode codepoint of sel.              */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2617
  /*   defaultOff     3     ULONG   offset to a default UVS table          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2618
  /*                                describing any variants to be found in */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2619
  /*                                the normal Unicode subtable.           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2620
  /*   nonDefOff      7     ULONG   offset to a non-default UVS table      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2621
  /*                                describing any variants not in the     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2622
  /*                                standard cmap, with GIDs here          */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2623
  /* (either offset may be 0 NULL)                                         */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2624
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2625
  /* Selectors are sorted by code point.                                   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2626
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2627
  /* A default Unicode Variation Selector (UVS) subtable is just a list of */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2628
  /* ranges of code points which are to be found in the standard cmap.  No */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2629
  /* glyph IDs (GIDs) here.                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2630
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2631
  /*   numRanges      0     ULONG   number of ranges following             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2632
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2633
  /* A range looks like                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2634
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2635
  /*   uniStart       0     UINT24  code point of the first character in   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2636
  /*                                this range                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2637
  /*   additionalCnt  3     UBYTE   count of additional characters in this */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2638
  /*                                range (zero means a range of a single  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2639
  /*                                character)                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2640
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2641
  /* Ranges are sorted by `uniStart'.                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2642
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2643
  /* A non-default Unicode Variation Selector (UVS) subtable is a list of  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2644
  /* mappings from codepoint to GID.                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2645
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2646
  /*   numMappings    0     ULONG   number of mappings                     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2647
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2648
  /* A range looks like                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2649
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2650
  /*   uniStart       0     UINT24  code point of the first character in   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2651
  /*                                this range                             */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2652
  /*   GID            3     USHORT  and its GID                            */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2653
  /*                                                                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2654
  /* Ranges are sorted by `uniStart'.                                      */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2655
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2656
#ifdef TT_CONFIG_CMAP_FORMAT_14
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2657
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2658
  typedef struct  TT_CMap14Rec_
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2659
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2660
    TT_CMapRec  cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2661
    FT_ULong    num_selectors;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2662
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2663
    /* This array is used to store the results of various
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2664
     * cmap 14 query functions.  The data is overwritten
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2665
     * on each call to these functions.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2666
     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2667
    FT_UInt32   max_results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2668
    FT_UInt32*  results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2669
    FT_Memory   memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2670
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2671
  } TT_CMap14Rec, *TT_CMap14;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2672
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2673
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2674
  FT_CALLBACK_DEF( void )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2675
  tt_cmap14_done( TT_CMap14  cmap )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2676
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2677
    FT_Memory  memory = cmap->memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2678
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2679
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2680
    cmap->max_results = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2681
    if ( memory != NULL && cmap->results != NULL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2682
      FT_FREE( cmap->results );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2683
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2684
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2685
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2686
  static FT_Error
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2687
  tt_cmap14_ensure( TT_CMap14  cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2688
                    FT_UInt32  num_results,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2689
                    FT_Memory  memory )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2690
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2691
    FT_UInt32 old_max = cmap->max_results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2692
    FT_Error  error   = SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2693
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2694
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2695
    if ( num_results > cmap->max_results )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2696
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2697
       cmap->memory = memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2698
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2699
       if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2700
         return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2701
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2702
       cmap->max_results = num_results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2703
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2704
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2705
    return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2706
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2707
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2708
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2709
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2710
  tt_cmap14_init( TT_CMap14  cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2711
                  FT_Byte*   table )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2712
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2713
    cmap->cmap.data = table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2714
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2715
    table               += 6;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2716
    cmap->num_selectors = FT_PEEK_ULONG( table );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2717
    cmap->max_results   = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2718
    cmap->results       = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2719
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2720
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2721
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2722
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2723
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2724
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2725
  tt_cmap14_validate( FT_Byte*      table,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2726
                      FT_Validator  valid )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2727
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2728
    FT_Byte*  p             = table + 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2729
    FT_ULong  length        = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2730
    FT_ULong  num_selectors = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2731
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2732
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2733
    if ( length > (FT_ULong)( valid->limit - table ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2734
         length < 10 + 11 * num_selectors            )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2735
      FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2736
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2737
    /* check selectors, they must be in increasing order */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2738
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2739
      /* we start lastVarSel at 1 because a variant selector value of 0
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2740
       * isn't valid.
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2741
       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2742
      FT_ULong  n, lastVarSel = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2743
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2744
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2745
      for ( n = 0; n < num_selectors; n++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2746
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2747
        FT_ULong  varSel    = TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2748
        FT_ULong  defOff    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2749
        FT_ULong  nondefOff = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2750
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2751
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2752
        if ( defOff >= length || nondefOff >= length )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2753
          FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2754
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2755
        if ( varSel < lastVarSel )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2756
          FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2757
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2758
        lastVarSel = varSel + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2759
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2760
        /* check the default table (these glyphs should be reached     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2761
        /* through the normal Unicode cmap, no GIDs, just check order) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2762
        if ( defOff != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2763
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2764
          FT_Byte*  defp      = table + defOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2765
          FT_ULong  numRanges = TT_NEXT_ULONG( defp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2766
          FT_ULong  i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2767
          FT_ULong  lastBase  = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2768
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2769
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2770
          if ( defp + numRanges * 4 > valid->limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2771
            FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2772
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2773
          for ( i = 0; i < numRanges; ++i )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2774
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2775
            FT_ULong  base = TT_NEXT_UINT24( defp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2776
            FT_ULong  cnt  = FT_NEXT_BYTE( defp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2777
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2778
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2779
            if ( base + cnt >= 0x110000UL )              /* end of Unicode */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2780
              FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2781
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2782
            if ( base < lastBase )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2783
              FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2784
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2785
            lastBase = base + cnt + 1U;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2786
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2787
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2788
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2789
        /* and the non-default table (these glyphs are specified here) */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2790
        if ( nondefOff != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2791
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2792
          FT_Byte*  ndp         = table + nondefOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2793
          FT_ULong  numMappings = TT_NEXT_ULONG( ndp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2794
          FT_ULong  i, lastUni = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2795
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2796
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2797
          if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2798
            FT_INVALID_TOO_SHORT;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2799
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2800
          for ( i = 0; i < numMappings; ++i )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2801
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2802
            FT_ULong  uni = TT_NEXT_UINT24( ndp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2803
            FT_ULong  gid = TT_NEXT_USHORT( ndp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2804
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2805
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2806
            if ( uni >= 0x110000UL )                     /* end of Unicode */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2807
              FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2808
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2809
            if ( uni < lastUni )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2810
              FT_INVALID_DATA;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2811
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2812
            lastUni = uni + 1U;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2813
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2814
            if ( valid->level >= FT_VALIDATE_TIGHT    &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2815
                 gid >= TT_VALID_GLYPH_COUNT( valid ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2816
              FT_INVALID_GLYPH_ID;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2817
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2818
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2819
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2820
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2821
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2822
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2823
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2824
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2825
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2826
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2827
  tt_cmap14_char_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2828
                        FT_UInt32  char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2829
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2830
    FT_UNUSED( cmap );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2831
    FT_UNUSED( char_code );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2832
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2833
    /* This can't happen */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2834
    return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2835
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2836
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2837
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2838
  FT_CALLBACK_DEF( FT_UInt32 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2839
  tt_cmap14_char_next( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2840
                       FT_UInt32  *pchar_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2841
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2842
    FT_UNUSED( cmap );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2843
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2844
    /* This can't happen */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2845
    *pchar_code = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2846
    return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2847
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2848
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2849
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2850
  FT_CALLBACK_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2851
  tt_cmap14_get_info( TT_CMap       cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2852
                      TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2853
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2854
    FT_UNUSED( cmap );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2855
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2856
    cmap_info->format   = 14;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2857
    /* subtable 14 does not define a language field */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2858
    cmap_info->language = 0xFFFFFFFFUL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2859
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2860
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2861
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2862
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2863
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2864
  static FT_UInt
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2865
  tt_cmap14_char_map_def_binary( FT_Byte    *base,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2866
                                 FT_UInt32   char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2867
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2868
    FT_UInt32  numRanges = TT_PEEK_ULONG( base );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2869
    FT_UInt32  max, min;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2870
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2871
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2872
    min = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2873
    max = numRanges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2874
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2875
    base += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2876
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2877
    /* binary search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2878
    while ( min < max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2879
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2880
      FT_UInt32  mid   = ( min + max ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2881
      FT_Byte*   p     = base + 4 * mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2882
      FT_ULong   start = TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2883
      FT_UInt    cnt   = FT_NEXT_BYTE( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2884
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2885
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2886
      if ( char_code < start )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2887
        max = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2888
      else if ( char_code > start+cnt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2889
        min = mid + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2890
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2891
        return TRUE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2892
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2893
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2894
    return FALSE;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2895
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2896
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2897
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2898
  static FT_UInt
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2899
  tt_cmap14_char_map_nondef_binary( FT_Byte    *base,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2900
                                    FT_UInt32   char_code )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2901
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2902
    FT_UInt32  numMappings = TT_PEEK_ULONG( base );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2903
    FT_UInt32  max, min;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2904
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2905
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2906
    min = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2907
    max = numMappings;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2908
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2909
    base += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2910
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2911
    /* binary search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2912
    while ( min < max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2913
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2914
      FT_UInt32  mid = ( min + max ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2915
      FT_Byte*   p   = base + 5 * mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2916
      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2917
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2918
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2919
      if ( char_code < uni )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2920
        max = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2921
      else if ( char_code > uni )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2922
        min = mid + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2923
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2924
        return TT_PEEK_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2925
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2926
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2927
    return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2928
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2929
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2930
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2931
  static FT_Byte*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2932
  tt_cmap14_find_variant( FT_Byte    *base,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2933
                          FT_UInt32   variantCode )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2934
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2935
    FT_UInt32  numVar = TT_PEEK_ULONG( base );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2936
    FT_UInt32  max, min;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2937
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2938
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2939
    min = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2940
    max = numVar;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2941
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2942
    base += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2943
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2944
    /* binary search */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2945
    while ( min < max )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2946
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2947
      FT_UInt32  mid    = ( min + max ) >> 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2948
      FT_Byte*   p      = base + 11 * mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2949
      FT_ULong   varSel = TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2950
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2951
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2952
      if ( variantCode < varSel )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2953
        max = mid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2954
      else if ( variantCode > varSel )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2955
        min = mid + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2956
      else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2957
        return p;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2958
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2959
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2960
    return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2961
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2962
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2963
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2964
  FT_CALLBACK_DEF( FT_UInt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2965
  tt_cmap14_char_var_index( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2966
                            TT_CMap    ucmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2967
                            FT_UInt32  charcode,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2968
                            FT_UInt32  variantSelector)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2969
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2970
    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2971
    FT_ULong  defOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2972
    FT_ULong  nondefOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2973
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2974
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2975
    if ( !p )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2976
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2977
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2978
    defOff    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2979
    nondefOff = TT_PEEK_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2980
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2981
    if ( defOff != 0                                                    &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2982
         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2983
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2984
      /* This is the default variant of this charcode.  GID not stored */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2985
      /* here; stored in the normal Unicode charmap instead.           */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2986
      return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2987
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2988
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2989
    if ( nondefOff != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2990
      return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2991
                                               charcode );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2992
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2993
    return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2994
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2995
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2996
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2997
  FT_CALLBACK_DEF( FT_Int )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2998
  tt_cmap14_char_var_isdefault( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  2999
                                FT_UInt32  charcode,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3000
                                FT_UInt32  variantSelector )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3001
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3002
    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3003
    FT_ULong  defOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3004
    FT_ULong  nondefOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3005
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3006
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3007
    if ( !p )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3008
      return -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3009
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3010
    defOff    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3011
    nondefOff = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3012
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3013
    if ( defOff != 0                                                    &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3014
         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3015
      return 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3016
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3017
    if ( nondefOff != 0                                            &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3018
         tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3019
                                           charcode ) != 0         )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3020
      return 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3021
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3022
    return -1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3023
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3024
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3025
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3026
  FT_CALLBACK_DEF( FT_UInt32* )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3027
  tt_cmap14_variants( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3028
                      FT_Memory  memory )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3029
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3030
    TT_CMap14   cmap14 = (TT_CMap14)cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3031
    FT_UInt32   count  = cmap14->num_selectors;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3032
    FT_Byte*    p      = cmap->data + 10;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3033
    FT_UInt32*  result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3034
    FT_UInt32   i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3035
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3036
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3037
    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3038
      return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3039
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3040
    result = cmap14->results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3041
    for ( i = 0; i < count; ++i )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3042
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3043
      result[i] = (FT_UInt32)TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3044
      p        += 8;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3045
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3046
    result[i] = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3047
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3048
    return result;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3049
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3050
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3051
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3052
  FT_CALLBACK_DEF( FT_UInt32 * )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3053
  tt_cmap14_char_variants( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3054
                           FT_Memory  memory,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3055
                           FT_UInt32  charCode )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3056
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3057
    TT_CMap14   cmap14 = (TT_CMap14)  cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3058
    FT_UInt32   count  = cmap14->num_selectors;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3059
    FT_Byte*    p      = cmap->data + 10;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3060
    FT_UInt32*  q;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3061
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3062
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3063
    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3064
      return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3065
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3066
    for ( q = cmap14->results; count > 0; --count )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3067
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3068
      FT_UInt32  varSel    = TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3069
      FT_ULong   defOff    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3070
      FT_ULong   nondefOff = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3071
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3072
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3073
      if ( ( defOff != 0                                               &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3074
             tt_cmap14_char_map_def_binary( cmap->data + defOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3075
                                            charCode )                 ) ||
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3076
           ( nondefOff != 0                                            &&
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3077
             tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3078
                                               charCode ) != 0         ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3079
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3080
        q[0] = varSel;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3081
        q++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3082
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3083
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3084
    q[0] = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3085
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3086
    return cmap14->results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3087
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3088
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3089
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3090
  static FT_UInt
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3091
  tt_cmap14_def_char_count( FT_Byte  *p )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3092
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3093
    FT_UInt32  numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3094
    FT_UInt    tot       = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3095
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3096
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3097
    p += 3;  /* point to the first `cnt' field */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3098
    for ( ; numRanges > 0; numRanges-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3099
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3100
      tot += 1 + p[0];
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3101
      p   += 4;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3102
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3103
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3104
    return tot;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3105
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3106
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3107
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3108
  static FT_UInt32*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3109
  tt_cmap14_get_def_chars( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3110
                           FT_Byte*    p,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3111
                           FT_Memory   memory )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3112
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3113
    TT_CMap14   cmap14 = (TT_CMap14) cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3114
    FT_UInt32   numRanges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3115
    FT_UInt     cnt;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3116
    FT_UInt32*  q;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3117
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3118
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3119
    cnt       = tt_cmap14_def_char_count( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3120
    numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3121
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3122
    if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3123
      return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3124
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3125
    for ( q = cmap14->results; numRanges > 0; --numRanges )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3126
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3127
      FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3128
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3129
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3130
      cnt = FT_NEXT_BYTE( p ) + 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3131
      do
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3132
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3133
        q[0]  = uni;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3134
        uni  += 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3135
        q    += 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3136
      } while ( --cnt != 0 );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3137
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3138
    q[0] = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3139
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3140
    return cmap14->results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3141
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3142
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3143
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3144
  static FT_UInt32*
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3145
  tt_cmap14_get_nondef_chars( TT_CMap     cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3146
                              FT_Byte    *p,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3147
                              FT_Memory   memory )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3148
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3149
    TT_CMap14   cmap14 = (TT_CMap14) cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3150
    FT_UInt32   numMappings;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3151
    FT_UInt     i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3152
    FT_UInt32  *ret;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3153
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3154
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3155
    numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3156
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3157
    if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3158
      return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3159
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3160
    ret = cmap14->results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3161
    for ( i = 0; i < numMappings; ++i )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3162
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3163
      ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3164
      p += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3165
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3166
    ret[i] = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3167
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3168
    return ret;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3169
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3170
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3171
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3172
  FT_CALLBACK_DEF( FT_UInt32 * )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3173
  tt_cmap14_variant_chars( TT_CMap    cmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3174
                           FT_Memory  memory,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3175
                           FT_UInt32  variantSelector )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3176
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3177
    FT_Byte    *p  = tt_cmap14_find_variant( cmap->data + 6,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3178
                                             variantSelector );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3179
    FT_UInt32  *ret;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3180
    FT_Int      i;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3181
    FT_ULong    defOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3182
    FT_ULong    nondefOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3183
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3184
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3185
    if ( !p )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3186
      return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3187
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3188
    defOff    = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3189
    nondefOff = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3190
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3191
    if ( defOff == 0 && nondefOff == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3192
      return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3193
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3194
    if ( defOff == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3195
      return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3196
                                         memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3197
    else if ( nondefOff == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3198
      return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3199
                                      memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3200
    else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3201
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3202
      /* Both a default and a non-default glyph set?  That's probably not */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3203
      /* good font design, but the spec allows for it...                  */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3204
      TT_CMap14  cmap14 = (TT_CMap14) cmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3205
      FT_UInt32  numRanges;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3206
      FT_UInt32  numMappings;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3207
      FT_UInt32  duni;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3208
      FT_UInt32  dcnt;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3209
      FT_UInt32  nuni;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3210
      FT_Byte*   dp;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3211
      FT_UInt    di, ni, k;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3212
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3213
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3214
      p  = cmap->data + nondefOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3215
      dp = cmap->data + defOff;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3216
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3217
      numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3218
      dcnt        = tt_cmap14_def_char_count( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3219
      numRanges   = (FT_UInt32)TT_NEXT_ULONG( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3220
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3221
      if ( numMappings == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3222
        return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3223
                                        memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3224
      if ( dcnt == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3225
        return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3226
                                           memory );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3227
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3228
      if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3229
        return NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3230
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3231
      ret  = cmap14->results;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3232
      duni = (FT_UInt32)TT_NEXT_UINT24( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3233
      dcnt = FT_NEXT_BYTE( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3234
      di   = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3235
      nuni = (FT_UInt32)TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3236
      p   += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3237
      ni   = 1;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3238
      i    = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3239
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3240
      for ( ;; )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3241
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3242
        if ( nuni > duni + dcnt )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3243
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3244
          for ( k = 0; k <= dcnt; ++k )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3245
            ret[i++] = duni + k;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3246
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3247
          ++di;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3248
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3249
          if ( di > numRanges )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3250
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3251
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3252
          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3253
          dcnt = FT_NEXT_BYTE( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3254
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3255
        else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3256
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3257
          if ( nuni < duni )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3258
            ret[i++] = nuni;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3259
          /* If it is within the default range then ignore it -- */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3260
          /* that should not have happened                       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3261
          ++ni;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3262
          if ( ni > numMappings )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3263
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3264
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3265
          nuni = (FT_UInt32)TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3266
          p += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3267
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3268
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3269
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3270
      if ( ni <= numMappings )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3271
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3272
        /* If we get here then we have run out of all default ranges.   */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3273
        /* We have read one non-default mapping which we haven't stored */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3274
        /* and there may be others that need to be read.                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3275
        ret[i++] = nuni;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3276
        while ( ni < numMappings )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3277
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3278
          ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3279
          p += 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3280
          ++ni;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3281
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3282
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3283
      else if ( di <= numRanges )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3284
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3285
        /* If we get here then we have run out of all non-default     */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3286
        /* mappings.  We have read one default range which we haven't */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3287
        /* stored and there may be others that need to be read.       */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3288
        for ( k = 0; k <= dcnt; ++k )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3289
          ret[i++] = duni + k;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3290
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3291
        while ( di < numRanges )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3292
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3293
          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3294
          dcnt = FT_NEXT_BYTE( dp );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3295
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3296
          for ( k = 0; k <= dcnt; ++k )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3297
            ret[i++] = duni + k;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3298
          ++di;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3299
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3300
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3301
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3302
      ret[i] = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3303
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3304
      return ret;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3305
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3306
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3307
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3308
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3309
  FT_DEFINE_TT_CMAP(tt_cmap14_class_rec,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3310
      sizeof ( TT_CMap14Rec ),
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3311
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3312
      (FT_CMap_InitFunc)     tt_cmap14_init,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3313
      (FT_CMap_DoneFunc)     tt_cmap14_done,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3314
      (FT_CMap_CharIndexFunc)tt_cmap14_char_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3315
      (FT_CMap_CharNextFunc) tt_cmap14_char_next,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3316
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3317
      /* Format 14 extension functions */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3318
      (FT_CMap_CharVarIndexFunc)    tt_cmap14_char_var_index,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3319
      (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3320
      (FT_CMap_VariantListFunc)     tt_cmap14_variants,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3321
      (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3322
      (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3323
    ,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3324
    14,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3325
    (TT_CMap_ValidateFunc)tt_cmap14_validate,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3326
    (TT_CMap_Info_GetFunc)tt_cmap14_get_info
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3327
  )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3328
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3329
#endif /* TT_CONFIG_CMAP_FORMAT_14 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3330
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3331
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3332
#ifndef FT_CONFIG_OPTION_PIC
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3333
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3334
  static const TT_CMap_Class  tt_cmap_classes[] =
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3335
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3336
#define TTCMAPCITEM(a) &a,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3337
#include "ttcmapc.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3338
    NULL,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3339
  };
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3340
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3341
#else /*FT_CONFIG_OPTION_PIC*/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3342
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3343
  void FT_Destroy_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class* clazz)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3344
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3345
    FT_Memory memory = library->memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3346
    if ( clazz )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3347
      FT_FREE( clazz );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3348
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3349
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3350
  FT_Error FT_Create_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class** output_class)
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3351
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3352
    TT_CMap_Class*  clazz;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3353
    TT_CMap_ClassRec* recs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3354
    FT_Error          error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3355
    FT_Memory memory = library->memory;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3356
    int i = 0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3357
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3358
#define TTCMAPCITEM(a) i++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3359
#include "ttcmapc.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3360
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3361
    /* allocate enough space for both the pointers +terminator and the class instances */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3362
    if ( FT_ALLOC( clazz, sizeof(*clazz)*(i+1)+sizeof(TT_CMap_ClassRec)*i ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3363
      return error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3364
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3365
    /* the location of the class instances follows the array of pointers */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3366
    recs = (TT_CMap_ClassRec*) (((char*)clazz)+(sizeof(*clazz)*(i+1))); 
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3367
    i=0;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3368
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3369
#undef TTCMAPCITEM
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3370
#define TTCMAPCITEM(a)           \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3371
    FT_Init_Class_##a(&recs[i]); \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3372
    clazz[i] = &recs[i];         \
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3373
    i++;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3374
#include "ttcmapc.h"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3375
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3376
    clazz[i] = NULL;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3377
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3378
    *output_class = clazz;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3379
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3380
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3381
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3382
#endif /*FT_CONFIG_OPTION_PIC*/
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3383
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3384
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3385
  /* parse the `cmap' table and build the corresponding TT_CMap objects */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3386
  /* in the current face                                                */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3387
  /*                                                                    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3388
  FT_LOCAL_DEF( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3389
  tt_face_build_cmaps( TT_Face  face )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3390
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3391
    FT_Byte*           table = face->cmap_table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3392
    FT_Byte*           limit = table + face->cmap_size;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3393
    FT_UInt volatile   num_cmaps;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3394
    FT_Byte* volatile  p     = table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3395
    FT_Library         library = FT_FACE_LIBRARY( face );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3396
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3397
    FT_UNUSED( library );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3398
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3399
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3400
    if ( !p || p + 4 > limit )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3401
      return SFNT_Err_Invalid_Table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3402
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3403
    /* only recognize format 0 */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3404
    if ( TT_NEXT_USHORT( p ) != 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3405
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3406
      p -= 2;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3407
      FT_ERROR(( "tt_face_build_cmaps:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3408
                 " unsupported `cmap' table format = %d\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3409
                 TT_PEEK_USHORT( p ) ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3410
      return SFNT_Err_Invalid_Table;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3411
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3412
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3413
    num_cmaps = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3414
#ifdef FT_MAX_CHARMAP_CACHEABLE
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3415
    if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3416
      FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables(%d) "
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3417
                 "subtable#%d and later are loaded but cannot be searched\n",
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3418
                 num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3419
#endif
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3420
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3421
    for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3422
    {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3423
      FT_CharMapRec  charmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3424
      FT_UInt32      offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3425
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3426
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3427
      charmap.platform_id = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3428
      charmap.encoding_id = TT_NEXT_USHORT( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3429
      charmap.face        = FT_FACE( face );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3430
      charmap.encoding    = FT_ENCODING_NONE;  /* will be filled later */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3431
      offset              = TT_NEXT_ULONG( p );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3432
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3433
      if ( offset && offset <= face->cmap_size - 2 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3434
      {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3435
        FT_Byte* volatile              cmap   = table + offset;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3436
        volatile FT_UInt               format = TT_PEEK_USHORT( cmap );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3437
        const TT_CMap_Class* volatile  pclazz = FT_TT_CMAP_CLASSES_GET;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3438
        TT_CMap_Class volatile         clazz;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3439
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3440
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3441
        for ( ; *pclazz; pclazz++ )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3442
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3443
          clazz = *pclazz;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3444
          if ( clazz->format == format )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3445
          {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3446
            volatile TT_ValidatorRec  valid;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3447
            volatile FT_Error         error = SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3448
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3449
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3450
            ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3451
                               FT_VALIDATE_DEFAULT );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3452
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3453
            valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3454
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3455
            if ( ft_setjmp(
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3456
              *((ft_jmp_buf*)&FT_VALIDATOR( &valid )->jump_buffer) ) == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3457
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3458
              /* validate this cmap sub-table */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3459
              error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3460
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3461
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3462
            if ( valid.validator.error == 0 )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3463
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3464
              FT_CMap  ttcmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3465
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3466
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3467
              /* It might make sense to store the single variation selector */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3468
              /* cmap somewhere special.  But it would have to be in the    */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3469
              /* public FT_FaceRec, and we can't change that.               */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3470
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3471
              if ( !FT_CMap_New( (FT_CMap_Class)clazz,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3472
                                 cmap, &charmap, &ttcmap ) )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3473
              {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3474
                /* it is simpler to directly set `flags' than adding */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3475
                /* a parameter to FT_CMap_New                        */
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3476
                ((TT_CMap)ttcmap)->flags = (FT_Int)error;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3477
              }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3478
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3479
            else
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3480
            {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3481
              FT_TRACE0(( "tt_face_build_cmaps:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3482
                          " broken cmap sub-table ignored\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3483
            }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3484
            break;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3485
          }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3486
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3487
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3488
        if ( *pclazz == NULL )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3489
        {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3490
          FT_TRACE0(( "tt_face_build_cmaps:"
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3491
                      " unsupported cmap sub-table ignored\n" ));
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3492
        }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3493
      }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3494
    }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3495
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3496
    return SFNT_Err_Ok;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3497
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3498
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3499
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3500
  FT_LOCAL( FT_Error )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3501
  tt_get_cmap_info( FT_CharMap    charmap,
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3502
                    TT_CMapInfo  *cmap_info )
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3503
  {
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3504
    FT_CMap        cmap  = (FT_CMap)charmap;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3505
    TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3506
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3507
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3508
    return clazz->get_cmap_info( charmap, cmap_info );
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3509
  }
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3510
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3511
88f2e05288ba aaand let's add freetype as well while we are at it
koda
parents:
diff changeset
  3512
/* END */