Delen via


OpenType-variabelelettertypen

In dit onderwerp worden openType-variabelelettertypen beschreven, de ondersteuning ervan in DirectWrite en Direct2D en hoe u deze in uw app kunt gebruiken. 

Wat zijn opentypevariabele lettertypen?

Versie 1.8 van de specificatie van de OpenType-lettertype-indeling een nieuwe extensie geïntroduceerd in de indeling die bekend staat als OpenType-lettertypevariaties. Lettertypen die deze extensies gebruiken, worden opentypevariabele lettertypen genoemd. Een openType-variabele lettertype is één lettertype dat zich kan gedragen als verschillende lettertypen door continue interpolatie tussen verschillende ontwerpen te gebruiken, die allemaal zijn gedefinieerd in het ene lettertype.

Een openType-variabelelettertype kan continue variatie van het ontwerp definiëren langs een of meer onafhankelijke assen, zoals gewicht of breedte:

 

Toont een OpenType-variabelelettertype met behulp van de letter G en verschillende variaties langs een horizontale breedteas en een verticale gewichtsas.

Een lettertypeontwikkelaar bepaalt een set variatieassen die in een bepaald lettertype moeten worden gebruikt. Deze assen kunnen een reeks bekende (of 'geregistreerde') assen van variatie bevatten, zoals gewicht en breedte, maar ze kunnen ook willekeurige, aangepaste assen van variatie bevatten die zijn gedefinieerd door de lettertypeontwikkelaar.  

Door een set variatieassen voor een lettertype te selecteren, definieert de ontwikkelaar van het lettertype een abstracte, n-dimensionale ruimte van ontwerpvariatie voor het lettertype. Tekstengines kunnen mogelijk elke positie of 'instantie' opgeven binnen die doorlopende ruimte voor het opmaken en weergeven van tekst. 

De lettertypeontwikkelaar kan ook namen selecteren en toewijzen aan bepaalde exemplaren binnen de ontwerpvariatieruimte; deze worden 'benoemde exemplaren' genoemd. Een lettertype met gewichtsvariatie kan bijvoorbeeld continue variatie ondersteunen tussen zeer lichte en zeer zware pennenstreken, terwijl de ontwikkelaar van het lettertype bepaalde gewichten heeft geselecteerd langs dat continuum en namen heeft toegewezen, zoals 'Licht', 'Normaal' en 'Semibold'. 

De lettertypenotatie openType-variabele maakt gebruik van gegevenstabellen in traditionele OpenType-lettertypen plus bepaalde aanvullende tabellen waarin wordt beschreven hoe de waarden van verschillende gegevensitems voor verschillende exemplaren veranderen. De indeling wijst één variatie-exemplaar aan als een 'standaardexemplaren', waarbij traditionele tabellen worden gebruikt om standaardwaarden op te halen. Alle andere exemplaren zijn afhankelijk van de standaardgegevens plus andere deltagegevens. Een 'glyf'-tabel kan bijvoorbeeld een Beschrijving van de Bezier-curve hebben van een nominale glyph-shape, de shape die wordt gebruikt voor het standaardexemplaren, terwijl een 'gvar'-tabel beschrijft hoe de Bezier-besturingspunten voor het glyph worden aangepast voor andere exemplaren. Op dezelfde manier kunnen andere lettertypewaarden een nominale waarde plus deltagegevens bevatten die beschrijven hoe deze waarden voor verschillende exemplaren veranderen; Bijvoorbeeld x-hoogte en andere metrische gegevens voor het hele lettertype, of glyph-specifieke markeringsposities en afspatiëringsaanpassingen. 

