Aracılığıyla paylaş


OpenType Değişken Yazı Tipleri

Bu konu başlığında OpenType değişken yazı tipleri, DirectWrite ve Direct2D'deki destekleri ve bunların uygulamanızda nasıl kullanılacağı açıklanmaktadır. 

OpenType değişken yazı tipleri nedir?

OpenType yazı tipi biçimi belirtimi sürüm 1.8, OpenType Yazı Tipi Çeşitlemeleri olarak bilinen biçime yeni bir uzantı getirmektedir. Bu uzantıları kullanan yazı tipleri OpenType değişken yazı tipleri olarak bilinir. OpenType değişken yazı tipi, tümü tek yazı tipi içinde tanımlanan farklı tasarımlar arasında sürekli ilişkilendirme kullanarak birkaç yazı tipi gibi davranabilen tek bir yazı tipidir.

OpenType değişken yazı tipi, tasarımının kalınlık veya genişlik gibi bir veya daha fazla bağımsız eksen boyunca sürekli varyasyonunu tanımlayabilir:

 

'G' harfini kullanarak bir OpenType değişken yazı tipini gösterir ve yatay genişlik ekseni ve dikey ağırlık ekseni boyunca farklı varyasyonlar gösterir.

Yazı tipi geliştiricisi, belirli bir yazı tipinde kullanılacak çeşitleme eksenleri kümesini belirler. Bu eksenler, ağırlık ve genişlik gibi iyi bilinen (veya "kayıtlı") çeşitleme eksenleri kümesi içerebilir, ancak yazı tipi geliştiricisi tarafından tanımlanan rastgele, özel çeşitleme eksenlerini de içerebilir.  

Yazı tipi geliştiricisi, bir yazı tipi için çeşitleme eksenleri kümesi seçerek yazı tipi için tasarım varyasyonunun soyut, n boyutlu bir alanını tanımlar. Metin altyapıları, metni yerleştirmek ve işlemek için bu sürekli alan içinde herhangi bir konum veya "örnek" belirtebilir. 

Yazı tipi geliştiricisi ayrıca tasarım varyasyonu alanında belirli örnekleri seçebilir ve bunlara ad atayabilir; bunlar "adlandırılmış örnekler" olarak adlandırılır. Örneğin, kalınlık varyasyonu olan bir yazı tipi çok hafif ve çok ağır vuruşlar arasındaki sürekli varyasyonu desteklerken, yazı tipi geliştiricisi bu devamlılık boyunca belirli ağırlıklar seçmiş ve bunlara "Açık", "Normal" ve "Semibold" gibi adlar atamıştır. 

OpenType değişken yazı tipi biçimi, geleneksel OpenType yazı tiplerinde bulunan veri tablolarının yanı sıra çeşitli veri öğelerinin değerlerinin farklı örnekler için nasıl değiştiğini açıklayan bazı ek tabloları kullanır. Biçimi, varsayılan değerleri almak için geleneksel tabloları kullanan bir çeşitleme örneğini "varsayılan örnek" olarak belirler. Diğer tüm örnekler varsayılan verilere ve diğer delta verilerine bağlıdır. Örneğin, bir 'glyf' tablosunda varsayılan örnek için kullanılan şekil olan nominal bir glif şeklinin Bezier eğrisi açıklaması bulunabilirken, 'gvar' tablosu glif için Bezier denetim noktalarının diğer örnekler için nasıl ayarlanacağını açıklar. Benzer şekilde, diğer yazı tipi değerleri nominal değere ek olarak bu değerlerin farklı örnekler için nasıl değiştiğini açıklayan delta verilerine sahip olabilir; örneğin, x yüksekliği ve yazı tipi genelindeki diğer ölçümler veya karaktere özgü işaret tutturucu konumları ve aralık ayarlamaları. 

