Browse Source

Dynamic use of freetype lib

git-svn-id: trunk@37865 -
michael 7 years ago
parent
commit
cb918ec2e4

+ 4 - 0
packages/fcl-image/fpmake.pp

@@ -223,6 +223,9 @@ begin
           AddUnit('fpimage');
         end;
     T:=P.Targets.AddUnit('freetypeh.pp',[solaris,iphonesim,darwin,freebsd,openbsd,netbsd,linux,haiku,beos,win32,win64,aix,dragonfly]);
+    T.Dependencies.AddInclude('libfreetype.inc');
+    T:=P.Targets.AddUnit('freetypehdyn.pp',[solaris,iphonesim,darwin,freebsd,openbsd,netbsd,linux,haiku,beos,win32,win64,aix,dragonfly]);
+    T.Dependencies.AddInclude('libfreetype.inc');
     T:=P.Targets.AddUnit('freetype.pp',[solaris,iphonesim,darwin,freebsd,openbsd,netbsd,linux,haiku,beos,win32,win64,aix,dragonfly]);
       with T.Dependencies do
         begin
@@ -236,6 +239,7 @@ begin
           AddUnit('fpimgcmn');
           AddUnit('freetype');
           AddUnit('freetypeh');
+          AddUnit('freetypehdyn');
           AddUnit('fpimage');
         end;
     T:=P.Targets.AddUnit('pcxcomn.pas');

+ 7 - 1
packages/fcl-image/src/freetype.pp

@@ -15,9 +15,11 @@
 {$mode objfpc}{$h+}
 unit freetype;
 
+{$DEFINE DYNAMIC}
+
 interface
 
-uses sysutils, classes, freetypeh, FPImgCmn;
+uses sysutils, classes, {$IFDEF DYNAMIC}freetypehdyn{$ELSE}freetypeh{$ENDIF}, FPImgCmn;
 
 { TODO : take resolution in account to find the size }
 { TODO : speed optimization: search glyphs with a hash-function/tree/binary search/... }
@@ -315,6 +317,10 @@ begin
   inherited create;
   FList := Tlist.Create;
   FPaths := TStringList.Create;
+{$IFDEF DYNAMIC}
+  if Pointer(FT_Init_FreeType)=Nil then
+    InitializeFreetype();
+{$ENDIF}
   r := FT_Init_FreeType(FTLib);
   if r <> 0  then
     begin

+ 1 - 371
packages/fcl-image/src/freetypeh.pp

@@ -15,378 +15,8 @@
 {$mode objfpc}
 unit freetypeh;
 
-{ Note that these are not all the availlable calls from the dll yet.
-  This unit is used by TStringBitMaps and FTFont }
-
 interface
 
