lazarus/components/freetype/tttypes.pas
marco 4d0ffa3d5e * force objfpc, like the other units
git-svn-id: trunk@64346 -
2021-01-07 18:07:26 +00:00

576 lines
19 KiB
ObjectPascal

(*******************************************************************
*
* TTTypes.pas 1.0
*
* Global types definitions
*
* Copyright 1996, 1997 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
* modified and distributed under the terms of the FreeType project
* license, LICENSE.TXT. By continuing to use, modify or distribute
* this file you indicate that you have read the license and
* understand and accept it fully.
*
******************************************************************)
unit TTTypes;
interface
{$mode objfpc}{$H+}
type
TError = boolean;
{$IFDEF OS2}
TT_Int = Longint;
{$ELSE}
TT_Int = Integer;
{$ENDIF}
TT_Long = longint;
TT_ULong = longword;
TT_Short = integer;
TT_UShort = word;
TT_Fixed = LongInt; (* Signed Fixed 16.16 Float *)
TT_FWord = SmallInt; (* Distance in FUnits *)
TT_UFWord = Word; (* Unsigned Distance *)
TT_F2Dot14 = Integer; (* signed fixed float 2.14 used for *)
(* unary vectors, with layout : *)
(* *)
(* s : 1 -- sign bit *)
(* m : 1 -- mantissa bit *)
(* f : 14 -- unsigned fractional *)
(* *)
(* 's:m' is the 2-bit signed int *)
(* value to which the *positive* *)
(* fractional part should be *)
(* added. *)
(* *)
TT_F26Dot6 = LongInt; (* 26.6 fixed float, used for pixel coordinates *)
TT_Pos = Longint; (* funits or 26.6, depending on context *)
const
TT_Flag_On_Curve = $01; (* Point is On curve *)
type
(******************************************************)
(* a simple unit vector type *)
(* *)
TT_UnitVector = record
x : TT_F2Dot14;
y : TT_F2Dot14;
end;
(******************************************************)
(* a simple vector type *)
(* *)
TT_Vector = record
x : TT_Pos;
y : TT_Pos;
end;
(******************************************************)
(* a simple 2x2 matrix type *)
(* *)
TT_Matrix = record
xx, xy : TT_Fixed;
yx, yy : TT_Fixed;
end;
(******************************************************)
(* a glyph's bounding box *)
(* *)
TT_BBox = record
xMin, yMin : TT_Pos;
xMax, yMax : TT_Pos;
end;
(******************************************************)
(* kerning info between two glyphs *)
(* *)
TT_KerningInfo = record
kerning_x, kerning_y: TT_FWord;
minimum_x, minimum_y: TT_FWord;
found: boolean;
end;
(******************************************************)
(* the engine's error condition type - 0 always *)
(* means success. *)
(* *)
TT_Error = TT_Int;
TT_Points_Table = array[0..99] of TT_Vector;
TT_Points = ^TT_Points_Table;
TT_Coordinates = array[0..99] of TT_Pos;
TT_PCoordinates = ^TT_Coordinates;
TT_TouchTable = array[0..9] of byte;
TT_PTouchTable = ^TT_TouchTable;
TT_ConStarts = array[0..9] of word;
TT_PConStarts = ^TT_ConStarts;
(******************************************************)
(* glyph outline description *)
(* *)
TT_Outline = record
n_points : integer;
n_contours : integer;
points : TT_Points; (* array of point coordinates *)
flags : TT_PTouchTable; (* array of point flags *)
conEnds : TT_PConStarts; (* array of contours ends *)
owner : Boolean; (* this flag is set when the outline *)
(* owns the arrays it uses. *)
high_precision : Boolean;
second_pass : Boolean;
dropout_mode : Byte;
end;
(******************************************************)
(* glyph metrics structure *)
(* *)
TT_Glyph_Metrics = record
bbox : TT_BBox;
bearingX : TT_Pos;
bearingY : TT_Pos;
advance : TT_Pos;
end;
(******************************************************)
(* big glyph metrics structure *)
(* *)
TT_Big_Glyph_Metrics = record
bbox : TT_BBox;
horiBearingX : TT_Pos;
horiBearingY : TT_Pos;
horiAdvance : TT_Pos;
vertBearingX : TT_Pos;
vertBearingY : TT_Pos;
vertAdvance : TT_Pos;
end;
TDirectRenderingFunction = procedure( x,y,tx: integer;
data: pointer ) of object;
(******************************************************)
(* instance metrics. used to return information to *)
(* clients regarding an instance's important state *)
(* *)
TT_Instance_Metrics = record
pointsize : integer;
x_ppem : integer;
y_ppem : integer;
x_scale : TT_Fixed;
y_scale : TT_Fixed;
x_resolution : integer;
y_resolution : integer;
end;
const
TT_Flow_Down = -1;
TT_Flow_Up = +1;
type
(******************************************************)
(* a record used to describe a bitmap or pixmap to *)
(* the rasterizer. *)
(* *)
TT_Raster_Map = record
Rows : TT_Int; (* rows number of the bitmap *)
Cols : TT_Int; (* columns (bytes) per row *)
Width : TT_Int; (* pixels per row *)
Flow : TT_Int; (* bit/pixmap's flow *)
Buffer : pointer; (* bit/pixmap data *)
Size : longint; (* bit/pixmap data size (bytes) *)
end;
(******************************************************)
(* The TrueType font header table structure *)
(* *)
TT_Header = record
table_version : TT_Fixed;
font_revision : TT_Fixed;
checksum_adjust : TT_Long;
magic_number : TT_Long;
flags : TT_UShort;
units_per_EM : TT_UShort;
created : array[0..1] of TT_Long;
modified : array[0..1] of TT_Long;
xMin, yMin : TT_FWord;
xMax, yMax : TT_FWord;
mac_style : TT_UShort;
lowest_rec_PPEM : TT_UShort;
font_direction : TT_Short;
index_to_loc_format : TT_Short;
glyph_data_format : TT_Short;
end;
(******************************************************)
(* The TrueType horizontal header table structure *)
(* *)
TT_Horizontal_Header = record
version : TT_Fixed;
ascender : TT_FWord;
descender : TT_FWord;
line_gap : TT_FWord;
advance_Width_Max : TT_UShort;
min_left_side_bearing : TT_Short;
min_right_side_bearing : TT_Short;
xMax_extent : TT_Short;
caret_slope_rise : TT_Short;
caret_slope_run : TT_Short;
reserved : array[0..4] of TT_SHort;
metric_data_format : TT_Short;
number_of_HMetrics : TT_UShort;
(* the following are not part of the header in the file *)
short_metrics : Pointer;
long_metrics : Pointer;
end;
(******************************************************)
(* The TrueType vertical header table structure *)
(* *)
TT_Vertical_Header = record
version : TT_Fixed;
ascender : TT_FWord;
descender : TT_FWord;
line_gap : TT_FWord;
advance_Height_Max : TT_UShort;
min_top_side_bearing : TT_Short;
min_bottom_side_bearing : TT_Short;
yMax_extent : TT_Short;
caret_slope_rise : TT_Short;
caret_slope_run : TT_Short;
reserved : array[0..4] of TT_SHort;
metric_data_format : TT_Short;
number_of_VMetrics : TT_UShort;
(* the following are not part of the header in the file *)
short_metrics : Pointer;
long_metrics : Pointer;
end;
(******************************************************)
(* The TrueType OS/2 table structure *)
(* *)
TT_OS2 = record
version : TT_UShort; (* $0001 *)
xAvgCharWidth : TT_Short;
usWeightClass : TT_UShort;
usWidthClass : TT_UShort;
fsType : TT_Short;
ySubscriptXSize : TT_Short;
ySubscriptYSize : TT_Short;
ySubScriptXOffset : TT_Short;
ySubscriptYOffset : TT_Short;
ySuperscriptXSize : TT_Short;
ySuperscriptYSize : TT_Short;
ySuperscriptXOffset : TT_Short;
ySuperscriptYOffset : TT_Short;
yStrikeoutSize : TT_Short;
yStrikeoutPosition : TT_Short;
sFamilyClass : TT_Short;
panose : array[0..9] of Byte;
ulUnicodeRange1 : TT_ULong; (* bits 0-31 *)
ulUnicodeRange2 : TT_ULong; (* bits 32-63 *)
ulUnicodeRange3 : TT_ULong; (* bits 64-95 *)
ulUnicodeRange4 : TT_ULong; (* bits 96-127 *)
achVendID : array[0..3] of Byte;
fsSelection : TT_UShort;
usFirstCharIndex : TT_UShort;
usLastCharIndex : TT_UShort;
sTypoAscender : TT_Short;
sTypoDescender : TT_Short;
sTypoLineGap : TT_Short;
usWinAscent : TT_UShort;
usWinDescent : TT_UShort;
(* only version 1 tables *)
ulCodePageRange1 : TT_ULong;
ulCodePageRange2 : TT_ULong;
(* only version 2 tables *)
sxHeight : TT_Short;
sCapHeight : TT_Short;
usDefaultChar : TT_UShort;
usBreakChar : TT_UShort;
usMaxContext : TT_UShort;
end;
(******************************************************)
(* The TrueType Postscript table structure *)
(* *)
TT_Postscript = record
FormatType : TT_Fixed;
italicAngle : TT_Fixed;
underlinePosition : TT_Short;
underlineThickness : TT_Short;
isFixedPitch : TT_ULong;
minMemType42 : TT_ULong;
maxMemType42 : TT_ULong;
minMemType1 : TT_ULong;
maxMemType1 : TT_ULong;
end;
(******************************************************)
(* face properties. use to report important face *)
(* data to clients *)
(* *)
TT_Face_Properties = record
num_glyphs : integer;
max_points : integer;
max_contours : integer;
max_faces : integer;
header : ^TT_Header;
horizontal : ^TT_Horizontal_Header;
vertical : ^TT_Vertical_Header;
os2 : ^TT_OS2;
postscript : ^TT_Postscript;
end;
(******************************************************)
(* Objects handle types *)
(* *)
TT_Stream = record z : Pointer; end;
TT_Face = record z : Pointer; end;
TT_Instance = record z : Pointer; end;
TT_Glyph = record z : Pointer; end;
TT_CharMap = record z : Pointer; end;
TT_Gray_Palette = packed array[0..4] of byte;
PTT_Gray_Palette = ^TT_Gray_Palette;
(******************************************************************)
(* *)
(* ERROR CODES *)
(* *)
(******************************************************************)
const
(* ------------------- Success is always 0 ---------------------- *)
TT_Err_Ok = 0;
(* -------------------------------------------------------------- *)
TT_Err_Invalid_Face_Handle = $0001;
TT_Err_Invalid_Instance_Handle = $0002;
TT_Err_Invalid_Glyph_Handle = $0003;
TT_Err_Invalid_CharMap_Handle = $0004;
TT_Err_Invalid_Result_Address = $0005;
TT_Err_Invalid_Glyph_Index = $0006;
TT_Err_Invalid_Argument = $0007;
TT_Err_Could_Not_Open_File = $0008;
TT_Err_File_Is_Not_Collection = $0009;
TT_Err_Table_Missing = $000A;
TT_Err_Invalid_Horiz_Metrics = $000B;
TT_Err_Invalid_Vert_Metrics = $000B;
TT_Err_Invalid_CharMap_Format = $000C;
TT_Err_Invalid_File_Format = $0010;
TT_Err_File_Error = $0011;
TT_Err_Invalid_Engine = $0020;
TT_Err_Too_Many_Extensions = $0021;
TT_Err_Extensions_Unsupported = $0022;
TT_Err_Invalid_Extension_Id = $0023;
TT_Err_No_Vertical_Data = $0030;
TT_Err_Max_Profile_Missing = $0080;
TT_Err_Header_Table_Missing = $0081;
TT_Err_Horiz_Header_Missing = $0082;
TT_Err_Locations_Missing = $0083;
TT_Err_Name_Table_Missing = $0084;
TT_Err_CMap_Table_Missing = $0085;
TT_Err_Hmtx_Table_Missing = $0086;
TT_Err_OS2_Table_Missing = $0087;
TT_Err_Post_Table_Missing = $0088;
(* -------------------------------------------------------------- *)
TT_Err_Out_Of_Memory = $0100;
(* -------------------------------------------------------------- *)
TT_Err_Invalid_File_Offset = $0200;
TT_Err_Invalid_File_Read = $0201;
TT_Err_Invalid_Frame_Access = $0202;
(* -------------------------------------------------------------- *)
TT_Err_Too_Many_Points = $0300;
TT_Err_Too_Many_Contours = $0301;
TT_Err_Invalid_Composite = $0302;
TT_Err_Too_Many_Ins = $0303;
(* -------------------------------------------------------------- *)
TT_Err_Invalid_Opcode = $0400;
TT_Err_Too_Few_Arguments = $0401;
TT_Err_Stack_Overflow = $0402;
TT_Err_Code_Overflow = $0403;
TT_Err_Bad_Argument = $0404;
TT_Err_Divide_By_Zero = $0405;
TT_Err_Storage_Overflow = $0406;
TT_Err_Cvt_Overflow = $0407;
TT_Err_Invalid_Reference = $0408;
TT_Err_Invalid_Distance = $0409;
TT_Err_Interpolate_Twilight = $040A;
TT_Err_Debug_Opcode = $040B;
TT_Err_ENDF_In_Exec_Stream = $040C;
TT_Err_Out_Of_CodeRanges = $040D;
TT_Err_Nested_DEFs = $040E;
TT_Err_Invalid_CodeRange = $040F;
TT_Err_Invalid_Displacement = $0410;
TT_Err_Execution_Too_Long = $0411;
TT_Err_Too_Many_FuncDefs = $0412;
TT_Err_Too_Many_InsDefs = $0413;
TT_Err_Nested_Frame_Access = $0500;
TT_Err_Invalid_Cache_List = $0501;
TT_Err_Could_Not_Find_Context = $0502;
TT_Err_UNlisted_Object = $0503;
TT_Err_Raster_Pool_Overflow = $0600;
TT_Err_Raster_Negative_Height = $0601;
TT_Err_Invalid_Value = $0602;
TT_Err_Raster_Not_Initialised = $0603;
type
TFreeTypeCustomRasterizer = class
function Render_Glyph( var glyph : TT_Outline;
var target : TT_Raster_Map ) : TError; virtual; abstract;
(* Render one glyph in the target bitmap (1-bit per pixel) *)
function Render_Gray_Glyph( var glyph : TT_Outline;
var target : TT_Raster_Map;
palette : PTT_Gray_Palette ) : TError; virtual; abstract;
(* Render one gray-level glyph in the target pixmap *)
(* palette points to an array of 5 colors used for the rendering *)
(* use nil to reuse the last palette. Default is VGA graylevels *)
function Render_Gray_Glyph_HQ( var glyph : TT_Outline;
var target : TT_Raster_Map ) : TError; virtual; abstract;
function Render_Directly_Gray_Glyph( var glyph : TT_Outline;
x,y,tx,ty: integer;
OnRender: TDirectRenderingFunction;
palette : PTT_Gray_Palette) : TError; virtual; abstract;
function Render_Directly_Gray_Glyph_HQ( var glyph : TT_Outline;
x,y,tx,ty: integer;
OnRender: TDirectRenderingFunction) : TError; virtual; abstract;
procedure Set_Raster_Palette(const palette: TT_Gray_Palette); virtual; abstract;
end;
type
(*********************** SIMPLE PRIMITIVE TYPES *******************)
(* BYTE is already defined in Pascal *)
(* They are equivalent to C unsigned chars *)
UShort = Word; (* unsigned short integer, must be on 16 bits *)
Short = Smallint; (* signed short integer, must be on 16 bits *)
Long = Longint;
ULong = LongWord; (* unsigned long integer, must be on 32 bits *)
{$IFDEF USE32}
Int = LongInt; (* the 'int' type is used for loop counters and *)
{$ELSE} (* indexes.. Their size must be the one a given *)
Int = Integer; (* system handles most easily ( 16 bits on Turbo *)
{$ENDIF} (* and 32 on Virtual Pascals ) *)
TByteArray = array[0..1000] of Byte;
PByte = ^TByteArray;
TShortArray = array[0..1000] of Short;
PShort = ^TShortArray;
TUShortArray = array[0..1000] of UShort;
PUShort = ^TUShortArray;
TStorage = array[0..16000] of Long;
PStorage = ^TStorage;
PLong = PStorage;
PULong = PStorage;
(***************** FreeType Internal Types *****************************)
TCoordinates = array[0..1023] of TT_F26Dot6;
PCoordinates = ^TCoordinates;
PTouchTable = PByte;
TVecRecord = record
n : Int; (* number of points *)
org_x : PCoordinates; (* original coordinates arrays *)
org_y : PCoordinates;
cur_x : PCoordinates; (* current coordinates arrays *)
cur_y : PCoordinates;
touch : PTouchTable; (* touch flags array *)
end;
(* This type is used to describe each point zone in the interpreter *)
const
Success = False;
Failure = True;
implementation
end.