Değişken yazı tipleri rastgele bir çeşitleme ekseni kümesini destekleyebildiğinden, yazı tipi tasarımcılarının yazı tipi aileleri oluşturma şeklini daha doğrudan yansıtan genişletilebilir bir yazı tipi aileleri modeline ihtiyaç duyarlar: yazı tipi ailesi, bir aile adıyla tanımlanır ve tasarımın değişebileceği rastgele bir sayıyla (yazı tipi geliştiricisi tarafından belirlenir) belirli tasarım özellikleri sabittir. Bir yazı tipi ailesi, ağırlık için çeşitlemelerle oluşturulabilir, ancak x yüksekliği, serif boyutu, "funkiness" veya yazı tipi geliştiricisinin istediği her şey için farklı bir yazı tipi ailesi oluşturulabilir. Bu modelde, yazı tipi yüz seçimi en iyi genel veya "tercih edilen" veya "tipografik", aile adı ve her biri bir çeşitleme türünü ve belirli bir değeri temsil eden bir anahtar-değer çifti kümesi kullanılarak ve genel olarak çeşitleme türleri genişletilebilir bir küme olarak tanımlanır. Bu genel yazı tipi ailesi, geleneksel, değişken olmayan yazı tiplerine ve değişken yazı tiplerine uygulanabilir. Örneğin, bu genel tipografik aile modelinin altında "Selawik VF" ailesinin ağırlık, optik boyut ve serif tasarımı çeşitlemeleri olabilir ve "Semilight Banner Sans" gibi örnekler olabilir. 

Ancak mevcut DirectWrite API'leri de dahil olmak üzere bazı mevcut yazılım uygulamaları, yazı tipi ailelerinin daha sınırlı bir modeli varsayılarak tasarlanabilir. Örneğin, bazı uygulamalar bir yazı tipi ailesinin en fazla Normal, Kalın, İtalik ve Kalın İtalik çeşitlemelerine sahip olabileceğini varsayabilir. IdWriteFontCollection ve IDWriteFontFamily arabirimleri, bir aile içindeki değişkenlerin parametre olarak DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH veya DWRITE_FONT_STYLE sabit listeleri kullanılarak belirtilmesine olanak sağlayan bir ağırlık/esnetme/stil ("WSS") ailesi modelini varsayar. Önceki örneği ele alarak, optik boyut ve serif eksenleri WSS modelinde aile içi çeşitleme eksenleri olarak işlenmez. 

Değişken yazı tipleri için tam destek, bir aile üyesinin yazı tipi tarafından belirlenen çeşitli parametrelerle belirtilmesine olanak sağlayan API'ler gerektirir. Ancak var olan API tasarımları, değişken yazı tipinde tanımlanan adlandırılmış örnekleri daha sınırlı yazı tipi ailesi modellerine yansıtarak değişken yazı tipleri için kısmi destek sağlayabilir. Önceki örnekte "Selawik VF Semilight Banner Sans" WSS modeline bir "Selawik VF Banner Sans" ailesi olarak ve "Semilight" bir ağırlık değişkeni olarak yansıtılabilir. 

Başka bir örnek için, ağırlık ve optik boyut çeşitlerini içeren Sitka gibi bir tipografik yazı tipi ailesi düşünün. Ailedeki adlandırılmış çeşitler Sitka Text Regular ve Sitka Banner Bold (artı birçok diğer) içerir. Tipografik aile adı "Sitka" iken, tipografik aile modelindeki bu çeşitlemelerin yüz adları "Text Regular" ve "Banner Bold" olacaktır. Dört üyeli ve WSS aile modelleri, bir aile içinde optik boyut çeşitlemelerine izin vermez ve bu nedenle optik boyut farkları aile düzeyinde ayrımlar olarak ele alınmalıdır. Aşağıdaki tabloda, Sitka tipografik ailesinden bir yazı tipi seçiminin WSS ailesi modelinde nasıl ele alınacağı gösterilmektedir:

Tipografik aile modeli

WSS aile modeli

Aile

Yüz

Aile

Yüz

Sitka

Normal Metin

Sitka Metni

Düzenli

Sitka

Başlık Kalın

Sitka Banner

Kalın

Sitka

Resim Yazısı italik

Sitka Caption

İtalik

 

