summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2017-07-03 15:00:21 +0200
committerTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2017-07-13 22:28:38 +0200
commita3c9704f4c0cf2a0c6a4982bfb8124af63a506b0 (patch)
treea373b29b77e127121d54b65b5c5c407b923267c9
parent1e13a4098887b225ddf47c14be98f3cd2c48dec4 (diff)
tdf#106990 set cleartype setting / force to use GDI render mode
With this we read the system setting for cleartype and set it to the render target we are using. Additionally we set the GDI like rendering mode which forces that the text is rendered similar as this was done with GDI. Change-Id: If6fb72bc371accf50278c968c94e625aee3f0953 Reviewed-on: https://gerrit.libreoffice.org/39602 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r--vcl/inc/win/winlayout.hxx14
-rw-r--r--vcl/win/gdi/winlayout.cxx74
2 files changed, 85 insertions, 3 deletions
diff --git a/vcl/inc/win/winlayout.hxx b/vcl/inc/win/winlayout.hxx
index d733e185d59d..61ecfdf8c8d8 100644
--- a/vcl/inc/win/winlayout.hxx
+++ b/vcl/inc/win/winlayout.hxx
@@ -432,6 +432,13 @@ public:
Point* pPos, int* pGetNextGlypInfo) override;
};
+enum class D2DTextAntiAliasMode
+{
+ Default,
+ ClearType,
+ AntiAliased,
+};
+
class D2DWriteTextOutRenderer : public TextOutRenderer
{
typedef HRESULT(WINAPI *pD2D1CreateFactory_t)(D2D1_FACTORY_TYPE,
@@ -481,6 +488,11 @@ public:
inline bool Ready() const { return mpGdiInterop && mpRT; }
+ void applyTextAntiAliasMode();
+ void setTextAntiAliasMode(D2DTextAntiAliasMode eMode)
+ {
+ meTextAntiAliasMode = eMode;
+ }
private:
static void CleanupModules();
@@ -500,6 +512,8 @@ private:
IDWriteFontFace * mpFontFace;
float mlfEmHeight;
HDC mhDC;
+ D2DTextAntiAliasMode meTextAntiAliasMode;
+ IDWriteRenderingParams* mpRenderingParameters;
};
#endif // INCLUDED_VCL_INC_WIN_WINLAYOUT_HXX
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 18c17b02abc2..5377a96af884 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -97,6 +97,8 @@ bool WinFontInstance::CacheGlyphToAtlas(bool bRealGlyphIndices, HDC hDC, HFONT h
if (!pTxt)
return false;
+ pTxt->setTextAntiAliasMode(D2DTextAntiAliasMode::AntiAliased);
+
if (!pTxt->BindFont(aHDC.get()))
{
SAL_WARN("vcl.gdi", "Binding of font failed. The font might not be supported by Direct Write.");
@@ -212,6 +214,7 @@ bool WinFontInstance::CacheGlyphToAtlas(bool bRealGlyphIndices, HDC hDC, HFONT h
};
pRT->BeginDraw();
+ pTxt->applyTextAntiAliasMode();
pRT->DrawGlyphRun(baseline, &glyphs, pBrush);
HRESULT hResult = pRT->EndDraw();
@@ -3154,6 +3157,47 @@ bool ExTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
}
return (pRectToErase && nGlyphs >= 1);
}
+namespace
+{
+
+D2DTextAntiAliasMode lclGetSystemTextAntiAliasMode()
+{
+ D2DTextAntiAliasMode eMode = D2DTextAntiAliasMode::Default;
+
+ BOOL bFontSmoothing;
+ if (!SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &bFontSmoothing, 0))
+ return eMode;
+
+ if (bFontSmoothing)
+ {
+ UINT nType;
+ if (!SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &nType, 0))
+ return eMode;
+
+ eMode = (nType == FE_FONTSMOOTHINGCLEARTYPE) ? D2DTextAntiAliasMode::ClearType
+ : D2DTextAntiAliasMode::AntiAliased;
+ }
+
+ return eMode;
+}
+
+IDWriteRenderingParams* lclSetRenderingMode(IDWriteFactory* pDWriteFactory, DWRITE_RENDERING_MODE eRenderingMode)
+{
+ IDWriteRenderingParams* pDefaultParameters = nullptr;
+ pDWriteFactory->CreateRenderingParams(&pDefaultParameters);
+
+ IDWriteRenderingParams* pParameters = nullptr;
+ pDWriteFactory->CreateCustomRenderingParams(
+ pDefaultParameters->GetGamma(),
+ pDefaultParameters->GetEnhancedContrast(),
+ pDefaultParameters->GetClearTypeLevel(),
+ pDefaultParameters->GetPixelGeometry(),
+ eRenderingMode,
+ &pParameters);
+ return pParameters;
+}
+
+} // end anonymous namespace
D2DWriteTextOutRenderer::D2DWriteTextOutRenderer()
: mpD2DFactory(nullptr),
@@ -3161,11 +3205,12 @@ D2DWriteTextOutRenderer::D2DWriteTextOutRenderer()
mpGdiInterop(nullptr),
mpRT(nullptr),
mRTProps(D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT,
- D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
- 0, 0)),
+ D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
+ 0, 0)),
mpFontFace(nullptr),
mlfEmHeight(0.0f),
- mhDC(nullptr)
+ mhDC(nullptr),
+ meTextAntiAliasMode(D2DTextAntiAliasMode::Default)
{
HRESULT hr = S_OK;
hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof(ID2D1Factory), nullptr, reinterpret_cast<void **>(&mpD2DFactory));
@@ -3175,6 +3220,8 @@ D2DWriteTextOutRenderer::D2DWriteTextOutRenderer()
hr = mpDWriteFactory->GetGdiInterop(&mpGdiInterop);
hr = CreateRenderTarget();
}
+ meTextAntiAliasMode = lclGetSystemTextAntiAliasMode();
+ mpRenderingParameters = lclSetRenderingMode(mpDWriteFactory, DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC);
}
D2DWriteTextOutRenderer::~D2DWriteTextOutRenderer()
@@ -3190,6 +3237,26 @@ D2DWriteTextOutRenderer::~D2DWriteTextOutRenderer()
CleanupModules();
}
+void D2DWriteTextOutRenderer::applyTextAntiAliasMode()
+{
+ D2D1_TEXT_ANTIALIAS_MODE eMode = D2D1_TEXT_ANTIALIAS_MODE_DEFAULT;
+ switch (meTextAntiAliasMode)
+ {
+ case D2DTextAntiAliasMode::Default:
+ eMode = D2D1_TEXT_ANTIALIAS_MODE_ALIASED;
+ break;
+ case D2DTextAntiAliasMode::AntiAliased:
+ eMode = D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE;
+ break;
+ case D2DTextAntiAliasMode::ClearType:
+ eMode = D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE;
+ break;
+ default:
+ break;
+ }
+ mpRT->SetTextAntialiasMode(eMode);
+ mpRT->SetTextRenderingParams(mpRenderingParameters);
+}
bool D2DWriteTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
const Rectangle* pRectToErase,
@@ -3237,6 +3304,7 @@ bool D2DWriteTextOutRenderer::operator ()(SalLayout const &rLayout, HDC hDC,
}
mpRT->BeginDraw();
+ applyTextAntiAliasMode();
D2D1_MATRIX_3X2_F aOrigTrans, aRotTrans;
mpRT->GetTransform(&aOrigTrans);