Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Thema werden Die OpenType-Variablenschriftarten, deren Unterstützung in DirectWrite und Direct2D sowie die Verwendung in Ihrer App beschrieben.
- Was sind OpenType-Variablenschriftarten?
- Unterstützung der OpenType-Variablenschriftart in DirectWrite-
- Verwenden von OpenType-Variablenschriftarten
Was sind OpenType-Variablenschriftarten?
Version 1.8 der OpenType-Schriftartformatspezifikation eine neue Erweiterung für das Format eingeführt, das als OpenType Font Variationsbezeichnet wird. Schriftarten, die diese Erweiterungen verwenden, werden als OpenType-Variablenschriftarten bezeichnet. Eine OpenType-Variable ist eine einzelne Schriftart, die sich wie mehrere Schriftarten verhalten kann, indem eine fortlaufende Interpolation zwischen verschiedenen Designs verwendet wird, die alle innerhalb der einzelnen Schriftart definiert sind.
Eine OpenType-Variable kann eine fortlaufende Variation des Designs entlang einer oder mehrerer unabhängiger Achsen definieren, z. B. Stärke oder Breite:
Ein Schriftartentwickler bestimmt eine Reihe von Variationsachsen, die in einer bestimmten Schriftart verwendet werden sollen. Diese Achsen können eine Reihe bekannter (oder "registrierter") Variationsachsen enthalten, z. B. Gewicht und Breite, aber sie können auch beliebige, benutzerdefinierte Variationsachsen enthalten, die vom Entwickler der Schriftart definiert sind.
Durch Auswählen einer Reihe von Variationsachsen für eine Schriftart definiert der Schriftartentwickler einen abstrakten, ndimensionalen Raum der Designvariation für die Schriftart. Textmodule können potenziell beliebige Positionen oder Instanzen innerhalb dieses fortlaufenden Bereichs angeben, um Text zu gestalten und zu rendern.
Der Schriftartentwickler kann auch Namen für bestimmte Instanzen innerhalb des Entwurfsvariationsraums auswählen und zuweisen. diese werden als "benannte Instanzen" bezeichnet. Beispielsweise kann eine Schriftart mit Gewichtsvariation eine kontinuierliche Variation zwischen sehr leichten und sehr schweren Strichen unterstützen, während der Schriftartentwickler bestimmte Gewichte entlang dieses Kontinuums ausgewählt und ihnen Namen zugewiesen hat, z. B. "Light", "Regular" und "Semibold".
Das OpenType-Schriftartformat verwendet Datentabellen in herkömmlichen OpenType-Schriftarten sowie bestimmte zusätzliche Tabellen, die beschreiben, wie sich die Werte verschiedener Datenelemente für verschiedene Instanzen ändern. Das Format bezeichnet eine Variationsinstanz als "Standardinstanz", die herkömmliche Tabellen verwendet, um Standardwerte abzurufen. Alle anderen Instanzen hängen von den Standarddaten und anderen Deltadaten ab. Beispielsweise kann eine Tabelle "Glyf" eine Bezierkurvenbeschreibung einer nominalen Glyphenform aufweisen, bei der es sich um die Form handelt, die für die Standardinstanz verwendet wird, während eine Tabelle "Gvar" beschreibt, wie die Bézier-Kontrollpunkte für die Glyphe für andere Instanzen angepasst werden. Ebenso können andere Schriftartwerte einen Nominalwert plus Delta-Daten aufweisen, die beschreiben, wie sich diese Werte für unterschiedliche Instanzen ändern; z. B. X-Höhe und andere schriftartweite Metriken oder Glyphenspezifische Markierungsankerpositionen und Kerninganpassungen.
Da variable Schriftarten einen beliebigen Satz von Variationsachsen unterstützen können, benötigen sie ein erweiterbares Modell von Schriftartfamilien, das direkter widerspiegelt, wie Schriftartendesigner Familien von Schriftarten erstellen: Eine Schriftartenfamilie wird durch einen Familiennamen und bestimmte Designmerkmale definiert, die konstant sind, mit einer beliebigen Zahl (bestimmt durch den Schriftartentwickler), wie das Design variieren kann. Eine Schriftfamilie kann mit Varianten für die Gewichtung erstellt werden, aber eine andere Schriftfamilie kann mit Varianten für x-Höhe, Serifengröße, "Funkigkeit" oder unabhängig von den Wünschen des Schriftartentwicklers erstellt werden. In diesem Modell wird eine Schriftart-Gesichtsauswahl am besten mithilfe der allgemeinen oder "bevorzugten" oder "typografischen" Oder "typografischen" Sowie einer Reihe von Schlüsselwertpaaren beschrieben, die jeweils eine Art von Variation und spezifischen Wert darstellen, wobei die Arten von Variationen im Allgemeinen eine erweiterbare Gruppe sind. Dieser allgemeine Begriff einer Schriftartfamilie kann sowohl auf herkömmliche, nicht variable Schriftarten als auch auf variable Schriftarten angewendet werden. Unter diesem allgemeinen typografischen Familienmodell kann beispielsweise eine Familie "Selawik VF" Variationen für Gewicht, optische Größe und Serifendesign mit Instanzen wie "Semilight Banner Sans" aufweisen.
Einige vorhandene Softwareimplementierungen, einschließlich vorhandener DirectWrite-APIs, können jedoch unter Der Annahme eines eingeschränkteren Modells von Schriftartfamilien entworfen werden. Einige Anwendungen können beispielsweise davon ausgehen, dass eine Schriftfamilie höchstens reguläre, fett, kursiv und fett kursiv formatierte Varianten aufweisen kann. Die vorhandenen IDWriteFontCollection und IDWriteFontFamily Schnittstellen übernehmen ein Familienmodell mit Gewicht/Stretch/Formatvorlage ("WSS"), sodass Varianten innerhalb einer Familie mithilfe der DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH oder DWRITE_FONT_STYLE Enumerationen als Parameter angegeben werden können. Im vorherigen Beispiel würden die optische Größe und die Serifenachse nicht als familieninterne Variationsachsen im WSS-Modell behandelt.
Die vollständige Unterstützung für variable Schriftarten erfordert APIs, mit denen ein Familienmitglied mit potenziell mehreren Parametern angegeben werden kann, wie von der Schriftart bestimmt. Vorhandene API-Designs können jedoch möglicherweise teilweise Unterstützung für variable Schriftarten bereitstellen, indem sie die benannten Instanzen projizieren, die in einer Variablenschriftart definiert sind, in die eingeschränkteren Schriftfamilienmodelle. Im vorherigen Beispiel könnte "Selawik VF Semilight Banner Sans" in das WSS-Modell als "Selawik VF Banner Sans"-Familie mit "Semilight" als Gewichtsvariante projiziert werden.
Ein weiteres Beispiel: Betrachten Sie eine typografische Schriftfamilie wie Sitka mit Gewichts- und optischen Größenvarianten. Benannte Varianten in der Familie sind Sitka Text Regular und Sitka Banner Bold (plus viele andere). Der typografische Familienname ist "Sitka", während die Gesichtsnamen für diese Varianten im typografischen Familienmodell "Text Regular" und "Banner Fett" sind. Die Vier-Mitglieder- und WSS-Familienmodelle lassen keine optischen Größenvarianten innerhalb einer Familie zu, und daher müssen optische Größenunterschiede wie Unterscheidungen auf Familienebene behandelt werden. In der folgenden Tabelle wird veranschaulicht, wie eine Auswahl von Schriftarten aus der Typografiefamilie Sitka im WSS-Familienmodell behandelt wird:
Typografisches Familienmodell
WSS-Familienmodell
Familie
Gesicht
Familie
Gesicht
Sitka
Normaler Text
Sitka-Text
Regelmäßig
Sitka
Banner fett
Sitka Banner
Kühn
Sitka
Beschriftung kursiv
Sitka Caption
Kursiv
Die Projektion von Namen aus einem typografischen Familienmodell in das WSS-Familienmodell kann auf nicht variable Schriftarten und auf die benannten Instanzen von Variablenschriftarten angewendet werden. Dies kann jedoch für andere, nicht benannte Instanzen aus dem fortlaufenden Entwurfsvariationsraum einer Variablenschriftart nicht ausgeführt werden. Aus diesem Grund erfordert die Unterstützung der vollständigen Funktionalität variabler Schriftarten APIs, die für den Verweis auf Gesichter innerhalb einer typografischen Familie in Bezug auf einen nicht eingeschränkten Satz von Variationsachsen und Achsenwerten ausgelegt sind.
Unterstützung der OpenType-Variablenschriftart in DirectWrite
Ab der Veröffentlichung des Windows 10 Creators Update ist das OpenType-Schriftartformat für variable Schriftarten immer noch sehr neu, und Schriftartanbieter, Plattformen und Apps befinden sich noch im Prozess der Implementierung des neuen Formats. Dieses Update stellt die erste Implementierung für dieses Format in DirectWrite bereit.
DirectWrite-Interne wurden aktualisiert, um OpenType-Variablenschriftarten zu unterstützen. Mithilfe der aktuellen APIs unterstützt dies alle benannten Instanzen einer Variablenschriftart. Diese Unterstützung kann für vollständige Workflows verwendet werden – von der Aufzählung der benannten Instanzen, der Auswahl einer benannten Instanz, der Verwendung im Layout und der Gestaltung bis hin zum Rendern und Drucken. Zum Vorteil von Apps, die auch GDI-Textinterop für bestimmte Vorgänge verwenden, wurde auch eine ähnliche Unterstützung in vorhandenen GDI-APIs hinzugefügt.
Im Windows 10 Creators Update unterstützt DirectWrite keine beliebigen Instanzen, die die Funktion für kontinuierliche Variationen von Variablenschriftarten verwenden.
In vielen Vorgängen kann das Verhalten in DirectWrite von benannten Instanzen einer Variablenschriftart nicht vom Verhalten nicht variabler Schriftarten unterschieden werden. Und da unterstützung mit vorhandenen DirectWrite-APIs bereitgestellt wird, können die benannten Instanzen von Variablenschriftarten sogar in vielen vorhandenen DirectWrite-Apps ohne Änderungen funktionieren. Ausnahmen können jedoch in bestimmten Situationen gelten:
- Wenn eine App Schriftartdaten direkt für bestimmte Vorgänge verarbeitet. Wenn eine App beispielsweise Glyphenkonturdaten direkt aus der Schriftartdatei liest, um bestimmte visuelle Effekte zu erstellen.
- Wenn eine App eine Drittanbieterbibliothek für bestimmte Vorgänge verwendet. Wenn eine App z. B. DirectWrite für das Layout verwendet, um endgültige Glyphenindizes und Positionen abzurufen, dann wird jedoch eine Drittanbieterbibliothek zum Rendern verwendet.
- Wenn eine App Schriftartdaten in ein Dokument einbettet oder auf andere Weise Schriftartdaten an einen nachgeschalteten Prozess übergibt.
Wenn Vorgänge mithilfe von Implementierungen ausgeführt werden, die keine Variablenschriftarten unterstützen, werden diese Vorgänge möglicherweise nicht zu den erwarteten Ergebnissen führen. Beispielsweise können Glyphenpositionen für eine benannte Instanz der Variablenschriftart berechnet werden, aber die Glyphen können gerendert werden, vorausgesetzt, eine andere benannte Instanz. Je nach Anwendungsimplementierung können Ergebnisse in einigen Kontexten, aber nicht in anderen Kontexten funktionieren, in denen andere Bibliotheken verwendet werden können. Beispielsweise kann Text auf dem Bildschirm richtig angezeigt werden, aber nicht beim Drucken. Wenn End-to-End-Workflows nur mit DirectWrite implementiert werden, kann das richtige Verhalten für benannte Instanzen einer Variablenschriftart erwartet werden.
Da vorhandene DirectWrite-APIs die Gesichtsauswahl mit dem Modell "Weight/Stretch/Style" unterstützen, werden die benannten Instanzen von Schriftarten, die andere Variationsachsen verwenden, vom allgemeinen typografischen Familienmodell in das WSS-Modell projiziert, wie oben beschrieben. Dies basiert auf einer variablen Schriftart, einschließlich einer "Formatattribute"-Tabelle ('STAT') mit Untertabellen mit Achsenwert, die DWrite verwendet, um Gesichtsnamentoken zu unterscheiden, die Gewichtungs-, Stretch- oder Formatvorlagenattribute von Token bestimmen, die sich auf andere Variationsachsen beziehen.
Wenn eine Variable schriftart keine "STAT"-Tabelle enthält, wie für variable Schriftarten durch die OpenType-Spezifikation erforderlich, behandelt DirectWrite die Schriftart als nicht variable Schriftart, die nur die Standardinstanz enthält.
Wenn eine Schriftart eine "STAT"-Tabelle enthält, aber keine geeigneten Untertabellen für Achsenwerte enthält, kann dies zu unerwarteten Ergebnissen führen, z. B. mehrere Gesichter mit identischen Gesichtsnamen. Diese Schriftarten werden derzeit nicht unterstützt.
Die OpenType-Spezifikation ermöglicht die Darstellung von Glyphenkonturdaten in einem von zwei Formaten: mithilfe einer "Glyf"-Tabelle, die trueType-Gliederungs- und Hintingformat verwendet, oder mithilfe einer Tabelle vom Typ "CFF", die die Komprimierung des Schriftformats ("CFF") verwendet. In einer Variablenschriftart mit TrueType-Gliederungen wird die Tabelle "Glyf" weiterhin verwendet und durch eine "gvar"-Tabelle ergänzt, die die Variationsdaten für die Gliederungen bereitstellt. Dies bedeutet, dass die Standardinstanz einer Variablenschriftart mit TrueType-Gliederungen nur herkömmliche OpenType-Tabellen verwendet, die in älteren Software unterstützt werden, die keine Unterstützung für variable Schriftarten aufweist. In einer Variablenschriftart mit CFF-Gliederungen wird die Tabelle "CFF" jedoch durch die Tabelle "CFF2" ersetzt, die die Standardgliederungsdaten und die zugehörigen Variationsdaten in einer Tabelle kapselt. CFF-Daten werden von einem separaten Rasterizer verarbeitet, der für TrueType-Daten verwendet wird, und eine Tabelle "CFF2" erfordert einen aktualisierten CFF-Rasterizer, der "CFF2" unterstützt. Eine Tabelle "CFF2" kann nicht von älteren CFF-Rasterizern verarbeitet werden. Bei einer variablen Schriftart mit CFF-Gliederungsdaten bedeutet dies, dass selbst die Standardinstanz in älteren Software nicht funktioniert.
Im Windows 10 Creators Update unterstützt DirectWrite keine variablen Schriftarten mit CFF-Gliederungsdaten mithilfe der Tabelle "CFF2".
Verwenden von OpenType-Variablenschriftarten
OpenType-Schriftarten können leicht zu verwenden sein, wobei die aktuellen Einschränkungen beachtet werden, die oben aufgeführt sind:
- Derzeit werden nur benannte Instanzen einer Variablenschriftart unterstützt.
- Derzeit werden nur variable Schriftarten unterstützt, die TrueType-Glyphenkonturdaten (nicht CFF-Gliederungen) verwenden.
- Bei Schriftarten, die andere Achsen als Gewicht, Stretch oder Format verwenden, werden benannte Instanzen in das WSS-Familienmodell projiziert, was dazu führen kann, dass einige benannte Instanzen als separate Familien angezeigt werden (wie in der Vergangenheit bei nicht variablen Schriftarten). Um dies zu unterstützen, müssen variable Schriftarten über eine Tabelle "STAT" verfügen, die entsprechende Untertabellen für Achsenwerte enthält.
- Benannte Instanzen von Variablenschriftarten werden in DirectWrite-APIs unterstützt. Wenn jedoch bestimmte Vorgänge in älteren Implementierungen ausgeführt werden, die keine Variablenschriftarten unterstützen, können diese zu falschen Ergebnissen führen.
- Bestimmte DirectWrite-APIs verwenden die DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH und DWRITE_FONT_STYLE Enumerationen zum Angeben von Gewichts-, Stretch- und Formatvorlagenattributen beim Auswählen von Gesichtern. Wenn eine Variable Schriftart entsprechende Variationsachsen verwendet, aber viele benannte Instanzen aufweist, die eine feinere Granularität erfordern, sind nicht alle benannten Instanzen in diesen APIs auswählbar.
OpenType-Variable Schriftarten, die diesen Anforderungen entsprechen, können in der Windows-Shell wie andere OpenType-Schriftarten installiert werden und auch in benutzerdefinierten Schriftartensätzen verwendet werden, die von einer App erstellt werden.
Bei der Installation im System werden alle benannten Instanzen einer Variablenschriftart in den vom IDWriteFontFamily3 zurückgegebenen Schriftartensatz eingeschlossen:GetSystemFontSet-Methode. Beachten Sie, dass ein Schriftsatz eine flache Liste ohne Familiengruppierungshierarchie ist, aber jedes Element in der Gruppe verfügt über eine Familiennameneigenschaft, die auf dem WSS-Familienmodell basiert. Der Schriftsatz kann mithilfe der IDWriteFontSet::GetMatchingFonts Methoden nach einer bestimmten Variablenschriftart gefiltert werden. Wenn Sie die GetMatchingFonts Überladung verwenden, die einen FamilyName akzeptiert, muss der angegebene FamilyName jedoch den Namen verwenden, der dem WSS-Schriftartfamilienmodell entspricht. Die vollständige Liste der WSS-kompatiblen Familiennamen, die in einem Schriftartensatz auftreten, können mithilfe der IDWriteFontSet::GetPropertyValues Methoden mithilfe von DWRITE_FONT_PROPERTY_ID_FAMILY_NAME abgerufen werden.
Ebenso werden alle benannten Instanzen einer Variablenschriftart in der Schriftartsammlung dargestellt, die von der IDWriteFactory::GetSystemFontCollection--Methode zurückgegeben wird. Da es sich bei den Elementen einer Schriftartsammlung um Schriftartfamilien handelt, die auf dem WSS-Modell basieren, können die benannten Instanzen einer Variablenschriftart in einer Auflistung als Elemente von zwei oder mehr Schriftartfamilien dargestellt werden. Wenn die IDWriteFontCollection::FindFamilyName Methode verwendet wird, muss der FamilyName-Parameter ein WSS-kompatibler Familienname sein. Um alle WSS-kompatiblen Familiennamen aus einer Schriftartsammlung zu finden, kann eine App jede Familie durchlaufen und IDWriteFontFamily::GetFamilyNamesaufrufen, obwohl es einfacher sein kann, einen entsprechenden Schriftartsatz zu erhalten und die GetPropertyValues--Methode wie oben beschrieben zu verwenden.
Beim Arbeiten mit benutzerdefinierten Schriftarten können verschiedene Ansätze, die im thema benutzerdefinierte Schriftartsätze beschrieben werden, verwendet werden, um einen Schriftsatz zu erstellen. Zum Hinzufügen einer variablen Schriftart zu einem benutzerdefinierten Schriftartsatz wird die IDWriteFontSetBuilder1::AddFontFile Methode empfohlen, da sie variable Schriftarten unterstützt und alle benannten Instanzen einer Variablenschriftart in einem einzigen Aufruf hinzu fügt. Zurzeit gibt es keine Möglichkeit, einzelne benannte Instanzen einer benutzerdefinierten Variablenschriftart zu einem Schriftartsatz mithilfe der IDWriteFontSetBuilder::AddFontFaceReference Methoden hinzuzufügen, da es keine Möglichkeit gibt, einen Schriftzeichenverweis zu erstellen, der angibt, welche benannten Instanzen aus einer Variablenschriftdatei vorgesehen sind. Dies bedeutet, dass derzeit keine Möglichkeit besteht, benannte Instanzen einer benutzerdefinierten Schriftart zu einem benutzerdefinierten Schriftartsatz mit zugewiesenen benutzerdefinierten Eigenschaften hinzuzufügen. Das bedeutet wiederum, dass benutzerdefinierte Variablenschriftarten derzeit nicht problemlos in Verbindung mit DirectWrite-APIs für Remoteschriftarten verwendet werden können. Wenn benannte Instanzen einer variablen Schriftart in einem Systemschriftartsatz enthalten sind, sind jedoch Bereits Schriftartbezüge für jede benannte Instanz vorhanden, und diese können benutzerdefinierten Schriftartsätzen hinzugefügt werden, einschließlich der Verwendung von benutzerdefinierten Eigenschaftswerten. Weitere Informationen finden Sie im Thema "Benutzerdefinierte Schriftartsätze".
Beim Arbeiten mit Variablenschriftarten sind directWrite DWRITE_FONT_WEIGHT und DWRITE_FONT_STRETCH Enumerationen eng mit den in der OpenType-Spezifikation definierten Gewichts- und Breitenvariationsachsen verbunden, sind jedoch nicht identisch. Zuerst unterstützt die numerische Skalierung für jede Variationsachse immer Bruchwerte, während fontWeight und fontStretch ganze Zahlen verwenden. Die Skalierung der OpenType-Gewichtsachse verwendet Werte zwischen 1 und 1000, die auch von FontWeight unterstützt werden. Daher ist die Änderung von einem Größenachsenwert für Variationen zu FontWeight relativ gering: Das für eine benannte Instanz gemeldete FontWeight kann von dem genauen Wert gerundet werden, der zum Definieren der benannten Instanz innerhalb der Schriftart verwendet wird. Der Unterschied zwischen DirectWrite fontStretch und dem OpenType-Breitenachsenmaßstab ist größer: DirectWrite verwendet Werte von 1 bis 9, nach dem usWidthClass Werte der OpenType OS/2-Tabelle, während die OpenType-Breitenachsenskala positive Werte verwendet, die einen Prozentsatz der normalen Breite darstellen. Die usWidthClass Dokumentation in der OpenType-Spezifikation stellt eine Zuordnung zwischen Werten 1 bis 9 und Prozent der Normalwerte bereit. Der für eine benannte Instanz gemeldete fontStretch-Wert kann beim Konvertieren von Werten der Breiteachse gerundet werden.
Beim Erstellen eines IDWriteTextFormat-müssen eine Schriftartsammlung und WSS-kompatible Schriftarteigenschaften (Familienname, Gewicht, Stretch und Formatvorlage) angegeben werden. Dies gilt auch beim Festlegen von Schriftartformatierungseigenschaften für ein IDWriteTextLayout Textbereich. Die Eigenschaften können aus einem IDWriteFontFace3 Objekt oder aus IDWriteFont und IDWriteFontFamily Objekte abgerufen werden, die eine bestimmte benannte Instanz darstellen. Wie oben beobachtet, werden die von den Methoden GetWeight und GetStretch zurückgegebenen Werte möglicherweise abgerundete Annäherungen für die tatsächlichen Achsenwerte, die zum Definieren der benannten Instanz verwendet werden, aber DirectWrite zuordnen die Kombination von Eigenschaften zurück zur gewünschten benannten Instanz.
Wenn eine App IDWriteFontFallbackBuilder- verwendet, um benutzerdefinierte Fallbackdaten für Schriftarten zu erstellen, werden Familien für Zeichenbereichszuordnungen mit WSS-kompatiblen Familiennamen angegeben. Der Schriftfallback in DirectWrite basiert auf Familien, bei denen DirectWrite eine Variante in einer Fallbackfamilie auswählt, die für die Variante der Startfamilie am nächsten ist. Bei Varianten, die andere Dimensionen als Gewicht, Stretch und Format umfassen, wäre DirectWrite derzeit nicht in der Lage, solche Varianten innerhalb einer Fallbackfamilie auszuwählen, es sei denn, benutzerdefinierte Fallbackdaten wurden speziell erstellt, um Fallbackzuordnungen für Familien bereitzustellen, die bestimmte nicht-WSS-Attribute aufweisen, z. B. "Caption"-optische Größenvarianten.