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