gpt4 book ai didi

macos - Delphi - OSX - 从内存流加载字体

转载 作者:行者123 更新时间:2023-12-03 17:59:04 36 4
gpt4 key购买 nike

我正在尝试使用 Delphi 在 Firemonkey (FMX) 应用程序中从 OSX 上的内存流加载字体。

这是我试过的代码:

procedure LoadFontFromStream(SourceStream:TStream);
var cfData:CFDataRef;
fontBuffer:TBytes;
fontRef: CGFontRef;
provider: CGDataProviderRef;
currentStrRef: CFStringRef;
currentStr: string;
streamSize: Int64;
ctFontReference : CTFontRef;
ctAscent, ctDescent, ctCapHeight: CGFloat;
begin
streamSize := SourceStream.Size;
SetLength(fontBuffer, streamSize);
SourceStream.Read(fontBuffer[0], streamSize);

cfData := CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, @fontBuffer[0],
streamSize, kCFAllocatorNull);
provider := CGDataProviderCreateWithCFData(cfData);
CFRelease(cfData);

fontRef := CGFontCreateWithDataProvider(provider);
CGDataProviderRelease(provider);

if fontRef <> nil then
begin
ctFontReference := CTFontCreateWithGraphicsFont(fontRef,0.0, nil, nil);
if ctFontReference <> nil then
begin
ctCapHeight := CTFontGetCapHeight(ctFontReference);
ctAscent := CTFontGetAscent(ctFontReference);
ctDescent := CTFontGetDescent(ctFontReference);
end;
currentStrRef := CTFontCopyFamilyName(ctFontReference);
currentStr := CFToDelphiString(currentStrRef);
Log.d('Family name: %s',[currentStr]);
CFRelease(currentStrRef);
currentStrRef := CTFontCopyPostscriptName(ctFontReference);
currentStr := CFToDelphiString(currentStrRef);
Log.d('Postscript name: %s',[currentStr]);
CFRelease(currentStrRef);
currentStrRef := CTFontCopyDisplayName(ctFontReference);
currentStr := CFToDelphiString(currentStrRef);
Log.d('Display name: %s',[currentStr]);
CFRelease(currentStrRef);
end;
end;

家族名称、后记名称和显示名称在调试器上都显示正确。但是,该字体未加载/显示在我的表单上。运行代码后,我尝试枚举所有字体系列,但似乎我的字体 (Open Sans) 不存在。以下是我如何枚举字体系列:

procedure ListFonts();
var fontFamilyArray: CFArrayRef;
i : CFIndex;
NumFamilies: CFIndex;
family: CFStringRef;
familyStr: string;
foundOpenSans: Boolean;
begin
foundOpenSans := False;
fontFamilyArray := CTFontManagerCopyAvailableFontFamilyNames();
NumFamilies := CFArrayGetCount(fontFamilyArray);
for i := 0 to NumFamilies-1 do
begin
family := CFArrayGetValueAtIndex(fontFamilyArray, i);
familyStr := CFToDelphiString(family);
if familyStr.StartsWith('Open') then
begin
foundOpenSans := true;
Log.d('Found %s', [familyStr]);
end;
end;

if not foundOpenSans then
Log.d('Open Sans not found');

CFRelease(fontFamilyArray);
end;

我知道加载自定义字体是可能的,方法是在 info.plist 文件中设置 ATSApplicationFontsPath 并将这些文件与我的包放在一个文件夹中。我试过了,那行得通。但是,我需要从内存流中加载字体。

知道为什么该代码无法加载字体吗?在我的应用程序中创建任何表单之前,我正在运行代码来加载字体。

最佳答案

我没有看到您在字体管理器中注册了该字体。看看CTFontManagerRegisterGraphicsFont .该文档明确提到了此功能,用于注册从内存构造的字体。

关于macos - Delphi - OSX - 从内存流加载字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33060128/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com