215 lines
10 KiB
ObjectPascal
215 lines
10 KiB
ObjectPascal
unit frxOS2WindowsMetricsClass;
|
|
|
|
interface
|
|
|
|
{$I frx.inc}
|
|
|
|
uses SysUtils, TTFHelpers, frxTrueTypeTable;
|
|
|
|
type
|
|
TVendorID = packed array[0..3] of Byte;
|
|
TPanose = packed array[0..9] of Byte;
|
|
OS2WindowsMetrics = packed record
|
|
Version: Word; // version number 0x0004
|
|
xAvgCharWidth: Smallint;
|
|
usWeightClass: Word;
|
|
usWidthClass: Word;
|
|
fsType: Word;
|
|
ySubscriptXSize: Smallint;
|
|
ySubscriptYSize: Smallint;
|
|
ySubscriptXOffset: Smallint;
|
|
ySubscriptYOffset: Smallint;
|
|
ySuperscriptXSize: Smallint;
|
|
ySuperscriptYSize: Smallint;
|
|
ySuperscriptXOffset: Smallint;
|
|
ySuperscriptYOffset: Smallint;
|
|
yStrikeoutSize: Smallint;
|
|
yStrikeoutPosition: Smallint;
|
|
sFamilyClass: Smallint;
|
|
panose: TPanose;
|
|
ulUnicodeRange1: Cardinal;
|
|
ulUnicodeRange2: Cardinal;
|
|
ulUnicodeRange3: Cardinal;
|
|
ulUnicodeRange4: Cardinal;
|
|
achVendID: TVendorID;
|
|
fsSelection: Word;
|
|
usFirstCharIndex: Word;
|
|
usLastCharIndex: Word;
|
|
sTypoAscender: Smallint;
|
|
sTypoDescender: Smallint;
|
|
sTypoLineGap: Smallint;
|
|
usWinAscent: Word;
|
|
usWinDescent: Word;
|
|
ulCodePageRange1: Cardinal;
|
|
ulCodePageRange2: Cardinal;
|
|
sxHeight: Smallint;
|
|
sCapHeight: Smallint;
|
|
usDefaultChar: Word;
|
|
usBreakChar: Word;
|
|
usMaxContext: Word;
|
|
end;
|
|
|
|
POS2WindowsMetrics = ^OS2WindowsMetrics;
|
|
|
|
OS2WindowsMetricsClass = class(TrueTypeTable)
|
|
// Fields
|
|
private win_metrix: POS2WindowsMetrics;
|
|
// Methods
|
|
public constructor Create(src: TrueTypeTable);
|
|
public destructor Destroy; override;
|
|
|
|
public procedure Load(font: Pointer); override;
|
|
public function Save(font: Pointer; offset: Cardinal): Cardinal; override;
|
|
private function Get_AvgCharWidth: Smallint;
|
|
private function Get_Ascent: Word;
|
|
private function Get_BreakChar: Word;
|
|
private function Get_DefaultChar: Word;
|
|
private function Get_Descent: Word;
|
|
private function Get_FirstCharIndex: Word;
|
|
private function Get_LastCharIndex: Word;
|
|
|
|
// Properties
|
|
public property AvgCharWidth: Smallint read Get_AvgCharWidth;
|
|
public property Ascent: Word read Get_Ascent;
|
|
public property BreakChar: Word read Get_BreakChar;
|
|
public property DefaultChar: Word read Get_DefaultChar;
|
|
public property Descent: Word read Get_Descent;
|
|
public property FirstCharIndex: Word read Get_FirstCharIndex;
|
|
public property LastCharIndex: Word read Get_LastCharIndex;
|
|
end;
|
|
|
|
implementation
|
|
|
|
constructor OS2WindowsMetricsClass.Create(src: TrueTypeTable);
|
|
begin
|
|
inherited Create(src);
|
|
win_metrix := AllocMem( SizeOf(OS2WindowsMetrics) );
|
|
end;
|
|
|
|
destructor OS2WindowsMetricsClass.Destroy;
|
|
begin
|
|
FreeMem(win_metrix);
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Get_AvgCharWidth: Smallint;
|
|
begin
|
|
Result := win_metrix^.xAvgCharWidth;
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Get_Ascent: Word;
|
|
begin
|
|
Result := win_metrix^.usWinAscent;
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Get_BreakChar: Word;
|
|
begin
|
|
Result := win_metrix^.usBreakChar;
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Get_DefaultChar: Word;
|
|
begin
|
|
Result := win_metrix^.usDefaultChar;
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Get_Descent: Word;
|
|
begin
|
|
Result := win_metrix^.usWinDescent;
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Get_FirstCharIndex: Word;
|
|
begin
|
|
Result := win_metrix^.usFirstCharIndex;
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Get_LastCharIndex: Word;
|
|
begin
|
|
Result := win_metrix^.usLastCharIndex;
|
|
end;
|
|
|
|
procedure OS2WindowsMetricsClass.Load(font: Pointer);
|
|
var
|
|
metrix: ^OS2WindowsMetrics;
|
|
begin
|
|
metrix := TTF_Helpers.Increment(font, self.entry.offset );
|
|
self.win_metrix.Version := TTF_Helpers.SwapUInt16(metrix.Version);
|
|
self.win_metrix.xAvgCharWidth := TTF_Helpers.SwapInt16(metrix.xAvgCharWidth);
|
|
self.win_metrix.usWeightClass := TTF_Helpers.SwapUInt16(metrix.usWeightClass);
|
|
self.win_metrix.usWidthClass := TTF_Helpers.SwapUInt16(metrix.usWidthClass);
|
|
self.win_metrix.fsType := TTF_Helpers.SwapUInt16(metrix.fsType);
|
|
self.win_metrix.ySubscriptXSize := TTF_Helpers.SwapInt16(metrix.ySubscriptXSize);
|
|
self.win_metrix.ySubscriptYSize := TTF_Helpers.SwapInt16(metrix.ySubscriptYSize);
|
|
self.win_metrix.ySubscriptXOffset := TTF_Helpers.SwapInt16(metrix.ySubscriptXOffset);
|
|
self.win_metrix.ySubscriptYOffset := TTF_Helpers.SwapInt16(metrix.ySubscriptYOffset);
|
|
self.win_metrix.ySuperscriptXSize := TTF_Helpers.SwapInt16(metrix.ySuperscriptXSize);
|
|
self.win_metrix.ySuperscriptYSize := TTF_Helpers.SwapInt16(metrix.ySuperscriptYSize);
|
|
self.win_metrix.ySuperscriptXOffset := TTF_Helpers.SwapInt16(metrix.ySuperscriptXOffset);
|
|
self.win_metrix.ySuperscriptYOffset := TTF_Helpers.SwapInt16(metrix.ySuperscriptYOffset);
|
|
self.win_metrix.yStrikeoutSize := TTF_Helpers.SwapInt16(metrix.yStrikeoutSize);
|
|
self.win_metrix.yStrikeoutPosition := TTF_Helpers.SwapInt16(metrix.yStrikeoutPosition);
|
|
self.win_metrix.sFamilyClass := TTF_Helpers.SwapInt16(metrix.sFamilyClass);
|
|
self.win_metrix.ulUnicodeRange1 := TTF_Helpers.SwapUInt32(metrix.ulUnicodeRange1);
|
|
self.win_metrix.ulUnicodeRange2 := TTF_Helpers.SwapUInt32(metrix.ulUnicodeRange2);
|
|
self.win_metrix.ulUnicodeRange3 := TTF_Helpers.SwapUInt32(metrix.ulUnicodeRange3);
|
|
self.win_metrix.ulUnicodeRange4 := TTF_Helpers.SwapUInt32(metrix.ulUnicodeRange4);
|
|
self.win_metrix.fsSelection := TTF_Helpers.SwapUInt16(metrix.fsSelection);
|
|
self.win_metrix.usFirstCharIndex := TTF_Helpers.SwapUInt16(metrix.usFirstCharIndex);
|
|
self.win_metrix.usLastCharIndex := TTF_Helpers.SwapUInt16(metrix.usLastCharIndex);
|
|
self.win_metrix.sTypoAscender := TTF_Helpers.SwapInt16(metrix.sTypoAscender);
|
|
self.win_metrix.sTypoDescender := TTF_Helpers.SwapInt16(metrix.sTypoDescender);
|
|
self.win_metrix.sTypoLineGap := TTF_Helpers.SwapInt16(metrix.sTypoLineGap);
|
|
self.win_metrix.usWinAscent := TTF_Helpers.SwapUInt16(metrix.usWinAscent);
|
|
self.win_metrix.usWinDescent := TTF_Helpers.SwapUInt16(metrix.usWinDescent);
|
|
self.win_metrix.ulCodePageRange1 := TTF_Helpers.SwapUInt32(metrix.ulCodePageRange1);
|
|
self.win_metrix.ulCodePageRange1 := TTF_Helpers.SwapUInt32(metrix.ulCodePageRange2);
|
|
self.win_metrix.sxHeight := TTF_Helpers.SwapInt16(metrix.sxHeight);
|
|
self.win_metrix.sCapHeight := TTF_Helpers.SwapInt16(metrix.sCapHeight);
|
|
self.win_metrix.usDefaultChar := TTF_Helpers.SwapUInt16(metrix.usDefaultChar);
|
|
self.win_metrix.usBreakChar := TTF_Helpers.SwapUInt16(metrix.usBreakChar);
|
|
self.win_metrix.usMaxContext := TTF_Helpers.SwapUInt16(metrix.usMaxContext);
|
|
end;
|
|
|
|
function OS2WindowsMetricsClass.Save(font: Pointer; offset: Cardinal): Cardinal;
|
|
var
|
|
metrix: ^OS2WindowsMetrics;
|
|
begin
|
|
self.entry.offset := offset;
|
|
metrix := TTF_Helpers.Increment(font, self.entry.offset);
|
|
metrix.Version := TTF_Helpers.SwapUInt16(self.win_metrix.Version);
|
|
metrix.xAvgCharWidth := TTF_Helpers.SwapInt16(self.win_metrix.xAvgCharWidth);
|
|
metrix.usWeightClass := TTF_Helpers.SwapUInt16(self.win_metrix.usWeightClass);
|
|
metrix.usWidthClass := TTF_Helpers.SwapUInt16(self.win_metrix.usWidthClass);
|
|
metrix.fsType := TTF_Helpers.SwapUInt16(self.win_metrix.fsType);
|
|
metrix.ySubscriptXSize := TTF_Helpers.SwapInt16(self.win_metrix.ySubscriptXSize);
|
|
metrix.ySubscriptYSize := TTF_Helpers.SwapInt16(self.win_metrix.ySubscriptYSize);
|
|
metrix.ySubscriptXOffset := TTF_Helpers.SwapInt16(self.win_metrix.ySubscriptXOffset);
|
|
metrix.ySubscriptYOffset := TTF_Helpers.SwapInt16(self.win_metrix.ySubscriptYOffset);
|
|
metrix.ySuperscriptXSize := TTF_Helpers.SwapInt16(self.win_metrix.ySuperscriptXSize);
|
|
metrix.ySuperscriptYSize := TTF_Helpers.SwapInt16(self.win_metrix.ySuperscriptYSize);
|
|
metrix.ySuperscriptXOffset := TTF_Helpers.SwapInt16(self.win_metrix.ySuperscriptXOffset);
|
|
metrix.ySuperscriptYOffset := TTF_Helpers.SwapInt16(self.win_metrix.ySuperscriptYOffset);
|
|
metrix.yStrikeoutSize := TTF_Helpers.SwapInt16(self.win_metrix.yStrikeoutSize);
|
|
metrix.yStrikeoutPosition := TTF_Helpers.SwapInt16(self.win_metrix.yStrikeoutPosition);
|
|
metrix.sFamilyClass := TTF_Helpers.SwapInt16(self.win_metrix.sFamilyClass);
|
|
metrix.ulUnicodeRange1 := TTF_Helpers.SwapUInt32(self.win_metrix.ulUnicodeRange1);
|
|
metrix.ulUnicodeRange2 := TTF_Helpers.SwapUInt32(self.win_metrix.ulUnicodeRange2);
|
|
metrix.ulUnicodeRange3 := TTF_Helpers.SwapUInt32(self.win_metrix.ulUnicodeRange3);
|
|
metrix.ulUnicodeRange4 := TTF_Helpers.SwapUInt32(self.win_metrix.ulUnicodeRange4);
|
|
metrix.fsSelection := TTF_Helpers.SwapUInt16(self.win_metrix.fsSelection);
|
|
metrix.usFirstCharIndex := TTF_Helpers.SwapUInt16(self.win_metrix.usFirstCharIndex);
|
|
metrix.usLastCharIndex := TTF_Helpers.SwapUInt16(self.win_metrix.usLastCharIndex);
|
|
metrix.sTypoAscender := TTF_Helpers.SwapInt16(self.win_metrix.sTypoAscender);
|
|
metrix.sTypoDescender := TTF_Helpers.SwapInt16(self.win_metrix.sTypoDescender);
|
|
metrix.sTypoLineGap := TTF_Helpers.SwapInt16(self.win_metrix.sTypoLineGap);
|
|
metrix.usWinAscent := TTF_Helpers.SwapUInt16(self.win_metrix.usWinAscent);
|
|
metrix.usWinDescent := TTF_Helpers.SwapUInt16(self.win_metrix.usWinDescent);
|
|
metrix.ulCodePageRange1 := TTF_Helpers.SwapUInt32(self.win_metrix.ulCodePageRange1);
|
|
metrix.ulCodePageRange1 := TTF_Helpers.SwapUInt32(self.win_metrix.ulCodePageRange2);
|
|
metrix.sxHeight := TTF_Helpers.SwapInt16(self.win_metrix.sxHeight);
|
|
metrix.sCapHeight := TTF_Helpers.SwapInt16(self.win_metrix.sCapHeight);
|
|
metrix.usDefaultChar := TTF_Helpers.SwapUInt16(self.win_metrix.usDefaultChar);
|
|
metrix.usBreakChar := TTF_Helpers.SwapUInt16(self.win_metrix.usBreakChar);
|
|
metrix.usMaxContext := TTF_Helpers.SwapUInt16(self.win_metrix.usMaxContext);
|
|
Result := (offset + self.entry.length + 3) and $fffffffc;
|
|
end;
|
|
end.
|