Niestandardowe zestawy czcionek
W tym temacie opisano różne sposoby używania czcionek niestandardowych w aplikacji.
- Wprowadzenie
- Podsumowanie interfejsów API
- Kluczowe pojęcia
- czcionki i formaty plików czcionek
- zestawy czcionek i kolekcje czcionek
-
typowe scenariusze
- Tworzenie zestawu czcionek przy użyciu dowolnych czcionek w lokalnym systemie plików
- Tworzenie zestawu czcionek przy użyciu znanych czcionek w lokalnym systemie plików
- Tworzenie niestandardowego zestawu czcionek przy użyciu znanych czcionek zdalnych w sieci Web
- Tworzenie niestandardowego zestawu czcionek przy użyciu danych czcionek załadowanych do pamięci
- zaawansowane scenariusze
Wprowadzenie
W większości przypadków aplikacje używają czcionek zainstalowanych lokalnie w systemie. DirectWrite zapewnia dostęp do tych czcionek przy użyciu IDWriteFactory3::GetSystemFontSet lub IDWriteFactory::GetSystemFontCollection metod. W niektórych przypadkach aplikacje mogą również chcieć używać czcionek dołączonych do systemu Windows 10, ale które nie są obecnie zainstalowane w bieżącym systemie. Dostęp do takich czcionek można uzyskać z poziomu usługi czcionek systemu Windows przy użyciu metody GetSystemFontSet lub wywołując IDWriteFactory3::GetSystemFontCollection z parametrem includeDownloadableFonts ustawionym na wartość TRUE.
Jednak w niektórych scenariuszach aplikacji aplikacje muszą używać czcionek, które nie są zainstalowane w systemie i nie są udostępniane przez usługę czcionek systemu Windows. Poniżej przedstawiono przykłady takich scenariuszy:
- Czcionki są osadzone jako zasoby w pliku binarnym aplikacji.
- Pliki czcionek są umieszczane w pakiecie aplikacji i przechowywane na dysku w folderze instalacyjnym aplikacji.
- Aplikacja to narzędzie do tworzenia czcionek, które musi załadować pliki czcionek określone przez użytkownika.
- Czcionki są osadzone w plikach dokumentów, które można wyświetlać lub edytować w aplikacji.
- Aplikacja używa czcionek uzyskanych z publicznej usługi czcionek sieci Web.
- Aplikacja używa danych czcionek przesyłanych strumieniowo za pośrednictwem protokołu sieci prywatnej.
Funkcja DirectWrite udostępnia interfejsy API do pracy z czcionkami niestandardowymi w tych i innych podobnych scenariuszach. Niestandardowe dane czcionek mogą pochodzić z plików w lokalnym systemie plików; z zdalnych źródeł opartych na chmurze, do których uzyskiwano dostęp przy użyciu protokołu HTTP; lub z dowolnych źródeł po załadowaniu do buforu pamięci.
Nuta
Chociaż funkcja DirectWrite udostępnia interfejsy API do pracy z czcionkami niestandardowymi od systemu Windows 7, nowsze interfejsy API zostały dodane w systemie Windows 10 i ponownie w aktualizacji Windows 10 Creators Update (kompilacja zapoznawcza 15021 lub nowsza), które ułatwiają implementowanie kilku wymienionych scenariuszy. Ten temat koncentruje się na interfejsach API dostępnych w oknie 10. W przypadku aplikacji, które muszą działać we wcześniejszych wersjach systemu Windows, zobacz niestandardowe kolekcje czcionek (Windows 7/8).
Podsumowanie interfejsów API
Ten temat koncentruje się na funkcjach udostępnianych przez następujące interfejsy API:
- interfejs IDWriteFontSet
- interfejs IDWriteFontSetBuilder
- interfejsIDWriteFontSetBuilder1
- interfejs IDWriteFontFaceReference
- interfejs IDWriteFontFile
- IDWriteFactory::CreateFontFileReference, metoda
- IDWriteFactory::CreateCustomFontFileReference, metoda
- IDWriteFactory3::CreateFontFaceReference metod
- struktura DWRITE_FONT_PROPERTY
- wyliczenie DWRITE_FONT_PROPERTY_ID
- interfejsIDWriteFontFileLoader
- IDWriteFactory::RegisterFontFileLoader, metoda
- IDWriteFactory::UnregisterFontFileLoader, metoda
- IDWriteFactory5::CreateInMemoryFontFileLoader, metoda
- interfejsIDWriteInMemoryFontFileLoader
- IDWriteFactory5::CreateHttpFontFileLoader, metoda
- interfejs IDWriteRemoteFontFileLoader
- interfejs IDWriteFontDownloadQueue
- interfejsidWriteFontDownloadListener
- interfejs IDWriteFontFileStream
- interfejs IDWriteRemoteFontFileStream
- interfejs IDWriteAsyncResult
- IDWriteFactory5::AnalyzeContainerType, metoda
- IDWriteFactory5::UnpackFontFile, metoda
Kluczowe pojęcia
Aby zrozumieć interfejsy API DirectWrite do pracy z czcionkami niestandardowymi, warto zrozumieć model koncepcyjny, który jest oparty na tych interfejsach API. Kluczowe pojęcia zostaną opisane tutaj.
Gdy funkcja DirectWrite wykonuje rzeczywisty układ tekstu lub renderowanie, musi uzyskać dostęp do rzeczywistych danych czcionek. Obiekt twarzy czcionki zawiera rzeczywiste dane czcionek, które muszą istnieć w systemie lokalnym. Jednak w przypadku innych operacji, takich jak sprawdzanie dostępności określonej czcionki lub prezentowanie opcji czcionki użytkownikowi, potrzebne jest odwołanie do określonej czcionki, a nie rzeczywiste dane czcionki. W directWrite obiekt odwołania do twarzy czcionki zawiera tylko informacje potrzebne do zlokalizowania i utworzenia wystąpienia czcionki. Ponieważ odwołanie do twarzy czcionki nie przechowuje rzeczywistych danych, funkcja DirectWrite może radzić sobie z odwołaniami do twarzy czcionki, dla których rzeczywiste dane są w zdalnej lokalizacji sieciowej, a także gdy rzeczywiste dane są lokalne.
Zestaw czcionek to zestaw odwołań do twarzy czcionki wraz z pewnymi podstawowymi właściwościami informacyjnymi, których można używać w odwołaniu do czcionki lub porównywania z innymi czcionkami, takimi jak nazwa rodziny lub wartość wagi czcionki. Rzeczywiste dane dla różnych czcionek mogą być lokalne lub mogą być zdalne lub niektóre mieszaniny.
Zestaw czcionek może służyć do uzyskania odpowiedniego obiektu kolekcji czcionek. Aby uzyskać więcej informacji, zobacz zestawy czcionek i kolekcje czcionek poniżej.
Interfejs IDWriteFontSet udostępnia metody, które umożliwiają wykonywanie zapytań dotyczących wartości właściwości, takich jak nazwa rodziny lub grubość czcionki, lub odwołania do twarzy czcionek, które pasują do określonych wartości właściwości. Po przefiltrowaniu do określonego zaznaczenia można uzyskać wystąpienie interfejsu IDWriteFontFaceReference z metodami pobierania (jeśli rzeczywiste dane czcionki są obecnie zdalne), w celu uzyskania odpowiedniego obiektuIDWriteFontFace3, który może być używany do układu i renderowania.
Interfejs IDWriteFontFile u podstaw każdego odwołania do twarzy czcionki lub czcionki. Reprezentuje to lokalizację pliku czcionki i ma dwa składniki: moduł ładujący plik czcionek i klucz pliku czcionki. Moduł ładujący plik czcionek (IDWriteFontFileLoader) służy do otwierania pliku w razie potrzeby i zwraca strumień z danymi (IDWriteFontFileStream). W zależności od modułu ładującego dane mogą znajdować się w lokalnej ścieżce pliku, zdalnym adresie URL lub w buforze pamięci. Klucz jest wartością zdefiniowaną przez moduł ładujący, która unikatowo identyfikuje plik w kontekście modułu ładującego, umożliwiając modułowi ładującemu lokalizowanie danych i tworzenie dla niego strumienia.
Niestandardowe czcionki można łatwo dodawać do niestandardowego zestawu czcionek, co z kolei może służyć do filtrowania lub organizowania informacji o czcionkach do celów, takich jak tworzenie interfejsu użytkownika selektora czcionek. Zestaw czcionek może również służyć do tworzenia kolekcji czcionek do użycia w interfejsach API wyższego poziomu, takich jak IDWriteTextFormat i IDWriteTextLayout. InterfejsIDWriteFontSetBuilder może służyć do utworzenia niestandardowego zestawu czcionek zawierającego kilka czcionek niestandardowych. Można go również użyć do utworzenia niestandardowego zestawu czcionek, który łączy niestandardowe czcionki i czcionki dostarczone przez system; lub miesza czcionki z różnymi źródłami dla rzeczywistych danych — magazynu lokalnego, zdalnych adresów URL i pamięci.
Jak wspomniano, odwołanie do twarzy czcionki może odwoływać się do danych czcionek w zdalnym źródle, ale dane muszą być lokalne, aby uzyskać obiekt twarzy czcionki, który może być używany do układu i renderowania. Pobieranie danych zdalnych jest obsługiwane przez kolejkę pobierania czcionek. Aplikacje mogą używać interfejsu IDWriteFontDownloadQueue do kolejkowania żądań pobierania czcionek zdalnych w celu zainicjowania procesu pobierania oraz rejestrowania obiektu IDWriteFontDownloadListener akcji po zakończeniu procesu pobierania.
W przypadku większości opisanych tutaj interfejsów funkcja DirectWrite udostępnia implementacje systemu. Jednym wyjątkiem jest interfejs IDWriteFontDownloadListener, który aplikacja implementuje do wykonywania akcji specyficznych dla aplikacji, gdy czcionki zdalne zostały pobrane lokalnie. Aplikacje mogą mieć powód, aby zapewnić własne niestandardowe implementacje dla niektórych innych interfejsów, choć byłoby to potrzebne tylko w konkretnych, bardziej zaawansowanych scenariuszach. Na przykład aplikacja musi zapewnić niestandardową implementację IDWriteFontFileLoader interfejsu do obsługi plików czcionek w magazynie lokalnym korzystającym z formatu kontenera WOFF2. Dodatkowe szczegóły zostaną podane poniżej.
Czcionki i formaty plików czcionek
Inną kluczową koncepcją, która jest przydatna do zrozumienia, jest relacja między poszczególnymi twarzami czcionek i plikami czcionek, które je zawierają. Idea pliku czcionki OpenType (.ttf lub .otf) zawierającego jedną czcionkę jest znana. Jednak format czcionki OpenType umożliwia również kolekcję czcionek OpenType (.ttc lub .otc), która jest pojedynczym plikiem zawierającym wiele czcionek. Pliki kolekcji OpenType są często używane w przypadku dużych czcionek, które są ściśle powiązane i mają identyczne wartości dla niektórych danych czcionek: łącząc czcionki w jednym pliku, wspólne dane mogą zostać zduplikowane. Z tego powodu odwołanie do twarzy czcionki lub twarzy czcionki musi odwoływać się nie tylko do pliku czcionki (lub równoważnego źródła danych), ale musi również określić indeks czcionki w tym pliku, w przypadku ogólnego przypadku, w którym plik może być plikiem kolekcji.
W przypadku czcionek używanych w Internecie dane czcionek są często pakowane w określone formaty kontenerów, WOFF lub WOFF2, które zapewniają kompresję danych czcionek oraz pewien poziom ochrony przed piractwom i naruszeniem licencji czcionek. Funkcjonalnie plik WOFF lub WOFF2 jest odpowiednikiem czcionki OpenType lub pliku kolekcji czcionek, ale dane są kodowane w innym formacie, który wymaga rozpakowywania, zanim będzie można go użyć.
Niektóre interfejsy API DirectWrite mogą obsługiwać poszczególne twarze czcionek, podczas gdy inne interfejsy API mogą obsługiwać pliki, które mogą zawierać pliki kolekcji OpenType, które zawierają wiele twarzy. Podobnie niektóre interfejsy API obsługują tylko nieprzetworzone dane w formacie OpenType, a inne interfejsy API mogą obsługiwać pakowane formaty kontenerów WOFF i WOFF2. Te szczegóły znajdują się w poniższej dyskusji.
Zestawy czcionek i kolekcje czcionek
Niektóre aplikacje można zaimplementować do pracy z czcionkami przy użyciu interfejsu IDWriteFontCollection. Istnieje bezpośrednia korespondencja między kolekcją czcionek a zestawem czcionek. Każda z nich może przechowywać te same czcionki, ale przedstawia je w innej organizacji. Z dowolnej kolekcji czcionek można uzyskać odpowiedni zestaw czcionek i na odwrót.
Podczas pracy z wieloma czcionkami niestandardowymi najłatwiej jest użyć interfejsu konstruktora zestawu czcionek do utworzenia niestandardowego zestawu czcionek, a następnie uzyskać kolekcję czcionek po utworzeniu zestawu czcionek. Proces tworzenia niestandardowego zestawu czcionek zostanie opisany szczegółowo poniżej. Aby uzyskać interfejs IDWriteFontCollection1 z zestawu czcionek, jest używana metoda IDWriteFactory3::CreateFontCollectionFromFontSet.
Jeśli aplikacja ma obiekt kolekcji i musi uzyskać odpowiedni zestaw czcionek, można to zrobić przy użyciu metody IDWriteFontCollection1::GetFontSet.
Typowe scenariusze
W tej sekcji opisano niektóre z najbardziej typowych scenariuszy obejmujących niestandardowe zestawy czcionek:
- Tworzenie niestandardowego zestawu czcionek przy użyciu dowolnych czcionek w ścieżkach w lokalnym systemie plików.
- Tworzenie niestandardowego zestawu czcionek przy użyciu znanych czcionek (być może dołączonych do aplikacji), które są przechowywane w lokalnym systemie plików.
- Tworzenie niestandardowego zestawu czcionek przy użyciu znanych czcionek zdalnych w sieci Web.
- Tworzenie niestandardowego zestawu czcionek przy użyciu danych czcionek załadowanych do pamięci.
Kompletne implementacje dla tych scenariuszy znajdują się w przykładzie DirectWrite Custom Font Sets. Ten przykład ilustruje również jeden bardziej zaawansowany scenariusz obsługi danych czcionek zapakowanych w formatach kontenerów WOFF lub WOFF2, które zostaną omówione poniżej.
Tworzenie zestawu czcionek przy użyciu dowolnych czcionek w lokalnym systemie plików
W przypadku czynienia z dowolnym zestawem plików czcionek w magazynie lokalnym, IDWriteFontSetBuilder1::AddFontFile metoda jest wygodna, ponieważ w jednym wywołaniu może obsługiwać wszystkie twarze czcionek w pliku Kolekcji czcionek OpenType, a także wszystkie wystąpienia czcionki dla czcionki zmiennej OpenType. Jest to dostępne w aktualizacji systemu Windows 10 Dla twórców (kompilacja 15021 lub nowsza) i jest zalecana zawsze, gdy jest dostępna.
Aby użyć tej metody, użyj następującego procesu.
- 1. Zacznij od utworzenia interfejsu IDWriteFactory5:
- Dla każdego pliku czcionki w lokalnym systemie plików utwórz IDWriteFontFile, który się do niego odwołuje:
- Po dodaniu wszystkich plików do konstruktora zestawu czcionek można utworzyć niestandardowy zestaw czcionek:
IDWriteFactory5* pDWriteFactory;
HRESULT hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory5),
reinterpret_cast<IUnknown**>(&pDWriteFactory)
);
2. Użyj fabryki, aby uzyskać interfejs IDWriteFontSetBuilder1:
IDWriteFontSetBuilder1* pFontSetBuilder;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontSetBuilder(&pFontSetBuilder);
}
IDWriteFontFile* pFontFile;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontFileReference(pFilePath, /* lastWriteTime*/ nullptr, &pFontFile);
}
4. Dodaj obiekt IDWriteFontFile do konstruktora zestawu czcionek przy użyciu metody AddFontFile:
hr = pFontSetBuilder->AddFontFile(pFontFile);
Jeśli ścieżka pliku określona w wywołaniu metody CreateFontFileReference odniosła się do innego elementu niż obsługiwany plik OpenType, wywołanie metody AddFontFile zwróci błąd, DWRITE_E_FILEFORMAT.
IDWriteFontSet* pFontSet;
hr = pFontSetBuilder->CreateFontSet(&pFontSet);
Jeśli aplikacja musi działać w systemie Windows 10 w wersjach starszych niż Windows 10 Creators Update, metoda AddFontFile nie będzie dostępna. Dostępność można wykryć, tworząc interfejs IDWriteFactory3, a następnie używając interfejsu QueryInterface, aby spróbować uzyskać interfejs IDWriteFactory5: jeśli to się powiedzie, będzie również dostępny interfejs IDWriteFontSetBuilder1 i AddFontFile.
Jeśli metoda AddFontFile jest niedostępna, należy użyć metody IDWriteFontSetBuilder::AddFontFaceReference metody , aby dodać poszczególne twarze czcionek. Aby zezwolić na pliki kolekcji czcionek OpenType zawierające wiele twarzy, można użyć metody IDWriteFontFile::Analyze, aby określić liczbę twarzy zawartych w pliku. Proces jest następujący.
- 1. Zacznij od utworzenia interfejsu IDWriteFactory3:
- Użyj fabryki, aby uzyskać interfejs IDWriteFontSetBuilder:
- Dla każdego pliku czcionki utwórz IDWriteFontFile, jak pokazano powyżej:
- Po dodaniu wszystkich twarzy do konstruktora zestawu czcionek utwórz niestandardowy zestaw czcionek, jak pokazano powyżej.
IDWriteFactory3* pDWriteFactory;
HRESULT hr = DWriteCreateFactory(
DWRITE_FACTORY_TYPE_SHARED,
__uuidof(IDWriteFactory5),
reinterpret_cast<IUnknown**>(&pDWriteFactory)
);
IDWriteFontSetBuilder* pFontSetBuilder;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontSetBuilder(&pFontSetBuilder);
}
IDWriteFontFile* pFontFile;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateFontFileReference(pFilePath, /* lastWriteTime*/ nullptr, &pFontFile);
}
Zamiast dodawać plik bezpośrednio do konstruktora zestawu czcionek, musimy określić liczbę twarzy i utworzyć poszczególne IDWriteFontFaceReference obiektów.
4. Użyj metody Analyze, aby uzyskać liczbę twarzy w pliku.
BOOL isSupported;
DWRITE_FONT_FILE_TYPE fileType;
UINT32 numberOfFonts;
hr = pFontFile->Analyze(&isSupported, &fileType, /* face type */ nullptr, &numberOfFonts);
Metoda Analyze ustawi również wartości parametrów isSupported i fileType. Jeśli plik nie jest obsługiwanym formatem, parametr isSupported będzie mieć wartość FALSE, a odpowiednie działania, takie jak ignorowanie pliku, można wykonać.
5. Pętla przez liczbę czcionek ustawionych w parametrze numberOfFonts. W pętli utwórz IDWriteFontFaceReference dla każdej pary plików/indeksów i dodaj ją do konstruktora zestawu czcionek.
for (uint32_t fontIndex = 0; fontIndex < numberOfFonts; fontIndex++)
{
IDWriteFontFaceReference* pFontFaceReference;
hr = pDWriteFactory->CreateFontFaceReference(pFontFile, fontIndex, DWRITE_FONT_SIMULATIONS_NONE, &pFontFaceReference);
if (SUCCEEDED(hr))
{
hr = pFontSetBuilder->AddFontFaceReference(pFontFaceReference);
}
}
Aplikację można zaprojektować tak, aby korzystała z preferowanej metody AddFontFile podczas uruchamiania w aktualizacji dla twórców systemu Windows 10, ale wróć do używania metody AddFontFaceReference podczas uruchamiania we wcześniejszych wersjach systemu Windows 10. Przetestuj dostępność interfejsu IDWriteFactory5, zgodnie z powyższym opisem, a następnie odpowiednio rozgałęzij. To podejście przedstawiono w przykładzie DirectWrite Custom Font Sets.
Tworzenie zestawu czcionek przy użyciu znanych czcionek w lokalnym systemie plików
Jak wspomniano powyżej, każde odwołanie do twarzy czcionki w zestawie czcionek jest skojarzone z pewnymi właściwościami informacyjnymi, takimi jak nazwa rodziny i waga czcionki. Po dodaniu czcionek niestandardowych do konstruktora zestawu czcionek przy użyciu wywołań interfejsu API wymienionych powyżej te właściwości informacyjne są uzyskiwane bezpośrednio z rzeczywistych danych czcionek, które są odczytywane podczas dodawania czcionki. Jednak w niektórych sytuacjach, jeśli aplikacja ma inne źródło informacji o czcionki, może chcieć podać własne wartości niestandardowe dla tych właściwości.
Jako przykład tego, jak może to być przydatne, załóżmy, że aplikacja tworzy pakiety niektórych czcionek używanych do prezentowania określonych elementów interfejsu użytkownika w aplikacji. Czasami, na przykład w przypadku nowej wersji aplikacji, określone czcionki używane przez aplikację dla tych elementów mogą wymagać zmiany. Jeśli aplikacja ma zakodowane odwołania do określonych czcionek, zastąpienie jednej czcionki inną będzie wymagać zmiany każdego z tych odwołań. Zamiast tego, jeśli aplikacja używa właściwości niestandardowych do przypisywania aliasów funkcjonalnych na podstawie typu renderowanego elementu lub tekstu, mapuje każdy alias na określoną czcionkę w jednym miejscu, a następnie używa aliasów we wszystkich kontekstach, w których czcionki są tworzone i manipulowane, a następnie zastąpienie jednej czcionki inną wymaga tylko zmiany jednego miejsca, w którym alias jest mapowany na określoną czcionkę.
Wartości niestandardowe właściwości informacyjnych można przypisać, gdy wywoływana jest metoda IDWriteFontSetBuilder::AddFontFaceReference. Metoda wykonania tej czynności jest następująca; może być używany w dowolnej wersji systemu Windows 10.
Jak pokazano powyżej, zacznij od uzyskania interfejsów IDWriteFactory3 i IDWriteFontSetIDWriteFontSet. Dla każdej niestandardowej twarzy czcionki do dodania utwórz IDWriteFontFaceReference, jak pokazano powyżej. Zanim zostanie on dodany do konstruktora zestawu czcionek (w pętli w kroku 5, pokazanym powyżej), jednak aplikacja definiuje niestandardowe wartości właściwości, które mają być używane.
Zestaw niestandardowych wartości właściwości jest definiowany przy użyciu tablicy struktur DWRITE_FONT_PROPERTY. Każda z nich identyfikuje konkretną właściwość z wyliczenia DWRITE_FONT_PROPERTY_ID i odpowiadającą mu wartość właściwości, która ma być używana.
Należy pamiętać, że wszystkie wartości właściwości są przypisywane jako ciągi. Jeśli te wartości mogą być później wyświetlane użytkownikom, można ustawić alternatywne wartości dla danej właściwości dla różnych języków, ale nie jest to wymagane. Należy również pamiętać, że jeśli jakiekolwiek niestandardowe wartości właściwości są ustawiane przez aplikację, tylko te wartości, które zostały określone, będą używane w zestawie czcionek; Funkcja DirectWrite nie będzie uzyskiwać żadnych wartości bezpośrednio z czcionki dla właściwości informacyjnych używanych w zestawie czcionek.
W poniższym przykładzie zdefiniowano niestandardowe wartości dla trzech właściwości informacyjnych: nazwy rodziny, pełnej nazwy i wagi czcionki.
DWRITE_FONT_PROPERTY props[] =
{
{ DWRITE_FONT_PROPERTY_ID_FAMILY_NAME, L"My Icon Font", L"en-US" },
{ DWRITE_FONT_PROPERTY_ID_FULL_NAME, L"My Icon Font", L"en-US" },
{ DWRITE_FONT_PROPERTY_ID_WEIGHT, L"400", nullptr }
};
Po zdefiniowaniu żądanej tablicy wartości właściwości dla czcionki wykonaj wywołanie metody AddFontFaceRefence, przekazując tablicę właściwości, a także odwołanie do twarzy czcionki.
hr = pFontSetBuilder->AddFontFaceReference(pFontFaceReference, props, ARRAYSIZE(props));
Po dodaniu wszystkich niestandardowych twarzy czcionek do konstruktora zestawu czcionek wraz z ich właściwościami niestandardowymi utwórz niestandardowy zestaw czcionek, jak pokazano powyżej.
Tworzenie niestandardowego zestawu czcionek przy użyciu znanych czcionek zdalnych w sieci Web
Właściwości niestandardowe są ważne do pracy z czcionkami zdalnymi. Każde odwołanie do twarzy czcionki musi mieć pewne właściwości informacyjne, aby scharakteryzować czcionkę i odróżnić ją od innych czcionek. Ponieważ dane czcionek dla czcionek zdalnych nie są lokalne, funkcja DirectWrite nie może uzyskiwać właściwości bezpośrednio z danych czcionek. W związku z tym właściwości należy podać jawnie podczas dodawania czcionki zdalnej do konstruktora zestawu czcionek.
Sekwencja wywołań interfejsu API do dodawania czcionek zdalnych do zestawu czcionek jest podobna do sekwencji opisanej w poprzednim scenariuszu. Ponieważ dane czcionek są zdalne, jednak operacje związane z odczytywaniem rzeczywistych danych czcionek będą inne niż podczas pracy z plikami w magazynie lokalnym. W tej sytuacji nowy interfejs niższego poziomu, IDWriteRemoteFontFileLoader, został dodany w aktualizacji systemu Windows 10 dla twórców.
Aby użyć zdalnego modułu ładującego plik czcionek, należy najpierw zarejestrować go w fabryce DirectWrite. Moduł ładujący musi być przechowywany przez aplikację tak długo, jak są używane skojarzone z nim czcionki. Gdy czcionki nie będą już używane, a w pewnym momencie przed zniszczeniem fabryki moduł ładujący musi zostać wyrejestrowany. Można to zrobić w destruktorze klasy, która jest właścicielem obiektu modułu ładującego. Te kroki zostaną pokazane poniżej.
Metoda tworzenia niestandardowego zestawu czcionek przy użyciu czcionek zdalnych jest następująca; wymaga to aktualizacji systemu Windows 10 Dla twórców.
- 1. Utwórz interfejs IDWriteFactory5, jak pokazano powyżej.
2. Utwórz interfejs IDWriteFontSetBuilder, jak pokazano powyżej.
3. Użyj fabryki, aby uzyskać IDWriteRemoteFontFileLoader.
- Zdefiniuj właściwości niestandardowe dla twarzy czcionki, jak pokazano powyżej.
- Dodaj odwołanie do twarzy czcionki wraz z właściwościami niestandardowymi do konstruktora zestawu czcionek, jak pokazano powyżej.
- Po dodaniu wszystkich czcionek do konstruktora zestawu czcionek utwórz zestaw czcionek, jak pokazano powyżej.
- W pewnym momencie, gdy zdalne czcionki nie będą już używane, wyrejestruj zdalny moduł ładujący plik czcionek.
IDWriteRemoteFontFileLoader* pRemoteFontFileLoader;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateHttpFontFileLoader(
/* referrerURL */ nullptr,
/* extraHeaders */ nullptr,
&pRemoteFontFileLoader
);
}
Spowoduje to zwrócenie przez system implementacji zdalnego interfejsu modułu ładującego pliku czcionek, który może obsługiwać interakcje HTTP na potrzeby pobierania danych czcionek w imieniu aplikacji. Adres URL odwołania lub dodatkowe nagłówki można określić, jeśli jest to wymagane przez usługę czcionek lub usługi, które są źródłem czcionek.
Ważny
Uwaga dotycząca zabezpieczeń: po podjęciu próby pobrania czcionki zdalnej istnieje możliwość fałszowania przez osobę atakującą zamierzonego serwera, który zostanie wywołany. W takim przypadku docelowe i odwołujące się adresy URL oraz szczegóły nagłówka zostaną ujawnione osobie atakującej. Deweloperzy aplikacji są odpowiedzialni za ograniczenie tego ryzyka. Zalecane jest użycie protokołu HTTPS, a nie protokołu HTTP.
Pojedynczy zdalny moduł ładujący plików czcionek może być używany dla wielu czcionek, chociaż można użyć różnych modułów ładujących, jeśli czcionki są uzyskiwane z wielu usług, które mają różne wymagania dotyczące adresu URL odwołania lub dodatkowych nagłówków.
4. Zarejestruj zdalny moduł ładujący plików czcionek w fabryce.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->RegisterFontFileLoader(pRemoteFontFileLoader);
}
Od tego momentu kroki tworzenia niestandardowego zestawu czcionek są podobne do opisanych dla znanych, lokalnych plików czcionek z dwoma ważnymi wyjątkami. Najpierw obiekt IDWriteFontFile jest tworzony przy użyciu zdalnego interfejsu modułu ładującego plików czcionek, a nie przy użyciu fabryki. Po drugie nie można użyć metody Analyze, ponieważ dane czcionki nie są lokalne. Zamiast tego aplikacja musi wiedzieć, czy zdalny plik czcionki jest plikiem Kolekcji czcionek OpenType, a jeśli tak, musi wiedzieć, które czcionki w kolekcji będą używane, oraz indeks dla każdego z nich. W związku z tym pozostałe kroki są następujące.
5. Dla każdego zdalnego pliku czcionki użyj zdalnego interfejsu modułu ładującego pliku czcionek, aby utworzyć IDWriteFontFile, określając adres URL wymagany do uzyskania dostępu do pliku czcionki.
IDWriteFontFile* pFontFile;
hr = pRemoteFontFileLoader->CreateFontFileReferenceFromUrl(
pDWriteFactory,
/* baseUrl */ L"https://github.com/",
/* fontFileUrl */ L"winjs/winjs/blob/master/src/fonts/Symbols.ttf?raw=true",
&pFontFile
);
Należy pamiętać, że pełny adres URL można określić w parametrze fontFileUrl lub można go podzielić na części bazowe i względne. Jeśli określono podstawowy adres URL, łączenie wartości baseUrl i fontFileUrl musi podać pełny adres URL — funkcja DirectWrite nie dostarczy żadnego dodatkowego ogranicznika.
Ważny
Uwaga dotycząca zabezpieczeń/wydajności: po podjęciu próby pobrania czcionki zdalnej nie ma gwarancji, że system Windows otrzyma odpowiedź z serwera. W niektórych przypadkach serwer może odpowiedzieć z błędem nienadzielonego pliku dla nieprawidłowego względnego adresu URL, ale przestać odpowiadać, jeśli odbiera wiele nieprawidłowych żądań. Jeśli serwer nie odpowie, system Windows w końcu upłynął limit czasu, choć może to potrwać kilka minut, jeśli zainicjowano wiele pobrań. Należy wykonać czynności, aby upewnić się, że adresy URL będą prawidłowe podczas wykonywania wywołań.
Należy również zauważyć, że adres URL może wskazywać nieprzetworzonego pliku czcionki OpenType (.ttf, .otf, ttc, otc), ale może również wskazywać czcionki w pliku kontenera WOFF lub WOFF2. Jeśli zostanie przywoływany plik WOFF lub WOFF2, implementacja DirectWrite zdalnego modułu ładującego pliku czcionek automatycznie rozpakuje dane czcionek z pliku kontenera.
6. Dla każdego indeksu twarzy czcionki w zdalnym pliku czcionek, który ma być używany, utwórz IDWriteFontFaceReference.
IDWriteFontFaceReference* pFontFaceReference;
hr = pDWriteFactory->CreateFontFaceReference(pFontFile, /* faceIndex */ 0, DWRITE_FONT_SIMULATIONS_NONE, &pFontFaceReference);
hr = pDWriteFactory->UnregisterFontFileLoader(pRemoteFontFileLoader);
Po utworzeniu niestandardowego zestawu czcionek z niestandardowymi czcionkami zdalnymi zestaw czcionek zawiera odwołania i właściwości informacyjne czcionek zdalnych, ale rzeczywiste dane są nadal zdalne. Obsługa DirectWrite dla czcionek zdalnych umożliwia zachowanie odwołania do twarzy czcionki w zestawie czcionek i wybranie czcionki do użycia w układzie i renderowaniu, ale rzeczywiste dane nie są pobierane, dopóki nie będzie rzeczywistej potrzeby jej użycia, na przykład gdy zostanie wykonany układ tekstu.
Aplikacja może podjąć podejście z góry, żądając, aby directWrite pobrać dane czcionki, a następnie czekać na potwierdzenie pomyślnego pobrania przed rozpoczęciem przetwarzania czcionki. Jednak pobieranie sieci oznacza pewne opóźnienie nieprzewidywalnego czasu trwania, a sukces jest również niepewny. Z tego powodu zazwyczaj lepszym rozwiązaniem jest użycie innego podejścia, co pozwala na wstępne wykonywanie układu i renderowania przy użyciu alternatywnych lub rezerwowych czcionek, które są już lokalne, podczas żądania pobrania żądanej, zdalnej czcionki, a następnie zaktualizowania wyników po pobraniu żądanej czcionki.
Aby zażądać pobrania całej czcionki przed jej zastosowaniem, można użyć metody IDWriteFontFaceReference::EnqueueFontDownloadRequest. Jeśli czcionka jest bardzo duża, tylko część danych może być potrzebna do przetwarzania określonych ciągów. Funkcja DirectWrite udostępnia dodatkowe metody, których można użyć do żądania fragmentów danych czcionki wymaganych dla określonej zawartości, EnqueueCharacterDownloadRequest i EnqueueGlyphDownloadRequest.
Załóżmy, że podejście do zastosowania w aplikacji polega na umożliwieniu początkowego przetwarzania przy użyciu czcionek lokalnych, alternatywnych lub rezerwowych. Metoda IDWriteFontFallback::MapCharacters może służyć do identyfikowania lokalnych czcionek rezerwowych, a także automatycznie w kolejce żądanie pobrania preferowanej czcionki. Ponadto jeśli jest używana IDWriteTextLayout i niektóre lub wszystkie tekst w układzie są sformatowane przy użyciu zdalnego odwołania do czcionki, funkcja DirectWrite automatycznie użyje metody MapCharacters, aby pobrać lokalne czcionki rezerwowe i zapisać żądanie pobrania danych czcionki zdalnej.
Funkcja DirectWrite obsługuje kolejkę pobierania czcionek dla każdej fabryki, a żądania wykonywane przy użyciu metod wymienionych powyżej są dodawane do tej kolejki. Kolejkę pobierania czcionek można uzyskać przy użyciu metody IDWriteFactory3::GetFontDownloadQueue.
Jeśli zostanie wykonane żądanie pobrania, ale dane czcionki są już lokalne, spowoduje to no-op: nic nie zostanie dodane do kolejki pobierania. Aplikacja może sprawdzić, czy kolejka jest pusta, czy oczekujące żądania pobrania, wywołując metodę IDWriteFontDownloadQueue::IsEmpty.
Po dodaniu zdalnych żądań czcionek do kolejki należy zainicjować proces pobierania. Gdy czcionki zdalne są używane w IDWriteTextLayout, pobieranie zostanie zainicjowane automatycznie, gdy aplikacja wywołuje metody IDWriteTextLayout, które wymuszają operacje układu lub renderowania, takie jak Metody GetLineMetrics lub Draw. W innych scenariuszach aplikacja musi zainicjować pobieranie bezpośrednio przez wywołanie IDWriteFontDownloadQueue::BeginDownload.
Po zakończeniu pobierania aplikacja będzie miała możliwość podjęcia odpowiednich akcji — kontynuowania oczekujących operacji lub powtarzających się operacji, które zostały wykonane początkowo z czcionkami rezerwowymi. (Jeśli jest używany układ tekstu DirectWrite, IDWriteTextLayout3::InvalidateLayout może służyć do czyszczenia tymczasowych wyników obliczanych przy użyciu czcionek rezerwowych). Aby aplikacja została powiadomiona o zakończeniu procesu pobierania i podjęciu odpowiednich akcji, aplikacja musi zapewnić implementację interfejsu IDWriteFontDownloadListener i przekazać ją do wywołania BeginDownloadDownload.
Ważny
Uwaga dotycząca zabezpieczeń/wydajności: po podjęciu próby pobrania czcionki zdalnej nie ma gwarancji, że system Windows otrzyma odpowiedź z serwera. Jeśli serwer nie odpowie, system Windows w końcu upłynął limit czasu, choć może to potrwać kilka minut, jeśli wiele czcionek zdalnych jest pobieranych, ale kończy się niepowodzeniem. Wywołanie BeginDownload zostanie zwrócone natychmiast. Aplikacje nie powinny blokować interfejsu użytkownika podczas oczekiwania na wywołanie IDWriteFontDownloadListener::D ownloadCompleted.
Przykładowe implementacje tych interakcji z kolejką pobierania czcionek DirectWrite i interfejsem IDWriteFontDownloadListener można zobaczyć w przykładzie DirectWrite Custom Font SetsDirectWrite, a także w przykładzie DirectWrite Downloadable Fonts.
Tworzenie niestandardowego zestawu czcionek przy użyciu danych czcionek załadowanych do pamięci
Podobnie jak operacje niskiego poziomu odczytu danych z pliku czcionki różnią się w przypadku plików na dysku lokalnym a plików zdalnych w Sieci Web, to samo dotyczy również danych czcionek załadowanych do buforu pamięci. Dodano nowy interfejs niskiego poziomu do obsługi danych czcionek w pamięci w aktualizacji systemu Windows 10 Dla twórców, IDWriteInMemoryFontFileLoader.
Podobnie jak w przypadku zdalnego modułu ładującego plik czcionek, moduł ładujący plików czcionek w pamięci musi najpierw zostać zarejestrowany w fabryce DirectWrite. Moduł ładujący musi być przechowywany przez aplikację tak długo, jak są używane skojarzone z nim czcionki. Gdy czcionki nie będą już używane, a w pewnym momencie przed zniszczeniem fabryki moduł ładujący musi zostać wyrejestrowany. Można to zrobić w destruktorze klasy, która jest właścicielem obiektu modułu ładującego. Te kroki zostaną pokazane poniżej.
Jeśli aplikacja zawiera oddzielne informacje o twarzach czcionek reprezentowanych przez dane, może dodać poszczególne odwołania do twarzy czcionki do konstruktora zestawu czcionek z określonymi właściwościami niestandardowymi. Ponieważ dane czcionki są w pamięci lokalnej, nie jest to jednak wymagane; Funkcja DirectWrite będzie mogła odczytywać dane bezpośrednio w celu uzyskania wartości właściwości.
DirectWrite zakłada, że dane czcionek są w formacie nieprzetworzonym, OpenType, równoważnym z plikiem OpenType (.ttf, .otf, ttc, otc), ale w pamięci, a nie na dysku. Dane nie mogą być w formacie kontenera WOFF lub WOFF2. Dane mogą reprezentować kolekcję czcionek OpenType. Jeśli właściwości niestandardowe nie są używane, można użyć metody IDWriteFontSetBuilder1::AddFontFile metody , aby dodać wszystkie twarze czcionek w danych w jednym wywołaniu.
Ważnym zagadnieniem w scenariuszu w pamięci jest okres istnienia danych. Jeśli wskaźnik do buforu jest dostarczany do funkcji DirectWrite bez wyraźnego wskazania, że istnieje właściciel, funkcja DirectWrite utworzy kopię danych do nowego buforu pamięci, którego będzie właścicielem. Aby uniknąć kopiowania danych i dodatkowej alokacji pamięci, aplikacja może przekazać obiekt właściciela danych, który implementuje element IUnknown i jest właścicielem buforu pamięci zawierającego dane czcionki. Implementując ten interfejs, funkcja DirectWrite może dodać do liczby ref obiektu, zapewniając w ten sposób okres istnienia danych należących do użytkownika.
Metoda tworzenia niestandardowego zestawu czcionek przy użyciu danych czcionek w pamięci jest następująca; wymaga to aktualizacji systemu Windows 10 Dla twórców. Przyjęto założenie, że obiekt właściciela danych zaimplementowany przez aplikację implementuje element IUnknown, a także metody, które zwracają wskaźnik do buforu pamięci i rozmiar buforu.
- 1. Utwórz interfejs IDWriteFactory5, jak pokazano powyżej.
2. Utwórz interfejs [**IDWriteFontSetBuilder1**](/windows/win32/api/dwrite_3/nn-dwrite_3-idwritefontsetbuilder1), jak pokazano powyżej.
3. Użyj fabryki, aby uzyskać identyfikator IDWriteInMemoryFontFileLoader.
IDWriteInMemoryFontFileLoader* pInMemoryFontFileLoader;
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->CreateInMemoryFontFileLoader(&pInMemoryFontFileLoader);
}
Spowoduje to zwrócenie implementacji systemowej interfejsu modułu ładującego pliku czcionek w pamięci.
4. Zarejestruj moduł ładujący pliki czcionek w pamięci w fabryce.
if (SUCCEEDED(hr))
{
hr = pDWriteFactory->RegisterFontFileLoader(pInMemoryFontFileLoader);
}
5. Dla każdego pliku czcionki w pamięci użyj modułu ładującego plik czcionki w pamięci, aby utworzyć IDWriteFontFile.
IDWriteFontFile* pFontFile;
hr = pInMemoryFontFileLoader->CreateInMemoryFontFileReference(
pDWriteFactory,
pFontDataOwner->fontData /* returns void* */,
pFontDataOwner->fontDataSize /* returns UINT32 */,
pFontDataOwner /* ownerObject, owns the memory with font data and implements IUnknown */,
&pFontFile
);
6. Dodaj obiekt IDWriteFontFile do konstruktora zestawu czcionek przy użyciu metody AddFontFile, jak pokazano powyżej. Jeśli istnieje potrzeba, aplikacja może zamiast tego utworzyć poszczególne IDWriteFontFaceReference obiektów na podstawie IDWriteFontFile, opcjonalnie zdefiniować właściwości niestandardowe dla każdego odwołania do twarzy czcionki, a następnie dodać odwołanie do twarzy czcionki z właściwościami niestandardowymi do zestawu czcionek przy użyciu metody AddFontFaceReference, jak pokazano powyżej.
7. Po dodaniu wszystkich czcionek do konstruktora zestawu czcionek utwórz niestandardowy zestaw czcionek, jak pokazano powyżej.
8. W pewnym momencie, gdy czcionki w pamięci nie będą już używane, wyrejestruj moduł ładujący plik czcionek w pamięci.
hr = pDWriteFactory->UnregisterFontFileLoader(pInMemoryFontFileLoader);
Scenariusze zaawansowane
Niektóre aplikacje mogą mieć specjalne wymagania, które wymagają bardziej zaawansowanego przetwarzania niż opisano powyżej.
Łączenie zestawów czcionek
Niektóre aplikacje mogą wymagać utworzenia zestawu czcionek składającego się z niektórych kombinacji elementów z innych zestawów czcionek. Na przykład aplikacja może chcieć utworzyć zestaw czcionek, który łączy wszystkie czcionki zainstalowane w systemie z wyborem czcionek niestandardowych lub łączy zainstalowane czcionki spełniające określone kryteria z innymi czcionkami. DirectWrite ma interfejsy API do obsługi manipulowania i łączenia zestawów czcionek.
Aby połączyć co najmniej dwa zestawy czcionek, metoda IDWriteFontSetBuilder::AddFontSet metoda dodaje wszystkie czcionki w danym zestawie czcionek, które mają zostać dodane do konstruktora zestawu czcionek w jednym wywołaniu. Jeśli w nowym zestawie czcionek są wymagane tylko niektóre czcionki z istniejącego zestawu czcionek, można użyć metody IDWriteFontSet::GetMatchingFonts metody w celu utworzenia nowego obiektu zestawu czcionek, który został przefiltrowany w celu uwzględnienia tylko czcionek pasujących do określonych właściwości. Metody te umożliwiają łatwe tworzenie niestandardowego zestawu czcionek łączących czcionki z dwóch lub większej liczby istniejących zestawów czcionek
Używanie lokalnych danych czcionek WOFF lub WOFF2
Jeśli aplikacja ma pliki czcionek w lokalnym systemie plików lub w buforze pamięci, ale używają formatów kontenerów WOFF lub WOFF2, DirectWrite (Windows 10 Creator Update lub nowszy) udostępnia metodę rozpakowywania formatu kontenera, IDWriteFactory5::UnpackFontFile, która zwraca IDWriteFontFileStream.
Jednak aplikacja będzie potrzebować sposobu pobrania IDWriteFontFileStream do obiektu modułu ładującego plików czcionek. Jednym ze sposobów wykonania tej czynności jest utworzenie niestandardowej implementacji IDWriteFontFileLoader implementacji, która opakowuje strumień. Podobnie jak w przypadku innych modułów ładujących pliki czcionek, należy je zarejestrować przed użyciem i wyrejestrować przed wyjściem z zakresu fabryki.
Jeśli niestandardowy moduł ładujący będzie również używany z nieprzetworzonymi (nie zapakowanymi) plikami czcionek, aplikacja będzie również musiała zapewnić niestandardową implementację interfejsu IDWriteFontFileStream do obsługi tych plików. Istnieją jednak łatwiejsze sposoby używania interfejsów API omówionych powyżej do obsługi nieprzetworzonych plików czcionek. Potrzebę implementacji niestandardowego strumienia można uniknąć przy użyciu oddzielnych ścieżek kodu dla spakowanych plików czcionek w porównaniu z nieprzetworzonymi plikami czcionek.
Po utworzeniu niestandardowego obiektu modułu ładującego plik czcionki spakowane dane pliku czcionki są dodawane do modułu ładującego za pomocą środków specyficznych dla aplikacji. Moduł ładujący może obsługiwać wiele plików czcionek, z których każdy jest identyfikowany przy użyciu klucza zdefiniowanego przez aplikację, który jest nieprzezroczystym elementem DirectWrite. Po dodaniu spakowanego pliku czcionki do modułu ładującego IDWriteFactory::CreateCustomFontFileReference metoda jest używana do uzyskiwania IDWriteFontFile na podstawie tego modułu ładującego dla danych czcionek zidentyfikowanych przez dany klucz.
Rzeczywiste rozpakowywanie danych czcionek można wykonać w miarę dodawania czcionek do modułu ładującego, ale można je również obsłużyć w IDWriteFontFileLoader::CreateStreamFromKey metodę, którą funkcja DirectWrite wywoła, gdy najpierw musi odczytać dane czcionki.
Po utworzeniu obiektu IDWriteFontFile pozostałe kroki dodawania czcionek do niestandardowego zestawu czcionek będą opisane powyżej.
Implementacja korzystająca z tego podejścia jest pokazana w przykładzie DirectWrite Custom Font Sets.
Używanie zdalnych mechanizmów czcionek DirectWrite z niestandardową implementacją sieci niskiego poziomu
Mechanizmy DirectWrite do obsługi czcionek zdalnych można podzielić na mechanizmy wyższego poziomu — zestawy czcionek, które zawierają odwołania do twarzy czcionek dla czcionek zdalnych, sprawdzanie lokalności danych czcionek i zarządzanie kolejką dla żądań pobierania czcionek — oraz mechanizmy niższego poziomu obsługujące rzeczywiste pobieranie. Niektóre aplikacje mogą chcieć korzystać z mechanizmów czcionek zdalnych wyższego poziomu, ale także wymagają niestandardowych interakcji sieciowych, takich jak komunikacja z serwerami przy użyciu protokołów innych niż HTTP.
W takiej sytuacji aplikacja musi utworzyć niestandardową implementację IDWriteRemoteFontFileLoader interfejsu, który współdziała z innymi interfejsami niższego poziomu w wymagany sposób. Aplikacja będzie również musiała zapewnić niestandardowe implementacje tych interfejsów niższego poziomu: IDWriteRemoteFontFileStreami IDWriteAsyncResult. Te trzy interfejsy mają metody wywołania zwrotnego, które funkcja DirectWrite wywoła podczas operacji pobierania.
Po wywołaniu idWriteFontDownloadQueue::BeginDownload wywoływana jest funkcja DirectWrite wysyła zapytania do zdalnego modułu ładującego pliku czcionek o lokalności danych i zażąda strumienia zdalnego. Jeśli dane nie są lokalne, wywołają metodę BeginDownload strumienia. Implementacja strumienia nie powinna blokować tego wywołania, ale powinna natychmiast zwrócić IDWriteAsyncResult obiektu, który zapewnia obsługę oczekiwania DirectWrite będzie używać do oczekiwania na asynchronicznej operacji pobierania. Implementacja niestandardowego strumienia jest odpowiedzialna za obsługę komunikacji zdalnej. Po wystąpieniu zdarzenia ukończenia polecenie DirectWrite wywoła IDWriteAsyncResult::GetResult w celu określenia wyniku operacji. Jeśli wynik zakończy się pomyślnie, oczekuje się, że kolejne wywołania readFragment do strumienia dla pobranych zakresów powiedzą się.
Ważny
Uwaga dotycząca zabezpieczeń/wydajności: jeśli podjęto próbę pobrania czcionki zdalnej, istnieje w ogóle, aby osoba atakująca fałszował wywoływany zamierzony serwer lub że serwer może nie odpowiadać. W przypadku implementowania niestandardowych interakcji sieciowych może być większa kontrola nad środki zaradcze niż w przypadku obsługi serwerów innych firm. Jednak należy rozważyć odpowiednie środki zaradcze, aby uniknąć ujawnienia informacji lub odmowy usługi. Zalecane są bezpieczne protokoły, takie jak HTTPS. Ponadto należy utworzyć limit czasu, tak aby dojście zdarzeń zwrócone do funkcji DirectWrite ostatecznie zostało ustawione.
Scenariusze pomocnicze we wcześniejszych wersjach systemu Windows
Scenariusze, które zostały opisane, mogą być obsługiwane w trybie DirectWrite we wcześniejszych wersjach systemu Windows, ale wymagałoby znacznie większej implementacji niestandardowej ze strony aplikacji przy użyciu bardziej ograniczonych interfejsów API, które były dostępne przed systemem Windows 10. Aby uzyskać więcej informacji, zobacz kolekcje czcionek niestandardowych (Windows 7/8).