Omdat variabele lettertypen een willekeurige set variatieassen kunnen ondersteunen, vereisen ze een uitbreidbaar model van lettertypefamilies die meer weerspiegelen hoe lettertypeontwerpers families van lettertypen maken: een lettertypefamilie wordt gedefinieerd door een familienaam en bepaalde ontwerpkenmerken die constant zijn, met een willekeurig getal (bepaald door de ontwikkelaar van het lettertype) van manieren waarop het ontwerp kan variëren. Een lettertypefamilie kan worden gemaakt met varianten voor gewicht, maar een andere lettertypefamilie kan worden gemaakt met varianten voor x-hoogte, serif-grootte, "funkiness" of wat de ontwikkelaar van het lettertype wenst. In dit model wordt een lettertypegezichtselectie het beste beschreven met behulp van de algemene of 'voorkeur' of 'typografische', familienaam plus een set sleutel-waardeparen, die elk een soort variatie en specifieke waarde vertegenwoordigen, waarbij de soorten variatie in het algemeen een uitbreidbare set zijn. Dit algemene begrip van een lettertypefamilie kan van toepassing zijn op traditionele, niet-variabele lettertypen en op variabele lettertypen. Bijvoorbeeld, onder dit algemene typografische familiemodel, kan een familie "Selawik VF" variaties hebben voor gewicht, optische grootte en serif ontwerp, met exemplaren zoals "Semilight Banner Sans". 

Sommige bestaande software-implementaties, waaronder bestaande DirectWrite-API's, kunnen echter worden ontworpen als een beperkter model van lettertypefamilies. Sommige toepassingen kunnen er bijvoorbeeld van uitgaan dat een lettertypefamilie maximaal reguliere, vetgedrukte, cursieve en vetgedrukte varianten kan bevatten. De bestaande IDWriteFontCollection en IDWriteFontFamily interfaces gaan uit van een familiemodel met gewicht/stretch/style (WSS), zodat varianten binnen een familie kunnen worden opgegeven met behulp van de DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH of DWRITE_FONT_STYLE opsommingen als parameters. In het vorige voorbeeld worden de optische grootte en serifassen niet behandeld als familie-interne assen van variatie in het WSS-model. 

Volledige ondersteuning voor variabele lettertypen vereist API's waarmee een gezinslid kan worden opgegeven met mogelijk verschillende parameters, zoals bepaald door het lettertype. Maar bestaande API-ontwerpen kunnen mogelijk gedeeltelijke ondersteuning bieden voor variabele lettertypen door de benoemde exemplaren te projecteren die zijn gedefinieerd in een variabel lettertype in de meer beperkte lettertypefamiliemodellen. In het vorige voorbeeld kan "Selawik VF Semilight Banner Sans" worden geprojecteerd in het WSS-model als een "Selawik VF Banner Sans"-familie met "Semilight" als een gewichtsvariant. 

Denk bijvoorbeeld aan een typografische lettertypefamilie zoals Sitka, met gewichtsvarianten en optische groottevarianten. Benoemde varianten binnen de familie zijn Sitka Text Regular en Sitka Banner Bold (plus vele andere). De typografische familienaam is 'Sitka' terwijl de gezichtsnamen voor deze varianten in het typografische familiemodel 'Text Regular' en 'Banner Bold' zouden zijn. De vier-lid- en WSS-familiemodellen staan geen optische groottevarianten binnen een gezin toe en daarom moeten optische-grootte-onderscheid worden behandeld als onderscheid op familieniveau. In de volgende tabel ziet u hoe een selectie lettertypen uit de sitka-typografische familie wordt behandeld in het WSS-familiemodel:

Typografische familiemodel

WSS-gezinsmodel

Familie

Gezicht

Familie

Gezicht

Sitka

Normale tekst

Sitka-tekst

Regelmatig

Sitka

Banner vet

Sitka Banner

Brutaal

Sitka

Cursief bijschrift

Sitka-bijschrift

Cursief

 

