aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--doc/ScintillaHistory.html6
-rw-r--r--win32/PlatWin.cxx44
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();