Bir tipografik aile modelinden WSS aile modeline ad projeksiyonu, değişken olmayan yazı tiplerine ve değişken yazı tiplerinin adlandırılmış örneklerine uygulanabilir. Ancak bu, değişken yazı tipinin sürekli tasarım varyasyonu alanından adlandırılmış olmayan diğer örnekler için yapılamaz. Bu nedenle, değişken yazı tiplerinin tam işlevselliği için destek, bir tipografi ailesi içindeki yüzlere kısıtlanmamış varyasyon eksenleri ve eksen değerleri bakımından başvuracak şekilde tasarlanmış API'ler gerektirir. 

DirectWrite'te OpenType değişken yazı tipi desteği

Windows 10 Creators Update'in yayımlanmasından itibaren OpenType değişken yazı tipi biçimi hala çok yenidir ve yazı tipi satıcıları, platformlar ve uygulamalar hala yeni biçimi uygulama aşamasındadır. Bu güncelleştirme, DirectWrite'de bu biçim için ilk uygulama sağlar. 

DirectWrite iç işlevleri OpenType değişken yazı tiplerini destekleyecek şekilde güncelleştirildi. Geçerli API'leri kullanarak bu, değişken yazı tipinin adlandırılmış örnekleri için destek sağlar. Bu destek, adlandırılmış örneklerin sabit listesi, adlandırılmış örneğin seçilmesi, düzen ve şekillendirmede kullanılmasından işleme ve yazdırmaya kadar tüm iş akışları için kullanılabilir. Belirli işlemler için GDI metin birlikte çalışma özelliğini de kullanan uygulamaların avantajı için, mevcut GDI API'lerine benzer destek de eklenmiştir. 

Windows 10 Creators Update'te DirectWrite, değişken yazı tiplerinin sürekli varyasyon özelliğini kullanan rastgele örnekleri desteklemez.

Birçok işlemde, bir değişken yazı tipinin adlandırılmış örneklerinin DirectWrite davranışı, değişken olmayan yazı tiplerinin davranışından ayırt edilemez. Ayrıca mevcut DirectWrite API'leri kullanılarak destek sağlandığından, değişken yazı tiplerinin adlandırılmış örnekleri herhangi bir değişiklik yapmadan birçok mevcut DirectWrite uygulamasında bile çalışabilir. Ancak bazı durumlarda özel durumlar geçerli olabilir:

  • Bir uygulama belirli işlemler için yazı tipi verilerini doğrudan işlerse. Örneğin, bir uygulama belirli görsel efektler oluşturmak için doğrudan yazı tipi dosyasından glif ana hat verilerini okursa.
  • Bir uygulama belirli işlemler için üçüncü taraf kitaplığı kullanıyorsa. Örneğin, bir uygulama düzen için DirectWrite kullanıyorsa, son glif dizinlerini ve konumlarını almak için, ancak işleme için bir üçüncü taraf kitaplığı kullanır.
  • Bir uygulama bir belgeye yazı tipi verileri eklerse veya başka bir şekilde yazı tipi verilerini aşağı akış işlemine geçirirse.

İşlemler değişken yazı tiplerini desteklemeyen uygulamalar kullanılarak gerçekleştiriliyorsa, bu işlemler beklenen sonuçları üretmeyebilir. Örneğin, değişken yazı tipinin adlandırılmış bir örneği için karakter konumları hesaplanabilir, ancak glifler farklı bir adlandırılmış örnek varsayılarak işlenebilir. Uygulama uygulamasına bağlı olarak, sonuçlar bazı bağlamlarda çalışabilir, ancak diğer kitaplıkların kullanılabileceğini diğer bağlamlarda çalışmayabilir. Örneğin, metin ekranda doğru görüntülenebilir, ancak yazdırıldığında görüntülenmez. Uçtan uca iş akışları yalnızca DirectWrite kullanılarak uygulanıyorsa, değişken yazı tipinin adlandırılmış örnekleri için doğru davranış beklenebilir. 

