diff options
Diffstat (limited to 'win32/PlatWin.cxx')
| -rw-r--r-- | win32/PlatWin.cxx | 44 | 
1 files changed, 43 insertions, 1 deletions
| 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(); | 
