我有一个重要的预先存在的GDI +代码体,用本机C ++编写,其中包括绘制文本和位图的透明层。这些层(使用具有自己的GDI +图形的存储器DC实现)随后在呈现给屏幕之前被组合。
我对文本元素并不满意,因为GDI +不允许单行文本具有多种画笔颜色,因此我必须将不同的颜色绘制为单独的文本运行,彼此相邻。连接单独的文本运行是很糟糕的,因为相邻运行之间的字距调整等与不同颜色的连续单次运行不一样。
切入追逐,探索DirectWrite提供的内容似乎是一个好主意,所以我试图复制DirectWrite中的一些现有功能。最具体地说,将文本呈现为透明位图。
这就是它变得艰难的地方:我不能让DirectWrite文本在包含alpha的背景上渲染而不会出现抗锯齿错误(因为前景文本像素应淡入透明,然后淡化为黑色)。我的文字看起来像示例in this post。
关于这方面的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;
看起来我需要回到灰度抗锯齿,但我正在努力。请某人: