aboutsummaryrefslogtreecommitdiffhomepage
path: root/win32/ScintillaWin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win32/ScintillaWin.cxx')
-rw-r--r--win32/ScintillaWin.cxx73
1 files changed, 71 insertions, 2 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index 7bb8d43db..52473bfa6 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -318,6 +318,9 @@ class ScintillaWin :
#if defined(USE_D2D)
ID2D1RenderTarget *pRenderTarget;
bool renderTargetValid;
+ // rendering parameters for current monitor
+ HMONITOR hCurrentMonitor;
+ std::shared_ptr<RenderingParams> renderingParams;
#endif
explicit ScintillaWin(HWND hwnd);
@@ -330,6 +333,7 @@ class ScintillaWin :
void Finalise() override;
#if defined(USE_D2D)
+ bool UpdateRenderingParams(bool force) noexcept;
void EnsureRenderTarget(HDC hdc);
#endif
void DropRenderTarget() noexcept;
@@ -354,6 +358,8 @@ class ScintillaWin :
Sci::Position TargetAsUTF8(char *text) const;
Sci::Position EncodedFromUTF8(const char *utf8, char *encoded) const;
+ void SetRenderingParams(Surface *psurf) const;
+
bool PaintDC(HDC hdc);
sptr_t WndPaint();
@@ -533,6 +539,7 @@ ScintillaWin::ScintillaWin(HWND hwnd) {
#if defined(USE_D2D)
pRenderTarget = nullptr;
renderTargetValid = true;
+ hCurrentMonitor = {};
#endif
caret.period = ::GetCaretBlinkTime();
@@ -577,6 +584,38 @@ void ScintillaWin::Finalise() {
#if defined(USE_D2D)
+bool ScintillaWin::UpdateRenderingParams(bool force) noexcept {
+ if (!renderingParams) {
+ renderingParams = std::make_shared<RenderingParams>();
+ }
+ HMONITOR monitor = ::MonitorFromWindow(MainHWND(), MONITOR_DEFAULTTONEAREST);
+ if (!force && monitor == hCurrentMonitor && renderingParams->defaultRenderingParams) {
+ return false;
+ }
+
+ IDWriteRenderingParams *monitorRenderingParams = nullptr;
+ IDWriteRenderingParams *customClearTypeRenderingParams = nullptr;
+ const HRESULT hr = pIDWriteFactory->CreateMonitorRenderingParams(monitor, &monitorRenderingParams);
+ UINT clearTypeContrast = 0;
+ if (SUCCEEDED(hr) && ::SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &clearTypeContrast, 0) != 0) {
+ if (clearTypeContrast >= 1000 && clearTypeContrast <= 2200) {
+ const FLOAT gamma = static_cast<FLOAT>(clearTypeContrast) / 1000.0f;
+ pIDWriteFactory->CreateCustomRenderingParams(gamma,
+ monitorRenderingParams->GetEnhancedContrast(),
+ monitorRenderingParams->GetClearTypeLevel(),
+ monitorRenderingParams->GetPixelGeometry(),
+ monitorRenderingParams->GetRenderingMode(),
+ &customClearTypeRenderingParams);
+ }
+ }
+
+ hCurrentMonitor = monitor;
+ renderingParams->defaultRenderingParams.reset(monitorRenderingParams);
+ renderingParams->customRenderingParams.reset(customClearTypeRenderingParams);
+ return true;
+}
+
+
void ScintillaWin::EnsureRenderTarget(HDC hdc) {
if (!renderTargetValid) {
DropRenderTarget();
@@ -646,7 +685,6 @@ void ScintillaWin::EnsureRenderTarget(HDC hdc) {
}
#endif
-
void ScintillaWin::DropRenderTarget() noexcept {
#if defined(USE_D2D)
ReleaseUnknown(pRenderTarget);
@@ -873,6 +911,17 @@ Sci::Position ScintillaWin::EncodedFromUTF8(const char *utf8, char *encoded) con
}
}
+void ScintillaWin::SetRenderingParams([[maybe_unused]] Surface *psurf) const {
+#if defined(USE_D2D)
+ if (psurf) {
+ ISetRenderingParams *setDrawingParams = dynamic_cast<ISetRenderingParams *>(psurf);
+ if (setDrawingParams) {
+ setDrawingParams->SetRenderingParams(renderingParams);
+ }
+ }
+#endif
+}
+
bool ScintillaWin::PaintDC(HDC hdc) {
if (technology == Technology::Default) {
AutoSurface surfaceWindow(hdc, this);
@@ -886,6 +935,7 @@ bool ScintillaWin::PaintDC(HDC hdc) {
if (pRenderTarget) {
AutoSurface surfaceWindow(pRenderTarget, this);
if (surfaceWindow) {
+ SetRenderingParams(surfaceWindow);
pRenderTarget->BeginDraw();
Paint(surfaceWindow, rcPaint);
surfaceWindow->Release();
@@ -1824,9 +1874,11 @@ sptr_t ScintillaWin::SciMessage(Message iMessage, uptr_t wParam, sptr_t lParam)
if (technology != technologyNew) {
if (technologyNew > Technology::Default) {
#if defined(USE_D2D)
- if (!LoadD2D())
+ if (!LoadD2D()) {
// Failed to load Direct2D or DirectWrite so no effect
return 0;
+ }
+ UpdateRenderingParams(true);
#else
return 0;
#endif
@@ -1952,6 +2004,12 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) {
case WM_SETTINGCHANGE:
//Platform::DebugPrintf("Setting Changed\n");
+#if defined(USE_D2D)
+ if (technology != Technology::Default) {
+ UpdateRenderingParams(true);
+ Redraw();
+ }
+#endif
UpdateBaseElements();
InvalidateStyleData();
// Get Intellimouse scroll line parameters
@@ -2016,7 +2074,17 @@ sptr_t ScintillaWin::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) {
case WM_NCLBUTTONDOWN:
case WM_SYSCOMMAND:
case WM_WINDOWPOSCHANGING:
+ return ::DefWindowProc(MainHWND(), msg, wParam, lParam);
+
case WM_WINDOWPOSCHANGED:
+#if defined(USE_D2D)
+ if (technology != Technology::Default) {
+ if (UpdateRenderingParams(false)) {
+ DropGraphics();
+ Redraw();
+ }
+ }
+#endif
return ::DefWindowProc(MainHWND(), msg, wParam, lParam);
case WM_GETTEXTLENGTH:
@@ -3528,6 +3596,7 @@ LRESULT PASCAL ScintillaWin::CTWndProc(
#endif
}
surfaceWindow->SetMode(sciThis->CurrentSurfaceMode());
+ sciThis->SetRenderingParams(surfaceWindow.get());
sciThis->ct.PaintCT(surfaceWindow.get());
#if defined(USE_D2D)
if (pCTRenderTarget)