Визуализация текста DirectWrite на прозрачном GDI+ DC

У меня есть существующее существующее тело кода GDI+, написанное на нативном C++, которое включает в себя прозрачные слои, на которых рисуется текст и растровые изображения. Слои (реализованные с использованием DC памяти с их собственной графикой GDI+) впоследствии объединяются, прежде чем они будут представлены на экране.

Я не очень доволен текстовыми элементами, поскольку GDI+ не позволяет отдельным наборам текста иметь несколько цветов кисти, и, следовательно, мне приходится рисовать разные цвета в виде отдельных отрезков текста рядом друг с другом. Объединение отдельных текстовых прогонов является грязным, потому что кернинг и т. Д. Между соседними прогонами не совпадают, как если бы это был непрерывный одиночный прогон разных цветов.

Если говорить о погоне, то было неплохо изучить возможности DirectWrite, поэтому я пытаюсь воспроизвести некоторые из существующих функций DirectWrite. В частности, рендеринг текста в прозрачные растровые изображения.

Вот тут-то и получилось: я не могу заставить текст DirectWrite отображать на фоне, включающем альфа, без сглаживания (неправильно сглаживаются пиксели текста на переднем плане, вместо этого они становятся черными). Мой текст выглядит как пример в этом посте.

Документация MS и примеры по этому вопросу немного тонкие, и никакие поиски в Google и поиск через стек не пролили сколько-нибудь существенного света.

Мой код включает в себя следующие кусочки 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,&params);
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;

Похоже, мне нужно вернуться к сглаживанию в градациях серого, но я изо всех сил. Пожалуйста, будет кто-то:

  • Объясните, что должно делать сглаживание в оттенках серого и работает ли оно с прозрачными точками рендеринга растрового изображения; а также
  • Дайте мне несколько советов о том, как заставить работать сглаживание в оттенках серого?

0 ответов

Другие вопросы по тегам