mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-14 20:59:25 +00:00
62 lines
1.2 KiB
ObjectPascal
62 lines
1.2 KiB
ObjectPascal
unit Keyman.System.FontLoadUtil;
|
|
|
|
interface
|
|
|
|
uses
|
|
System.Classes;
|
|
|
|
type
|
|
TFontLoadUtil = class sealed
|
|
public
|
|
class function LoadFontData(const AFontName: string; Data: TStream): Boolean; static;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Vcl.Graphics,
|
|
Winapi.Windows;
|
|
|
|
class function TFontLoadUtil.LoadFontData(const AFontName: string;
|
|
Data: TStream): Boolean;
|
|
var
|
|
sz: DWord;
|
|
FHDC: THandle;
|
|
Canvas: TCanvas;
|
|
begin
|
|
if AFontName = '' then
|
|
Exit(False);
|
|
|
|
Canvas := TCanvas.Create;
|
|
try
|
|
FHDC := GetDC(GetDesktopWindow);
|
|
try
|
|
Canvas.Handle := FHDC;
|
|
try
|
|
Canvas.Font.Name := AFontName;
|
|
Canvas.TextExtent('A'); // This forces a csFontValid // I4824
|
|
|
|
sz := Winapi.Windows.GetFontData(Canvas.Handle, 0, 0, nil, 0);
|
|
if sz = GDI_ERROR then
|
|
Exit(False);
|
|
|
|
Data.Size := sz;
|
|
Data.Position := 0;
|
|
if Winapi.Windows.GetFontData(Canvas.Handle, 0, 0, (Data as TMemoryStream).Memory, sz) = GDI_ERROR then
|
|
begin
|
|
Data.Size := 0;
|
|
Exit(False);
|
|
end;
|
|
finally
|
|
Canvas.Handle := 0;
|
|
end;
|
|
finally
|
|
ReleaseDC(GetDesktopWindow, FHDC);
|
|
end;
|
|
finally
|
|
Canvas.Free;
|
|
end;
|
|
Result := True;
|
|
end;
|
|
|
|
end.
|