Tipi di carattere di variabili OpenType
Questo argomento descrive i tipi di carattere delle variabili OpenType, il supporto in DirectWrite e Direct2D e come usarli nell'app.
- Quali sono i tipi di carattere delle variabili OpenType?
- Supporto del tipo di carattere variabile OpenType in DirectWrite
- Uso dei tipi di carattere delle variabili OpenType
Quali sono i tipi di carattere delle variabili OpenType?
La versione 1.8 della specifica del formato del tipo di carattere OpenType ha introdotto una nuova estensione per il formato noto come Varianti carattere OpenType. I tipi di carattere che usano queste estensioni sono noti come tipi di carattere variabile OpenType. Un tipo di carattere variabile OpenType è un singolo tipo di carattere che può comportarsi come diversi tipi di carattere usando l'interpolazione continua tra progetti diversi, tutti definiti all'interno del singolo tipo di carattere.
Un tipo di carattere variabile OpenType può definire una variazione continua della progettazione lungo uno o più assi indipendenti, ad esempio peso o larghezza:
Uno sviluppatore di tipi di carattere determina un set di assi di variazione da usare in un determinato tipo di carattere. Questi assi possono includere un set di assi noti (o "registrati") di variazione, ad esempio peso e larghezza, ma possono anche includere assi arbitrari, assi personalizzati di variazione definiti dallo sviluppatore di tipi di carattere.
Selezionando un set di assi di variazione per un tipo di carattere, lo sviluppatore di tipi di carattere definisce uno spazio astratto e ndimensionale della variazione di progettazione per il tipo di carattere. I motori di testo possono specificare potenzialmente qualsiasi posizione o "istanza", all'interno di tale spazio continuo per la disposizione e il rendering del testo.
Lo sviluppatore di caratteri può anche selezionare e assegnare nomi a istanze specifiche all'interno dello spazio di variazione di progettazione; questi vengono definiti "istanze denominate". Ad esempio, un carattere con variazione di peso può supportare una variazione continua tra tratti molto leggeri e molto pesanti, mentre lo sviluppatore di caratteri ha selezionato pesi specifici lungo quel continuum e i nomi assegnati a loro, ad esempio "Light", "Regular" e "Semibold".
Il formato del tipo di carattere della variabile OpenType usa tabelle dati trovate nei tipi di carattere OpenType tradizionali e alcune tabelle aggiuntive che descrivono come i valori di vari elementi dati cambiano per istanze diverse. Il formato designa un'istanza di variante come "istanza predefinita", che usa le tabelle tradizionali per ottenere valori predefiniti. Tutte le altre istanze dipendono dai dati predefiniti e da altri dati delta. Ad esempio, una tabella "glyf" può avere una descrizione della curva Bezier di una forma di glifo nominale, ovvero la forma utilizzata per l'istanza predefinita, mentre una tabella "gvar" descrive come i punti di controllo Bezier per il glifo vengono regolati per altre istanze. Analogamente, altri valori di carattere possono avere un valore nominale più dati differenziali che descrivono come questi valori cambiano per istanze diverse; ad esempio, x-height e altre metriche a livello di carattere o posizioni di ancoraggio mark-specific del glifo e regolazioni di kerning.
Poiché i tipi di carattere variabile possono supportare un set arbitrario di assi di variazione, richiedono un modello estendibile di famiglie di tipi di carattere che riflettono in modo più diretto il modo in cui i progettisti di tipi di carattere creano famiglie di tipi di carattere: una famiglia di caratteri è definita da un nome di famiglia e determinate caratteristiche di progettazione costanti, con un numero arbitrario (determinato dallo sviluppatore di tipi di carattere) in cui la progettazione può variare. Una famiglia di caratteri può essere creata con varianti per il peso, ma una famiglia di caratteri diversa può essere creata con varianti per x-height, serif-size, "funkiness" o qualsiasi cosa desidera lo sviluppatore di caratteri. In questo modello, una selezione dei caratteri è descritta in modo ottimale usando il tipo generale o "preferito" o "tipografico", nome di famiglia più un set di coppie chiave-valore, ognuno che rappresenta un tipo di variazione e valore specifico, con i tipi di variazione in generale essendo un set estendibile. Questa nozione generale di una famiglia di caratteri può essere applicata ai tipi di carattere tradizionali, non variabili e ai tipi di carattere variabile. Ad esempio, in questo generale, il modello di famiglia tipografico "Selawik VF" potrebbe avere variazioni per peso, dimensione ottica e design serif, con istanze come "Semilight Banner Sans".
Alcune implementazioni software esistenti, tuttavia, incluse le API di DirectWrite esistenti, possono essere progettate presupponendo un modello più limitato di famiglie di caratteri. Ad esempio, alcune applicazioni possono presupporre che una famiglia di caratteri possa avere, al massimo, Regolare, Grassetto, Corsivo e Varianti corsivo grassetto. Le interfacce IDWriteFontCollection e IDWriteFontFamily presuppongono un modello di famiglia di tipo weight/stretch/style ("WSS"), consentendo la specifica delle varianti all'interno di una famiglia da specificare usando i DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH o DWRITE_FONT_STYLE enumerazione come parametri. Prendendo l'esempio precedente, le dimensioni ottiche e gli assi serif non verranno considerati assi interni della famiglia di variazioni nel modello WSS.
Il supporto completo per i tipi di carattere variabile richiederebbe api che consentono a un membro della famiglia di essere specificati con potenzialmente diversi parametri, come determinato dal tipo di carattere. Tuttavia, le progettazioni API esistenti possono essere in grado di fornire supporto parziale per i tipi di carattere variabile proiettando le istanze denominate definite in un tipo di carattere variabile nei modelli di famiglia di tipi di carattere più limitati. Nell'esempio precedente,"Selawik VF Semilight Banner Sans" può essere proiettato nel modello WSS come famiglia "Selawik VF Banner Sans" con "Semilight" come variante di peso.
Per un altro esempio, prendere in considerazione una famiglia di caratteri tipografici, ad esempio Sitka, con varianti di peso e dimensione ottica. Le varianti denominate all'interno della famiglia includono Sitka Text Regular e Sitka Banner Bold (più molti altri). Il nome della famiglia tipografica è "Sitka" mentre i nomi dei visi per queste varianti nel modello di famiglia tipografico sarebbero "Text Regular" e "Banner Bold". I modelli di famiglia di quattro membri e WSS non consentono varianti di dimensioni ottiche all'interno di una famiglia e pertanto le distinzione di dimensioni ottiche devono essere considerate come le distinzione a livello di famiglia. Nella tabella seguente viene illustrato come viene trattata una selezione di tipi di carattere dalla famiglia di tipi sitka nel modello di famiglia WSS:
Modello di famiglia tipografico
Modello di famiglia WSS
Famiglia
Viso
Famiglia
Viso
Sitka
Testo normale
Testo Sitka
Normale
Sitka
Banner Grassetto
Sitka Banner
Bold
Sitka
Didascalia corsivo
Didascalia sitka
Corsivo
La proiezione di nomi da un modello di famiglia tipografico al modello di famiglia WSS può essere applicata ai tipi di carattere non variabile e alle istanze denominate di tipi di carattere variabile. Questa operazione non può essere eseguita, tuttavia, per altre istanze non denominate dallo spazio di variazione di progettazione continua di un tipo di carattere variabile. Per questo motivo, il supporto per la funzionalità completa dei tipi di carattere variabile richiederà API progettate per fare riferimento ai visi all'interno di una famiglia tipografica in termini di un set non vincolato di assi di variazione e valori dell'asse.
Supporto del tipo di carattere variabile OpenType in DirectWrite
A partire dalla versione della Windows 10 Creators Update, il formato del tipo di carattere variabile OpenType è ancora molto nuovo e i fornitori di tipi di carattere, le piattaforme e le app sono ancora in fase di implementazione del nuovo formato. Questo aggiornamento fornisce l'implementazione iniziale per questo formato in DirectWrite.
DirectWrite interni sono stati aggiornati per supportare i tipi di carattere variabile OpenType. L'uso delle API correnti fornisce il supporto per qualsiasi istanza denominata di un tipo di carattere variabile. Questo supporto può essere usato per i flussi di lavoro completi, dall'enumerazione delle istanze denominate, dalla selezione di un'istanza denominata, dall'uso nel layout e nella forma, al rendering e alla stampa. Per il vantaggio delle app che usano anche l'interoperabilità di testo GDI per determinate operazioni, è stato aggiunto anche supporto simile nelle API GDI esistenti.
Nella Windows 10 Creators Update DirectWrite non supporta istanze arbitrarie che usano la funzionalità di variazione continua dei tipi di carattere variabile.
In molte operazioni il comportamento in DirectWrite di istanze denominate di un tipo di carattere variabile non può essere distinto dal comportamento dei tipi di carattere non variabile. Poiché il supporto viene fornito usando le API di DirectWrite esistenti, le istanze denominate dei tipi di carattere variabile possono funzionare anche in molte app di DirectWrite esistenti senza modifiche. Le eccezioni possono tuttavia essere applicate in determinate situazioni:
- Se un'app elabora i dati del tipo di carattere direttamente per determinate operazioni. Ad esempio, se un'app legge i dati di struttura del glifo direttamente dal file di carattere per creare determinati effetti visivi.
- Se un'app usa una libreria di terze parti per determinate operazioni. Ad esempio, se un'app usa DirectWrite per il layout, per ottenere indici e posizioni glifi finali, ma quindi usa una libreria di terze parti per il rendering.
- Se un'app incorpora i dati del tipo di carattere in un documento o in un altro modo passa i dati del tipo di carattere a un processo downstream.
Se le operazioni vengono eseguite usando implementazioni che non supportano tipi di carattere variabile, queste operazioni potrebbero non produrre i risultati previsti. Ad esempio, le posizioni del glifo possono essere calcolate per un'istanza denominata del tipo di carattere variabile, ma i glifi potrebbero essere sottoposti a rendering presupponendo un'istanza denominata diversa. A seconda dell'implementazione dell'applicazione, i risultati possono funzionare in alcuni contesti, ma non in altri contesti in cui possono essere usate altre librerie. Ad esempio, il testo può essere visualizzato correttamente sullo schermo, ma non quando stampato. Se i flussi di lavoro end-to-end vengono implementati usando solo DirectWrite, è possibile prevedere un comportamento corretto per le istanze denominate di un tipo di carattere variabile.
Poiché le API di DirectWrite esistenti supportano la selezione dei volti usando il modello di peso/estensione/stile, le istanze denominate dei tipi di carattere che usano altri assi di variazione verranno proiettate dal modello generale della famiglia tipografica nel modello WSS, come descritto in precedenza. Ciò si basa su un tipo di carattere variabile, tra cui una tabella "attributi di stile" ('STAT') con sottotable con valori di asse, che DWrite usa per distinguere i token di nome viso che definiscono gli attributi di peso, estensione o stile dai token che riguardano altri assi di variazione.
Se un tipo di carattere variabile non include una tabella 'STAT', come richiesto per i tipi di carattere variabile dalla specifica OpenType, DirectWrite considera il tipo di carattere come tipo di carattere non variabile contenente solo l'istanza predefinita.
Se un tipo di carattere contiene una tabella 'STAT', ma non include sottotable con valori di asse appropriati, questo può causare risultati imprevisti, ad esempio avere più visi con nomi di viso identici. Tali tipi di carattere non sono supportati in questo momento.
La specifica OpenType consente di rappresentare i dati della struttura del glifo in uno dei due formati: usando una tabella "glyf", che usa la struttura TrueType e il formato di hinting o usando una tabella "CFF", che usa la rappresentazione Compact Font Format ("CFF"). In un tipo di carattere variabile con struttura TrueType la tabella 'glyf' continua a essere usata e viene integrata con una tabella 'gvar' che fornisce i dati di variazione per le struttura. Ciò significa che l'istanza predefinita di un tipo di carattere variabile con contorni TrueType usa solo tabelle OpenType tradizionali che saranno supportate nel software meno recente che non dispone di supporto del tipo di carattere variabile. In un tipo di carattere variabile con struttura CFF, tuttavia, la tabella 'CFF' viene sostituita dalla tabella 'CFF2', che incapsula i dati di struttura predefiniti e i dati di variazione associati in una tabella. I dati CFF vengono elaborati da un rasterizzatore separato da quello usato per i dati TrueType e una tabella 'CFF2' richiede un rasterizzatore CFF aggiornato con supporto "CFF2". Non è possibile elaborare una tabella 'CFF2' da rasterizzatori CFF meno recenti. Per un tipo di carattere variabile con dati struttura CFF, ciò significa che anche l'istanza predefinita non funzionerà nel software precedente.
Nella Windows 10 Creators Update DirectWrite non supporta i tipi di carattere variabile con i dati della struttura CFF usando la tabella 'CFF2'.
Uso dei tipi di carattere delle variabili OpenType
I tipi di carattere delle variabili OpenType possono essere facili da usare, tenendo presente le limitazioni correnti annotate in precedenza:
- In questo momento sono supportate solo istanze denominate di un tipo di carattere variabile.
- Solo i tipi di carattere variabile che usano i dati struttura del glifo TrueType (non i contorni CFF) sono supportati in questo momento.
- Per i tipi di carattere che usano assi di variazione di progettazione diversi dal peso, dall'estensione o dallo stile, le istanze denominate verranno proiettate nel modello di famiglia WSS, che potrebbe comportare la visualizzazione di alcune istanze denominate come famiglie separate (come accade nel passato per i tipi di carattere non variabile). Per supportare questo problema, i tipi di carattere variabile devono avere una tabella "STAT" che include sottotable con valori di asse appropriati.
- Le istanze denominate dei tipi di carattere variabile sono supportate nelle API DirectWrite, ma se alcune operazioni vengono eseguite nelle implementazioni precedenti che non supportano tipi di carattere variabile, tali tipi di carattere potrebbero produrre risultati non corretti.
- Alcune API di DirectWrite usano le DWRITE_FONT_WEIGHT, le DWRITE_FONT_STRETCH e le DWRITE_FONT_STYLE enumerazioni per specificare attributi di peso, estensione e stile durante la selezione dei visi. Se un tipo di carattere variabile usa assi di variazione corrispondenti, ma ha molte istanze denominate che richiedono granularità più fine, non tutte le istanze denominate saranno selezionabili in tali API.
I tipi di carattere delle variabili OpenType conformi a questi requisiti possono essere installati dalla shell di Windows come altri tipi di carattere OpenType e possono essere usati anche nei set di caratteri personalizzati creati da un'app.
Quando installato nel sistema, tutte le istanze denominate di un tipo di carattere variabile verranno incluse nel set di caratteri restituito chiamando il metodo IDWriteFontFamily3::GetSystemFontSet . Si noti che un set di caratteri è un elenco flat senza una gerarchia di raggruppamento di famiglia, ma ogni elemento del set ha una proprietà nome di famiglia basata sul modello di famiglia WSS. Il set di caratteri può essere filtrato per un'istanza specifica di tipo tipo variabile denominata usando i metodi IDWriteFontSet::GetMatchingFonts . Se si usa l'overload GetMatchingFonts che accetta un nome famiglia, tuttavia, il nome specificato deve usare il nome conforme al modello di famiglia di caratteri WSS. È possibile ottenere l'elenco completo dei nomi di famiglia compatibili con WSS in un set di caratteri usando i metodi IDWriteFontSet::GetPropertyValues usando DWRITE_FONT_PROPERTY_ID_FAMILY_NAME.
Analogamente, tutte le istanze denominate di un tipo di carattere variabile verranno rappresentate nella raccolta di caratteri restituita dal metodo IDWriteFactory::GetSystemFontCollection . Poiché gli elementi di una raccolta di caratteri sono famiglie di tipi di carattere basati sul modello WSS, le istanze denominate di un tipo di carattere variabile possono essere rappresentate in una raccolta come membri di due o più famiglie di caratteri. Se viene usato il metodo IDWriteFontCollection::FindFamilyName , il parametro familyName deve essere un nome di famiglia compatibile con WSS. Per trovare tutti i nomi di famiglia compatibili con WSS da una raccolta di caratteri, un'app può scorrere ogni famiglia e chiamare IDWriteFontFamily::GetFamilyNames, anche se potrebbe essere più semplice ottenere un set di caratteri corrispondente e usare il metodo GetPropertyValues come descritto in precedenza.
Quando si usano tipi di carattere personalizzati, è possibile usare vari approcci descritti nell'argomento Set di caratteri personalizzati per creare un set di caratteri. Per aggiungere un tipo di carattere variabile a un set di caratteri personalizzato, il metodo IDWriteFontSetBuilder1::AddFontFile è consigliato poiché supporta tipi di carattere variabile e aggiungerà tutte le istanze denominate di un tipo di carattere variabile in una singola chiamata. Al momento non è possibile aggiungere singole istanze denominate di un tipo di carattere variabile personalizzato a un set di caratteri usando i metodi IDWriteFontSetBuilder::AddFontFaceReference perché non è possibile creare un riferimento al viso del carattere specificando quale delle istanze denominate da un file di carattere variabile è previsto. Ciò significa che attualmente non è possibile aggiungere istanze denominate di un tipo di carattere personalizzato a un set di caratteri personalizzato con proprietà personalizzate assegnate. Ciò significa che i tipi di carattere di variabile personalizzati attualmente non possono essere usati facilmente insieme alle API DirectWrite per i tipi di carattere remoti. Se le istanze denominate di un tipo di carattere variabile sono incluse in un set di tipi di carattere di sistema, tuttavia, i riferimenti al carattere di carattere per ogni istanza denominata saranno già presenti e questi possono essere aggiunti a set di caratteri personalizzati, inclusi l'uso dei valori delle proprietà personalizzate. Per altre informazioni, vedere l'argomento Set di caratteri personalizzati.
Quando si utilizzano tipi di carattere variabile, le DirectWrite DWRITE_FONT_WEIGHT e le enumerazioni DWRITE_FONT_STRETCH sono strettamente connesse agli assi di variazione di peso e larghezza definiti nella specifica OpenType, ma non sono uguali. Prima di tutto, la scala numerica per qualsiasi asse di variazione supporta sempre i valori frazionari, mentre fontWeight e fontStretch usano interi. La scala dell'asse di peso OpenType usa valori compresi tra 1 e 1000, supportati anche da fontWeight. Pertanto, la modifica da un valore dell'asse di peso di variazione a fontWeight è relativamente minore: il carattereWeight segnalato per un'istanza denominata può essere arrotondato dal valore preciso usato per definire l'istanza denominata all'interno del tipo di carattere. La distinzione tra DirectWrite fontStretch e la scala dell'asse di larghezza OpenType è maggiore: DirectWrite usa valori da 1 a 9, seguendo i valori usWidthClass della tabella OpenType OS/2, mentre la scala dell'asse di larghezza OpenType usa valori positivi che rappresentano una percentuale di larghezza normale. La documentazione usWidthClass nella specifica OpenType fornisce un mapping tra valori da 1 a 9 e percentuale dei valori normali. Il valore fontStretch segnalato per un'istanza denominata può comportare l'arrotondamento durante la conversione da valori dell'asse di larghezza.
Quando si crea un IDWriteTextFormat, è necessario specificare le proprietà dei tipi di carattere compatibili con WSS (nome della famiglia, peso, estensione e stile). Questo vale anche quando si impostano le proprietà di formattazione del carattere in un intervallo di testo IDWriteTextLayout . Le proprietà possono essere ottenute da un oggetto IDWriteFontFace3 o da oggetti IDWriteFont e IDWriteFontFamily che rappresentano un'istanza denominata specifica. Come osservato in precedenza, i valori restituiti dai metodi GetWeight e GetStretch possono essere arrotondati per i valori effettivi dell'asse usati per definire l'istanza denominata, ma DirectWrite eseguirà il mapping della combinazione di proprietà all'istanza denominata desiderata.
Analogamente, se un'app usa IDWriteFontFallbackBuilder per creare dati di fallback dei tipi di carattere personalizzati, le famiglie vengono specificate per i mapping di intervalli di caratteri usando nomi di famiglia compatibili con WSS. Il fallback del tipo di carattere all'interno di DirectWrite si basa su famiglie con DirectWrite selezionando una variante all'interno di una famiglia di fallback più vicina per la variante della famiglia iniziale. Per le varianti che coinvolgono dimensioni diverse da peso, estensione e stile, DirectWrite attualmente non sarebbe in grado di selezionare tali varianti all'interno di una famiglia di fallback a meno che i dati di fallback personalizzati non siano stati creati in modo specifico per fornire mapping di fallback per famiglie con attributi non WSS specifici, ad esempio varianti di dimensioni ottiche "Didascalia".