Mevcut DirectWrite API'leri ağırlık/esnetme/stil modeli kullanılarak yüz seçimini desteklediğinden, diğer çeşitleme eksenlerini kullanan adlandırılmış yazı tipi örnekleri yukarıda açıklandığı gibi genel tipografik aile modelinden WSS modeline yansıtılır. Bu, DWrite'nin ağırlık, esnetme veya stil özniteliklerini diğer çeşitleme eksenleriyle ilgili belirteçlerden ayıran yüz adı belirteçlerini ayırt etmek için kullandığı eksen değeri alt tabloları içeren "stil öznitelikleri" ('STAT') tablosu içeren değişken bir yazı tipine dayanır.  

OpenType belirtiminin değişken yazı tipleri için gerekli olduğu gibi değişken yazı tipinde 'STAT' tablosu yoksa, DirectWrite yazı tipini yalnızca varsayılan örneği içeren değişken olmayan bir yazı tipi olarak değerlendirir.  

Bir yazı tipi 'STAT' tablosu içeriyorsa ancak uygun eksen değeri alt tabloları içermiyorsa, bu durum aynı yüz adlarına sahip birden çok yüzün olması gibi beklenmeyen sonuçlara yol açabilir. Bu tür yazı tipleri şu anda desteklenmemektedir. 

OpenType belirtimi, glif anahat verilerinin iki biçimden birinde temsil edilmesini sağlar: TrueType ana hattı ve ipucu biçimi kullanan bir 'glyf' tablosu veya Sıkıştırılmış Yazı Tipi Biçimi ("CFF") gösterimi kullanan bir 'CFF' tablosu kullanma. TrueType ana hatlarına sahip değişken yazı tipinde 'glyf' tablosu kullanılmaya devam eder ve ana hatlar için varyasyon verilerini sağlayan bir 'gvar' tablosuyla desteklenir. Bu, TrueType ana hatlarına sahip bir değişken yazı tipinin varsayılan örneğinde yalnızca değişken yazı tipi desteği olmayan eski yazılımlarda desteklenecek geleneksel OpenType tabloları kullanıldığı anlamına gelir. Ancak CFF ana hatlarına sahip değişken yazı tipinde, 'CFF' tablosunun yerine varsayılan ana hat verilerini ve bir tablodaki ilişkili varyasyon verilerini kapsülleyen 'CFF2' tablosu kullanılır. CFF verileri, TrueType verileri için kullanılandan ayrı bir rasterleştirici tarafından işlenir ve 'CFF2' tablosu için 'CFF2' desteğine sahip güncelleştirilmiş bir CFF rasterleştiricisi gerekir. 'CFF2' tablosu eski CFF rasterleştiricileri tarafından işlenemez. CFF ana hat verilerine sahip değişken bir yazı tipi için bu, varsayılan örneğin bile eski yazılımlarda çalışmayacağı anlamına gelir. 

Windows 10 Creators Update'te DirectWrite, 'CFF2' tablosunu kullanarak CFF ana hat verilerine sahip değişken yazı tiplerini desteklemez. 

OpenType değişken yazı tiplerini kullanma

OpenType değişken yazı tiplerinin kullanımı kolay olabilir ve yukarıda belirtilen geçerli sınırlamaları göz önünde bulundurun:

  • Şu anda yalnızca değişken yazı tipinin adlandırılmış örnekleri desteklenir.
  • Şu anda yalnızca TrueType karakter anahat verilerini kullanan değişken yazı tipleri (CFF ana hatları değil) desteklenir. 
  • Kalınlık, esnetme veya stil dışında tasarım varyasyonunun eksenlerini kullanan yazı tipleri için adlandırılmış örnekler WSS ailesi modeline yansıtılır ve bu da bazı adlandırılmış örneklerin ayrı aileler olarak görünmesine neden olabilir (geçmişte değişken olmayan yazı tipleri için olduğu gibi). Bunu desteklemek için, değişken yazı tiplerinin uygun eksen değeri alt tablolarını içeren bir 'STAT' tablosu olmalıdır.
  • Değişken yazı tiplerinin adlandırılmış örnekleri DirectWrite API'lerinde desteklenir, ancak bazı işlemler değişken yazı tiplerini desteklemeyen eski uygulamalarda gerçekleştiriliyorsa, bunlar yanlış sonuçlara neden olabilir. 
  • Bazı DirectWrite API'leri yüzleri seçerken ağırlık, esnetme ve stil özniteliklerini belirtmek için DWRITE_FONT_WEIGHT, DWRITE_FONT_STRETCH ve DWRITE_FONT_STYLE numaralandırmalarını kullanır. Değişken yazı tipi karşılık gelen varyasyon eksenlerini kullanıyorsa ancak daha ayrıntılı olması gereken çok sayıda adlandırılmış örneği varsa, bu API'lerde adlandırılmış örneklerin tümü seçilemez.

