diff options
-rw-r--r-- | doc/ScintillaHistory.html | 6 | ||||
-rw-r--r-- | win32/PlatWin.cxx | 44 |
2 files changed, 49 insertions, 1 deletions
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 @@ <a href="http://sourceforge.net/p/scintilla/bugs/1538/">Bug #1538</a>. </li> <li> + 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. + <a href="http://sourceforge.net/p/scintilla/feature-requests/887/">Feature #887.</a> + </li> + <li> When scroll width is tracked, take width of annotation lines into account. </li> <li> 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<IUnknown**>(&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<FLOAT>(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(); |