DWriteCore'a genel bakış
DWriteCore, DirectWrite uygulaması Windows Uygulama SDK'sıdır (DirectWrite, yüksek kaliteli metin işleme, çözünürlükten bağımsız ana hat yazı tipleri ve tam Unicode metin ve düzen desteği için DirectX API'dir). DWriteCore, Windows 10, sürüm 1809 (10.0; Derleme 17763) dahil olmak üzere Windows sürümlerinde çalışan bir DirectWrite çeşididir. DWriteCore, DirectWrite ile aynı API'yi uygular ve bu konuda açıklandığı gibi birkaç ekleme içerir.
Bu giriş konu başlığında DWriteCore'un ne olduğu açıklanır ve geliştirme ortamınıza ve programınıza nasıl yükleneceği gösterilir.
Zaten DirectWrite kullanan bir uygulama için DWriteCore'a geçmek için en az değişiklik gerekir:
- Windows Uygulama SDK paketi'ne bir referans ekleyin.
-
dwrite_3.h
yerinedwrite_core.h
ekleyin. -
DWrite.lib
yerineDWriteCore.lib
bağlayın. - DWriteCreateFactory yerine DWriteCoreCreateFactoryçağırın.
Buna karşılık uygulama, müşterinizin hangi Windows sürümünü çalıştırdığından bağımsız olarak En yeni API'lere ve işlevlere erişim olmak üzere Windows Uygulama SDK'sının avantajlarından yararlanır.
Bahşiş
Etkin geliştirmede DirectX bileşenlerinin açıklamaları ve bağlantıları için DirectX Giriş Sayfasıblog gönderisine bakın.
DWriteCore'un değer teklifi
DirectWrite, doğrudan çağrılar veya Direct2Daracılığıyla çoğu uygulama için Windows'ta tercih edilen yazı tipi işleme aracı olmasını sağlayan zengin bir özellik dizisini destekler. DirectWrite cihazdan bağımsız bir metin düzeni sistemi, yüksek kaliteli alt piksel Microsoft ClearType metin işleme, donanım hızlandırmalı metin, çok biçimli metin, gelişmiş OpenType® tipografi özellikleri, geniş dil desteği ve GDIuyumlu düzen ve işleme içerir. DirectWrite, Windows Vista SP2'den beri kullanılabilir ve yalnızca bir yazı tipi kaynağına sahip bir yazı tipine stiller, kalınlıklar ve diğer öznitelikler uygulamanıza olanak tanıyan değişken yazı tipleri gibi daha gelişmiş özellikleri içerecek şekilde yıllar içinde geliştirilmiştir.
Ancak DirectWrite'in uzun kullanım ömrü nedeniyle, geliştirmedeki ilerlemeler Windows'un eski sürümlerini geride bırakma eğilimindedir. Ayrıca DirectWrite'in birinci sınıf metin işleme teknolojisi olarak durumu yalnızca Windows ile sınırlıdır ve platformlar arası uygulamaları kendi metin işleme yığınını yazmaya veya 3. taraf çözümlere güvenmeye bırakır.
DWriteCore, kitaplığı sistemden kaldırarak ve tüm potansiyel desteklenen uç noktaları hedef alarak sürüm özelliklerinin yetim kalmasını ve platformlar arası uyumsuzluk gibi temel sorunları çözer. Bu amaçla DWriteCore'ı Windows Uygulama SDK'sı ile tümleştirdik.
DWriteCore'un Windows Uygulama SDK'sında geliştirici olarak size verdiği birincil değer, birçok DirectWrite özelliğine (ve sonunda tümüne) erişim sağlamasıdır. DWriteCore'un tüm özellikleri, hangi özelliklerin hangi sürümlerde çalışabileceğine ilişkin herhangi bir eşitsizlik olmadan tüm alt düzey sürümlerde aynı şekilde çalışır.
DWriteCore tanıtım uygulaması—DWriteCoreGallery
DWriteCore, DWriteCoreGallery örnek uygulamasıyla gösterilmiştir. Bu uygulama artık indirip inceleyebilirsiniz.
DWriteCore kullanmaya başlama
DWriteCore, Windows Uygulama SDK'sınınbir parçasıdır. Bu bölümde DWriteCore ile programlama için geliştirme ortamınızın nasıl ayarlanacağı açıklanmaktadır.
Windows Uygulama SDK'sı için yükleme araçları
Bkz. Windows Uygulama SDK'sı için yükleme araçları.
Yeni proje oluşturma
Visual Studio'da Boş Uygulama, Paketlenmiş (Masaüstünde WinUI 3) proje şablonundan yeni bir proje oluşturun. Bu proje şablonunu dil seçerek bulabilirsiniz: C++; platform: Windows Uygulama SDK'sı; proje türü: Desktop.
Daha fazla bilgi için bkz. WinUI 3 için Project şablonları.
Microsoft.ProjectReunion.DWrite NuGet paketini yükleme
Visual Studio'da Proje >NuGet Paketlerini Yönet... öğesine tıklayın>Gözat'a gidin, arama kutusuna Microsoft.ProjectReunion.DWrite yazın veya yapıştırın, arama sonuçlarında öğeyi seçin ve ardından Yükle'ye tıklayarak yükle'ye tıklayarak projenin paketini yükleyin.
Alternatif olarak, DWriteCoreGallery örnek uygulamasıyla başlayın
Alternatif olarak, DWriteCoreGallery örnek uygulama projesinden başlayarak DWriteCore ile programlama yapabilir ve geliştirmenizi bu projeye dayandırabilirsiniz. Daha sonra bu örnek projeden var olan tüm kaynak kodları (veya dosyaları) kaldırmaktan ve projeye yeni kaynak kodu (veya dosyaları) eklemekten çekinmeyin.
Projenizde DWriteCore kullanma
DWriteCore ile programlama hakkında daha fazla bilgi için bu konunun devamında yer alan DWriteCore ile programlama bölümüne bakın.
DWriteCore'un yayın aşamaları
DirectWrite'yi DWriteCore'a taşıma, birden çok Windows yayın döngüsüne yayılacak kadar büyük bir projedir. Bu proje aşamalara ayrılır ve bunların her biri bir yayında sunulan bir işlev öbeğine karşılık gelir.
DWriteCore'un geçerli sürümündeki özellikler
DWriteCore, Windows Uygulama SDK'sınınbir parçasıdır. Aşağıdaki özellikler de dahil olmak üzere bir geliştirici olarak DWriteCore kullanmanız gereken temel araçları içerir.
- Yazı tipi numaralandırması.
- Yazı Tipi API'si.
- Şekillendirme.
- Alt düzey işleme API'leri. Bu, geçerli aşamada kısmidir; DWriteCore Direct2Dile birlikte çalışmaz, ancak IDWriteGlyphRunAnalysisve IDWriteBitmapRenderTargetkullanabilirsiniz.
- Temel metin düzeni işlevselliği.
- Metin işleme API'leri.
- Bit eşlem işleme hedefi.
- Yazı tiplerini renklendirin.
- Çeşitli iyileştirmeler (yazı tipi önbelleği temizleme, bellek içi yazı tipi yükleyici vb.).
- Alt çizgi desteği— bkz. IDWriteTextLayout::GetUnderlineve IDWriteTextLayout::SetUnderline.
- Üstü çizili desteği— bkz. IDWriteTextLayout::GetStrikethroughve IDWriteTextLayout::SetStrikethrough.
- IDWriteTextLayoutaracılığıyla dikey metin desteği — bkz. dikey metin .
- IDWriteTextAnalyzer ve IDWriteTextAnalyzer1 arabirimlerinin tüm yöntemleri uygulanır.
Başlık özelliği renkli yazı tipleridir. Renk yazı tipleri, yazı tiplerini basit tek renklerin ötesinde daha gelişmiş renk işlevleriyle işlemenizi sağlar. Örneğin, emoji ve araç çubuğu simgesi yazı tiplerini (örneğin, office tarafından kullanılanlar) işleme özelliğinin gücü renkli yazı tipleridir. Renk yazı tipleri ilk olarak Windows 8.1'de tanıtıldı, ancak özellik Windows 10, sürüm 1607'de (Yıldönümü Güncelleştirmesi) büyük ölçüde genişletildi.
Yazı tipi önbelleğini ve bellek içi yazı tipi yükleyicisini temizleme çalışmaları, yazı tiplerinin daha hızlı yüklenmesine ve bellek geliştirmelerine olanak sağlar.
Bu özelliklerle, DirectWrite'in değişken yazı tipleri gibi bazı modern temel işlevselliğinden hemen yararlanmaya başlayabilirsiniz. Değişken yazı tipleri, DirectWrite müşterileri için en önemli özelliklerden biridir.
DirectWrite geliştiricisi olarak size davetimiz
DWriteCore, diğer Windows Uygulama SDK'sı bileşenleriyle birlikte geliştirici geri bildirimlerine açık bir şekilde geliştirilecektir. Sizi DWriteCore'ı keşfetmeye başlamaya ve Windows Uygulama SDK'sı GitHub depomuzda özellik geliştirmeyle ilgili içgörüler veya istekler sağlamayadavet ediyoruz.
DWriteCore ile programlama
DirectWritegibi, DWriteCore ile COM-light API'si üzerindeki IDWriteFactory arabirimi aracılığıyla program yaparsınız.
DWriteCore kullanmak için dwrite_core.h
üst bilgi dosyasının eklenmesi gerekir.
// pch.h
...
// DWriteCore header file.
#include <dwrite_core.h>
dwrite_core.h
üst bilgi dosyası önce DWRITE_COREbelirteci tanımlar ve ardından dwrite_3.h
üst bilgi dosyasını içerir.
DWRITE_CORE belirteci önemlidir, çünkü daha sonra eklenen tüm üst bilgileri, DirectWrite API'lerinin tümünü kullanımınıza sunacak şekilde yönlendirir. Projeniz dwrite_core.h
ekledikten sonra devam edip kod yazabilir, derleyebilir ve çalıştırabilirsiniz.
DWriteCore için yeni veya farklı API'ler
DWriteCore API'sinin yüzeyi, DirectWriteile büyük ölçüde aynıdır. Ancak şu anda yalnızca DWriteCore'da bulunan az sayıda yeni API vardır.
Fabrika nesnesi oluşturma
DWriteCoreCreateFactory ücretsiz işlevi, tek tek DWriteCore nesnelerinin daha sonra oluşturulması için kullanılan bir fabrika nesnesi oluşturur.
DWriteCoreCreateFactory, DirectWrite'in sistem sürümü tarafından dışarı aktarılan DWriteCreateFactory işleviyle işlevsel olarak aynıdır. DWriteCore işlevinin belirsizliği önlemek için farklı bir adı vardır.
Kısıtlı fabrika nesnesi oluşturma
DWRITE_FACTORY_TYPE sabit listesine, kısıtlanmış bir fabrikayı gösteren yeni bir sabitDWRITE_FACTORY_TYPE_ISOLATED2eklenmiştir. Kısıtlı bir fabrika, yalıtılmış bir fabrikaya göre daha kilitlidir. Çapraz işlem veya kalıcı yazı tipi önbelleğiyle hiçbir şekilde etkileşim kurmaz. Ayrıca, bu fabrikadan döndürülen sistem yazı tipi koleksiyonu yalnızca iyi bilinen yazı tiplerini içerir. DWriteCoreCreateFactory ücretsiz işlevini çağırdığınızda kısıtlanmış fabrika nesnesi oluşturmak için DWRITE_FACTORY_TYPE_ISOLATED2 şu şekilde kullanabilirsiniz.
// Create a factory that doesn't interact with any cross-process nor
// persistent cache state.
winrt::com_ptr<::IDWriteFactory7> spFactory;
winrt::check_hresult(
::DWriteCoreCreateFactory(
DWRITE_FACTORY_TYPE_ISOLATED2,
__uuidof(spFactory),
reinterpret_cast<IUnknown**>(spFactory.put())
)
);
DWRITE_FACTORY_TYPE_ISOLATED2 DirectWrite'ın desteklemeyen eski bir sürümüne geçirirseniz, DWriteCreateFactoryE_INVALIDARGdöndürür.
Sistem belleği bit eşlemine karakter çizme
DirectWrite, sistem belleğindeki bit eşlemlere yönelik gliflerin render edilmesini destekleyen bir bit eşlem işlem hedef arabirimine sahiptir. Ancak şu anda temel piksel verilerine erişmenin tek yolu GDI üzerinden geçmektir ve bu nedenle API platformlar arası kullanılabilir değildir. Bu, piksel verilerini almak için bir yöntem eklenerek kolayca düzeltilir.
Böylece DWriteCore, IDWriteBitmapRenderTarget2arabirimini ve IDWriteBitmapRenderTarget2::GetBitmapDatayöntemini tanıtır. Bu yöntem, yeni bir yapı olan DWRITE_BITMAP_DATA_BGRA32türü (işaretçi) parametresini alır.
Uygulamanız IDWriteGdiInterop::CreateBitmapRenderTargetçağırarak bir bit eşlem işleme hedefi oluşturur. Windows'da bit eşlem işleme hedefi, GDI cihazdan bağımsız bit eşlem (DIB) seçili bir GDI bellek DC'sini kapsüller. IDWriteBitmapRenderTarget::DrawGlyphRun, glifleri DIB'ye renderlar. DirectWrite, GDI'ya gitmeden gliflerin kendisini işler. Uygulamanız daha sonra bit eşlem işleme hedefinden HDC alabilir ve BitBlt kullanarak pikselleri bir pencereye HDCkopyalayabilir.
Windows olmayan platformlarda, uygulamanız hala bir bit eşlem işleme hedefi oluşturabilir, ancak yalnızca HDC ve DIB içermeyen bir sistem bellek dizisini kapsüller. HDColmadan, uygulamanızın bit eşlem piksellerini kopyalayıp başka bir şekilde kullanabilmesi için başka bir yolu olmalıdır. Windows'da bile bazen gerçek piksel verilerini almak yararlı olabilir ve bunu yapmak için geçerli yöntemi aşağıdaki kod örneğinde göstereceğiz.
// pch.h
#pragma once
#include <windows.h>
#include <Unknwn.h>
#include <winrt/Windows.Foundation.h>
// WinMain.cpp
#include "pch.h"
#include <dwrite_core.h>
#pragma comment(lib, "Gdi32")
class TextRenderer
{
DWRITE_BITMAP_DATA_BGRA32 m_targetBitmapData;
public:
void InitializeBitmapData(winrt::com_ptr<IDWriteBitmapRenderTarget> const& renderTarget)
{
// Query the bitmap render target for the new interface.
winrt::com_ptr<IDWriteBitmapRenderTarget2> renderTarget2;
renderTarget2 = renderTarget.try_as<IDWriteBitmapRenderTarget2>();
if (renderTarget2)
{
// IDWriteBitmapRenderTarget2 exists, so we can get the bitmap the easy way.
winrt::check_hresult(renderTarget2->GetBitmapData(OUT & m_targetBitmapData));
}
else
{
// We're using an older version that doesn't implement IDWriteBitmapRenderTarget2,
// so we have to get the bitmap by going through GDI. First get the bitmap handle.
HDC hdc = renderTarget->GetMemoryDC();
winrt::handle dibHandle{ GetCurrentObject(hdc, OBJ_BITMAP) };
winrt::check_bool(bool{ dibHandle });
// Call a GDI function to fill in the DIBSECTION structure for the bitmap.
DIBSECTION dib;
winrt::check_bool(GetObject(dibHandle.get(), sizeof(dib), &dib));
m_targetBitmapData.width = dib.dsBm.bmWidth;
m_targetBitmapData.height = dib.dsBm.bmHeight;
m_targetBitmapData.pixels = static_cast<uint32_t*>(dib.dsBm.bmBits);
}
}
};
int __stdcall wWinMain(HINSTANCE, HINSTANCE, LPWSTR, int)
{
TextRenderer textRenderer;
winrt::com_ptr<IDWriteBitmapRenderTarget> renderTarget{ /* ... */ };
textRenderer.InitializeBitmapData(renderTarget);
}
DWriteCore ile DirectWrite arasındaki diğer API farkları
Yalnızca taslak olan veya Windows dışındaki platformlarda biraz farklı davranış sergileyen birkaç API vardır. Örneğin, IDWriteGdiInterop::CreateFontFaceFromHdc, GDIolmadan bir HDC olmadığı için Windows dışındaki platformlarda E_NOTIMPL döndürür.
Son olarak, genellikle DirectWrite ile birlikte kullanılan bazı windows API'leri de vardır (Direct2D önemli bir örnektir). Ancak şu anda Direct2D ve DWriteCore birlikte çalışmıyor. Örneğin, DWriteCore kullanarak bir IDWriteTextLayout oluşturur ve bunu D2D1RenderTarget::DrawTextLayoutiletirseniz, bu çağrı başarısız olur.