Bu gereksinimlere uyan OpenType değişken yazı tipleri, diğer OpenType yazı tipleri gibi Windows kabuğundan yüklenebilir ve bir uygulama tarafından oluşturulan özel yazı tipi kümelerinde de kullanılabilir.  

Sisteme yüklendiğinde, bir değişken yazı tipinin tüm adlandırılmış örnekleri, IDWriteFontFamily3::GetSystemFontSet yöntemi çağrılarak döndürülen yazı tipi kümesine eklenir. Yazı tipi kümesinin, aile gruplandırma hiyerarşisi olmayan düz bir liste olduğunu, ancak kümedeki her öğenin WSS aile modelini temel alan bir aile adı özelliği olduğunu unutmayın. Yazı tipi kümesi, IDWriteFontSet::GetMatchingFonts yöntemleri kullanılarak belirli bir değişken yazı tipi adlı örnek için filtrelenebilir. FamilyName alan GetMatchingFonts aşırı yüklemesi kullanılıyorsa, belirtilen familyName WSS font-family modeline uygun adı kullanmalıdır. Bir yazı tipi kümesinde oluşan WSS uyumlu aile adlarının tam listesi, DWRITE_FONT_PROPERTY_ID_FAMILY_NAME kullanılarak IDWriteFontSet::GetPropertyValues yöntemleri kullanılarak elde edilebilir.  

Benzer şekilde, değişken yazı tipinin adlandırılmış örneklerinin tümü IDWriteFactory::GetSystemFontCollection yöntemi tarafından döndürülen yazı tipi koleksiyonunda gösterilir. Yazı tipi koleksiyonunun öğeleri WSS modelini temel alan yazı tipi aileleri olduğundan, değişken yazı tipinin adlandırılmış örnekleri bir koleksiyonda iki veya daha fazla yazı tipi ailesinin üyesi olarak gösterilebilir. IDWriteFontCollection::FindFamilyName yöntemi kullanılıyorsa, familyName parametresi WSS uyumlu bir aile adı olmalıdır. Bir yazı tipi koleksiyonundan WSS uyumlu tüm aile adlarını bulmak için, bir uygulama her ailede döngü yapabilir ve IDWriteFontFamily::GetFamilyNamesçağırabilir, ancak ilgili yazı tipi kümesini almak ve yukarıda açıklandığı gibi GetPropertyValuesyöntemini kullanmak daha kolay olabilir. 

Özel yazı tipleriyle çalışırken, yazı tipi kümesi oluşturmak için Özel Yazı Tipi Kümeleri konusunda açıklanan çeşitli yaklaşımlar kullanılabilir. Özel yazı tipi kümesine değişken yazı tipi eklemek için idwriteFontSetBuilder1::AddFontFileyöntemi, değişken yazı tiplerini desteklediğinden ve değişken yazı tipinin adlandırılmış örneklerinin tümünü tek bir çağrıda ekleyeceğinden önerilir. Şu anda IDWriteFontSetBuilder::AddFontFaceReference yöntemlerini kullanarak bir yazı tipi kümesine özel değişken yazı tipinin tek tek adlandırılmış örneklerini eklemenin bir yolu yoktur, çünkü değişken yazı tipi dosyasındaki adlandırılmış örneklerden hangisinin amaçlandığını belirten bir yazı tipi yüz başvurusu oluşturmanın hiçbir yolu yoktur. Bu, şu anda özel özellikler atanmış özel bir yazı tipi kümesine özel yazı tipinin adlandırılmış örneklerini eklemenin hiçbir yolu olmadığı anlamına gelir. Bu da özel değişken yazı tiplerinin şu anda uzak yazı tipleri için DirectWrite API'leriyle birlikte kolayca kullanılamayacağı anlamına gelir. Ancak, bir değişken yazı tipinin adlandırılmış örnekleri bir sistem yazı tipi kümesine dahil edilirse, her adlandırılmış örneğin yazı tipi yüz başvuruları zaten vardır ve bunlar özel özellik değerlerinin kullanımı dahil olmak üzere özel yazı tipi kümelerine eklenebilir. Diğer ayrıntılar için Özel Yazı Tipi Kümeleri konusuna bakın. 