-const
-
-{$packrecords c}
-
-// Windows
-{$ifdef windows}
-  freetypedll = 'freetype-6.dll';   // version 2.1.4
-  {$define ft_found_platform}
-{$endif}
-// Mac OS X
-{$ifdef darwin}
-  freetypedll = 'libfreetype'; // Doesn't seam to matter much.
-  {$linklib freetype}          // This one is the important part,
-                               // but you also need to pass to fpc
-                               // the following command:
-                               // -k-L/usr/X11/lib
-                               // or another place where it can find
-                               // libfreetype.dylib
-  {$define ft_found_platform}
-{$endif}
-// LINUX
-{$if defined(UNIX) and not defined(darwin)}
-  freetypedll = 'freetype';
-  {$define ft_found_platform}
-{$endif}
-// Other platforms
-{$ifndef ft_found_platform}
-  freetypedll = 'freetype';
-{$endif}
-
-type
-  FT_Encoding = array[0..3] of char;
-
-const
-  FT_FACE_FLAG_SCALABLE = 1 shl 0;
-  FT_FACE_FLAG_FIXED_SIZES = 1 shl 1;
-  FT_FACE_FLAG_FIXED_WIDTH = 1 shl 2;
-  FT_FACE_FLAG_SFNT = 1 shl 3;
-  FT_FACE_FLAG_HORIZONTAL = 1 shl 4;
-  FT_FACE_FLAG_VERTICAL = 1 shl 5;
-  FT_FACE_FLAG_KERNING = 1 shl 6;
-  FT_FACE_FLAG_FAST_GLYPHS = 1 shl 7;
-  FT_FACE_FLAG_MULTIPLE_MASTERS = 1 shl 8;
-  FT_FACE_FLAG_GLYPH_NAMES = 1 shl 9;
-  FT_FACE_FLAG_EXTERNAL_STREAM = 1 shl 10;
-
-  FT_STYLE_FLAG_ITALIC = 1 shl 0;
-  FT_STYLE_FLAG_BOLD = 1 shl 1;
-
-  FT_LOAD_DEFAULT =          $0000;
-  FT_LOAD_NO_SCALE =         $0001;
-  FT_LOAD_NO_HINTING =       $0002;
-  FT_LOAD_RENDER =           $0004;
-  FT_LOAD_NO_BITMAP =        $0008;
-  FT_LOAD_VERTICAL_LAYOUT =  $0010;
-  FT_LOAD_FORCE_AUTOHINT =   $0020;
-  FT_LOAD_CROP_BITMAP =      $0040;
-  FT_LOAD_PEDANTIC =         $0080;
-  FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH = $0200;
-  FT_LOAD_NO_RECURSE =       $0400;
-  FT_LOAD_IGNORE_TRANSFORM = $0800;
-  FT_LOAD_MONOCHROME =       $1000;
-  FT_LOAD_LINEAR_DESIGN =    $2000;
-
-  ft_glyph_format_none      = $00000000;
-  ft_glyph_format_composite = $636F6D70; //comp 099 111 109 112
-  ft_glyph_format_bitmap    = $62697473; //bits 098 105 116 115
-  ft_glyph_format_outline   = $6F75746C; //outl 111 117 116 108
-  ft_glyph_format_plotter   = $706C6F74; //plot 112 108 111 116
-
-  FT_ENCODING_MS_SYMBOL : FT_Encoding = 'symb';
-  FT_ENCODING_UNICODE : FT_Encoding = 'unic';
-  FT_ENCODING_MS_SJIS : FT_Encoding = 'sjis';
-  FT_ENCODING_MS_GB2312 : FT_Encoding = 'gb  ';
-  FT_ENCODING_MS_BIG5 : FT_Encoding = 'big5';
-  FT_ENCODING_MS_WANSUNG : FT_Encoding = 'wans';
-  FT_ENCODING_MS_JOHAB : FT_Encoding = 'joha';
-  FT_ENCODING_ADOBE_STANDARD : FT_Encoding = 'ADOB';
-  FT_ENCODING_ADOBE_EXPERT : FT_Encoding = 'ADBE';
-  FT_ENCODING_ADOBE_CUSTOM : FT_Encoding = 'ADBC';
-  FT_ENCODING_ADOBE_LATIN_1 : FT_Encoding = 'lat1';
-  FT_ENCODING_OLD_LATIN_2 : FT_Encoding = 'lat2';
-  FT_ENCODING_APPLE_ROMAN : FT_Encoding = 'armn';
-
-  ft_glyph_bbox_unscaled  = 0; //* return unscaled font units           */
-  ft_glyph_bbox_subpixels = 0; //* return unfitted 26.6 coordinates     */
-  ft_glyph_bbox_gridfit   = 1; //* return grid-fitted 26.6 coordinates  */
-  ft_glyph_bbox_truncate  = 2; //* return coordinates in integer pixels */
-  ft_glyph_bbox_pixels    = 3; //* return grid-fitted pixel coordinates */
-
-  FT_KERNING_DEFAULT  = 0;
-  FT_KERNING_UNFITTED = 1;
-  FT_KERNING_UNSCALED = 2;
-
-
-type
-
-  FT_Bool = boolean;
-  FT_FWord = smallint;
-  FT_UFWord = word;
-  FT_Char = char;
-  FT_Byte = byte;
-  FT_String = char;
-  FT_Short = smallint;
-  FT_UShort = word;
-  FT_Int = longint;
-  FT_UInt = longword;
-  {$if defined(cpu64) and not(defined(win64) and defined(cpux86_64))}
-  FT_Long = int64;
-  FT_ULong = qword;
-  FT_Pos = int64;
-  {$ELSE}
-  FT_Long = longint;
-  FT_ULong = longword;
-  FT_Pos = longint;
-  {$ENDIF}
-  FT_F2Dot14 = smallint;
-  FT_F26Dot6 = longint;
-  FT_Fixed = FT_Long;
-  FT_Error = longint;
-  FT_Pointer = pointer;
-  //FT_Offset = size_t;
-  //FT_PtrDist = size_t;
-
-  FT_Render_Mode = (FT_RENDER_MODE_NORMAL, FT_RENDER_MODE_LIGHT,
-      FT_RENDER_MODE_MONO, FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V,
-      FT_RENDER_MODE_MAX);
-
-  FT_UnitVector_ = record
-      x : FT_F2Dot14;
-      y : FT_F2Dot14;
-   end;
-  FT_UnitVector = FT_UnitVector_;
-
-  FT_Matrix = record
-      xx : FT_Fixed;
-      xy : FT_Fixed;
-      yx : FT_Fixed;
-      yy : FT_Fixed;
-   end;
-  PFT_Matrix = ^FT_Matrix;
-
-  FT_Data = record
-      pointer : ^FT_Byte;
-      length : FT_Int;
-   end;
-
-  FT_Generic_Finalizer = procedure (AnObject:pointer);cdecl;
-
-  FT_Generic = record
-      data : pointer;
-      finalizer : FT_Generic_Finalizer;
-   end;
-
-  FT_Glyph_Metrics = record
-    width : FT_Pos;
-    height : FT_Pos;
-    horiBearingX : FT_Pos;
-    horiBearingY : FT_Pos;
-    horiAdvance : FT_Pos;
-    vertBearingX : FT_Pos;
-    vertBearingY : FT_Pos;
-    vertAdvance : FT_Pos;
-  end;
-
-  FT_Bitmap_Size = record
-    height : FT_Short;
-    width : FT_Short;
-  end;
-  AFT_Bitmap_Size = array [0..1023] of FT_Bitmap_Size;
-  PFT_Bitmap_Size = ^AFT_Bitmap_Size;
-
-  FT_Vector = record
-    x : FT_Pos;
-    y : FT_Pos;
-  end;
-  PFT_Vector = ^FT_Vector;
-
-  FT_BBox = record
-    xMin, yMin : FT_Pos;
-    xMax, yMax : FT_Pos;
-  end;
-  PFT_BBox = ^FT_BBox;
-
-  FT_Bitmap = record
-    rows : integer;
-    width : integer;
-    pitch : integer;
-    buffer : pointer;
-    num_grays : shortint;
-    pixel_mode : char;
-    palette_mode : char;
-    palette : pointer;
-  end;
-
-  FT_Outline = record
-    n_contours,
-    n_points : smallint;
-    points : PFT_Vector;
-    tags : pchar;
-    contours : ^smallint;
-    flags : integer;
-  end;
-  PFT_Outline = ^FT_Outline;
-
-  FT_Outline_MoveToFunc = function(const to_: PFT_Vector; user: Pointer): integer;
-  FT_Outline_LineToFunc = function(const to_: PFT_Vector; user: Pointer): integer;
-  FT_Outline_ConicToFunc = function(const control, to_: PFT_Vector; user: Pointer): integer;
-  FT_Outline_CubicToFunc = function(const control1, control2, to_: PFT_Vector; user: Pointer): integer;
-
-  FT_Outline_Funcs = record
-    move_to: FT_Outline_MoveToFunc;
-    line_to: FT_Outline_LineToFunc;
-    conic_to: FT_Outline_ConicToFunc;
-    cubic_to: FT_Outline_CubicToFunc;
-    shift: integer;
-    delta: FT_Pos;
-  end;
-  PFT_Outline_Funcs = ^FT_Outline_Funcs;
-
-  FT_Size_Metrics = record
-    x_ppem : FT_UShort;
-    y_ppem : FT_UShort;
-    x_scale : FT_Fixed;
-    y_scale : FT_Fixed;
-    ascender : FT_Pos;
-    descender : FT_Pos;
-    height : FT_Pos;
-    max_advance : FT_Pos;
-  end;
-
-
-  PFT_Library = ^TFT_Library;
-  //PPFT_Library = ^PFT_Library;
-  PFT_Face = ^TFT_Face;
-  //PPFT_Face = ^PFT_Face;
-  PFT_Charmap = ^TFT_Charmap;
-  PPFT_Charmap = ^PFT_Charmap;
-  PFT_GlyphSlot = ^TFT_GlyphSlot;
-  PFT_Subglyph = ^TFT_Subglyph;
-  PFT_Size = ^TFT_Size;
-
-  PFT_Glyph = ^TFT_Glyph;
-  //PPFT_Glyph = ^PFT_Glyph;
-  PFT_BitmapGlyph = ^TFT_BitmapGlyph;
-  PFT_OutlineGlyph = ^TFT_OutlineGlyph;
-
-
-  TFT_Library = record
-  end;
-
-  TFT_Charmap = record
-    face : PFT_Face;
-    encoding : FT_Encoding;
-    platform_id, encoding_id : FT_UShort;
-  end;
-
-  TFT_Size = record
-    face : PFT_Face;
-    generic : FT_Generic;
-    metrics : FT_Size_Metrics;
-    //internal : FT_Size_Internal;
-  end;
-
-  TFT_Subglyph = record  // TODO
-  end;
-
-  TFT_GlyphSlot = record
-    alibrary : PFT_Library;
-    face : PFT_Face;
-    next : PFT_GlyphSlot;
-    flags : FT_UInt;
-    generic : FT_Generic;
-    metrics : FT_Glyph_Metrics;
-    linearHoriAdvance : FT_Fixed;
-    linearVertAdvance : FT_Fixed;
-    advance : FT_Vector;
-    format : longword;
-    bitmap : FT_Bitmap;
-    bitmap_left : FT_Int;
-    bitmap_top : FT_Int;
-    outline : FT_Outline;
-    num_subglyphs : FT_UInt;
-    subglyphs : PFT_SubGlyph;
-    control_data : pointer;
-    control_len : longint;
-    other : pointer;
-  end;
-
-  TFT_Face = record
-    num_faces : FT_Long;
-    face_index : FT_Long;
-    face_flags : FT_Long;
-    style_flags : FT_Long;
-    num_glyphs : FT_Long;
-    family_name : pchar;
-    style_name : pchar;
-    num_fixed_sizes : FT_Int;
-    available_sizes : PFT_Bitmap_Size;     // is array
-    num_charmaps : FT_Int;
-    charmaps : PPFT_CharMap;               // is array
-    generic : FT_Generic;
-    bbox : FT_BBox;
-    units_per_EM : FT_UShort;
-    ascender : FT_Short;
-    descender : FT_Short;
-    height : FT_Short;
-    max_advance_width : FT_Short;
-    max_advance_height : FT_Short;
-    underline_position : FT_Short;
-    underline_thickness : FT_Short;
-    glyph : PFT_GlyphSlot;
-    size : PFT_Size;
-    charmap : PFT_CharMap;
-  end;
-
-  TFT_Glyph = record
-    FTlibrary : PFT_Library;
-    clazz : pointer;
-    aFormat : longword;
-    advance : FT_Vector;
-  end;
-
-  TFT_BitmapGlyph = record
-    root : TFT_Glyph;
-    left, top : FT_Int;
-    bitmap : FT_Bitmap;
-  end;
-
-  TFT_OutlineGlyph = record
-    root : TFT_Glyph;
-    outline : FT_Outline;
-  end;
-
-//Base Interface
-function FT_Done_Face(face: PFT_Face): integer; cdecl; external freetypedll Name 'FT_Done_Face';
-function FT_Done_FreeType(alibrary: PFT_Library): integer; cdecl; external freetypedll Name 'FT_Done_FreeType';
-function FT_Get_Char_Index(face: PFT_Face; charcode: FT_ULong): FT_UInt; cdecl; external freetypedll Name 'FT_Get_Char_Index';
-function FT_Get_Kerning(face: PFT_Face; left_glyph, right_glyph, kern_mode: FT_UInt; out akerning: FT_Vector): integer; cdecl; external freetypedll Name 'FT_Get_Kerning';
-function FT_Init_FreeType(var alibrary: PFT_Library): integer; cdecl; external freetypedll Name 'FT_Init_FreeType';
-function FT_IS_SCALABLE(face: PFT_Face): boolean;
-function FT_Load_Char(face: PFT_Face; charcode: FT_ULong; load_flags: longint): integer; cdecl; external freetypedll Name 'FT_Load_Char';
-function FT_Load_Glyph(face: PFT_Face; glyph_index: FT_UInt; load_flags: longint): integer; cdecl; external freetypedll Name 'FT_Load_Glyph';
-function FT_New_Face(alibrary: PFT_Library; filepathname: PChar; face_index: integer; var aface: PFT_Face): integer; cdecl; external freetypedll Name 'FT_New_Face';
-function FT_Set_Char_Size(face: PFT_Face; char_width, char_height: FT_F26dot6; horz_res, vert_res: FT_UInt): integer; cdecl; external freetypedll Name 'FT_Set_Char_Size';
-function FT_Set_Pixel_Sizes(face: PFT_Face; pixel_width, pixel_height: FT_UInt): integer; cdecl; external freetypedll Name 'FT_Set_Pixel_Sizes';
-procedure FT_Set_Transform(face: PFT_Face; matrix: PFT_Matrix; delta: PFT_Vector); cdecl; external freetypedll Name 'FT_Set_Transform';
-
-//Outline Processing
-function FT_Outline_Decompose(outline: PFT_Outline; const func_interface: PFT_Outline_Funcs; user: Pointer): integer; cdecl; external freetypedll Name 'FT_Outline_Decompose';
-
-//FreeType Version
-procedure FT_Library_Version(alibrary: PFT_Library; var amajor, aminor, apatch: integer); cdecl; external freetypedll Name 'FT_Library_Version';
-
-//Glyph Management
-function FT_Get_Glyph(slot: PFT_GlyphSlot; out aglyph: PFT_Glyph): integer; cdecl; external freetypedll Name 'FT_Get_Glyph';
-function FT_Glyph_Copy(Source: PFT_Glyph; out target: PFT_Glyph): integer; cdecl; external freetypedll Name 'FT_Glyph_Copy';
-function FT_Glyph_To_Bitmap(var the_glyph: PFT_Glyph; render_mode: FT_Render_Mode; origin: PFT_Vector; Destroy: FT_Bool): integer; cdecl; external freetypedll Name 'FT_Glyph_To_Bitmap';
-function FT_Glyph_Transform(glyph: PFT_Glyph; matrix: PFT_Matrix; delta: PFT_Vector): integer; cdecl; external freetypedll Name 'FT_Glyph_Transform';
-procedure FT_Done_Glyph(glyph: PFT_Glyph); cdecl; external freetypedll Name 'FT_Done_Glyph';
-procedure FT_Glyph_Get_CBox(glyph: PFT_Glyph; bbox_mode: FT_UInt; var acbox: FT_BBox); cdecl; external freetypedll Name 'FT_Glyph_Get_CBox';
-
-implementation
-
-function FT_IS_SCALABLE(face: PFT_Face): boolean;
-begin
-  Result := (face^.face_flags and FT_FACE_FLAG_SCALABLE) = 1;
-end;
+{$I libfreetype.inc}
 
 end.

+ 6 - 1
packages/fcl-image/src/ftfont.pp

@@ -17,7 +17,12 @@ unit ftfont;
 
 interface
 
-uses SysUtils, Classes, FPCanvas, fpimgcmn, freetype, freetypeh;
+{$DEFINE DYNAMIC}
+
+uses
+  SysUtils, Classes, FPCanvas, fpimgcmn,
+  {$IFDEF DYNAMIC}freetypehdyn{$ELSE} freetypeh{$ENDIF},
+  freetype;
 
 type