Megosztás:


A DWriteCore áttekintése

A DWriteCore a Windows App SDKDirectWrite implementálása (a DirectWrite a DirectX API a kiváló minőségű szövegmegjelenítéshez, a felbontásfüggetlen szerkezeti betűtípusokhoz, valamint a Unicode teljes szöveg- és elrendezéstámogatásához). A DWriteCore a DirectWrite egy formája, amely a Windows több verzióján is működik egészen a Windows 10 1809-es (10.0; Build 17763) verziójáig. A DWriteCore ugyanazt az API-t implementálja, mint a DirectWrite, a jelen témakörben ismertetett néhány kiegészítéssel.

Ez a bevezető témakör bemutatja, hogy mi a DWriteCore, és bemutatja, hogyan telepítheti azt a fejlesztői környezetbe és programba.

A DirectWrite-et már használó alkalmazások esetében a DWriteCore-ra való váltás minimális módosításokat igényel:

  • Adjon hozzá egy hivatkozást a Windows App SDK-csomaghoz.
  • dwrite_3.hhelyett dwrite_core.h belefoglalása.
  • DWriteCore.lib csatolása DWrite.libhelyett.
  • A(z) DWriteCoreCreateFactory hívása DWriteCreateFactoryhelyett.

Cserébe az alkalmazás megkapja a Windows App SDK előnyeit– vagyis a legújabb API-khoz és funkciókhoz való hozzáférést, függetlenül attól, hogy az ügyfél milyen Windows-verziót futtat.

Borravaló

Az aktív fejlesztés alatt álló DirectX-összetevők leírását és hivatkozásait a DirectX kezdőlapcímű blogbejegyzésben találhatja meg.

A DWriteCore értékajánlata

DirectWrite számos olyan funkciót támogat, amelyek a legtöbb alkalmazáshoz a Windowsban választható betűtípus-megjelenítő eszközt teszik lehetővé – akár közvetlen hívásokon keresztül, akár Direct2Dkeresztül. A DirectWrite eszközfüggetlen szövegelrendezési rendszert, kiváló minőségű al képpontos Microsoft ClearType szövegmegjelenítést, hardveresen gyorsított szöveget, többformátumú szöveget, speciális OpenType® tipográfiai funkciókat, széles nyelvi támogatást és GDI-kompatibilis elrendezést és renderelést tartalmaz. A DirectWrite a Windows Vista SP2 óta érhető el, és az évek során egyre fejlettebb funkciókkal bővült, például a változó betűtípusokkal, amelyekkel stílusokat, súlyokat és egyéb attribútumokat alkalmazhat egyetlen betűtípus-erőforrással rendelkező betűtípusokra.

A DirectWrite hosszú élettartamának köszönhetően azonban a fejlesztés során a fejlesztések célja a Windows régebbi verzióinak hátrahagyása volt. Emellett a DirectWrite premier szövegmegjelenítési technológiája csak a Windowsra korlátozódik, így a platformfüggetlen alkalmazások saját szövegmegjelenítési vermet írhatnak, vagy külső megoldásokra támaszkodhatnak.

A DWriteCore a verziószolgáltatás árvaságával és platformfüggetlen kompatibilitásával kapcsolatos alapvető problémákat oldja meg a kódtár rendszerből való eltávolításával és az összes lehetséges támogatott végpont megcélzásával. Ennek érdekében integráltuk a DWriteCore-t a Windows App SDK-ba.

A DWriteCore elsődleges értéke, hogy fejlesztőként a Windows App SDK-ban számos (és végül az összes) DirectWrite-funkcióhoz biztosít hozzáférést. A DWriteCore minden funkciója ugyanúgy fog működni az összes alacsonyabb szintű verzióban, anélkül, hogy bármilyen eltérés lenne azzal kapcsolatban, hogy mely funkciók melyik verzión működnek.

A DWriteCore demo alkalmazás – DWriteCoreGallery

A DWriteCore-t a DWriteCoreGallery mintaalkalmazással mutatjuk be, amely most letölthető és tanulmányozható.

A DWriteCore használatának első lépései

A DWriteCore a Windows App SDKrésze. Ez a szakasz bemutatja, hogyan állíthatja be a fejlesztési környezetet a DWriteCore használatával való programozáshoz.

Eszközök telepítése a Windows App SDK-hoz

Lásd: Eszközök telepítése a Windows App SDK.