Değişken yazı tipleriyle çalışırken, DirectWrite DWRITE_FONT_WEIGHT ve DWRITE_FONT_STRETCH numaralandırmaları OpenType belirtiminde tanımlanan ağırlık ve genişlik varyasyon eksenlerine yakından bağlanır, ancak aynı değildir. İlk olarak, herhangi bir çeşitleme ekseni için sayısal ölçek her zaman kesirli değerleri desteklerken fontWeight ve fontStretch tamsayıları kullanır. OpenType ağırlık ekseni ölçeği, fontWeight tarafından da desteklenen 1 ile 1000 arasında değerler kullanır. Bu nedenle bir çeşitleme kalınlığı ekseni değerinden fontWeight'a yapılan değişiklik nispeten küçük bir değerdir: adlandırılmış örnek için bildirilen fontWeight, yazı tipi içindeki adlandırılmış örneği tanımlamak için kullanılan kesin değerden yuvarlanabilir. DirectWrite fontStretch ile OpenType genişlik ekseni ölçeği arasındaki fark büyüktür: DirectWrite, OpenType OS/2 tablosunun usWidthClass değerlerini izleyerek 1 ile 9 arasındaki değerleri kullanırken, OpenType genişlik ekseni ölçeği normal genişlik yüzdesini temsil eden pozitif değerler kullanır. OpenType belirtimindeki usWidthClass belgeleri 1 ile 9 arasındaki değerler ile normal değerlerin yüzdesi arasında bir eşleme sağlar. Adlandırılmış örnek için bildirilen fontStretch değeri, genişlik ekseni değerlerinden dönüştürülürken yuvarlama içerebilir. 

IDWriteTextFormatoluştururken, bir yazı tipi koleksiyonu ve WSS uyumlu yazı tipi özellikleri (aile adı, kalınlık, esnetme ve stil) belirtilmelidir. Bu, IDWriteTextLayout metin aralığında yazı tipi biçimlendirme özelliklerini ayarlarken de geçerlidir. Özellikler bir IDWriteFontFace3 nesnesinden veya IDWriteFont ve belirli bir adlandırılmış örneği temsil eden IDWriteFontFamilynesnelerialınabilir. Yukarıda da gözlemlendiği gibi, GetWeight ve GetStretch yöntemleri tarafından döndürülen değerler, adlandırılmış örneği tanımlamak için kullanılan gerçek eksen değerleri için yaklaşık olarak yuvarlanabilir, ancak DirectWrite özelliklerin birleşimini istenen adlandırılmış örneğe geri eşler. 

Benzer şekilde, bir uygulama özel yazı tipi geri dönüş verileri oluşturmak için IDWriteFontFallbackBuilder kullanıyorsa, WSS uyumlu aile adları kullanılarak karakter aralığı eşlemeleri için aileler belirtilir. DirectWrite içindeki yazı tipi geri dönüşü, DirectWrite'in başlangıç ailesinin varyantı için en yakın eşleşme olan bir geri dönüş ailesi içinde bir değişken seçmesine sahip aileleri temel alır. Ağırlık, esnetme ve stil dışındaki boyutları içeren çeşitlemeler için DirectWrite şu anda bir geri dönüş ailesi içinde bu tür varyantları seçemez. Özel geri dönüş verileri özellikle WSS olmayan belirli özniteliklere sahip aileler için geri dönüş eşlemeleri sağlamak üzere oluşturulmadıysa (örneğin, "Caption" optik boyut varyantları).