source: trunk/poppler/freetype2/src/pfr/pfrcmap.c @ 251

Last change on this file since 251 was 251, checked in by Eugene Romanenko, 13 years ago

PDF plugin: freetype library updated to version 2.3.5

File size: 4.2 KB
Line 
1/***************************************************************************/
2/*                                                                         */
3/*  pfrcmap.c                                                              */
4/*                                                                         */
5/*    FreeType PFR cmap handling (body).                                   */
6/*                                                                         */
7/*  Copyright 2002, 2007 by                                                */
8/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9/*                                                                         */
10/*  This file is part of the FreeType project, and may only be used,       */
11/*  modified, and distributed under the terms of the FreeType project      */
12/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13/*  this file you indicate that you have read the license and              */
14/*  understand and accept it fully.                                        */
15/*                                                                         */
16/***************************************************************************/
17
18
19#include "pfrcmap.h"
20#include "pfrobjs.h"
21#include FT_INTERNAL_DEBUG_H
22
23#include "pfrerror.h"
24
25
26  FT_CALLBACK_DEF( FT_Error )
27  pfr_cmap_init( PFR_CMap  cmap )
28  {
29    FT_Error  error = PFR_Err_Ok;
30    PFR_Face  face  = (PFR_Face)FT_CMAP_FACE( cmap );
31
32
33    cmap->num_chars = face->phy_font.num_chars;
34    cmap->chars     = face->phy_font.chars;
35
36    /* just for safety, check that the character entries are correctly */
37    /* sorted in increasing character code order                       */
38    {
39      FT_UInt  n;
40
41
42      for ( n = 1; n < cmap->num_chars; n++ )
43      {
44        if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code )
45        {
46          error = PFR_Err_Invalid_Table;
47          goto Exit;
48        }
49      }
50    }
51
52  Exit:
53    return error;
54  }
55
56
57  FT_CALLBACK_DEF( void )
58  pfr_cmap_done( PFR_CMap  cmap )
59  {
60    cmap->chars     = NULL;
61    cmap->num_chars = 0;
62  }
63
64
65  FT_CALLBACK_DEF( FT_UInt )
66  pfr_cmap_char_index( PFR_CMap   cmap,
67                       FT_UInt32  char_code )
68  {
69    FT_UInt   min = 0;
70    FT_UInt   max = cmap->num_chars;
71    FT_UInt   mid;
72    PFR_Char  gchar;
73
74
75    while ( min < max )
76    {
77      mid   = min + ( max - min ) / 2;
78      gchar = cmap->chars + mid;
79
80      if ( gchar->char_code == char_code )
81        return mid + 1;
82
83      if ( gchar->char_code < char_code )
84        min = mid + 1;
85      else
86        max = mid;
87    }
88    return 0;
89  }
90
91
92  FT_CALLBACK_DEF( FT_UInt )
93  pfr_cmap_char_next( PFR_CMap    cmap,
94                      FT_UInt32  *pchar_code )
95  {
96    FT_UInt    result    = 0;
97    FT_UInt32  char_code = *pchar_code + 1;
98
99
100  Restart:
101    {
102      FT_UInt   min = 0;
103      FT_UInt   max = cmap->num_chars;
104      FT_UInt   mid;
105      PFR_Char  gchar;
106
107
108      while ( min < max )
109      {
110        mid   = min + ( ( max - min ) >> 1 );
111        gchar = cmap->chars + mid;
112
113        if ( gchar->char_code == char_code )
114        {
115          result = mid;
116          if ( result != 0 )
117          {
118            result++;
119            goto Exit;
120          }
121
122          char_code++;
123          goto Restart;
124        }
125
126        if ( gchar->char_code < char_code )
127          min = mid+1;
128        else
129          max = mid;
130      }
131
132      /* we didn't find it, but we have a pair just above it */
133      char_code = 0;
134
135      if ( min < cmap->num_chars )
136      {
137        gchar  = cmap->chars + min;
138        result = min;
139        if ( result != 0 )
140        {
141          result++;
142          char_code = gchar->char_code;
143        }
144      }
145    }
146
147  Exit:
148    *pchar_code = char_code;
149    return result;
150  }
151
152
153  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
154  pfr_cmap_class_rec =
155  {
156    sizeof ( PFR_CMapRec ),
157
158    (FT_CMap_InitFunc)     pfr_cmap_init,
159    (FT_CMap_DoneFunc)     pfr_cmap_done,
160    (FT_CMap_CharIndexFunc)pfr_cmap_char_index,
161    (FT_CMap_CharNextFunc) pfr_cmap_char_next,
162
163    NULL, NULL, NULL, NULL, NULL
164  };
165
166
167/* END */
Note: See TracBrowser for help on using the repository browser.