ネイティブC++で記述されたGDI+コードの重要な既存の本体があります。これには、テキストとビットマップが描画される透明なレイヤーが含まれています。レイヤー(独自のGDI +グラフィックスを備えたメモリDCを使用して実装)は、画面に表示される前に結合されます。
GDI +ではテキストの単一の実行で複数のブラシの色を使用できないため、テキスト要素にそれほど満足していません。したがって、異なる色を別々のテキストの実行として隣り合わせに描画する必要があります。隣接するラン間のカーニングなどは、異なる色の連続した単一のランであるかのように同じではないため、別々のテキストランを連結するのは厄介です。
追いかけっこをして、DirectWriteが提供するものを探求するのは良い考えのように思えたので、DirectWriteの既存の機能のいくつかを複製しようとしています。最も具体的には、テキストを透明なビットマップにレンダリングします。
これが困難な点です。アンチエイリアシングがうまくいかずに、DirectWriteテキストをアルファを含む背景でレンダリングすることはできません(前景のテキストピクセルは透明にフェードする必要があるため、代わりに黒にフェードします)。私のテキストはこの投稿の例のように見えます。
これに関するMSのドキュメントと例は少し薄いです、そしてグーグル/スタックオーバーフロー検索の量はこれまでのところ重要な光を照らしていません。
私のコードには、DirectWriteのものの次のビットが含まれています。
// create a Text Layout object
IDWriteTextLayout *textLayout = NULL;
DWFactory->CreateTextLayout(wcstring,length,textFormat,width,height,&textLayout);
// create the render target using the label DC
HDC hdc = NULL;
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,
D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,D2D1_ALPHA_MODE_PREMULTIPLIED),
0,0,D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE,D2D1_FEATURE_LEVEL_DEFAULT);
D2DFactory->CreateDCRenderTarget(&props, &D2DRT);
hdc = myGraphics->GetHDC();
RECT dwrect = {0,0,size.w,size.h};
D2DRT->BindDC(hdc,&dwrect);
D2DRT->SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE);
// set rendering parameters
IDWriteRenderingParams *oldparams = NULL;
IDWriteRenderingParams *params = NULL;
DWFactory->CreateRenderingParams(&oldparams);
DWFactory->CreateCustomRenderingParams(oldparams->GetGamma(),oldparams->GetEnhancedContrast(),0.0f,oldparams->GetPixelGeometry(),DWRITE_RENDERING_MODE_DEFAULT,¶ms);
D2DRT->SetTextRenderingParams(params);
// create the brush colors
ID2D1SolidColorBrush *color = NULL;
D2DRT->CreateSolidColorBrush(<some ColorF>,&color);
// render the text
D2DRT->BeginDraw();
D2DRT->DrawTextLayout(origin,textLayout,color);
D2DRT->EndDraw();
myGraphics->ReleaseHDC(hdc);
hdc = NULL;
グレースケールのアンチエイリアスにフォールバックする必要があるようですが、苦労しています。誰かお願いします:
- グレースケールアンチエイリアシングが何をするのか、そしてそれが透明なビットマップレンダリングターゲットで機能するかどうかを説明します。と
- グレースケールアンチエイリアスを機能させる方法についてのヒントを教えてください。