diff options
Diffstat (limited to 'win32/PlatWin.cxx')
-rw-r--r-- | win32/PlatWin.cxx | 53 |
1 files changed, 20 insertions, 33 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 3d8595b1d..af1e41b5f 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -72,8 +72,6 @@ UINT CodePageFromCharSet(CharacterSet characterSet, UINT documentCodePage) noexc #if defined(USE_D2D) IDWriteFactory *pIDWriteFactory = nullptr; ID2D1Factory *pD2DFactory = nullptr; -IDWriteRenderingParams *defaultRenderingParams = nullptr; -IDWriteRenderingParams *customClearTypeRenderingParams = nullptr; D2D1_DRAW_TEXT_OPTIONS d2dDrawTextOptions = D2D1_DRAW_TEXT_OPTIONS_NONE; static HMODULE hDLLD2D {}; @@ -123,24 +121,6 @@ void LoadD2DOnce() noexcept { reinterpret_cast<IUnknown**>(&pIDWriteFactory)); } } - - if (pIDWriteFactory) { - const HRESULT hr = pIDWriteFactory->CreateRenderingParams(&defaultRenderingParams); - if (SUCCEEDED(hr)) { - unsigned int clearTypeContrast = 0; - if (::SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &clearTypeContrast, 0)) { - - FLOAT gamma; - if (clearTypeContrast >= 1000 && clearTypeContrast <= 2200) - gamma = static_cast<FLOAT>(clearTypeContrast) / 1000.0f; - else - gamma = defaultRenderingParams->GetGamma(); - - pIDWriteFactory->CreateCustomRenderingParams(gamma, defaultRenderingParams->GetEnhancedContrast(), defaultRenderingParams->GetClearTypeLevel(), - defaultRenderingParams->GetPixelGeometry(), defaultRenderingParams->GetRenderingMode(), &customClearTypeRenderingParams); - } - } - } } bool LoadD2D() { @@ -1294,7 +1274,7 @@ constexpr D2D1_RECT_F RectangleInset(D2D1_RECT_F rect, FLOAT inset) noexcept { class BlobInline; -class SurfaceD2D : public Surface { +class SurfaceD2D : public Surface, public ISetRenderingParams { SurfaceMode mode; ID2D1RenderTarget *pRenderTarget = nullptr; @@ -1304,8 +1284,10 @@ class SurfaceD2D : public Surface { ID2D1SolidColorBrush *pBrush = nullptr; - FontQuality fontQuality = FontQuality::QualityMask; + static constexpr FontQuality invalidFontQuality = FontQuality::QualityMask; + FontQuality fontQuality = invalidFontQuality; int logPixelsY = USER_DEFAULT_SCREEN_DPI; + std::shared_ptr<RenderingParams> renderingParams; void Clear() noexcept; void SetFontQuality(FontQuality extraFontFlag); @@ -1379,6 +1361,8 @@ public: void PopClip() override; void FlushCachedState() override; void FlushDrawing() override; + + void SetRenderingParams(std::shared_ptr<RenderingParams> renderingParams_) override; }; SurfaceD2D::SurfaceD2D() noexcept { @@ -1430,7 +1414,7 @@ void SurfaceD2D::Release() noexcept { } void SurfaceD2D::SetScale(WindowID wid) noexcept { - fontQuality = FontQuality::QualityMask; + fontQuality = invalidFontQuality; logPixelsY = DpiForWindow(wid); } @@ -1458,7 +1442,9 @@ void SurfaceD2D::Init(SurfaceID sid, WindowID wid) { } std::unique_ptr<Surface> SurfaceD2D::AllocatePixMap(int width, int height) { - return std::make_unique<SurfaceD2D>(pRenderTarget, width, height, mode, logPixelsY); + std::unique_ptr<SurfaceD2D> surf = std::make_unique<SurfaceD2D>(pRenderTarget, width, height, mode, logPixelsY); + surf->SetRenderingParams(renderingParams); + return surf; } void SurfaceD2D::SetMode(SurfaceMode mode_) { @@ -1485,15 +1471,14 @@ void SurfaceD2D::D2DPenColourAlpha(ColourRGBA fore) noexcept { } void SurfaceD2D::SetFontQuality(FontQuality extraFontFlag) { - if (fontQuality != extraFontFlag) { + if ((fontQuality != extraFontFlag) && renderingParams) { fontQuality = extraFontFlag; const D2D1_TEXT_ANTIALIAS_MODE aaMode = DWriteMapFontQuality(extraFontFlag); - - if (aaMode == D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE && customClearTypeRenderingParams) - pRenderTarget->SetTextRenderingParams(customClearTypeRenderingParams); - else if (defaultRenderingParams) - pRenderTarget->SetTextRenderingParams(defaultRenderingParams); - + if (aaMode == D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE && renderingParams->customRenderingParams) { + pRenderTarget->SetTextRenderingParams(renderingParams->customRenderingParams.get()); + } else if (renderingParams->defaultRenderingParams) { + pRenderTarget->SetTextRenderingParams(renderingParams->defaultRenderingParams.get()); + } pRenderTarget->SetTextAntialiasMode(aaMode); } } @@ -2629,6 +2614,10 @@ void SurfaceD2D::FlushDrawing() { } } +void SurfaceD2D::SetRenderingParams(std::shared_ptr<RenderingParams> renderingParams_) { + renderingParams = renderingParams_; +} + #endif std::unique_ptr<Surface> Surface::Allocate(Technology technology) { @@ -3863,8 +3852,6 @@ void Platform_Initialise(void *hInstance) noexcept { void Platform_Finalise(bool fromDllMain) noexcept { #if defined(USE_D2D) if (!fromDllMain) { - ReleaseUnknown(defaultRenderingParams); - ReleaseUnknown(customClearTypeRenderingParams); ReleaseUnknown(pIDWriteFactory); ReleaseUnknown(pD2DFactory); if (hDLLDWrite) { |