De projectie van namen van een typografische familiemodel naar het WSS-familiemodel kan worden toegepast op niet-variabele lettertypen en op de benoemde exemplaren van variabele lettertypen. Dit kan echter niet worden gedaan voor andere, niet-benoemde exemplaren uit de doorlopende ontwerpvariatieruimte van een variabel lettertype. Daarom vereist ondersteuning voor de volledige functionaliteit van variabele lettertypen API's die zijn ontworpen om te verwijzen naar gezichten binnen een typografische familie, wat betreft een niet-getrainde set variatieassen en aswaarden. 

Ondersteuning voor openType-variabele lettertype in DirectWrite

Vanaf de release van de Windows 10-makersupdate is de openType-variabele lettertype-indeling nog steeds erg nieuw en zijn leveranciers, platforms en apps nog steeds bezig met het implementeren van de nieuwe indeling. Deze update biedt de eerste implementatie voor deze indeling in DirectWrite. 

DirectWrite internals zijn bijgewerkt ter ondersteuning van OpenType-variabele lettertypen. Met behulp van huidige API's biedt dit ondersteuning voor alle benoemde exemplaren van een variabel lettertype. Deze ondersteuning kan worden gebruikt voor volledige werkstromen, van inventarisatie van de benoemde exemplaren, selectie van een benoemd exemplaar, gebruik in indeling en vormgeving om te renderen en af te drukken. Ten behoeve van apps die ook GDI-tekstinteroperabiliteit gebruiken voor bepaalde bewerkingen, is vergelijkbare ondersteuning ook toegevoegd aan bestaande GDI-API's. 

In de Windows 10-makersupdate biedt DirectWrite geen ondersteuning voor willekeurige exemplaren die gebruikmaken van de functie voor continue variatie van variabele lettertypen.

In veel bewerkingen kan het gedrag in DirectWrite van benoemde exemplaren van een variabel lettertype niet worden onderscheiden van het gedrag van niet-variabele lettertypen. En omdat ondersteuning wordt geboden met behulp van bestaande DirectWrite-API's, kunnen de benoemde exemplaren van variabele lettertypen zelfs werken in veel bestaande DirectWrite-apps zonder wijzigingen. Uitzonderingen kunnen echter van toepassing zijn in bepaalde situaties:

  • Als een app lettertypegegevens rechtstreeks verwerkt voor bepaalde bewerkingen. Als een app bijvoorbeeld glyph-overzichtsgegevens rechtstreeks uit het lettertypebestand leest om bepaalde visuele effecten te maken.
  • Als een app een bibliotheek van derden gebruikt voor bepaalde bewerkingen. Als een app bijvoorbeeld DirectWrite gebruikt voor de indeling, om uiteindelijke indexen en posities op te halen, maar vervolgens een bibliotheek van derden gebruikt voor rendering.
  • Als een app lettertypegegevens insluit in een document of op een andere manier lettertypegegevens doorgeeft aan een downstreamproces.

Als bewerkingen worden uitgevoerd met behulp van implementaties die geen ondersteuning bieden voor variabele lettertypen, produceren deze bewerkingen mogelijk niet de verwachte resultaten. Glyph-posities kunnen bijvoorbeeld worden berekend voor één benoemd exemplaar van het variabelelettertype, maar de glyphs kunnen worden weergegeven als een ander benoemd exemplaar. Afhankelijk van de implementatie van toepassingen kunnen de resultaten in sommige contexten werken, maar niet in andere contexten waarin andere bibliotheken kunnen worden gebruikt. Tekst kan bijvoorbeeld correct worden weergegeven op het scherm, maar niet wanneer deze wordt afgedrukt. Als end-to-end-werkstromen worden geïmplementeerd met alleen DirectWrite, kan het juiste gedrag voor benoemde exemplaren van een variabel lettertype worden verwacht. 

