Отрисовка текста DirectWrite на прозрачном GDI + DC

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

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

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

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

Документация MS и примеры по этому поводу немного тонкие, и до сих пор никакие поиски в Google / 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,&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;

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

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

person StuartW    schedule 03.12.2011    source источник
comment
Разместил это на технических форумах Microsoft, обновлю здесь, если получу ответ.   -  person StuartW    schedule 05.12.2011
comment
Вы когда-нибудь догадывались об этом?   -  person Filip Skakun    schedule 26.11.2012