From 8a5a8dec91164f7578f1f004794510126011a93a Mon Sep 17 00:00:00 2001 From: Neil Date: Wed, 23 Oct 2013 19:08:01 +1100 Subject: Feature [feature-requests:#887]. Apply GDI gamma to DirectWrite . From Marko Njezic. --- doc/ScintillaHistory.html | 6 ++++++ win32/PlatWin.cxx | 44 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 3f85ee14e..aaeae3572 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -466,6 +466,12 @@ Bug #1538.
  • + For DirectWrite, use the GDI ClearType gamma value for SC_EFF_QUALITY_LCD_OPTIMIZED as + this results in text that is similar in colour intensity to GDI. + For the duller default DirectWrite ClearType text appearance, use SC_EFF_QUALITY_DEFAULT. + Feature #887. +
  • +
  • When scroll width is tracked, take width of annotation lines into account.
  • diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index dd2d3da6a..da642bc67 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -44,6 +44,10 @@ #define IDC_HAND MAKEINTRESOURCE(32649) #endif +#ifndef SPI_GETFONTSMOOTHINGCONTRAST +#define SPI_GETFONTSMOOTHINGCONTRAST 0x200C +#endif + // Take care of 32/64 bit pointers #ifdef GetWindowLongPtr static void *PointerFromWindow(HWND hWnd) { @@ -124,6 +128,8 @@ static RECT RectFromPRectangle(PRectangle prc) { #if defined(USE_D2D) IDWriteFactory *pIDWriteFactory = 0; ID2D1Factory *pD2DFactory = 0; +IDWriteRenderingParams *defaultRenderingParams = 0; +IDWriteRenderingParams *customClearTypeRenderingParams = 0; bool LoadD2D() { static bool triedLoadingD2D = false; @@ -153,6 +159,24 @@ bool LoadD2D() { reinterpret_cast(&pIDWriteFactory)); } } + + if (pIDWriteFactory) { + HRESULT hr = pIDWriteFactory->CreateRenderingParams(&defaultRenderingParams); + if (SUCCEEDED(hr)) { + unsigned int clearTypeContrast; + ::SystemParametersInfo(SPI_GETFONTSMOOTHINGCONTRAST, 0, &clearTypeContrast, 0); + + FLOAT gamma; + if (clearTypeContrast >= 1000 && clearTypeContrast <= 2200) + gamma = static_cast(clearTypeContrast) / 1000.0f; + else + gamma = defaultRenderingParams->GetGamma(); + + pIDWriteFactory->CreateCustomRenderingParams(gamma, defaultRenderingParams->GetEnhancedContrast(), defaultRenderingParams->GetClearTypeLevel(), + defaultRenderingParams->GetPixelGeometry(), defaultRenderingParams->GetRenderingMode(), &customClearTypeRenderingParams); + } + } + } triedLoadingD2D = true; return pIDWriteFactory && pD2DFactory; @@ -1346,7 +1370,15 @@ void SurfaceD2D::SetFont(Font &font_) { codePageText = CodePageFromCharSet(pfm->characterSet, codePage); } if (pRenderTarget) { - pRenderTarget->SetTextAntialiasMode(DWriteMapFontQuality(pfm->extraFontFlag)); + D2D1_TEXT_ANTIALIAS_MODE aaMode; + aaMode = DWriteMapFontQuality(pfm->extraFontFlag); + + if (aaMode == D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE && customClearTypeRenderingParams) + pRenderTarget->SetTextRenderingParams(customClearTypeRenderingParams); + else if (defaultRenderingParams) + pRenderTarget->SetTextRenderingParams(defaultRenderingParams); + + pRenderTarget->SetTextAntialiasMode(aaMode); } } @@ -3245,6 +3277,16 @@ void Platform_Initialise(void *hInstance) { #endif void Platform_Finalise() { +#if defined(USE_D2D) + if (defaultRenderingParams) { + defaultRenderingParams->Release(); + defaultRenderingParams = 0; + } + if (customClearTypeRenderingParams) { + customClearTypeRenderingParams->Release(); + customClearTypeRenderingParams = 0; + } +#endif if (reverseArrowCursor != NULL) ::DestroyCursor(reverseArrowCursor); ListBoxX_Unregister(); -- cgit v1.2.3