Aangezien bestaande DirectWrite-API's gezichtsselectie ondersteunen met behulp van het model gewicht/stretch/style, worden de benoemde exemplaren van lettertypen die gebruikmaken van andere assen van variatie geprojecteerd van het algemene typografische familiemodel naar het WSS-model, zoals hierboven beschreven. Dit is afhankelijk van een variabel lettertype, met inbegrip van een tabel 'stijlkenmerken' ('STAT') met subtabellen met aswaarde, die DWrite gebruikt om gezichtsnaamtokens te onderscheiden die gewichts-, stretch- of stijlkenmerken aanwijzen van tokens die betrekking hebben op andere assen van variatie.  

Als een variabelelettertype geen STAT-tabel bevat, zoals vereist voor variabele lettertypen volgens de OpenType-specificatie, wordt het lettertype door DirectWrite behandeld als een niet-variabel lettertype dat alleen het standaardexemplaren bevat.  

Als een lettertype wel een 'STAT'-tabel bevat, maar geen geschikte subtabellen met aswaarden bevat, kan dit leiden tot onverwachte resultaten, zoals het hebben van meerdere gezichten met identieke gezichtsnamen. Dergelijke lettertypen worden momenteel niet ondersteund. 

Met de OpenType-specificatie kunnen glyph-overzichtsgegevens in een van de twee indelingen worden weergegeven: met behulp van een 'glyf'-tabel, die gebruikmaakt van trueType-overzicht en hinting-indeling, of een 'CFF'-tabel, die gebruikmaakt van compacte tekenopmaak ('CFF'). In een variabel lettertype met TrueType-overzichten blijft de tabel 'glyf' worden gebruikt en wordt aangevuld met een 'gvar'-tabel die de variatiegegevens voor de overzichten levert. Dit betekent dat voor het standaardexemplaren van een variabelelettertype met TrueType-overzichten alleen traditionele OpenType-tabellen worden gebruikt die worden ondersteund in oudere software zonder ondersteuning voor variabele lettertypen. In een variabel lettertype met CFF-overzichten wordt de tabel CFF echter vervangen door de tabel CFF2, die de standaardoverzichtsgegevens en de bijbehorende variatiegegevens in één tabel inkapselt. CFF-gegevens worden verwerkt door een afzonderlijke rasterizer die wordt gebruikt voor TrueType-gegevens en een 'CFF2'-tabel vereist een bijgewerkte CFF-rasterizer met CFF2-ondersteuning. Een CFF2-tabel kan niet worden verwerkt door oudere CFF-rasterizers. Voor een variabel lettertype met CFF-overzichtsgegevens betekent dit dat zelfs het standaardexemplaren niet in oudere software werken. 

In de Windows 10 Creators Update biedt DirectWrite geen ondersteuning voor variabele lettertypen met CFF-overzichtsgegevens met behulp van de tabel CFF2. 

OpenType-variabelelettertypen gebruiken

OpenType-variabelelettertypen kunnen eenvoudig te gebruiken zijn, rekening houdend met de huidige beperkingen die hierboven zijn vermeld:

  • Op dit moment worden alleen benoemde exemplaren van een variabel lettertype ondersteund.
  • Op dit moment worden alleen variabele lettertypen ondersteund die gebruikmaken van trueType-overzichtsgegevens (niet CFF-overzichten). 
  • Voor lettertypen die andere assen van ontwerpvariatie gebruiken dan gewicht, stretch of stijl, worden benoemde exemplaren geprojecteerd in het WSS-familiemodel. Dit kan ertoe leiden dat sommige benoemde exemplaren worden weergegeven als afzonderlijke families (zoals in het verleden voor niet-variabele lettertypen). Om dit te ondersteunen, moeten variabele lettertypen een 'STAT'-tabel hebben die de juiste subtabellen met aswaarde bevat.
  • Benoemde exemplaren van variabele lettertypen worden ondersteund in DirectWrite-API's, maar als bepaalde bewerkingen worden uitgevoerd in oudere implementaties die geen ondersteuning bieden voor variabele lettertypen, kunnen deze onjuiste resultaten opleveren. 
  • Bepaalde DirectWrite-API's maken gebruik van de DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH en DWRITE_FONT_STYLE opsommingen voor het opgeven van gewichts-, stretch- en stijlkenmerken bij het selecteren van gezichten. Als een variabelelettertype corresponderende variatieassen gebruikt, maar veel benoemde exemplaren heeft waarvoor een nauwkeurige granulariteit is vereist, kunnen niet alle benoemde exemplaren worden geselecteerd in deze API's.