Új projekt létrehozása

A Visual Studióban hozzon létre egy új projektet a Blank App, Packaged (WinUI 3 in Desktop) projektsablonból. Ezt a projektsablont a nyelv kiválasztásával találja meg: C++; platform: Windows App SDK; projekttípus: Asztali.

További információ: WinUI 3projektsablonjai.

A Microsoft.ProjectReunion.DWrite NuGet-csomag telepítése

A Visual Studióban kattintson Project>NuGet-csomagok kezelése...>Tallózás, írja be vagy illessze be Microsoft.ProjectReunion.DWrite a keresőmezőbe, jelölje ki az elemet a keresési eredmények között, majd kattintson a telepítése gombra a projekt csomagjának telepítéséhez.

Másik lehetőségként kezdje a DWriteCoreGallery mintaalkalmazással

Alternatívaként a DWriteCore használatával is programozhat úgy, hogy a DWriteCoreGallery mintaalkalmazás-projektet választja kiindulópontnak, és a fejlesztést erre a projektre alapozza. Ezután nyugodtan eltávolíthat minden meglévő forráskódot (vagy fájlt) a mintaprojektből, és hozzáadhat minden új forráskódot (vagy fájlt) a projekthez.

DWriteCore használata a projektben

A DWriteCore-tal való programozásról a jelen témakör későbbi, DWriteCore szakaszában talál további információt.

A DWriteCore kiadási fázisai

A DirectWrite DWriteCore-ba történő portolása elég nagy projekt, amely több Windows kiadási ciklusra is kiterjed. Ez a projekt fázisokra van osztva, amelyek mindegyike egy kiadásban elérhető funkciókészletnek felel meg.

A DWriteCore aktuális kiadásának funkciói

A DWriteCore a Windows App SDKrésze. Ez tartalmazza azokat az alapvető eszközöket, amelyeket fejlesztőként a DWriteCore használatához kell használnia, beleértve az alábbi funkciókat is.

A szalagcím funkció a színes betűtípusok. A színes betűtípusok lehetővé teszik a betűtípusok kifinomultabb színfunkcióval való megjelenítését az egyszerű egyetlen színeken túl. Például a színes betűtípusok teszik lehetővé az emoji- és eszköztárikon betűtípusok megjelenítését (amelyek közül az utóbbit például az Office használja). A színes betűtípusokat először a Windows 8.1-ben vezették be, de a funkció jelentősen kibővült a Windows 10 1607-es verziójában (évfordulós frissítés).

A betűgyorsítótár és a memóriabeli betűtípus-betöltő megtisztítása lehetővé teszi a betűtípusok gyorsabb betöltését és a memóriafejlesztést.

Ezekkel a funkciókkal azonnal elkezdheti kihasználni a DirectWrite modern alapvető funkcióit, például a változó betűtípusokat. A változó betűtípusok a DirectWrite-ügyfelek egyik legfontosabb funkciója.

Meghívásunk az Ön számára mint DirectWrite fejlesztő

A DWriteCore és más Windows App SDK-összetevők a fejlesztői visszajelzések iránti nyitottsággal lesznek fejlesztve. Meghívjuk Önt arra, hogy kezdje el felfedezni a DWriteCore-t, és ossza meg észrevételeit vagy kérdéseit a Windows App SDK GitHub-adattárbana funkciók fejlesztésével kapcsolatban.

Programozás DWriteCore-tal

Csakúgy, mint DirectWrite, a DWriteCore-ot a COM-light API-n keresztül programozza az IDWriteFactory felületen keresztül.

A DWriteCore használatához hozzá kell adni a dwrite_core.h fejlécfájlt.

// pch.h
...
// DWriteCore header file.
#include <dwrite_core.h>

A dwrite_core.h fejlécfájl először definiálja a tokent DWRITE_CORE, majd tartalmazza a dwrite_3.h fejlécfájlt. A DWRITE_CORE jelző azért fontos, mert a később belefoglalt fejlécek úgy irányulnak, hogy az összes DirectWrite API elérhetővé váljon számára. Miután a projekt tartalmazza a dwrite_core.h-t, kódot írhat, fordíthatja és futtathatja.

Új vagy eltérő API-k a DWriteCore-hoz

A DWriteCore API felület nagyjából ugyanaz, mint DirectWrite. Van azonban néhány új API, amelyek jelenleg csak a DWriteCore-ban találhatók.

