私のアプリケーションでは、ユーザーはキャンバス上にテキスト オブジェクトを作成できます。このオブジェクトをプロジェクト ファイルに保存して、後で読み込むことができます。
さまざまなプラットフォームでロードした後にオブジェクトが同じように見えるようにするために、テキスト オブジェクトをパスとして実装しました。これにより、ユーザーはダウンロードしたフォントを使用し、そのフォントを使用せずに別のデバイスでプロジェクト ファイルを開くこともできます。テキストの外観は変わりません。
パスは を使用して作成され、 を使用TTextLayout.ConvertToPath
して描画されTCanvas.FillPath
ます。これはほとんどのフォントで問題なく機能しますが、その他のフォントでは問題があります。
下の画像は、Bahnschrift フォントを使用した結果 (上) を示しています。下は、MS ペイントを使用した場合の外観を示しています。このフォントには交差するパスがあるようです。問題は、FillPath が別の塗りつぶしモードを使用していることだと思いますが、これは変更するオプションではないようです。
また、テキストを作成してパスに変換することで、Inkscape で SVG と同じフォントをテストしましたが、正しく描画されました。Delphi と Inkscape で作成されたパス データは基本的に同じです (t は互いに交差する 2 つの閉じた領域で構成されています)、異なるのはそれらの描画方法です。
誰でもこれの修正を提案できますか?
これがコードです
procedure TMainForm.Button1Click(Sender: TObject);
Var
LPath : TPathData;
LLayout : TTextLayout;
begin
LLayout := TTextLayoutManager.DefaultTextLayout.Create;
LLayout.Text := 'test';
LLayout.Font.Family := 'Bahnschrift';
LPath := TPathData.Create;
LLayout.ConvertToPath(LPath);
// Draw the path to a bitmap
SavePathBitmap(LPath, 'Path_test');
LLayout.Free;
LPath.Free;
end;
procedure TMainForm.SavePathBitmap(APath : TPathData ; AFileName : String);
var
bmp : TBitmap;
rect : TRectF;
begin
APath.Scale(10, 10); // Enlarge
rect := APath.GetBounds;
APath.Translate(-rect.Left + 5, -rect.Top + 5); // offset onto bitmap
bmp := TBitmap.Create(Trunc(rect.Width)+10, Trunc(rect.Height)+10);
with bmp.Canvas do if BeginScene then begin
Clear(TAlphaColorRec.White);
Fill.Color := TAlphaColorRec.Black;
FillPath(APath, 1);
EndScene;
bmp.SaveToFile(AFileName + '.png');
end;
bmp.Free;
end;