1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.4 (Public License)
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
4 //
5 // Anti-Grain Geometry - Version 2.4 Release Milano 3 (AggPas 2.4 RM3)
6 // Pascal Port By: Milan Marusinec alias Milano
7 // milan@marusinec.sk
8 // http://www.aggpas.org
9 // Copyright (c) 2005-2007
10 //
11 // Permission to copy, use, modify, sell and distribute this software
12 // is granted provided this copyright notice appears in all copies.
13 // This software is provided "as is" without express or implied
14 // warranty, and with no claim as to its suitability for any purpose.
15 //
16 //----------------------------------------------------------------------------
17 // Contact: mcseem@antigrain.com
18 // mcseemagg@yahoo.com
19 // http://www.antigrain.com
20 //
21 // [Pascal Port History] -----------------------------------------------------
22 //
23 // 17.09.2007-Milano: Finished OK
24 // 16.09.2007-Milano: Unit port establishment
25 //
26 { agg_font_freetype_lib.pas }
27 unit
28 agg_font_freetype_lib ;
29
30 INTERFACE
31
32 {$I agg_mode.inc }
33
34 {$packrecords c}
35
36 uses
37 agg_basics ;
38
39 type
40 FT_Encoding = array[0..3] of char;
41
42 const
43 {$IFDEF WINDOWS }
44 ft_lib = 'freetype.dll';
45 {$ENDIF }
46
47 // Linux, FreeBSD etc.
48 {$if defined(UNIX) and not defined(darwin)}
49 ft_lib = 'freetype';
50 {$ENDIF }
51
52 // Mac OS X
53 {$ifdef darwin}
54 ft_lib = 'libfreetype';
55 {$ENDIF }
56
57 FT_CURVE_TAG_ON = 1;
58 FT_CURVE_TAG_CONIC = 0;
59 FT_CURVE_TAG_CUBIC = 2;
60
61 FT_FACE_FLAG_SCALABLE = 1 shl 0;
62 FT_FACE_FLAG_FIXED_SIZES = 1 shl 1;
63 FT_FACE_FLAG_FIXED_WIDTH = 1 shl 2;
64 FT_FACE_FLAG_SFNT = 1 shl 3;
65 FT_FACE_FLAG_HORIZONTAL = 1 shl 4;
66 FT_FACE_FLAG_VERTICAL = 1 shl 5;
67 FT_FACE_FLAG_KERNING = 1 shl 6;
68 FT_FACE_FLAG_FAST_GLYPHS = 1 shl 7;
69 FT_FACE_FLAG_MULTIPLE_MASTERS = 1 shl 8;
70 FT_FACE_FLAG_GLYPH_NAMES = 1 shl 9;
71 FT_FACE_FLAG_EXTERNAL_STREAM = 1 shl 10;
72
73 FT_STYLE_FLAG_ITALIC = 1 shl 0;
74 FT_STYLE_FLAG_BOLD = 1 shl 1;
75
76 FT_LOAD_DEFAULT = $0000;
77 FT_LOAD_NO_SCALE = $0001;
78 FT_LOAD_NO_HINTING = $0002;
79 FT_LOAD_RENDER = $0004;
80 FT_LOAD_NO_BITMAP = $0008;
81 FT_LOAD_VERTICAL_LAYOUT = $0010;
82 FT_LOAD_FORCE_AUTOHINT = $0020;
83 FT_LOAD_CROP_BITMAP = $0040;
84 FT_LOAD_PEDANTIC = $0080;
85 FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH = $0200;
86 FT_LOAD_NO_RECURSE = $0400;
87 FT_LOAD_IGNORE_TRANSFORM = $0800;
88 FT_LOAD_MONOCHROME = $1000;
89 FT_LOAD_LINEAR_DESIGN = $2000;
90
91 ft_glyph_format_none = $00000000;
92 ft_glyph_format_composite = $636F6D70; //comp 099 111 109 112
93 ft_glyph_format_bitmap = $62697473; //bits 098 105 116 115
94 ft_glyph_format_outline = $6F75746C; //outl 111 117 116 108
95 ft_glyph_format_plotter = $706C6F74; //plot 112 108 111 116
96
97 FT_ENCODING_NONE : FT_Encoding = (#0 ,#0 ,#0 ,#0 );
98 FT_ENCODING_MS_SYMBOL : FT_Encoding = 'symb';
99 FT_ENCODING_UNICODE : FT_Encoding = 'unic';
100 FT_ENCODING_MS_SJIS : FT_Encoding = 'sjis';
101 FT_ENCODING_MS_GB2312 : FT_Encoding = 'gb ';
102 FT_ENCODING_MS_BIG5 : FT_Encoding = 'big5';
103 FT_ENCODING_MS_WANSUNG : FT_Encoding = 'wans';
104 FT_ENCODING_MS_JOHAB : FT_Encoding = 'joha';
105 FT_ENCODING_ADOBE_STANDARD : FT_Encoding = 'ADOB';
106 FT_ENCODING_ADOBE_EXPERT : FT_Encoding = 'ADBE';
107 FT_ENCODING_ADOBE_CUSTOM : FT_Encoding = 'ADBC';
108 FT_ENCODING_ADOBE_LATIN_1 : FT_Encoding = 'lat1';
109 FT_ENCODING_OLD_LATIN_2 : FT_Encoding = 'lat2';
110 FT_ENCODING_APPLE_ROMAN : FT_Encoding = 'armn';
111
112 ft_glyph_bbox_unscaled = 0; //* return unscaled font units */
113 ft_glyph_bbox_subpixels = 0; //* return unfitted 26.6 coordinates */
114 ft_glyph_bbox_gridfit = 1; //* return grid-fitted 26.6 coordinates */
115 ft_glyph_bbox_truncate = 2; //* return coordinates in integer pixels */
116 ft_glyph_bbox_pixels = 3; //* return grid-fitted pixel coordinates */
117
118 FT_KERNING_DEFAULT = 0;
119 FT_KERNING_UNFITTED = 1;
120 FT_KERNING_UNSCALED = 2;
121
122
123 { TYPES DEFINITION }
124 type
125
126 FT_Bool = boolean;
127 FT_FWord = smallint;
128 FT_UFWord = word;
129 FT_Char = char;
130 FT_Byte = byte;
131 FT_String = char;
132 FT_Short = smallint;
133 FT_UShort = word;
134 FT_Int = longint;
135 FT_UInt = longword;
136 FT_Int32 = longint;
137 {$if defined(cpu64) and not(defined(win64) and defined(cpux86_64))}
138 FT_Long = int64;
139 FT_ULong = qword;
140 FT_Pos = int64;
141 {$ELSE}
142 FT_Long = longint;
143 FT_ULong = longword;
144 FT_Pos = longint;
145 {$ENDIF}
146 FT_F2Dot14 = smallint;
147 FT_F26Dot6 = longint;
148 FT_Fixed = FT_Long;
149 FT_Error = longint;
150 FT_Pointer = pointer;
151
152 FT_Byte_ptr = ^FT_Byte;
153 FT_Short_ptr = ^FT_Short;
154
155 FT_Render_Mode = (FT_RENDER_MODE_NORMAL, FT_RENDER_MODE_LIGHT,
156 FT_RENDER_MODE_MONO, FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V,
157 FT_RENDER_MODE_MAX);
158
159 FT_Library_ptr_ptr = ^FT_Library_ptr;
160 FT_Library_ptr = ^FT_Library;
161 FT_Library = record
162 end;
163
164 FT_Subglyph_ptr = ^FT_Subglyph;
165 FT_Subglyph = record // TODO
166 end;
167
168 FT_Bitmap_Size = record
169 height ,
170 width : FT_Short;
171
172 end;
173
174 AFT_Bitmap_Size = array [0..1023] of FT_Bitmap_Size;
175 FT_Bitmap_Size_ptr = ^AFT_Bitmap_Size;
176
177 FT_Charmap_ptr = ^FT_Charmap;
178 FT_Charmap_ptr_ptr = ^FT_Charmap_ptr;
179
180 FT_Generic_Finalizer = procedure(AnObject : pointer ); cdecl;
181
182 FT_Generic = record
183 data : pointer;
184 finalizer : FT_Generic_Finalizer;
185
186 end;
187
188 FT_BBox_ptr = ^FT_BBox;
189 FT_BBox = record
190 xMin ,
191 yMin ,
192 xMax ,
193 yMax : FT_Pos;
194
195 end;
196
197 FT_Vector_ptr = ^FT_Vector;
198 FT_Vector = record
199 x ,
200 y : FT_Pos;
201
202 end;
203
204 FT_Bitmap_ptr = ^FT_Bitmap;
205 FT_Bitmap = record
206 rows ,
207 width ,
208 pitch : FT_Int;
209
210 buffer : pointer;
211
212 num_grays : FT_Short;
213 pixel_mode ,
214 palette_mode : char;
215
216 palette : pointer;
217
218 end;
219
220 FT_Outline_ptr = ^FT_Outline;
221 FT_Outline = record
222 n_contours ,
223 n_points : FT_Short;
224
225 points : FT_Vector_ptr;
226 tags : PChar;
227
228 contours : FT_Short_ptr;
229 flags : FT_Int;
230
231 end;
232
233 FT_Glyph_Metrics = record
234 width ,
235 height ,
236
237 horiBearingX ,
238 horiBearingY ,
239 horiAdvance ,
240 vertBearingX ,
241 vertBearingY ,
242 vertAdvance : FT_Pos;
243
244 end;
245
246 FT_Face_ptr_ptr = ^FT_Face_ptr;
247 FT_Face_ptr = ^FT_Face;
248
249 FT_GlyphSlot_ptr = ^FT_GlyphSlot;
250 FT_GlyphSlot = record
251 alibrary : FT_Library_ptr;
252
253 face : FT_Face_ptr;
254 next : FT_GlyphSlot_ptr;
255 flags : FT_UInt;
256
257 generic : FT_Generic;
258 metrics : FT_Glyph_Metrics;
259
260 linearHoriAdvance ,
261 linearVertAdvance : FT_Fixed;
262
263 advance : FT_Vector;
264 format : longword;
265 bitmap : FT_Bitmap;
266
267 bitmap_left ,
268 bitmap_top : FT_Int;
269
270 outline : FT_Outline;
271
272 num_subglyphs : FT_UInt;
273 subglyphs : FT_SubGlyph_ptr;
274 control_data : pointer;
275 control_len : longint;
276
277 other : pointer;
278
279 end;
280
281 FT_Size_Metrics = record
282 x_ppem ,
283 y_ppem : FT_UShort;
284 x_scale ,
285 y_scale : FT_Fixed;
286
287 ascender ,
288 descender ,
289 height ,
290 max_advance : FT_Pos;
291
292 end;
293
294 FT_Size_ptr = ^FT_Size;
295 FT_Size = record
296 face : FT_Face_ptr;
297 generic : FT_Generic;
298 metrics : FT_Size_Metrics;
299 //internal : FT_Size_Internal;
300
301 end;
302
303 FT_Face = record
304 num_faces ,
305 face_index ,
306 face_flags ,
307 style_flags ,
308 num_glyphs : FT_Long;
309 family_name ,
310 style_name : PChar;
311
312 num_fixed_sizes : FT_Int;
313 available_sizes : FT_Bitmap_Size_ptr; // is array
314
315 num_charmaps : FT_Int;
316 charmaps : FT_CharMap_ptr_ptr; // is array
317
318 generic : FT_Generic;
319 bbox : FT_BBox;
320
321 units_per_EM : FT_UShort;
322
323 ascender ,
324 descender ,
325 height ,
326
327 max_advance_width ,
328 max_advance_height ,
329 underline_position ,
330 underline_thickness : FT_Short;
331
332 glyph : FT_GlyphSlot_ptr;
333 size : FT_Size_ptr;
334 charmap : FT_CharMap_ptr;
335
336 end;
337
338 FT_Charmap = record
339 face : FT_Face_ptr;
340 encoding : FT_Encoding;
341
342 platform_id ,
343 encoding_id : FT_UShort;
344
345 end;
346
347 { GLOBAL PROCEDURES }
FT_CURVE_TAGnull348 function FT_CURVE_TAG (flag : char ) : char;
FT_IS_SCALABLEnull349 function FT_IS_SCALABLE(face : FT_Face_ptr ) : boolean;
FT_HAS_KERNINGnull350 function FT_HAS_KERNING(face : FT_Face_ptr ) : boolean;
351
FT_Init_FreeTypenull352 function FT_Init_FreeType(var alibrary : FT_Library_ptr ) : FT_Error; cdecl; external ft_lib name 'FT_Init_FreeType';
353
FT_Done_FreeTypenull354 function FT_Done_FreeType(alibrary : FT_Library_ptr ) : FT_Error; cdecl; external ft_lib name 'FT_Done_FreeType';
355
FT_Attach_Filenull356 function FT_Attach_File(face : FT_Face_ptr; filepathname : PChar ) : FT_Error; cdecl; external ft_lib name 'FT_Attach_File';
357
FT_New_Memory_Facenull358 function FT_New_Memory_Face(
359 library_ : FT_Library_ptr;
360 file_base : FT_Byte_ptr;
361 file_size ,
362 face_index : FT_Long;
363 var aface : FT_Face_ptr ) : FT_Error; cdecl; external ft_lib name 'FT_New_Memory_Face';
364
FT_New_Facenull365 function FT_New_Face(
366 library_ : FT_Library_ptr;
367 filepathname : PChar;
368 face_index : FT_Long;
369 var aface : FT_Face_ptr ) : FT_Error; cdecl; external ft_lib name 'FT_New_Face';
370
FT_Done_Facenull371 function FT_Done_Face(face : FT_Face_ptr ) : FT_Error; cdecl; external ft_lib name 'FT_Done_Face';
372
FT_Select_Charmapnull373 function FT_Select_Charmap(face : FT_Face_ptr; encoding : FT_Encoding ) : FT_Error; cdecl; external ft_lib name 'FT_Select_Charmap';
374
FT_Get_Char_Indexnull375 function FT_Get_Char_Index(face : FT_Face_ptr; charcode : FT_ULong ) : FT_UInt; cdecl; external ft_lib name 'FT_Get_Char_Index';
376
FT_Load_Glyphnull377 function FT_Load_Glyph(
378 face : FT_Face_ptr;
379 glyph_index : FT_UInt ;
380 load_flags : FT_Int32 ) : FT_Error; cdecl; external ft_lib name 'FT_Load_Glyph';
381
FT_Render_Glyphnull382 function FT_Render_Glyph(slot : FT_GlyphSlot_ptr; render_mode : FT_Render_Mode ) : FT_Error; cdecl; external ft_lib name 'FT_Render_Glyph';
383
FT_Get_Kerningnull384 function FT_Get_Kerning(
385 face : FT_Face_ptr;
386 left_glyph ,right_glyph ,kern_mode : FT_UInt;
387 akerning : FT_Vector_ptr ) : FT_Error; cdecl; external ft_lib name 'FT_Get_Kerning';
388
FT_Set_Char_Sizenull389 function FT_Set_Char_Size(
390 face : FT_Face_ptr;
391 char_width ,char_height : FT_F26dot6;
392 horz_res ,vert_res : FT_UInt) : FT_Error; cdecl; external ft_lib name 'FT_Set_Char_Size';
393
FT_Set_Pixel_Sizesnull394 function FT_Set_Pixel_Sizes(
395 face : FT_Face_ptr;
396 pixel_width ,pixel_height : FT_UInt ) : FT_Error; cdecl; external ft_lib name 'FT_Set_Pixel_Sizes';
397
398
399 IMPLEMENTATION
400 { LOCAL VARIABLES & CONSTANTS }
401 { UNIT IMPLEMENTATION }
402 { FT_CURVE_TAG }
FT_CURVE_TAGnull403 function FT_CURVE_TAG(flag : char ) : char;
404 begin
405 result:=char(int8u(flag ) and 3 );
406
407 end;
408
409 { FT_IS_SCALABLE }
FT_IS_SCALABLEnull410 function FT_IS_SCALABLE(face : FT_Face_ptr ) : boolean;
411 begin
412 Result := (face.face_flags and FT_FACE_FLAG_SCALABLE) = 1;
413 end;
414
415 { FT_HAS_KERNING }
FT_HAS_KERNINGnull416 function FT_HAS_KERNING(face : FT_Face_ptr ) : boolean;
417 begin
418 Result := (face.face_flags and FT_FACE_FLAG_KERNING) = 1;
419 end;
420
421 end.
422
423