Как использовать метод TextAnalyzer.GetTypographicFeatures - PullRequest
0 голосов
/ 17 апреля 2019

Мне нужно получить доступные функции OpenType для данного шрифта в моем приложении (C #). Я использую DirectWrite через SharpDX, и у меня действительно плохое время.

Я знаю, что лучшим решением будет использовать этот метод:

SharpDX.DirectWrite.TextAnalyzer2.GetTypographicFeatures

но я не знаю, как получить из него результат, так как я не знаю, где получить параметры.

Это параметры, которые мне нужно указать, чтобы получить функции шрифта:

  1. fontFace FontFace
  2. ScriptAnalysis ScriptAnalysis
  3. localName String
  4. maxTagCount int
  5. actualTagCount int
  6. теги FontFeatureTag

Может кто-нибудь дать мне лучшее объяснение или (в идеале) какой-нибудь код. Об этом почти нет документации, поэтому я не знаю, где взять эти параметры и / или что они означают.

Заранее спасибо.

1 Ответ

0 голосов
/ 20 апреля 2019

Наконец-то я это понял. Спасибо Buglehead, который дал мне последний кусок головоломки.

Вот пример. В этом коде я сначала загружаю все системные шрифты, затем получаю определенный шрифт, а затем получаю FontFeatureTags для этого конкретного шрифта.

using SharpDX.DirectWrite;

private void LoadFontFeatureTags()
{
    Factory f = new Factory(FactoryType.Isolated);
    Factory4 _factory = new Factory4(f.NativePointer);
    _factory.CreateFontCollectionFromFontSet(_factory.SystemFontSet, out FontCollection1 collection);
    List<SharpDX.DirectWrite.FontFamily> loadedFonts = new List<SharpDX.DirectWrite.FontFamily>();
    for (int i = 0; i < collection.FontFamilyCount; i++)
    {
        var family = collection.GetFontFamily(i);
        loadedFonts.Add(family);
    }
    var gabriolaFont = loadedFonts.FirstOrDefault(x => x.FamilyNames.GetString(0).Contains("Gabriola"));
    var gabriolaFirstChild = gabriolaFont.GetFont(0);
    Font3 f3 = new Font3(gabriolaFirstChild.NativePointer);
    f3.CreateFontFace(out FontFace3 face3);

    ScriptAnalysis analysis = new ScriptAnalysis();
    TextAnalyzer analyzer = new TextAnalyzer(f);
    TextAnalyzer2 analyzer2 = new TextAnalyzer2((IntPtr)analyzer);
    int maxTagCount = 32;
    FontFeatureTag[] featuresArray = new FontFeatureTag[maxTagCount];
    analyzer2.GetTypographicFeatures(face3, analysis, "es-US", maxTagCount, out int actualCount, featuresArray);
}
...