blob: fd201db8e3812b5cc2e04095063bbc7ad7aac91a [file] [log] [blame]
Werner Lemberg7fa51b52000-07-08 19:51:42 +00001/***************************************************************************/
2/* */
Werner Lembergb5084e12000-10-28 17:10:06 +00003/* t1driver.c */
Werner Lemberg7fa51b52000-07-08 19:51:42 +00004/* */
Werner Lembergb5084e12000-10-28 17:10:06 +00005/* Type 1 driver interface (body). */
Werner Lemberg7fa51b52000-07-08 19:51:42 +00006/* */
Werner Lembergd393ca32003-09-30 07:00:42 +00007/* Copyright 1996-2001, 2002, 2003 by */
Werner Lemberg7fa51b52000-07-08 19:51:42 +00008/* 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 Lemberg90d99642000-12-09 00:45:38 +000018
Werner Lembergcc069be2000-12-08 16:17:16 +000019#include <ft2build.h>
David Turner8d3a4012001-03-20 11:14:24 +000020#include "t1driver.h"
21#include "t1gload.h"
22#include "t1load.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000023
Werner Lemberg1f7f0e82001-06-06 17:30:41 +000024#include "t1errors.h"
25
Werner Lembergf1ca2342000-11-29 15:18:54 +000026#ifndef T1_CONFIG_OPTION_NO_AFM
David Turner8d3a4012001-03-20 11:14:24 +000027#include "t1afm.h"
Werner Lembergf1ca2342000-11-29 15:18:54 +000028#endif
Werner Lemberg7fa51b52000-07-08 19:51:42 +000029
David Turner19ed8af2000-12-08 02:42:29 +000030#include FT_INTERNAL_DEBUG_H
31#include FT_INTERNAL_STREAM_H
David Turner2dfb5ac2000-01-27 14:02:04 +000032
David Turnerc313c502003-09-11 19:51:54 +000033#include FT_SERVICE_MULTIPLE_MASTERS_H
34#include FT_SERVICE_GLYPH_DICT_H
35#include FT_SERVICE_XFREE86_NAME_H
36#include FT_SERVICE_POSTSCRIPT_NAME_H
David Turner77605952003-10-29 21:43:52 +000037#include FT_SERVICE_POSTSCRIPT_CMAPS_H
38#include FT_SERVICE_POSTSCRIPT_INFO_H
Werner Lemberg7fa51b52000-07-08 19:51:42 +000039
40 /*************************************************************************/
41 /* */
42 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
43 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
44 /* messages during execution. */
45 /* */
David Turner2dfb5ac2000-01-27 14:02:04 +000046#undef FT_COMPONENT
Werner Lembergb5084e12000-10-28 17:10:06 +000047#define FT_COMPONENT trace_t1driver
Werner Lemberg7fa51b52000-07-08 19:51:42 +000048
David Turnerc313c502003-09-11 19:51:54 +000049 /*
50 * GLYPH DICT SERVICE
51 *
52 */
David Turner2dfb5ac2000-01-27 14:02:04 +000053
Werner Lemberg4a2305c2001-06-28 07:17:51 +000054 static FT_Error
Tom Kacvinskycfcec822001-08-09 01:06:33 +000055 t1_get_glyph_name( T1_Face face,
Werner Lemberg4a2305c2001-06-28 07:17:51 +000056 FT_UInt glyph_index,
57 FT_Pointer buffer,
58 FT_UInt buffer_max )
David Turner6930b452000-07-19 17:13:03 +000059 {
60 FT_String* gname;
Werner Lemberge4b32a52000-10-31 20:42:18 +000061
Werner Lembergd060a752000-07-20 06:57:41 +000062
David Turner6930b452000-07-19 17:13:03 +000063 gname = face->type1.glyph_names[glyph_index];
Werner Lembergd060a752000-07-20 06:57:41 +000064
65 if ( buffer_max > 0 )
David Turner6930b452000-07-19 17:13:03 +000066 {
David Turnerd15bc0d2002-04-12 09:31:48 +000067 FT_UInt len = (FT_UInt)( ft_strlen( gname ) );
Werner Lemberge4b32a52000-10-31 20:42:18 +000068
Werner Lembergd060a752000-07-20 06:57:41 +000069
David Turner6930b452000-07-19 17:13:03 +000070 if (len >= buffer_max)
Werner Lembergd060a752000-07-20 06:57:41 +000071 len = buffer_max - 1;
Werner Lemberge4b32a52000-10-31 20:42:18 +000072
David Turnere459d742002-03-22 13:52:37 +000073 FT_MEM_COPY( buffer, gname, len );
David Turner6930b452000-07-19 17:13:03 +000074 ((FT_Byte*)buffer)[len] = 0;
75 }
76
Werner Lembergd060a752000-07-20 06:57:41 +000077 return T1_Err_Ok;
Werner Lemberge4b32a52000-10-31 20:42:18 +000078 }
David Turner6930b452000-07-19 17:13:03 +000079
Werner Lemberg5dea4442001-08-13 11:44:29 +000080
Tom Kacvinskycfcec822001-08-09 01:06:33 +000081 static FT_UInt
82 t1_get_name_index( T1_Face face,
83 FT_String* glyph_name )
84 {
Werner Lemberg5dea4442001-08-13 11:44:29 +000085 FT_Int i;
Tom Kacvinskycfcec822001-08-09 01:06:33 +000086 FT_String* gname;
87
Werner Lemberg5dea4442001-08-13 11:44:29 +000088
Tom Kacvinskycfcec822001-08-09 01:06:33 +000089 for ( i = 0; i < face->type1.num_glyphs; i++ )
90 {
91 gname = face->type1.glyph_names[i];
92
David Turnerd15bc0d2002-04-12 09:31:48 +000093 if ( !ft_strcmp( glyph_name, gname ) )
Werner Lemberg5dea4442001-08-13 11:44:29 +000094 return (FT_UInt)i;
Tom Kacvinskycfcec822001-08-09 01:06:33 +000095 }
96
97 return 0;
98 }
99
David Turnerc313c502003-09-11 19:51:54 +0000100 static const FT_Service_GlyphDictRec t1_service_glyph_dict =
101 {
Werner Lemberg013efd12003-09-17 05:26:33 +0000102 (FT_GlyphDict_GetNameFunc) t1_get_glyph_name,
103 (FT_GlyphDict_NameIndexFunc)t1_get_name_index
David Turnerc313c502003-09-11 19:51:54 +0000104 };
105
106
107 /*
108 * POSTSCRIPT NAME SERVICE
109 *
110 */
David Turner6930b452000-07-19 17:13:03 +0000111
David Turner23bcde12001-10-17 13:48:10 +0000112 static const char*
Werner Lembergefa99612002-04-01 22:01:46 +0000113 t1_get_ps_name( T1_Face face )
David Turner23bcde12001-10-17 13:48:10 +0000114 {
115 return (const char*) face->type1.font_name;
116 }
117
David Turnerb72d8a82003-09-29 20:33:37 +0000118 static const FT_Service_PsFontNameRec t1_service_ps_name =
David Turnerc313c502003-09-11 19:51:54 +0000119 {
Werner Lemberg1c0b8e92003-10-23 04:54:14 +0000120 (FT_PsName_GetFunc)t1_get_ps_name
David Turnerc313c502003-09-11 19:51:54 +0000121 };
David Turner23bcde12001-10-17 13:48:10 +0000122
David Turnerc313c502003-09-11 19:51:54 +0000123
124 /*
125 * MULTIPLE MASTERS SERVICE
126 *
127 */
128
129#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
130 static const FT_Service_MultiMastersRec t1_service_multi_masters =
131 {
Werner Lemberg013efd12003-09-17 05:26:33 +0000132 (FT_Get_MM_Func) T1_Get_Multi_Master,
133 (FT_Set_MM_Design_Func)T1_Set_MM_Design,
134 (FT_Set_MM_Blend_Func) T1_Set_MM_Blend
David Turnerc313c502003-09-11 19:51:54 +0000135 };
136#endif
137
138
139 /*
David Turner77605952003-10-29 21:43:52 +0000140 * POSTSCRIPT INFO SERVICE
141 *
142 */
143
144 static FT_Error
145 t1_ps_get_font_info( FT_Face face,
146 PS_FontInfoRec* afont_info )
147 {
148 *afont_info = ((T1_Face)face)->type1.font_info;
149 return 0;
150 }
151
Werner Lemberg40bb0962003-11-01 14:36:20 +0000152
David Turner77605952003-10-29 21:43:52 +0000153 static FT_Int
154 t1_ps_has_glyph_names( FT_Face face )
155 {
156 FT_UNUSED( face );
157 return 1;
158 }
159
Werner Lemberg40bb0962003-11-01 14:36:20 +0000160
David Turner77605952003-10-29 21:43:52 +0000161 static const FT_Service_PsInfoRec t1_service_ps_info =
162 {
Werner Lemberg40bb0962003-11-01 14:36:20 +0000163 (PS_GetFontInfoFunc) t1_ps_get_font_info,
164 (PS_HasGlyphNamesFunc)t1_ps_has_glyph_names
David Turner77605952003-10-29 21:43:52 +0000165 };
166
Werner Lemberg40bb0962003-11-01 14:36:20 +0000167
David Turner77605952003-10-29 21:43:52 +0000168 /*
David Turnerc313c502003-09-11 19:51:54 +0000169 * SERVICE LIST
170 *
171 */
172
173 static const FT_ServiceDescRec t1_services[] =
174 {
David Turnerb72d8a82003-09-29 20:33:37 +0000175 { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
Werner Lemberg1c0b8e92003-10-23 04:54:14 +0000176 { FT_SERVICE_ID_GLYPH_DICT, &t1_service_glyph_dict },
177 { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_TYPE_1 },
David Turner77605952003-10-29 21:43:52 +0000178 { FT_SERVICE_ID_POSTSCRIPT_INFO, &t1_service_ps_info },
David Turner17dd0632003-09-21 16:04:05 +0000179
180#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
Werner Lemberg1c0b8e92003-10-23 04:54:14 +0000181 { FT_SERVICE_ID_MULTI_MASTERS, &t1_service_multi_masters },
David Turner17dd0632003-09-21 16:04:05 +0000182#endif
David Turnerc313c502003-09-11 19:51:54 +0000183 { NULL, NULL }
184 };
185
186
Werner Lemberg4a2305c2001-06-28 07:17:51 +0000187 static FT_Module_Interface
188 Get_Interface( FT_Driver driver,
Werner Lemberg5f0ee942002-04-30 06:37:52 +0000189 const FT_String* t1_interface )
David Turner2dfb5ac2000-01-27 14:02:04 +0000190 {
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000191 FT_UNUSED( driver );
Werner Lembergb48a6092000-07-09 19:15:30 +0000192
David Turnerc313c502003-09-11 19:51:54 +0000193 return ft_service_list_lookup( t1_services, t1_interface );
David Turner2dfb5ac2000-01-27 14:02:04 +0000194 }
195
196
Werner Lembergb5084e12000-10-28 17:10:06 +0000197#ifndef T1_CONFIG_OPTION_NO_AFM
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000198
David Turner95bec282000-02-15 12:55:57 +0000199 /*************************************************************************/
200 /* */
201 /* <Function> */
202 /* Get_Kerning */
203 /* */
204 /* <Description> */
205 /* A driver method used to return the kerning vector between two */
206 /* glyphs of the same face. */
207 /* */
208 /* <Input> */
209 /* face :: A handle to the source face object. */
210 /* */
211 /* left_glyph :: The index of the left glyph in the kern pair. */
212 /* */
213 /* right_glyph :: The index of the right glyph in the kern pair. */
214 /* */
215 /* <Output> */
216 /* kerning :: The kerning vector. This is in font units for */
217 /* scalable formats, and in pixels for fixed-sizes */
218 /* formats. */
219 /* */
220 /* <Return> */
221 /* FreeType error code. 0 means success. */
222 /* */
223 /* <Note> */
224 /* Only horizontal layouts (left-to-right & right-to-left) are */
225 /* supported by this function. Other layouts, or more sophisticated */
226 /* kernings are out of scope of this method (the basic driver */
227 /* interface is meant to be simple). */
228 /* */
229 /* They can be implemented by format-specific interfaces. */
230 /* */
Werner Lemberg4a2305c2001-06-28 07:17:51 +0000231 static FT_Error
232 Get_Kerning( T1_Face face,
233 FT_UInt left_glyph,
234 FT_UInt right_glyph,
235 FT_Vector* kerning )
David Turner95bec282000-02-15 12:55:57 +0000236 {
Werner Lembergb5084e12000-10-28 17:10:06 +0000237 T1_AFM* afm;
David Turnere49ab252000-05-16 23:44:38 +0000238
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000239
David Turner95bec282000-02-15 12:55:57 +0000240 kerning->x = 0;
241 kerning->y = 0;
242
Werner Lembergb5084e12000-10-28 17:10:06 +0000243 afm = (T1_AFM*)face->afm_data;
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000244 if ( afm )
Werner Lembergb5084e12000-10-28 17:10:06 +0000245 T1_Get_Kerning( afm, left_glyph, right_glyph, kerning );
David Turner95bec282000-02-15 12:55:57 +0000246
247 return T1_Err_Ok;
248 }
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000249
250
251#endif /* T1_CONFIG_OPTION_NO_AFM */
252
David Turner95bec282000-02-15 12:55:57 +0000253
David Turner76a5f622000-11-04 01:55:49 +0000254 FT_CALLBACK_TABLE_DEF
David Turneref3c1262002-03-14 09:22:48 +0000255 const FT_Driver_ClassRec t1_driver_class =
David Turner2dfb5ac2000-01-27 14:02:04 +0000256 {
David Turnerf0df85b2000-06-22 00:17:42 +0000257 {
Werner Lemberg052904e2003-06-17 10:42:27 +0000258 FT_MODULE_FONT_DRIVER |
259 FT_MODULE_DRIVER_SCALABLE |
260 FT_MODULE_DRIVER_HAS_HINTER,
Werner Lemberg66b35092002-02-10 12:33:14 +0000261
David Turnerf0df85b2000-06-22 00:17:42 +0000262 sizeof( FT_DriverRec ),
Werner Lembergb48a6092000-07-09 19:15:30 +0000263
David Turner5fe4c002000-07-26 19:04:08 +0000264 "type1",
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000265 0x10000L,
266 0x20000L,
Werner Lembergb48a6092000-07-09 19:15:30 +0000267
David Turnerf0df85b2000-06-22 00:17:42 +0000268 0, /* format interface */
Werner Lembergb48a6092000-07-09 19:15:30 +0000269
David Turner5893c1b2001-10-18 11:49:26 +0000270 (FT_Module_Constructor)T1_Driver_Init,
271 (FT_Module_Destructor) T1_Driver_Done,
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000272 (FT_Module_Requester) Get_Interface,
David Turnerf0df85b2000-06-22 00:17:42 +0000273 },
274
David Turner2dfb5ac2000-01-27 14:02:04 +0000275 sizeof( T1_FaceRec ),
Werner Lembergb5084e12000-10-28 17:10:06 +0000276 sizeof( T1_SizeRec ),
277 sizeof( T1_GlyphSlotRec ),
David Turnere49ab252000-05-16 23:44:38 +0000278
Werner Lembergefa99612002-04-01 22:01:46 +0000279 (FT_Face_InitFunc) T1_Face_Init,
280 (FT_Face_DoneFunc) T1_Face_Done,
281 (FT_Size_InitFunc) T1_Size_Init,
282 (FT_Size_DoneFunc) T1_Size_Done,
283 (FT_Slot_InitFunc) T1_GlyphSlot_Init,
284 (FT_Slot_DoneFunc) T1_GlyphSlot_Done,
David Turnerf0df85b2000-06-22 00:17:42 +0000285
David Turneref3c1262002-03-14 09:22:48 +0000286 (FT_Size_ResetPointsFunc) T1_Size_Reset,
Werner Lembergefa99612002-04-01 22:01:46 +0000287 (FT_Size_ResetPixelsFunc) T1_Size_Reset,
288 (FT_Slot_LoadFunc) T1_Load_Glyph,
David Turner95bec282000-02-15 12:55:57 +0000289
Werner Lembergb5084e12000-10-28 17:10:06 +0000290#ifdef T1_CONFIG_OPTION_NO_AFM
Werner Lembergefa99612002-04-01 22:01:46 +0000291 (FT_Face_GetKerningFunc) 0,
292 (FT_Face_AttachFunc) 0,
David Turner95bec282000-02-15 12:55:57 +0000293#else
Werner Lembergefa99612002-04-01 22:01:46 +0000294 (FT_Face_GetKerningFunc) Get_Kerning,
295 (FT_Face_AttachFunc) T1_Read_AFM,
David Turner95bec282000-02-15 12:55:57 +0000296#endif
David Turner3e19d852002-07-17 21:52:20 +0000297 (FT_Face_GetAdvancesFunc) 0
David Turner2dfb5ac2000-01-27 14:02:04 +0000298 };
299
David Turner2dfb5ac2000-01-27 14:02:04 +0000300
Werner Lemberg7fa51b52000-07-08 19:51:42 +0000301/* END */