3

私のアプリケーションでは、ユーザーはキャンバス上にテキスト オブジェクトを作成できます。このオブジェクトをプロジェクト ファイルに保存して、後で読み込むことができます。

さまざまなプラットフォームでロードした後にオブジェクトが同じように見えるようにするために、テキスト オブジェクトをパスとして実装しました。これにより、ユーザーはダウンロードしたフォントを使用し、そのフォントを使用せずに別のデバイスでプロジェクト ファイルを開くこともできます。テキストの外観は変わりません。

パスは を使用して作成され、 を使用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;
4

0 に答える 0