Визуализация текста DirectWrite на прозрачном GDI + DC - PullRequest
2 голосов
/ 04 декабря 2011

У меня есть существующее существующее тело кода GDI +, написанное на нативном C ++, которое включает в себя прозрачные слои, на которых рисуется текст и растровые изображения.Слои (реализованные с использованием DC памяти с их собственной графикой 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;

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

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