Pemrosesan DirectWrite
Opsi Penyajian
Teks dengan pemformatan yang dijelaskan hanya oleh objek IDWriteTextFormat dapat dirender dengan Direct2D, namun, ada beberapa opsi lagi untuk merender objek IDWriteTextLayout.
String yang dijelaskan oleh objekIDWriteTextLayoutdapat dirender menggunakan metode di bawah ini.
1. Render menggunakan Direct2D
Untuk merender objek IDWriteTextLayout menggunakan Direct2D, gunakan metode ID2D1RenderTarget::DrawTextLayout, seperti yang ditunjukkan dalam kode berikut.
pRT_->DrawTextLayout(
origin,
pTextLayout_,
pBlackBrush_
);
Untuk tinjauan yang lebih mendalam tentang menggambar objek IDWriteTextLayout menggunakan Direct2D , lihat Memulai dengan DirectWrite .
2. Render menggunakan perender teks kustom.
Anda merender dengan perenderan kustom dengan menggunakan metodeIDWriteTextLayout::Draw, yang menerima antarmuka panggilan balik berasal dari IDWriteTextRenderer sebagai argumen, seperti yang ditunjukkan dalam kode berikut.
// Draw the text layout using DirectWrite and the CustomTextRenderer class.
hr = pTextLayout_->Draw(
NULL,
pTextRenderer_, // Custom text renderer.
origin.x,
origin.y
);
Metode IDWriteTextLayout::Draw memanggil metode panggilan balik perender kustom yang Anda berikan. DrawGlyphRun, DrawUnderline, DrawInlineObject, dan metode DrawStrikethrough melakukan fungsi menggambar.
IDWriteTextRenderer mendeklarasikan metode untuk menggambar glyph run, garis bawah, coret, dan objek inline. Terserah aplikasi untuk menerapkan metode ini. Membuat perender teks kustom memungkinkan aplikasi menerapkan efek tambahan saat merender teks, seperti isi atau kerangka kustom. Contoh perender teks kustom disertakan dalam DirectWrite Hello World Sample.
3. Render ClearType ke dalam permukaan GDI.
Penyajian ke permukaan GDI sebenarnya adalah contoh penggunaan perender teks kustom. Namun, beberapa pekerjaan dilakukan untuk Anda dalam bentuk antarmuka IDWriteBitmapRenderTarget.
Untuk membuat antarmuka ini, gunakan metodeIDWriteGdiInterop::CreateBitmapRenderTarget.
Metode DrawGlyphRun dari perender teks kustom Anda memanggil metode IDWriteBitmapRenderTarget::DrawGlyphRun untuk menggambar huruf. Penyajian objek garis bawah, coretan, dan sebaris harus dilakukan oleh perender kustom Anda.
Antarmuka IDWriteBitmapRenderTarget merender ke konteks perangkat (DC) di dalam memori. Anda mendapatkan penunjuk ke DC ini dengan menggunakan metode IDWriteBitmapRenderTarget::GetMemoryDC .
memoryHdc = g_pBitmapRenderTarget->GetMemoryDC();
Setelah penggambaran dilakukan, DC memori objek IDWriteBitmapRenderTarget harus disalin ke surface GDI tujuan.
Nota
Anda juga memiliki opsi untuk mentransfer bitmap ke jenis permukaan lain, seperti permukaan GDI+.
// Transfer from DWrite's rendering target to the window.
BitBlt(
hdc,
0, 0,
size.cx, size.cy,
memoryHdc,
0, 0,
SRCCOPY | NOMIRRORBITMAP
);
Nota
Aplikasi Anda memiliki tanggung jawab untuk merender semuanya ke jendela pada akhirnya. Ini termasuk teks dan grafik. Ada penalti kinerja untuk ini. Selain itu, rendering ke memori DC tidak didukung percepatan perangkat keras GDI.
Untuk gambaran umum yang lebih rinci tentang interoperabilitas dengan GDI, lihat Mengoperasikan dengan GDI.
4. Render teks skala abu-abu secara transparan ke permukaan GDI. (Windows 8 dan yang lebih baru)
Mulai dari Windows 8, Anda dapat merender teks skala abu-abu secara transparan ke permukaan GDI untuk performa yang lebih baik. Untuk melakukan ini, Anda perlu:
- Bersihkan DC memori ke kondisi transparan.
- Render teks ke HDC memori menggunakan antialias skala abu-abu (DWRITE_TEXT_ANTIALIAS_MODE_GRAYSCALE).
- Gunakan fungsiAlphaBlend untuk merender memori HDC secara transparan di atas HDC target akhir.
- Ulangi sebanyak yang diperlukan (katakanlah, sekali per eksekusi glyph) dan di antara grafik lain dapat dirender langsung ke HDC target akhir tanpa ditimpa oleh fungsi 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
);
Topik terkait
-
Render Menggunakan Direct2D
-
Merender Menggunakan Perender Teks Kustom