OpenType változó betűtípusok
Ez a témakör az OpenType változó betűtípusait, a DirectWrite és a Direct2D támogatását, valamint az alkalmazásokban való használatát ismerteti.
- Mik az OpenType változó betűtípusai?
- OpenType változó betűtípusának támogatása a DirectWrite
- OpenType változó betűtípusainak használata
Mik az OpenType változó betűtípusai?
Az OpenType betűtípusformátum specifikációjának 1.8-as verziója új bővítményt vezetett be az OpenType betűtípus-változatoknéven ismert formátumhoz. Az ezeket a bővítményeket használó betűtípusokat OpenType változó betűtípusoknak nevezzük. Az OpenType változó betűtípusa egyetlen betűtípus, amely több betűtípushoz hasonlóan viselkedhet a különböző minták közötti folyamatos interpolációval, amelyek mindegyike egyetlen betűtípusban van definiálva.
Az OpenType változók betűtípusai egy vagy több független tengely mentén, például súly vagy szélesség mentén határozhatják meg a kialakítás folyamatos variációját:
A betűtípus-fejlesztő egy adott betűtípushoz használandó változattengelyek készletét határozza meg. Ezek a tengelyek tartalmazhatnak jól ismert (vagy "regisztrált") változattengelyeket, például súlyt és szélességet, de tartalmazhatnak tetszőleges, egyéni változattengelyeket is, amelyeket a betűtípus fejlesztője határoz meg.
Ha egy betűtípus változattengelyeit választja ki, a betűtípus fejlesztője egy absztrakt, n dimenziós térközt határoz meg a betűtípushoz. A szövegmotorok tetszőleges pozíciót vagy "példányt" adhatnak meg a szöveg elhelyezésére és megjelenítésére szolgáló folyamatos térben.
A betűkészlet-fejlesztő a tervezési változat területén belül kijelölhet és hozzárendelhet neveket bizonyos példányokhoz; ezeket "nevesített példányoknak" nevezzük. Például a súlyváltozással rendelkező betűtípusok támogathatják a nagyon könnyű és a nagyon nehéz tollvonások közötti folyamatos eltérést, míg a betűtípus fejlesztője adott súlyokat választott ki a folytonosság mentén, és hozzájuk rendelt neveket, például "Light", "Regular" és "Semibold".
Az OpenType változó betűformátuma a hagyományos OpenType betűtípusokban található adattáblákat, valamint bizonyos további táblákat használ, amelyek a különböző adatelemek értékeinek változását írják le a különböző példányok esetében. A formátum egy változatpéldányt jelöl meg "alapértelmezett példányként", amely hagyományos táblákat használ az alapértelmezett értékek lekéréséhez. Minden más példány az alapértelmezett adatoktól és az egyéb deltaadatoktól függ. Egy "glyf" tábla például bezier-görbe leírással rendelkezhet egy névleges glif-alakzatról, amely az alapértelmezett példányhoz használt alakzat, míg a "gvar" tábla leírja, hogy a glyph Bezier vezérlőpontjai hogyan vannak igazítva más példányokhoz. Hasonlóképpen, más betűtípusértékek névleges értékekkel és deltaadatokkal is rendelkezhetnek, amelyek azt írják le, hogy ezek az értékek hogyan változnak a különböző példányok esetében; például x magasságú és egyéb betűméretű metrikák, vagy glyph-specifikus mark-anchoring pozíciók és kerítési beállítások.
Mivel a változó betűtípusok tetszőleges változattengely-készletet támogatnak, a betűcsaládok bővíthető modelljét igénylik, amelyek közvetlenül tükrözik, hogyan hoznak létre betűtípuscsaládokat a betűtípustervezők: a betűtípuscsaládokat egy családnév és bizonyos állandó tervezési jellemzők határozzák meg, tetszőleges számmal (a betűtípus fejlesztője határozza meg) a kialakítás különböző módjait. Lehet, hogy egy betűcsaládot a súlyozáshoz használnak, de egy másik betűcsaládot is létrehozhat x magasságú, serif-méretű, "funkiness" vagy bármilyen más betűtípus-fejlesztő kívánsága szerint. Ebben a modellben a betűtípus-arcok kiválasztását az általános vagy "előnyben részesített" vagy "tipográfiai" családnévvel, valamint a kulcs-érték párok készletével írják le, amelyek mindegyike egyfajta variációt és konkrét értéket jelöl, és általában a változatok fajtái bővíthető készlet. A betűtípuscsalád ezen általános fogalma a hagyományos, nem változó betűtípusokra és a változó betűtípusokra is alkalmazható. Ebben az általános, tipográfiai családi modellben például a "Selawik VF" családban a súly, az optikai méret és a serif kialakítás variációi lehetnek, például a "Semilight Banner Sans".
Egyes meglévő szoftveres implementációk, beleértve a meglévő DirectWrite API-kat is, a betűcsaládok korlátozottabb modelljét feltételezve tervezhetők. Egyes alkalmazások például feltételezhetik, hogy egy betűtípuscsalád legfeljebb normál, félkövér, dőlt és félkövér dőlt változatokkal rendelkezhet. A meglévő IDWriteFontCollection és IDWriteFontFamily interfészek feltételeznek egy súly/stretch/style ("WSS") családmodellt, amely lehetővé teszi a családon belüli változatok paraméterként való megadását a DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH vagy DWRITE_FONT_STYLE enumerálások használatával. Az előző példában az optikai méretet és a serif tengelyeket nem kezelik a WSS-modell családon belüli tengelyeiként.
A változó betűtípusok teljes körű támogatásához olyan API-k szükségesek, amelyek lehetővé teszik egy családtag számára, hogy a betűtípus által meghatározott több paraméterrel is meg legyen adva. A meglévő API-tervek azonban részleges támogatást nyújthatnak a változó betűtípusokhoz azáltal, hogy a változó betűtípusban definiált elnevezett példányokat a korlátozottabb betűcsalád-modellekre vetítik. Az előző példában a "Selawik VF Semilight Banner Sans" a WSS-modellbe "Selawik VF Banner Sans" családként és "Semilight" súlyvariánsként vethető be.
Egy másik példa egy tipográfiai betűtípuscsalád, például a Sitka, súly- és optikai méretvariánsokkal. A család nevesített változatai közé tartozik a Sitka Text Regular és a Sitka Banner Bold (plusz sok más). A tipográfiai családnév "Sitka", míg a tipográfiai családmodellben ezekhez a változatokhoz a "Text Regular" és a "Banner Bold" név tartozik. A négytagú és A WSS családi modellek nem teszik lehetővé a családon belüli optikai méretvariánsokat, ezért az optikai méret különbségeit családi szintű különbségként kell kezelni. Az alábbi táblázat bemutatja, hogyan kezelhetők a Sitka tipográfiai családból származó betűtípusok a WSS-családmodellben:
Tipográfiai családi modell
WSS családi modell
Család
Arc
Család
Arc
Sitka
Normál szöveg
Sitka szöveg
Rendszeres
Sitka
Szalagcím félkövér
Sitka Banner
Merész
Sitka
Felirat dőlt
Sitka felirat
Dőlt
A tipográfiai családi modelltől a WSS családi modellig a nevek kivetítése alkalmazható a nem változó betűtípusokra és a változó betűtípusok nevesített példányaira. Ez azonban nem végezhető el más, nem elnevezett példányok esetében a változó betűtípusok folytonos kialakítási-variációs területéről. Ezért a változó betűtípusok teljes funkcionalitásának támogatásához olyan API-kra lesz szükség, amelyek a tipográfiai családban lévő arcokra való hivatkozásra szolgálnak a variációs tengelyek és tengelyértékek nem konfigurált készlete tekintetében.
OpenType változó betűtípusának támogatása a DirectWrite-ban
A Windows 10 Creators Update kiadásától kezdve az OpenType változó betűformátuma még mindig nagyon új, és a betűgyártók, platformok és alkalmazások még folyamatban vannak az új formátum implementálásában. Ez a frissítés a DirectWrite-ben biztosítja a formátum kezdeti implementálását.
A DirectWrite belső elemei frissültek az OpenType változó betűtípusainak támogatásához. Az aktuális API-k használatával ez támogatja a változó betűtípusok nevesített példányait. Ez a támogatás teljes munkafolyamatokhoz használható– a nevesített példányok számbavételétől a megnevezett példány kiválasztásán át az elrendezés és a formázás használatán át a renderelésig és nyomtatásig. A GDI-szövegösszekötőt bizonyos műveletekhez is használó alkalmazások javára hasonló támogatás lett hozzáadva a meglévő GDI API-khoz is.
A Windows 10 alkotói frissítésében a DirectWrite nem támogatja azokat az tetszőleges példányokat, amelyek a változó betűtípusok folyamatos variációs képességét használják.
Számos művelet esetén a Változó betűtípusok nevesített példányainak DirectWrite-ban való viselkedése nem különböztethető meg a nem változó betűtípusok viselkedésétől. Mivel a támogatás meglévő DirectWrite API-k használatával érhető el, a változó betűtípusok nevesített példányai módosítás nélkül is működhetnek számos meglévő DirectWrite-alkalmazásban. Bizonyos helyzetekben azonban kivételek alkalmazhatók:
- Ha egy alkalmazás közvetlenül dolgoz fel betűtípusadatokat bizonyos műveletekhez. Ha például egy alkalmazás közvetlenül a betűtípusfájlból olvas be glyph outline adatokat bizonyos vizuális effektusok létrehozásához.
- Ha egy alkalmazás külső kódtárat használ bizonyos műveletekhez. Ha például egy alkalmazás a DirectWrite-ot használja az elrendezéshez, a végső karakterjel-indexek és -pozíciók lekéréséhez, majd egy külső kódtárat használ a rendereléshez.
- Ha egy alkalmazás betűtípusadatokat ágyaz be egy dokumentumba, vagy más módon továbbítja a betűtípusadatokat egy alsóbb rétegbeli folyamatnak.
Ha a műveleteket olyan implementációkkal hajtják végre, amelyek nem támogatják a változó betűtípusokat, akkor előfordulhat, hogy ezek a műveletek nem a várt eredményeket eredményezik. Előfordulhat például, hogy a karakterjelek pozíciói a változó betűtípusának egy nevesített példányára lesznek kiszámítva, de a karakterjelek egy másik elnevezett példányt feltételezve jelenhetnek meg. Az alkalmazás implementációjától függően az eredmények bizonyos környezetekben működhetnek, más környezetekben azonban nem, amelyekben más kódtárak használhatók. Előfordulhat például, hogy a szöveg helyesen jelenik meg a képernyőn, nyomtatáskor azonban nem. Ha a végpontok közötti munkafolyamatok csak a DirectWrite használatával vannak implementálva, akkor a változó betűtípus elnevezett példányainak helyes viselkedése várható.
Mivel a meglévő DirectWrite API-k támogatják az arcok kiválasztását a súly/stretch/style modell használatával, a más változattengelyeket használó betűtípusok nevesített példányai az általános, tipográfiai családi modellből a WSS-modellbe lesznek kivetítve a fent leírtak szerint. Ez egy változó betűtípusra támaszkodik, beleértve a tengely-érték altáblákat tartalmazó "stílusattribútumokat" (STAT) tartalmazó táblázatot, amelyet a DWrite a súly- és stretch- vagy stílusattribútumokat jelző arcnév-jogkivonatok megkülönböztetésére használ a más változattengelyekhez tartozó tokenektől.
Ha egy változó betűtípusa nem tartalmaz "STAT" táblát, ahogyan azt az OpenType specifikációja megköveteli a változó betűtípusokhoz, akkor a DirectWrite nem változó betűtípusként kezeli a betűtípust, amely csak az alapértelmezett példányt tartalmazza.
Ha egy betűtípus tartalmaz egy "STAT" táblát, de nem tartalmaz megfelelő tengely-érték altáblákat, ez váratlan eredményekhez vezethet, például több arccal, amelyek azonos arcnevekkel rendelkeznek. Az ilyen betűtípusok jelenleg nem támogatottak.
Az OpenType specifikáció lehetővé teszi, hogy a glyph outline adatok két formátum egyikében legyenek ábrázolva: egy "glyf" tábla használatával, amely TrueType tagolást és emlékeztető formátumot használ, vagy egy "CFF" táblázatot használ, amely Kompakt betűformátum ("CFF") ábrázolást használ. A TrueType tagolású változó betűtípusokban a "glyf" tábla továbbra is használható, és kiegészül egy "gvar" táblával, amely a vázlatok változatadatait tartalmazza. Ez azt jelenti, hogy a TrueType tagolású változó betűtípusok alapértelmezett példánya csak hagyományos OpenType-táblákat használ, amelyeket a régebbi szoftverek támogatnak, és nem támogatják a változó betűtípusokat. A CFF tagolású változó betűtípusokban azonban a CFF táblát felváltja a "CFF2" tábla, amely az alapértelmezett szerkezeti adatokat és a hozzá tartozó változatadatokat foglalja magában egy táblában. A CFF-adatokat külön raszterizátor dolgozza fel a TrueType-adatokhoz használttól, a CFF2 tábla pedig egy frissített CFF raszterizátort igényel, amely rendelkezik "CFF2" támogatással. A régebbi CFF-raszterizátorok nem tudják feldolgozni a CFF2 táblát. A CFF szerkezeti adatokat tartalmazó változó betűtípus esetében ez azt jelenti, hogy még az alapértelmezett példány sem fog működni a régebbi szoftverekben.
A Windows 10 Alkotók frissítésében a DirectWrite nem támogatja a CFF szerkezeti adatokat tartalmazó változó betűtípusokat a CFF2 tábla használatával.
OpenType változó betűtípusok használata
Az OpenType változó betűtípusai könnyen használhatók, szem előtt tartva a fent említett jelenlegi korlátozásokat:
- Jelenleg csak a változó betűtípusok nevesített példányai támogatottak.
- Jelenleg csak a TrueType glyph outline adatokat használó változó betűtípusok támogatottak (cFF-tagolások nélkül).
- A súlytól, a nyúlástól vagy a stílustól eltérő kialakítási változatot használó betűtípusok esetében a névvel ellátott példányok a WSS családi modellbe lesznek kivetítve, ami azt eredményezheti, hogy egyes elnevezett példányok külön családként jelennek meg (ahogy a múltban a nem változó betűtípusok esetében). Ennek támogatásához a változó betűtípusoknak rendelkezniük kell egy "STAT" táblával, amely megfelelő tengely-érték altáblákat tartalmaz.
- A Változó betűtípusok nevesített példányai támogatottak a DirectWrite API-kban, de ha bizonyos műveleteket olyan régebbi implementációkban hajtanak végre, amelyek nem támogatják a változó betűtípusokat, azok helytelen eredményeket eredményezhetnek.
- Egyes DirectWrite API-k a DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH és DWRITE_FONT_STYLE enumerálásokat használják a súly, a nyújtás és a stílus attribútumainak megadásához az arcok kiválasztásakor. Ha egy változó betűtípusa megfelelő változattengelyeket használ, de számos olyan elnevezett példánysal rendelkezik, amelyek finomabb részletességet igényelnek, nem minden elnevezett példány lesz kiválasztható ezekben az API-kban.
Az ezen követelményeknek megfelelő OpenType változó betűtípusok ugyanúgy telepíthetők a Windows rendszerhéjból, mint más OpenType betűtípusok, és alkalmazás által létrehozott egyéni betűtípuskészletekben is használhatók.
Ha telepítve van a rendszerben, a rendszer az IDWriteFontFamily3::GetSystemFontSet metódus meghívásával visszaadott betűtípuskészletbe foglalja bele a változó betűtípus összes elnevezett példányát. Vegye figyelembe, hogy a betűtípuskészletek egy családi csoportosítási hierarchia nélküli, egybesimított lista, de a készlet minden eleme rendelkezik a WSS-családmodellen alapuló családnév-tulajdonságdal. A betűtípuskészlet az IDWriteFontSet::GetMatchingFonts metódusok használatával szűrhető egy adott változóbetűs példányra. Ha a GetMatchingFonts túlterhelést használ, amely egy familyName-t vesz igénybe, a megadott familyName névnek a WSS betűtípuscsalád-modellnek megfelelő nevet kell használnia. A betűkészletekben előforduló WSS-kompatibilis családnevek teljes listája az IDWriteFontSet::GetPropertyValues metódusok DWRITE_FONT_PROPERTY_ID_FAMILY_NAME használatával kérhető le.
Hasonlóképpen, a változó betűtípusok nevesített példányai is megjelennek az IDWriteFactory::GetSystemFontCollection metódus által visszaadott betűtípusgyűjteményben. Mivel a betűtípusgyűjtemény elemei a WSS-modellen alapuló betűtípuscsaládok, a változó betűtípusok nevesített példányai két vagy több betűtípuscsalád tagjaiként jelenhetnek meg egy gyűjteményben. Ha a IDWriteFontCollection::FindFamilyName metódust használja, a familyName paraméternek WSS-kompatibilis családnévnek kell lennie. Ha meg szeretné keresni a WSS-kompatibilis családneveket egy betűtípusgyűjteményből, egy alkalmazás végigfuttathatja az egyes családokat, és meghívhatja IDWriteFontFamily::GetFamilyNamesparancsot, bár egyszerűbb lehet beszerezni egy megfelelő betűtípuskészletet, és a fent ismertetett GetPropertyValues metódust használni.
Egyéni betűtípusok használata esetén az Egyéni betűtípuskészletek témakörben ismertetett különböző módszerek használhatók a betűtípuskészletek létrehozásához. Ha változó betűtípust szeretne hozzáadni egy egyéni betűtípuskészlethez, az IDWriteFontSetBuilder1::AddFontFile metódus ajánlott, mivel támogatja a változó betűtípusokat, és egyetlen hívásban hozzáadja egy változó betűtípus összes elnevezett példányát. Jelenleg nem lehet egyéni változó betűtípus egyedi elnevezett példányait hozzáadni egy betűtípuskészlethez az IDWriteFontSetBuilder::AddFontFaceReference metódusok használatával, mivel nem lehet olyan betűtípus-archivatkozást létrehozni, amely meghatározza, hogy a változó betűkészletfájlból melyik elnevezett példányt szánják. Ez azt jelenti, hogy jelenleg nem lehet egyéni betűtípus elnevezett példányait hozzáadni egy egyéni, egyéni tulajdonsággal rendelkező betűtípuskészlethez. Ez viszont azt jelenti, hogy az egyéni változó betűtípusok jelenleg nem használhatók egyszerűen a DirectWrite API-kkal együtt távoli betűtípusokhoz. Ha egy változó betűtípus nevesített példányai szerepelnek a rendszer betűtípuskészletében, akkor az egyes elnevezett példányokra már léteznek betűtípus-archivatkozások, és ezek hozzáadhatók az egyéni betűtípuskészletekhez, beleértve az egyéni tulajdonságértékek használatát is. További részletekért tekintse meg az Egyéni betűkészletek témakört.
Változó betűtípusok használatakor a DirectWrite DWRITE_FONT_WEIGHT és DWRITE_FONT_STRETCH enumerálások szorosan kapcsolódnak az OpenType specifikációban meghatározott súly- és szélességváltozási tengelyekhez, de nem azonosak. Először is minden változattengely numerikus skálája mindig támogatja a törtértékeket, míg a fontWeight és a fontStretch függvény egész számokat használ. Az OpenType súlytengely skálája 1 és 1000 közötti értékeket használ, amelyet a fontWeight is támogat. Így a variációs súlytengely értékéről a fontWeight értékre való váltás viszonylag kisebb: a névvel ellátott példányhoz jelentett fontWeight érték lekerekítve lehet a betűkészleten belüli elnevezett példány meghatározásához használt pontos értékből. A DirectWrite fontStretch és az OpenType szélességi tengely skálája közötti különbség nagyobb: a DirectWrite 1 és 9 közötti értékeket használ az OpenType OS/2 tábla usWidthClass értékeit követve, míg az OpenType szélességi tengely skálája a normál szélesség százalékát képviselő pozitív értékeket használ. Az OpenType specifikációjának usWidthClass dokumentációja megfeleltetést biztosít az 1 és 9 közötti értékek és a normál értékek százalékos aránya között. A névvel ellátott példányhoz jelentett fontStretch érték kerekítéssel járhat a szélességi tengely értékeinek konvertálásakor.
Az IDWriteTextFormatlétrehozásakor meg kell adni egy betűkészletet és egy WSS-kompatibilis betűtípus-tulajdonságokat (családnév, súly, nyújtás és stílus). Ez akkor is érvényes, ha IDWriteTextLayout szövegtartományban állít be betűtípusformázási tulajdonságokat. A tulajdonságok beszerezhetők egy IDWriteFontFace3 objektumból vagy IDWriteFont és IDWriteFontFamily objektumból, amelyek egy adott elnevezett példányt jelölnek. A fentiekben leírtak szerint a GetWeight és a GetStretch metódus által visszaadott értékek lekerekített közelítések lehetnek a névvel ellátott példány meghatározásához használt tényleges tengelyértékekhez, de a DirectWrite a tulajdonságok kombinációját visszaképezi a kívánt elnevezett példányra.
Hasonlóképpen, ha egy alkalmazás IDWriteFontFallbackBuilder használatával hoz létre egyéni betűtípus-tartalék adatokat, a WSS-kompatibilis családneveket használó karaktertartomány-leképezésekhez családok vannak megadva. A DirectWrite-ben a betűtípus-tartalék olyan családokon alapul, amelyeknél a DirectWrite kiválaszt egy olyan változatot a tartalékcsaládon belül, amely a legközelebbi egyezés a kezdőcsalád változatához. A súlytól, a nyújtástól és a stílustól eltérő dimenziókat tartalmazó változatok esetében a DirectWrite jelenleg nem tud ilyen változatokat kiválasztani egy tartalékcsaládon belül, kivéve, ha egyéni tartalék adatokat hoztak létre kifejezetten olyan családok tartalék leképezéséhez, amelyek bizonyos nem WSS-attribútumokkal rendelkeznek, például "Felirat" optikai méretvariánsokkal.