Gyári objektum létrehozása

A DWriteCoreCreateFactory szabad függvény létrehoz egy gyári objektumot, amelyet az egyes DWriteCore-objektumok későbbi létrehozásához használnak.

DWriteCoreCreateFactory funkcionálisan megegyezik a DirectWrite rendszerverziója által exportált DWriteCreateFactory függvénnyel. A DWriteCore függvény neve eltérő, így elkerülhető a kétértelműség.

Korlátozott gyári objektum létrehozása

A DWRITE_FACTORY_TYPE enumerálás új állandóval rendelkezik,DWRITE_FACTORY_TYPE_ISOLATED2, amely egy korlátozott gyárat jelez. A korlátozott gyárak zároltabbak, mint egy elszigetelt gyár. Semmilyen módon nem működik együtt a többfolyamatos és az állandó betűtípus-gyorsítótárral. Ezen kívül az ebből a gyárból visszaadott rendszerbetűkészlet csak jól ismert betűtípusokat tartalmaz. Így hozhat létre DWRITE_FACTORY_TYPE_ISOLATED2 korlátozott gyári objektumot a DWriteCoreCreateFactory ingyenes függvény meghívásakor.

// 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())
  )
);

Ha a DirectWrite egy régebbi verziójának adja át DWRITE_FACTORY_TYPE_ISOLATED2, amely nem támogatja azt, akkor a DWriteCreateFactoryE_INVALIDARGértéket ad vissza.

Karakterjelek rajzolása rendszermemória-bitképre

A DirectWrite egy bittérképes renderelési célfelülettel rendelkezik, amely támogatja a karakterjelek bitképre való megjelenítését a rendszermemória egy bitképén. Jelenleg azonban az egyetlen módja annak, hogy hozzáférjenek a mögöttes képpontadatokhoz, ha a GDI-t használják, így az API nem használható platformfüggetlen. Ez könnyen orvosolható, ha hozzáad egy módszert a képpontadatok lekéréséhez.

Így a DWriteCore bevezeti az IDWriteBitmapRenderTarget2 felületet, és annak metódusát IDWriteBitmapRenderTarget2::GetBitmapData. Ez a metódus egy DWRITE_BITMAP_DATA_BGRA32típusú paramétert vesz fel, amely egy új struktúra.

Az alkalmazás az IDWriteGdiInterop::CreateBitmapRenderTarget meghívásával létrehoz egy bittérkép-renderelési célt. Windows rendszeren a bitkép-renderelési cél egy GDI-memória tartományvezérlőt foglal magában, amelybe egy GDI eszközfüggetlen bitkép (DIB) van kiválasztva. IDWriteBitmapRenderTarget::DrawGlyphRun glifákat renderel a DIB-re. A DirectWrite a GDI használata nélkül jeleníti meg a karakterjeleket. Az alkalmazás ekkor lekérheti a HDC- a bitkép renderelési célpontjáról, majd a BitBlt használatával átmásolhatja a képpontokat egy ablak HDC-ra.

Nem Windows-platformokon az alkalmazás továbbra is létrehozhat egy bitkép renderelési célt, de egyszerűen beágyaz egy rendszermemória-tömböt HDC- és DIB nélkül. HDC-nélkül az alkalmazásnak más módon kell lekérnie a bitkép képpontjait, hogy másolni tudja őket, vagy más módon használhassa őket. Még Windows rendszeren is néha hasznos a tényleges képpontadatok lekérése, és ennek jelenlegi módját az alábbi kód példájában mutatjuk be.

// 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);
}

Egyéb API-különbségek a DWriteCore és a DirectWrite között

Vannak olyan API-k, amelyek csak csonkok, vagy kissé eltérően viselkednek a nem Windows-platformokon. Például a IDWriteGdiInterop::CreateFontFaceFromHdc nem Windows-platformokon az E_NOTIMPL hibát adja vissza, mivel HDC nem létezik GDInélkül.

Végül pedig vannak bizonyos egyéb Windows API-k, amelyeket általában a DirectWrite-tal együtt használnak (a Direct2D egy figyelemre méltó példa). Jelenleg azonban a Direct2D és a DWriteCore nem működik együtt. Ha például létrehoz egy IDWriteTextLayout a DWriteCore használatával, és átadja azt a D2D1RenderTarget::DrawTextLayout, akkor a hívás nem fog sikerülni.