我有一个重要的预先存在的 GDI+ 代码主体,用本机 C++ 编写,其中包括在其上绘制文本和位图的透明层。这些层(使用具有自己的 GDI+ 图形的内存 DC 实现)随后在呈现到屏幕之前进行组合。
我对文本元素不太满意,因为 GDI+ 不允许单个文本运行具有多种画笔颜色,因此我必须将不同颜色绘制为单独运行的文本,彼此相邻。连接单独的文本运行很麻烦,因为相邻运行之间的字距调整等与不同颜色的连续单个运行不同。
切入正题,探索 DirectWrite 所提供的功能似乎是个好主意,因此我尝试复制 DirectWrite 中的一些现有功能。最具体地说,将文本呈现为透明位图。
这就是它变得困难的地方:我无法让 DirectWrite 文本在包含 alpha 的背景上呈现而不会出现抗锯齿问题(因为前景文本像素应该淡化为透明,而是淡化为黑色)。我的文字看起来像这篇文章中的示例。
MS 文档和这方面的示例有点薄,到目前为止,没有多少谷歌搜索/stackoverflow 搜索显示出任何重要的亮点。
我的代码包括以下 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;
看起来我需要回退到灰度抗锯齿,但我很挣扎。请有人:
- 解释灰度抗锯齿应该做什么,以及它是否适用于透明位图渲染目标;和
- 给我一些关于如何让灰度抗锯齿工作的建议?