Rendering DirectWrite
Opzioni di rendering
Il testo con formattazione descritto solo da un oggetto IDWriteTextFormat può essere eseguito con Direct2D, ma sono disponibili alcune altre opzioni per il rendering di un oggetto IDWriteTextLayout .
È possibile eseguire il rendering della stringa descritta da un oggetto IDWriteTextLayout usando i metodi seguenti.
1. Eseguire il rendering con Direct2D
Per eseguire il rendering di un oggetto IDWriteTextLayout usando Direct2D, usare il metodo ID2D1RenderTarget::D rawTextLayout , come illustrato nel codice seguente.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Per un'analisi più approfondita del disegno di un oggetto IDWriteTextLayout tramite Direct2D, vedere Introduzione con DirectWrite.
2. Eseguire il rendering usando un renderer di testo personalizzato.
Viene eseguito il rendering con un renderer personalizzato usando il metodo IDWriteTextLayout::D raw , che accetta un'interfaccia di callback derivata da IDWriteTextRenderer come argomento, come illustrato nel codice seguente.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
Il metodo IDWriteTextLayout::D raw chiama i metodi del callback del renderer personalizzato fornito. I metodi DrawGlyphRun, DrawUnderline, DrawInlineObject e DrawStrike through eseguono le funzioni di disegno.
IDWriteTextRenderer dichiara i metodi per il disegno di un'esecuzione, una sottolineatura, una sottolineatura, un attacco e oggetti inline. L'applicazione deve implementare questi metodi. La creazione di un renderer di testo personalizzato consente all'applicazione di applicare effetti aggiuntivi durante il rendering del testo, ad esempio un riempimento o una struttura personalizzata. Un renderer di testo personalizzato di esempio è incluso nell'esempio di DirectWrite Hello World.
3. Eseguire il rendering di ClearType in una superficie GDI.
Il rendering in una superficie GDI è in realtà un esempio di uso di un renderer di testo personalizzato. Tuttavia, alcune delle operazioni vengono eseguite sotto forma di interfaccia IDWriteBitmapRenderTarget .
Per creare questa interfaccia, usare il metodo IDWriteGdiInterop::CreateBitmapRenderTarget .
Il metodo DrawGlyphRun del renderer di testo personalizzato chiama il metodo IDWriteBitmapRenderTarget::D rawGlyphRun per disegnare i glifi. Il rendering della sottolineatura, dell'attacco e degli oggetti inline deve essere eseguito dal renderer personalizzato.
L'interfaccia IDWriteBitmapRenderTarget esegue il rendering in memoria di un contesto del dispositivo (DC). Si ottiene un handle per questo controller di dominio usando il metodo IDWriteBitmapRenderTarget::GetMemoryDC .
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
Dopo aver eseguito il disegno, il controller di dominio di memoria dell'oggetto IDWriteBitmapRenderTarget deve essere copiato nell'area GDI di destinazione.
Nota
È anche possibile trasferire la bitmap in un altro tipo di superficie, ad esempio una superficie GDI+.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);
Nota
L'app ha la responsabilità di eseguire il rendering di tutto nella finestra alla fine. Include testo e grafica. C'è una penalità per le prestazioni. Inoltre, il rendering in un controller di dominio di memoria non è accelerato dall'hardware GDI.
Per una panoramica più dettagliata dell'interoperabilità con GDI, vedere Interoperabilità con GDI.
4. Eseguire il rendering trasparente del testo in scala di grigio in un'area GDI. (Windows 8 e versioni successive)
A partire da Windows 8, è possibile eseguire il rendering trasparente del testo in scala grigia in una superficie GDI per prestazioni migliori. A tale scopo, è necessario:
- Cancellare il controller di dominio di memoria in modo trasparente.
- Eseguire il rendering del testo nella memoria HDC usando l'antialiasing in scala grigia (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
- Usare la funzione AlphaBlend per eseguire il rendering trasparente della memoria HDC sopra l'HDC di destinazione finale.
- Ripetere il numero di volte necessario (ad esempio, una volta per esecuzione glifo) e tra altre grafiche può essere eseguito il rendering direttamente all'HDC di destinazione finale senza essere sovrascritto dalla funzione AlphaBlend .
pRT_->SetTextAntialiasMode(DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE);
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
BLENDFUNCTION blendFunction = { 0 };
blendFunction.BlendOp = AC_SRC_OVER;
blendFunction.SourceConstantAlpha = 255;
blendFunction.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(
hdc,
0, 0,
width, height,
pRT_->GetMemoryDC(),
0, 0,
width, height,
blendFunction
);
Argomenti correlati