OpenType-variabelelettertypen die aan deze vereisten voldoen, kunnen net als andere OpenType-lettertypen worden geïnstalleerd vanuit de Windows-shell en kunnen ook worden gebruikt in aangepaste lettertypesets die zijn gemaakt door een app.  

Wanneer het systeem is geïnstalleerd, worden alle benoemde exemplaren van een variabel lettertype opgenomen in de lettertypeset die wordt geretourneerd door de methode IDWriteFontFamily3 aan te roepen:GetSystemFontSet methode. Een lettertypeset is een platte lijst zonder een hiërarchie met familiegroepen, maar elk item in de set heeft een familienaameigenschap op basis van het WSS-familiemodel. De lettertypeset kan worden gefilterd op een bepaald exemplaar met een variabele-lettertype met de naam IDWriteFontSet::GetMatchingFonts methoden. Als u de GetMatchingFonts overbelasting gebruikt die echter een familyName gebruikt, moet de opgegeven familyName de naam gebruiken die voldoet aan het WSS font-family-model. De volledige lijst met WSS-compatibele familienamen in een lettertypeset kan worden verkregen met behulp van de IDWriteFontSet::GetPropertyValues methoden met behulp van DWRITE_FONT_PROPERTY_ID_FAMILY_NAME.  

Op dezelfde manier worden alle benoemde exemplaren van een variabel lettertype weergegeven in de lettertypeverzameling die wordt geretourneerd door de methode IDWriteFactory::GetSystemFontCollection-methode. Omdat de elementen van een lettertypeverzameling lettertypefamilies zijn op basis van het WSS-model, kunnen de benoemde exemplaren van een variabel lettertype in een verzameling worden weergegeven als leden van twee of meer lettertypefamilies. Als de methode IDWriteFontCollection::FindFamilyName wordt gebruikt, moet de parameter FamilyName een WSS-compatibele familienaam zijn. Als u alle WSS-compatibele familienamen uit een lettertypeverzameling wilt vinden, kan een app elke familie doorlopen en IDWriteFontFamily::GetFamilyNamesaanroepen, hoewel het misschien eenvoudiger is om een bijbehorende lettertypeset te verkrijgen en de GetPropertyValues methode te gebruiken, zoals hierboven beschreven. 

Wanneer u met aangepaste lettertypen werkt, kunnen verschillende benaderingen die worden beschreven in de Aangepaste lettertypesets onderwerp worden gebruikt om een lettertypeset te maken. Als u een variabel lettertype wilt toevoegen aan een aangepaste lettertypeset, wordt de methode IDWriteFontSetBuilder1::AddFontFile methode aanbevolen omdat deze variabele lettertypen ondersteunt en alle benoemde exemplaren van een variabel lettertype in één aanroep toevoegt. Er is op dit moment geen manier om afzonderlijke benoemde exemplaren van een aangepast variabelelettertype toe te voegen aan een lettertypeset met behulp van de IDWriteFontSetBuilder::AddFontFaceReference methoden omdat er geen manier is om een lettertype-verwijzing te maken die aangeeft welke van de benoemde exemplaren uit een bestand met variabele lettertypen is bedoeld. Dit betekent dat er momenteel geen manier is om benoemde exemplaren van een aangepast lettertype toe te voegen aan een aangepaste lettertypeset waaraan aangepaste eigenschappen zijn toegewezen. Dat betekent op zijn beurt dat aangepaste variabelelettertypen momenteel niet eenvoudig kunnen worden gebruikt in combinatie met DirectWrite-API's voor externe lettertypen. Als benoemde exemplaren van een variabel lettertype zijn opgenomen in een systeemlettertypeset, bestaan er echter al lettertypegezichtverwijzingen voor elk benoemd exemplaar en kunnen deze worden toegevoegd aan aangepaste lettertypesets, waaronder met het gebruik van aangepaste eigenschapswaarden. Zie het onderwerp Aangepaste lettertypesets voor meer informatie. 

Wanneer u werkt met variabele lettertypen, zijn de DirectWrite-DWRITE_FONT_WEIGHT en DWRITE_FONT_STRETCH opsommingen nauw verbonden met de gewichts- en breedtevariatieassen die zijn gedefinieerd in de OpenType-specificatie, maar zijn niet hetzelfde. Ten eerste ondersteunt de numerieke schaal voor elke variatieas altijd breukwaarden, terwijl fontWeight en fontStretch gehele getallen gebruiken. De schaal van de OpenType-gewichtsas maakt gebruik van waarden tussen 1 en 1000, die ook worden ondersteund door fontWeight. De wijziging van de waarde van een variatieas naar fontWeight is dus relatief klein: het lettertypeGewicht dat voor een benoemd exemplaar is gerapporteerd, kan worden afgerond op basis van de exacte waarde die wordt gebruikt om het benoemde exemplaar in het lettertype te definiëren. Het onderscheid tussen DirectWrite fontStretch en de schaal van de OpenType-breedteas is groter: DirectWrite gebruikt waarden van 1 tot en met 9, na de usWidthClass waarden van de tabel OpenType OS/2, terwijl de schaal van de OpenType-breedteas positieve waarden gebruikt die een percentage van de normale breedte vertegenwoordigen. De documentatie usWidthClass in de OpenType-specificatie biedt een toewijzing tussen de waarden 1 tot en met 9 en het percentage van de normale waarden. De fontStretch-waarde die voor een benoemd exemplaar is gerapporteerd, kan betrekking hebben op afronding bij het converteren van waarden voor breedteas. 

Wanneer u een IDWriteTextFormatmaakt, moeten een lettertypeverzameling en WSS-compatibele lettertype-eigenschappen (familienaam, gewicht, stretch en stijl) worden opgegeven. Dit geldt ook bij het instellen van tekenopmaakeigenschappen op een IDWriteTextLayout tekstbereik. De eigenschappen kunnen worden verkregen van een IDWriteFontFace3-object of van IDWriteFont en IDWriteFontFamily-objecten die een bepaald benoemd exemplaar vertegenwoordigen. Zoals hierboven is waargenomen, kunnen de waarden die worden geretourneerd door de Methoden GetWeight en GetStretch worden afgerond op de werkelijke aswaarden die worden gebruikt om het benoemde exemplaar te definiëren, maar DirectWrite wijst de combinatie van eigenschappen weer toe aan het gewenste benoemde exemplaar. 

Als een app gebruikmaakt van IDWriteFontFallbackBuilder om aangepaste lettertypeterugvalgegevens te maken, worden families opgegeven voor tekenbereiktoewijzingen met WSS-compatibele familienamen. Lettertypeterugval in DirectWrite is gebaseerd op families met DirectWrite die een variant binnen een terugvalfamilie selecteren die het dichtst bij elkaar past voor de variant van de beginfamilie. Voor varianten die betrekking hebben op andere dimensies dan gewicht, stretch en stijl, zou DirectWrite momenteel niet in staat zijn om dergelijke varianten binnen een terugvalfamilie te selecteren, tenzij aangepaste terugvalgegevens specifiek zijn gemaakt om terugvaltoewijzingen te bieden voor families met bepaalde niet-WSS-kenmerken, zoals optische bijschriftvarianten.