Anzeigen von Text mit Uniscribe
Ihre Anwendungen können Uniscribe-API-Funktionen verwenden, um Typografie und die Anzeige und Bearbeitung von internationalem Text zu unterstützen. Uniscribe verwendet den Absatz als Einheit für die Textanzeige, und die Uniscribe-Funktionalität muss für den gesamten Absatz verwendet werden.
Wenn Sie Uniscribe für die Anzeige von Text verwenden, muss eine Anwendung einen Formatierungsprozess ("Layout") durchlaufen, in der Regel uniscribe. Die Anwendung unterteilt einen Text absatz in Zeichenfolgen von Zeichen mit dem gleichen Format, das als "Ausführungen" bezeichnet wird. Der Stil wird von der jeweiligen Implementierung bestimmt, enthält jedoch in der Regel Attribute wie Schriftart, Größe und Farbe. Beim Definieren von Ausführungen kann die Anwendung auch andere Informationen anwenden, z. B. Sprach- und Gebietsschemadaten, die für die Verwendung mit lexikalischen Tools verwaltet werden. Eine Anwendung kann z. B. als separater Run-Abschnitt in einem hauptsächlich englischen Text behandelt werden, der in Französisch gerendert wird.
Nachdem die Ausführungen für alle Absätze bestimmt wurden, teilt die Anwendung jeden Absatz in Zeichenfolgen auf, die das gleiche Skript und die gleiche Richtung ("Elemente") aufweisen. Die Anwendung wendet die Elementinformationen an, um Ausführungen zu erzeugen, die in Skript und Richtung eindeutig sind und vollständig in ein einzelnes Element ("Bereiche") fallen.
Die Aufschlüsselung eines Elements in Bereiche ist etwas willkürlich, obwohl ein Bereich aus mindestens einer aufeinanderfolgenden skriptdefinierte, unteilbare Zeichengruppierung bestehen sollte, die als "Cluster" bezeichnet wird. Für europäische Sprachen entspricht ein Cluster in der Regel einem einzelnen Codepagezeichen oder Unicode-Codepunkt und besteht aus einem einzelnen Glyphen. In Sprachen wie Thailändisch ist ein Cluster jedoch eine Gruppierung von Glyphen und entspricht mehreren aufeinander folgenden Zeichen oder Codepunkten. Beispielsweise kann ein thailändischer Cluster einen Konsonanten, einen Vokal und ein Tonzeichen enthalten. Damit Cluster nicht beeinträchtigt werden, sollte die Anwendung in der Regel entweder die längsten Bereiche verwenden, die sie nutzen kann, oder ihre eigenen lexikalischen Informationen verwenden, um zwischen Bereichen an Stellen zu unterbrechen, die sich nicht in der Mitte eines Clusters befinden.
Wenn die Cluster in jedem Bereich identifiziert wurden, muss die Anwendung die Größe der einzelnen Cluster bestimmen. Es verwendet Uniscribe, um die Cluster zu summieren, um die Größe der einzelnen Bereiche zu bestimmen. Anschließend summiert die Anwendung die Größen der Bereiche, bis sie eine Linie überlaufen, d. h. den Rand erreichen. Der Bereich, der die Linie überläuft, wird zwischen der aktuellen Zeile und der nächsten Zeile aufgeteilt. Für jede Zeile erstellt die Anwendung eine Karte von der visuellen Position zur logischen Position für jeden Bereich. Anschließend formt die Anwendung die Codepunkte für jeden Bereich in Glyphen, die anschließend positioniert und gerendert werden können.
Eine Anwendung führt das Textlayout nur einmal durch. Anschließend werden entweder die Glyphen und Positionen zu Anzeigezwecken gespeichert, oder sie werden jedes Mal generiert, wenn der Text angezeigt wird, wobei der Kompromiss Geschwindigkeit im Vergleich zu Arbeitsspeicher ist. Eine typische Anwendung implementiert den Layoutprozess einmal und generiert dann jedes Mal, wenn der Text angezeigt wird, die Glyphen und Positionen.
Eine Anwendung, die komplexe Skripts verwendet, hat die folgenden Probleme mit einem einfachen Ansatz für Layout und Anzeige.
- Die Breite eines komplexen Skriptzeichens hängt vom Kontext ab. Es ist nicht möglich, die Breiten in einfachen Tabellen zu speichern.
- Das Abbrechen zwischen Wörtern in Skripts wie Thailändisch erfordert Wörterbuchunterstützung. Beispielsweise wird kein Trennzeichen zwischen thailändischen Wörtern verwendet.
- Arabisch, Hebräisch, Russisch, Urdu und andere bidirektionale Textsprachen erfordern vor der Anzeige eine Neuanordnung.
- Häufig ist eine Form der Schriftartzuordnung erforderlich, um komplexe Skripts einfach verwenden zu können.
Die Tatsache, dass Uniscribe den Absatz als Anzeigeeinheit verwendet, hilft der Anwendung, diese komplexen Skriptprobleme angemessen zu behandeln.
Hinweis
Uniscribe muss für einen gesamten Absatz verwendet werden, auch wenn Abschnitte des Absatzes keine komplexen Skripts sind.
Wie in der folgenden Tabelle gezeigt, unterstützt Uniscribe Version 1.6 oder höher mehrere Funktionen, die OpenType-Tags nutzen. Sie können durch die entsprechenden regulären Uniscribe-Funktionen ersetzt werden. Im Allgemeinen sollten Ihre Anwendungen vollständig mit Funktionen der einen oder der anderen Gruppe funktionieren und nicht versuchen, Funktionen zu "mischen und abzugleichen".
| Reguläre Uniscribe-Funktion | Äquivalente OpenType-Funktion |
|---|---|
| ScriptItemize | ScriptItemizeOpenType |
| ScriptShape | ScriptShapeOpenType |
| ScriptPlace | ScriptPlaceOpenType |
Layout von Text mit Uniscribe
Ihre Anwendung kann die folgenden Schritte ausführen, um einen Text absatz mit Uniscribe zu gestalten. Bei diesem Verfahren wird davon ausgegangen, dass die Anwendung den Absatz bereits in Ausführungen unterteilt hat.
Rufen Sie ScriptRecordDigitSubsierung nur auf, wenn Sie starten oder eine WM _ SETTINGCHANGE-Nachricht empfangen.
(Optional) Rufen Sie ScriptIsComplex auf, um zu ermitteln, ob der Absatz eine komplexe Verarbeitung erfordert.
(Optional) Wenn Sie Uniscribe zum Verarbeiten bidirektionaler Text- und/oder Ziffernersetzungen verwenden, rufen Sie ScriptApplyDigitSubsdom auf, um die Strukturen SCRIPT _ CONTROL und SCRIPT _ STATE als Eingaben für ScriptItemizevorzubereiten. Wenn Sie diesen Schritt überspringen, aber dennoch eine Ziffernersetzung erfordern, ersetzen Sie die nationalen Ziffern durch Unicode U+0030 bis U+0039 (europäische Ziffern). Informationen zur Ziffernersetzung finden Sie unter Ziffernformen.
Rufen Sie ScriptItemize auf, um den Absatz in Elemente aufzuteilen. Wenn Uniscribe nicht für die Ziffernersetzung verwendet wird und die bidirektionale Reihenfolge bekannt ist, z. B. aufgrund des Tastaturlayouts, das zum Eingeben des Zeichens verwendet wird, rufen Sie ScriptItemize auf. Geben Sie im Aufruf NULL-Zeiger für die Strukturen SCRIPT _ CONTROL und SCRIPT _ STATE an. Diese Technik generiert Elemente nur mithilfe der Strukturierungs-Engine, und die Elemente können mithilfe der Engine-Informationen neu angeordnet werden.
Hinweis
In der Regel sollten Anwendungen, die nur mit Skripts von links nach rechts und ohne Ziffernersetzung funktionieren, NULL-Zeiger für die Strukturen SCRIPT _ CONTROL und SCRIPT _ STATE übergeben.
Führen Sie die Elementinformationen mit den Ausführungsinformationen zusammen, um Bereiche zu erzeugen.
Rufen Sie ScriptShape auf, um Cluster zu identifizieren und Glyphen zu generieren.
Wenn ScriptShape den Code USP _ E SCRIPT NOT IN FONT oder S OK mit der Ausgabe mit _ _ _ _ _ fehlenden Glyphen zurückgibt, wählen Sie Zeichen aus einer anderen Schriftart aus. Ersetzen Sie entweder eine andere Schriftart, oder deaktivieren Sie die Strukturierung, indem Sie den eScript-Member der SCRIPT _ ANALYSIS-Struktur, die an ScriptShape übergeben wird, auf SCRIPT _ UNDEFINED festlegen. Weitere Informationen finden Sie unter Verwenden von Schriftartfallback.
Rufen Sie ScriptPlace auf, um für die Glyphen in jedem aufeinanderfolgenden Bereich vorwärts breite und x- und y-Positionen zu generieren. Dies ist der erste Schritt, bei dem die Textgröße berücksichtigt wird.
Summiert die Bereichsgrößen, bis die Linie überläuft.
Unterbrechen Sie den Bereich an einer Wortgrenze, indem Sie die Member fSoftBreak und fWhiteSpace in den logischen Attributen verwenden. Um einen Cluster mit einem einzelnen Zeichen von der Ausführung abzubrechen, verwenden Sie die Informationen, die durch Aufrufen von ScriptBreakzurückgegeben werden.
Hinweis
Entscheiden Sie, ob der erste Codepunkt eines Bereichs ein Wörterbruchpunkt sein soll, da dies für das letzte Zeichen des vorherigen Bereichs erforderlich ist. Wenn beispielsweise ein Bereich mit einem Komma endet, betrachten Sie das erste Zeichen des nächsten Bereichs als Wörterbruchpunkt.
Wiederholen Sie die Schritte 6 bis 10 für jede Zeile im Absatz. Wenn sie jedoch die letzte Ausführung in der Zeile unterbricht, rufen Sie ScriptShape auf, um den verbleibenden Teil der Ausführung als erste Ausführung in der nächsten Zeile neu zu gestalten.
Anzeigen von Text mit Uniscribe
Ihre Anwendung kann die folgenden Schritte ausführen, um einen Text absatz anzuzeigen. Bei diesem Verfahren wird davon ausgegangen, dass die Anwendung den Text bereits angeordnet und die Glyphen und Positionen nicht aus dem Layoutprozess gespeichert hat. Wenn die Geschwindigkeit ein Problem ist, kann die Anwendung die Glyphen und Positionen aus der Layoutprozedur speichern und bei Schritt 2 in der Anzeigeprozedur beginnen.
Hinweis
Die Anwendung kann Schritt 2 weglassen, wenn der Text keine Zeichen von rechts nach links enthält, keine bidirektionalen Steuerzeichen enthält und eine Basiseinbettungsebene von links nach rechts verwendet.
Führen Sie für jede Ausführung folgende Schritte aus:
- Wenn sich der Stil seit der letzten Ausführung geändert hat, aktualisieren Sie das Handle auf den Gerätekontext, indem Sie ihn freigeben und erneut abrufen.
- Rufen Sie ScriptShape auf, um Glyphen für die Ausführung zu generieren.
- Rufen Sie ScriptPlace auf, um eine vorgezogene Breite und einen x,y-Offset für jedes Glyphen zu generieren.
Gehen Sie wie folgt vor, um die richtige visuelle Reihenfolge für die Ausführungen in der Zeile festzulegen:
- Extrahieren Sie ein Array bidirektionaler Einbettungsebenen, eins pro Bereich. Die Einbettungsebene wird von (SCRIPT _ ITEM) si angegeben. SCRIPT _ ANALYSIS) a. (SKRIPT) _ STATE) s.uBidiLevel.
- Übergeben Sie dieses Array an ScriptLayout, um eine Zuordnung von visuellen Positionen zu logischen Positionen zu generieren.
(Optional) Um den Text zu rechtfertigen, rufen Sie entweder ScriptJustify auf, oder verwenden Sie spezielle Kenntnisse des Texts.
Verwenden Sie die Visual-zu-Logisch-Zuordnung, um die Ausführungen in visueller Reihenfolge anzuzeigen. Rufen Sie ab dem linken Ende der Zeile ScriptTextOut auf, um die Ausführung anzuzeigen, die durch den ersten Eintrag in der Karte angegeben wird. Rufen Sie für jeden nachfolgenden Eintrag in der Karte ScriptTextOut auf, um die angegebene Ausführung rechts neben der zuvor angezeigten Ausführung anzuzeigen.
Wenn Sie Schritt 2 weglassen, beginnen Sie am linken Ende der Zeile, und rufen Sie ScriptTextOut auf, um die erste logische Ausführung und dann jede logische Ausführung rechts von der vorherigen Ausführung anzuzeigen.
Wiederholen Sie die obigen Schritte für alle Zeilen im Absatz.