diff options
author | Neil <nyamatongwe@gmail.com> | 2022-03-12 10:26:33 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2022-03-12 10:26:33 +1100 |
commit | 3064b730d2e912c7540a86341b0a7d1693a20690 (patch) | |
tree | 8f20614b439a669931ce64dac1156649129de8b1 /win32/PlatWin.cxx | |
parent | 73ae9e3d2ad7fddbe8945deb0647dd7597d58c0a (diff) | |
download | scintilla-mirror-3064b730d2e912c7540a86341b0a7d1693a20690.tar.gz |
Feature [feature-requests:#1432] Support per-monitor text rendering parameters
and update when changed by user.
Includes code from Zufu Liu.
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) { |