Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 1 | /***************************************************************************/ |
| 2 | /* */ |
| 3 | /* sfdriver.c */ |
| 4 | /* */ |
| 5 | /* High-level SFNT driver interface (body). */ |
| 6 | /* */ |
Werner Lemberg | e793092 | 2005-03-01 02:13:50 +0000 | [diff] [blame] | 7 | /* Copyright 1996-2001, 2002, 2003, 2004, 2005 by */ |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 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 | |
Werner Lemberg | cc069be | 2000-12-08 16:17:16 +0000 | [diff] [blame] | 18 | |
David Turner | 19ed8af | 2000-12-08 02:42:29 +0000 | [diff] [blame] | 19 | #include <ft2build.h> |
| 20 | #include FT_INTERNAL_SFNT_H |
| 21 | #include FT_INTERNAL_OBJECTS_H |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 22 | |
David Turner | 8d3a401 | 2001-03-20 11:14:24 +0000 | [diff] [blame] | 23 | #include "sfdriver.h" |
| 24 | #include "ttload.h" |
David Turner | 8d3a401 | 2001-03-20 11:14:24 +0000 | [diff] [blame] | 25 | #include "sfobjs.h" |
Werner Lemberg | 7fa51b5 | 2000-07-08 19:51:42 +0000 | [diff] [blame] | 26 | |
Werner Lemberg | 754d558 | 2003-09-12 20:32:51 +0000 | [diff] [blame] | 27 | #include "sferrors.h" |
| 28 | |
Werner Lemberg | f1ca234 | 2000-11-29 15:18:54 +0000 | [diff] [blame] | 29 | #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS |
David Turner | 8d3a401 | 2001-03-20 11:14:24 +0000 | [diff] [blame] | 30 | #include "ttsbit.h" |
Werner Lemberg | f1ca234 | 2000-11-29 15:18:54 +0000 | [diff] [blame] | 31 | #endif |
| 32 | |
| 33 | #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES |
David Turner | 8d3a401 | 2001-03-20 11:14:24 +0000 | [diff] [blame] | 34 | #include "ttpost.h" |
Werner Lemberg | f1ca234 | 2000-11-29 15:18:54 +0000 | [diff] [blame] | 35 | #endif |
| 36 | |
David Turner | 89a2a4b | 2005-12-14 20:38:15 +0000 | [diff] [blame^] | 37 | #ifdef TT_CONFIG_OPTION_BDF |
| 38 | #include "ttbdf.h" |
| 39 | #include FT_SERVICE_BDF_H |
| 40 | #endif |
| 41 | |
Werner Lemberg | 4b8397c | 2004-08-29 16:50:09 +0000 | [diff] [blame] | 42 | #include "ttcmap.h" |
Werner Lemberg | f13516c | 2005-03-03 17:09:08 +0000 | [diff] [blame] | 43 | #include "ttkern.h" |
Werner Lemberg | 91a6747 | 2003-12-17 14:28:22 +0000 | [diff] [blame] | 44 | |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 45 | #include FT_SERVICE_GLYPH_DICT_H |
| 46 | #include FT_SERVICE_POSTSCRIPT_NAME_H |
Werner Lemberg | 82906bf | 2003-11-04 18:24:20 +0000 | [diff] [blame] | 47 | #include FT_SERVICE_SFNT_H |
Werner Lemberg | 91a6747 | 2003-12-17 14:28:22 +0000 | [diff] [blame] | 48 | #include FT_SERVICE_TT_CMAP_H |
Werner Lemberg | 82906bf | 2003-11-04 18:24:20 +0000 | [diff] [blame] | 49 | |
| 50 | |
| 51 | /* |
| 52 | * SFNT TABLE SERVICE |
| 53 | * |
| 54 | */ |
Werner Lemberg | a929ba9 | 2000-06-25 06:47:11 +0000 | [diff] [blame] | 55 | |
Werner Lemberg | 52005c3 | 2001-06-27 23:25:46 +0000 | [diff] [blame] | 56 | static void* |
| 57 | get_sfnt_table( TT_Face face, |
| 58 | FT_Sfnt_Tag tag ) |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 59 | { |
| 60 | void* table; |
| 61 | |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 62 | |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 63 | switch ( tag ) |
| 64 | { |
| 65 | case ft_sfnt_head: |
| 66 | table = &face->header; |
| 67 | break; |
| 68 | |
| 69 | case ft_sfnt_hhea: |
| 70 | table = &face->horizontal; |
| 71 | break; |
| 72 | |
| 73 | case ft_sfnt_vhea: |
| 74 | table = face->vertical_info ? &face->vertical : 0; |
| 75 | break; |
| 76 | |
| 77 | case ft_sfnt_os2: |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 78 | table = face->os2.version == 0xFFFFU ? 0 : &face->os2; |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 79 | break; |
| 80 | |
| 81 | case ft_sfnt_post: |
| 82 | table = &face->postscript; |
| 83 | break; |
| 84 | |
| 85 | case ft_sfnt_maxp: |
| 86 | table = &face->max_profile; |
| 87 | break; |
| 88 | |
| 89 | case ft_sfnt_pclt: |
| 90 | table = face->pclt.Version ? &face->pclt : 0; |
| 91 | break; |
| 92 | |
| 93 | default: |
| 94 | table = 0; |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 95 | } |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 96 | |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 97 | return table; |
| 98 | } |
| 99 | |
| 100 | |
Werner Lemberg | 1743942 | 2004-08-11 05:25:37 +0000 | [diff] [blame] | 101 | static FT_Error |
| 102 | sfnt_table_info( TT_Face face, |
| 103 | FT_UInt idx, |
| 104 | FT_ULong *tag, |
| 105 | FT_ULong *length ) |
| 106 | { |
| 107 | if ( !tag || !length ) |
| 108 | return SFNT_Err_Invalid_Argument; |
| 109 | |
| 110 | if ( idx >= face->num_tables ) |
| 111 | return SFNT_Err_Table_Missing; |
| 112 | |
| 113 | *tag = face->dir_tables[idx].Tag; |
| 114 | *length = face->dir_tables[idx].Length; |
| 115 | |
| 116 | return SFNT_Err_Ok; |
| 117 | } |
| 118 | |
| 119 | |
Werner Lemberg | 82906bf | 2003-11-04 18:24:20 +0000 | [diff] [blame] | 120 | static const FT_Service_SFNT_TableRec sfnt_service_sfnt_table = |
| 121 | { |
| 122 | (FT_SFNT_TableLoadFunc)tt_face_load_any, |
Werner Lemberg | 1743942 | 2004-08-11 05:25:37 +0000 | [diff] [blame] | 123 | (FT_SFNT_TableGetFunc) get_sfnt_table, |
| 124 | (FT_SFNT_TableInfoFunc)sfnt_table_info |
Werner Lemberg | 82906bf | 2003-11-04 18:24:20 +0000 | [diff] [blame] | 125 | }; |
| 126 | |
| 127 | |
David Turner | 6930b45 | 2000-07-19 17:13:03 +0000 | [diff] [blame] | 128 | #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 129 | |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 130 | /* |
| 131 | * GLYPH DICT SERVICE |
| 132 | * |
| 133 | */ |
David Turner | 17dd063 | 2003-09-21 16:04:05 +0000 | [diff] [blame] | 134 | |
Werner Lemberg | 52005c3 | 2001-06-27 23:25:46 +0000 | [diff] [blame] | 135 | static FT_Error |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 136 | sfnt_get_glyph_name( TT_Face face, |
Werner Lemberg | 52005c3 | 2001-06-27 23:25:46 +0000 | [diff] [blame] | 137 | FT_UInt glyph_index, |
| 138 | FT_Pointer buffer, |
| 139 | FT_UInt buffer_max ) |
David Turner | 6930b45 | 2000-07-19 17:13:03 +0000 | [diff] [blame] | 140 | { |
| 141 | FT_String* gname; |
| 142 | FT_Error error; |
Werner Lemberg | e4b32a5 | 2000-10-31 20:42:18 +0000 | [diff] [blame] | 143 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 144 | |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 145 | error = tt_face_get_ps_name( face, glyph_index, &gname ); |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 146 | if ( !error && buffer_max > 0 ) |
David Turner | 6930b45 | 2000-07-19 17:13:03 +0000 | [diff] [blame] | 147 | { |
David Turner | d15bc0d | 2002-04-12 09:31:48 +0000 | [diff] [blame] | 148 | FT_UInt len = (FT_UInt)( ft_strlen( gname ) ); |
Werner Lemberg | e4b32a5 | 2000-10-31 20:42:18 +0000 | [diff] [blame] | 149 | |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 150 | |
| 151 | if ( len >= buffer_max ) |
| 152 | len = buffer_max - 1; |
Werner Lemberg | e4b32a5 | 2000-10-31 20:42:18 +0000 | [diff] [blame] | 153 | |
David Turner | e459d74 | 2002-03-22 13:52:37 +0000 | [diff] [blame] | 154 | FT_MEM_COPY( buffer, gname, len ); |
David Turner | 6930b45 | 2000-07-19 17:13:03 +0000 | [diff] [blame] | 155 | ((FT_Byte*)buffer)[len] = 0; |
| 156 | } |
Werner Lemberg | e4b32a5 | 2000-10-31 20:42:18 +0000 | [diff] [blame] | 157 | |
David Turner | 6930b45 | 2000-07-19 17:13:03 +0000 | [diff] [blame] | 158 | return error; |
Werner Lemberg | e4b32a5 | 2000-10-31 20:42:18 +0000 | [diff] [blame] | 159 | } |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 160 | |
| 161 | |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 162 | static const FT_Service_GlyphDictRec sfnt_service_glyph_dict = |
| 163 | { |
Werner Lemberg | 013efd1 | 2003-09-17 05:26:33 +0000 | [diff] [blame] | 164 | (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, |
| 165 | (FT_GlyphDict_NameIndexFunc)NULL |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 166 | }; |
| 167 | |
| 168 | #endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ |
| 169 | |
Werner Lemberg | 013efd1 | 2003-09-17 05:26:33 +0000 | [diff] [blame] | 170 | |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 171 | /* |
| 172 | * POSTSCRIPT NAME SERVICE |
| 173 | * |
| 174 | */ |
David Turner | 17dd063 | 2003-09-21 16:04:05 +0000 | [diff] [blame] | 175 | |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 176 | static const char* |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 177 | sfnt_get_ps_name( TT_Face face ) |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 178 | { |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 179 | FT_Int n, found_win, found_apple; |
David Turner | 678e0d4 | 2002-03-20 10:47:38 +0000 | [diff] [blame] | 180 | const char* result = NULL; |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 181 | |
Werner Lemberg | c3b2160 | 2001-12-05 01:22:05 +0000 | [diff] [blame] | 182 | |
| 183 | /* shouldn't happen, but just in case to avoid memory leaks */ |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 184 | if ( face->postscript_name ) |
| 185 | return face->postscript_name; |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 186 | |
Werner Lemberg | 8880f2c | 2002-01-25 16:05:39 +0000 | [diff] [blame] | 187 | /* scan the name table to see whether we have a Postscript name here, */ |
| 188 | /* either in Macintosh or Windows platform encodings */ |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 189 | found_win = -1; |
| 190 | found_apple = -1; |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 191 | |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 192 | for ( n = 0; n < face->num_names; n++ ) |
| 193 | { |
David Turner | b5713c5 | 2002-03-14 11:26:29 +0000 | [diff] [blame] | 194 | TT_NameEntryRec* name = face->name_table.names + n; |
Werner Lemberg | c3b2160 | 2001-12-05 01:22:05 +0000 | [diff] [blame] | 195 | |
| 196 | |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 197 | if ( name->nameID == 6 && name->stringLength > 0 ) |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 198 | { |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 199 | if ( name->platformID == 3 && |
| 200 | name->encodingID == 1 && |
| 201 | name->languageID == 0x409 ) |
| 202 | found_win = n; |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 203 | |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 204 | if ( name->platformID == 1 && |
| 205 | name->encodingID == 0 && |
| 206 | name->languageID == 0 ) |
| 207 | found_apple = n; |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 208 | } |
| 209 | } |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 210 | |
Werner Lemberg | 2282f34 | 2002-03-28 14:21:15 +0000 | [diff] [blame] | 211 | if ( found_win != -1 ) |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 212 | { |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 213 | FT_Memory memory = face->root.memory; |
David Turner | b5713c5 | 2002-03-14 11:26:29 +0000 | [diff] [blame] | 214 | TT_NameEntryRec* name = face->name_table.names + found_win; |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 215 | FT_UInt len = name->stringLength / 2; |
Werner Lemberg | 779afe4 | 2003-06-22 15:33:53 +0000 | [diff] [blame] | 216 | FT_Error error = SFNT_Err_Ok; |
Werner Lemberg | 319c00d | 2003-04-23 19:48:24 +0000 | [diff] [blame] | 217 | |
| 218 | FT_UNUSED( error ); |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 219 | |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 220 | |
Werner Lemberg | 877ff67 | 2002-05-28 06:03:10 +0000 | [diff] [blame] | 221 | if ( !FT_ALLOC( result, name->stringLength + 1 ) ) |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 222 | { |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 223 | FT_Stream stream = face->name_table.stream; |
Werner Lemberg | 877ff67 | 2002-05-28 06:03:10 +0000 | [diff] [blame] | 224 | FT_String* r = (FT_String*)result; |
| 225 | FT_Byte* p = (FT_Byte*)name->string; |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 226 | |
| 227 | |
| 228 | if ( FT_STREAM_SEEK( name->stringOffset ) || |
| 229 | FT_FRAME_ENTER( name->stringLength ) ) |
| 230 | { |
| 231 | FT_FREE( result ); |
| 232 | name->stringLength = 0; |
| 233 | name->stringOffset = 0; |
| 234 | FT_FREE( name->string ); |
Werner Lemberg | 877ff67 | 2002-05-28 06:03:10 +0000 | [diff] [blame] | 235 | |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 236 | goto Exit; |
| 237 | } |
| 238 | |
Werner Lemberg | 877ff67 | 2002-05-28 06:03:10 +0000 | [diff] [blame] | 239 | p = (FT_Byte*)stream->cursor; |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 240 | |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 241 | for ( ; len > 0; len--, p += 2 ) |
| 242 | { |
| 243 | if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 ) |
| 244 | *r++ = p[1]; |
| 245 | } |
| 246 | *r = '\0'; |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 247 | |
| 248 | FT_FRAME_EXIT(); |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 249 | } |
David Turner | 678e0d4 | 2002-03-20 10:47:38 +0000 | [diff] [blame] | 250 | goto Exit; |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 251 | } |
| 252 | |
Werner Lemberg | 2282f34 | 2002-03-28 14:21:15 +0000 | [diff] [blame] | 253 | if ( found_apple != -1 ) |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 254 | { |
David Turner | 678e0d4 | 2002-03-20 10:47:38 +0000 | [diff] [blame] | 255 | FT_Memory memory = face->root.memory; |
Werner Lemberg | 2282f34 | 2002-03-28 14:21:15 +0000 | [diff] [blame] | 256 | TT_NameEntryRec* name = face->name_table.names + found_apple; |
David Turner | 678e0d4 | 2002-03-20 10:47:38 +0000 | [diff] [blame] | 257 | FT_UInt len = name->stringLength; |
Werner Lemberg | 779afe4 | 2003-06-22 15:33:53 +0000 | [diff] [blame] | 258 | FT_Error error = SFNT_Err_Ok; |
Werner Lemberg | 319c00d | 2003-04-23 19:48:24 +0000 | [diff] [blame] | 259 | |
| 260 | FT_UNUSED( error ); |
David Turner | 94dbf7f | 2002-03-26 02:38:39 +0000 | [diff] [blame] | 261 | |
Werner Lemberg | b7b163c | 2002-03-31 18:48:24 +0000 | [diff] [blame] | 262 | |
| 263 | if ( !FT_ALLOC( result, len + 1 ) ) |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 264 | { |
David Turner | 791d83a | 2002-05-27 23:52:01 +0000 | [diff] [blame] | 265 | FT_Stream stream = face->name_table.stream; |
| 266 | |
| 267 | |
| 268 | if ( FT_STREAM_SEEK( name->stringOffset ) || |
| 269 | FT_STREAM_READ( result, len ) ) |
| 270 | { |
| 271 | name->stringOffset = 0; |
| 272 | name->stringLength = 0; |
| 273 | FT_FREE( name->string ); |
| 274 | FT_FREE( result ); |
| 275 | goto Exit; |
| 276 | } |
David Turner | 94dbf7f | 2002-03-26 02:38:39 +0000 | [diff] [blame] | 277 | ((char*)result)[len] = '\0'; |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 278 | } |
David Turner | 28ea6f6 | 2002-03-05 16:12:57 +0000 | [diff] [blame] | 279 | } |
Werner Lemberg | c3b2160 | 2001-12-05 01:22:05 +0000 | [diff] [blame] | 280 | |
David Turner | 678e0d4 | 2002-03-20 10:47:38 +0000 | [diff] [blame] | 281 | Exit: |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 282 | face->postscript_name = result; |
David Turner | 678e0d4 | 2002-03-20 10:47:38 +0000 | [diff] [blame] | 283 | return result; |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 284 | } |
| 285 | |
Werner Lemberg | 40bb096 | 2003-11-01 14:36:20 +0000 | [diff] [blame] | 286 | static const FT_Service_PsFontNameRec sfnt_service_ps_name = |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 287 | { |
Werner Lemberg | 1c0b8e9 | 2003-10-23 04:54:14 +0000 | [diff] [blame] | 288 | (FT_PsName_GetFunc)sfnt_get_ps_name |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 289 | }; |
David Turner | 23bcde1 | 2001-10-17 13:48:10 +0000 | [diff] [blame] | 290 | |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 291 | |
Werner Lemberg | 91a6747 | 2003-12-17 14:28:22 +0000 | [diff] [blame] | 292 | /* |
| 293 | * TT CMAP INFO |
| 294 | * |
| 295 | */ |
| 296 | static const FT_Service_TTCMapsRec tt_service_get_cmap_info = |
| 297 | { |
| 298 | (TT_CMap_Info_GetFunc)tt_get_cmap_info |
| 299 | }; |
| 300 | |
David Turner | 89a2a4b | 2005-12-14 20:38:15 +0000 | [diff] [blame^] | 301 | #ifdef TT_CONFIG_OPTION_BDF |
| 302 | |
| 303 | static FT_Error |
| 304 | sfnt_get_charset_id( TT_Face face, |
| 305 | const char* *acharset_encoding, |
| 306 | const char* *acharset_registry ) |
| 307 | { |
| 308 | BDF_PropertyRec encoding, registry; |
| 309 | FT_Error error; |
| 310 | |
| 311 | /* XXX: I don't know if this is correct, since tt_face_find_bdf_prop |
| 312 | * will only return something correct if we have previously |
| 313 | * selected a size that is listed in the BDF table. |
| 314 | * should we change the BDF table format to include single |
| 315 | * offsets for "CHARSET_REGISTRY" and "CHARSET_ENCODING" ? |
| 316 | */ |
| 317 | error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); |
| 318 | if ( !error ) |
| 319 | { |
| 320 | error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); |
| 321 | if ( !error ) |
| 322 | { |
| 323 | if ( registry.type == BDF_PROPERTY_TYPE_ATOM && |
| 324 | encoding.type == BDF_PROPERTY_TYPE_ATOM ) |
| 325 | { |
| 326 | *acharset_encoding = encoding.u.atom; |
| 327 | *acharset_registry = registry.u.atom; |
| 328 | } |
| 329 | else |
| 330 | error = FT_Err_Invalid_Argument; |
| 331 | } |
| 332 | } |
| 333 | |
| 334 | return error; |
| 335 | } |
| 336 | |
| 337 | |
| 338 | static const FT_Service_BDFRec sfnt_service_bdf = |
| 339 | { |
| 340 | (FT_BDF_GetCharsetIdFunc) sfnt_get_charset_id, |
| 341 | (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop, |
| 342 | }; |
| 343 | |
| 344 | #endif /* TT_CONFIG_OPTION_BDF */ |
| 345 | |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 346 | |
| 347 | /* |
| 348 | * SERVICE LIST |
| 349 | * |
| 350 | */ |
| 351 | |
| 352 | static const FT_ServiceDescRec sfnt_services[] = |
| 353 | { |
Werner Lemberg | 82906bf | 2003-11-04 18:24:20 +0000 | [diff] [blame] | 354 | { FT_SERVICE_ID_SFNT_TABLE, &sfnt_service_sfnt_table }, |
Werner Lemberg | 40bb096 | 2003-11-01 14:36:20 +0000 | [diff] [blame] | 355 | { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &sfnt_service_ps_name }, |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 356 | #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES |
Werner Lemberg | 40bb096 | 2003-11-01 14:36:20 +0000 | [diff] [blame] | 357 | { FT_SERVICE_ID_GLYPH_DICT, &sfnt_service_glyph_dict }, |
David Turner | 17dd063 | 2003-09-21 16:04:05 +0000 | [diff] [blame] | 358 | #endif |
David Turner | 89a2a4b | 2005-12-14 20:38:15 +0000 | [diff] [blame^] | 359 | #ifdef TT_CONFIG_OPTION_BDF |
| 360 | { FT_SERVICE_ID_BDF, &sfnt_service_bdf }, |
| 361 | #endif |
Werner Lemberg | 91a6747 | 2003-12-17 14:28:22 +0000 | [diff] [blame] | 362 | { FT_SERVICE_ID_TT_CMAP, &tt_service_get_cmap_info }, |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 363 | |
| 364 | { NULL, NULL } |
David Turner | 17dd063 | 2003-09-21 16:04:05 +0000 | [diff] [blame] | 365 | }; |
Werner Lemberg | d060a75 | 2000-07-20 06:57:41 +0000 | [diff] [blame] | 366 | |
David Turner | 6930b45 | 2000-07-19 17:13:03 +0000 | [diff] [blame] | 367 | |
Werner Lemberg | 52005c3 | 2001-06-27 23:25:46 +0000 | [diff] [blame] | 368 | FT_CALLBACK_DEF( FT_Module_Interface ) |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 369 | sfnt_get_interface( FT_Module module, |
Werner Lemberg | 5f0ee94 | 2002-04-30 06:37:52 +0000 | [diff] [blame] | 370 | const char* module_interface ) |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 371 | { |
David Turner | c6a9220 | 2000-07-04 18:12:13 +0000 | [diff] [blame] | 372 | FT_UNUSED( module ); |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 373 | |
David Turner | c313c50 | 2003-09-11 19:51:54 +0000 | [diff] [blame] | 374 | return ft_service_list_lookup( sfnt_services, module_interface ); |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 375 | } |
| 376 | |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 377 | |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 378 | static |
| 379 | const SFNT_Interface sfnt_interface = |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 380 | { |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 381 | tt_face_goto_table, |
David Turner | e49ab25 | 2000-05-16 23:44:38 +0000 | [diff] [blame] | 382 | |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 383 | sfnt_init_face, |
| 384 | sfnt_load_face, |
| 385 | sfnt_done_face, |
| 386 | sfnt_get_interface, |
David Turner | 2e42131 | 2000-05-26 22:13:17 +0000 | [diff] [blame] | 387 | |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 388 | tt_face_load_any, |
| 389 | tt_face_load_sfnt_header, |
| 390 | tt_face_load_directory, |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 391 | |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 392 | tt_face_load_header, |
| 393 | tt_face_load_metrics_header, |
| 394 | tt_face_load_cmap, |
| 395 | tt_face_load_max_profile, |
| 396 | tt_face_load_os2, |
| 397 | tt_face_load_postscript, |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 398 | |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 399 | tt_face_load_names, |
| 400 | tt_face_free_names, |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 401 | |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 402 | tt_face_load_hdmx, |
| 403 | tt_face_free_hdmx, |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 404 | |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 405 | tt_face_load_kern, |
| 406 | tt_face_load_gasp, |
| 407 | tt_face_load_pclt, |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 408 | |
| 409 | #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 410 | |
Werner Lemberg | 4b68007 | 2000-11-07 06:30:29 +0000 | [diff] [blame] | 411 | /* see `ttload.h' */ |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 412 | tt_face_load_bitmap_header, |
David Turner | f96594f | 2000-11-06 23:07:51 +0000 | [diff] [blame] | 413 | |
Werner Lemberg | deadbb5 | 2004-04-13 21:08:17 +0000 | [diff] [blame] | 414 | /* see `ttsbit.h' and `sfnt.h' */ |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 415 | tt_face_set_sbit_strike, |
| 416 | tt_face_load_sbit_strikes, |
Werner Lemberg | b2d65d7 | 2005-08-03 21:21:11 +0000 | [diff] [blame] | 417 | #ifdef FT_OPTIMIZE_MEMORY |
| 418 | 0, |
| 419 | 0, |
| 420 | #else |
| 421 | tt_find_sbit_image, |
| 422 | tt_load_sbit_metrics, |
| 423 | #endif |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 424 | tt_face_load_sbit_image, |
| 425 | tt_face_free_sbit_strikes, |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 426 | |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 427 | #else /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 428 | |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 429 | 0, |
| 430 | 0, |
| 431 | 0, |
David Turner | 6a487b5 | 2005-02-28 22:09:07 +0000 | [diff] [blame] | 432 | 0, |
| 433 | 0, |
David Turner | f96594f | 2000-11-06 23:07:51 +0000 | [diff] [blame] | 434 | 0, |
| 435 | 0, |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 436 | |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 437 | #endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ |
David Turner | e49ab25 | 2000-05-16 23:44:38 +0000 | [diff] [blame] | 438 | |
David Turner | e568027 | 2005-02-26 00:12:04 +0000 | [diff] [blame] | 439 | /* see `ttkern.h' */ |
| 440 | tt_face_get_kerning, |
| 441 | |
Werner Lemberg | 43b057b | 2005-10-26 18:37:40 +0000 | [diff] [blame] | 442 | #ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES |
| 443 | |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 444 | /* see `ttpost.h' */ |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 445 | tt_face_get_ps_name, |
| 446 | tt_face_free_ps_names, |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 447 | |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 448 | #else /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 449 | |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 450 | 0, |
| 451 | 0, |
Werner Lemberg | a8bbc26 | 2000-07-01 14:06:46 +0000 | [diff] [blame] | 452 | |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 453 | #endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 454 | |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 455 | }; |
David Turner | e49ab25 | 2000-05-16 23:44:38 +0000 | [diff] [blame] | 456 | |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 457 | |
David Turner | 76a5f62 | 2000-11-04 01:55:49 +0000 | [diff] [blame] | 458 | FT_CALLBACK_TABLE_DEF |
| 459 | const FT_Module_Class sfnt_module_class = |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 460 | { |
David Turner | f0df85b | 2000-06-22 00:17:42 +0000 | [diff] [blame] | 461 | 0, /* not a font driver or renderer */ |
| 462 | sizeof( FT_ModuleRec ), |
Werner Lemberg | fbeb41d | 2000-07-02 00:27:53 +0000 | [diff] [blame] | 463 | |
David Turner | f0df85b | 2000-06-22 00:17:42 +0000 | [diff] [blame] | 464 | "sfnt", /* driver name */ |
Werner Lemberg | a929ba9 | 2000-06-25 06:47:11 +0000 | [diff] [blame] | 465 | 0x10000L, /* driver version 1.0 */ |
| 466 | 0x20000L, /* driver requires FreeType 2.0 or higher */ |
Werner Lemberg | fbeb41d | 2000-07-02 00:27:53 +0000 | [diff] [blame] | 467 | |
David Turner | f0df85b | 2000-06-22 00:17:42 +0000 | [diff] [blame] | 468 | (const void*)&sfnt_interface, /* module specific interface */ |
Werner Lemberg | fbeb41d | 2000-07-02 00:27:53 +0000 | [diff] [blame] | 469 | |
Werner Lemberg | a929ba9 | 2000-06-25 06:47:11 +0000 | [diff] [blame] | 470 | (FT_Module_Constructor)0, |
| 471 | (FT_Module_Destructor) 0, |
David Turner | b08fe2d | 2002-08-27 20:20:29 +0000 | [diff] [blame] | 472 | (FT_Module_Requester) sfnt_get_interface |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 473 | }; |
Werner Lemberg | fbeb41d | 2000-07-02 00:27:53 +0000 | [diff] [blame] | 474 | |
David Turner | d2b1f35 | 1999-12-16 23:11:37 +0000 | [diff] [blame] | 475 | |
Werner Lemberg | 4e6dd85 | 2000-06-05 05:26:15 +0000 | [diff] [blame] | 476 | /* END */ |