From 4b3344ecf4e02df4ad1530e4b46d477457d73f95 Mon Sep 17 00:00:00 2001 From: nyamatongwe Date: Wed, 10 Aug 2011 11:08:32 +1000 Subject: Implemented text quality parameter. --- win32/PlatWin.cxx | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'win32') diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 5726e6fb2..8a198eb4b 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -237,14 +237,16 @@ bool LoadD2D() { struct FormatAndMetrics { IDWriteTextFormat *pTextFormat; + int extraFontFlag; FLOAT yAscent; FLOAT yDescent; - FormatAndMetrics(IDWriteTextFormat *pTextFormat_, FLOAT yAscent_, FLOAT yDescent_) : - pTextFormat(pTextFormat_), yAscent(yAscent_), yDescent(yDescent_) { + FormatAndMetrics(IDWriteTextFormat *pTextFormat_, int extraFontFlag_, FLOAT yAscent_, FLOAT yDescent_) : + pTextFormat(pTextFormat_), extraFontFlag(extraFontFlag_), yAscent(yAscent_), yDescent(yDescent_) { } ~FormatAndMetrics() { pTextFormat->Release(); pTextFormat = 0; + extraFontFlag = 0; yAscent = 2; yDescent = 1; } @@ -286,6 +288,23 @@ static BYTE Win32MapFontQuality(int extraFontFlag) { } } +static D2D1_TEXT_ANTIALIAS_MODE DWriteMapFontQuality(int extraFontFlag) { + switch (extraFontFlag & SC_EFF_QUALITY_MASK) { + + case SC_EFF_QUALITY_NON_ANTIALIASED: + return D2D1_TEXT_ANTIALIAS_MODE_ALIASED; + + case SC_EFF_QUALITY_ANTIALIASED: + return D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE; + + case SC_EFF_QUALITY_LCD_OPTIMIZED: + return D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE; + + default: + return D2D1_TEXT_ANTIALIAS_MODE_DEFAULT; + } +} + static void SetLogFont(LOGFONTA &lf, const char *faceName, int characterSet, float size, int weight, bool italic, int extraFontFlag) { memset(&lf, 0, sizeof(lf)); // The negative is to allow for leading @@ -366,7 +385,7 @@ FontCached::FontCached(const char *faceName_, int characterSet_, float size_, in } pTextLayout->Release(); } - fid = reinterpret_cast(new FormatAndMetrics(pTextFormat, yAscent, yDescent)); + fid = reinterpret_cast(new FormatAndMetrics(pTextFormat, extraFontFlag_, yAscent, yDescent)); } } usage = 1; @@ -669,6 +688,9 @@ void SurfaceImpl::SetFont(Font &font_) { pTextFormat = pfabl->pTextFormat; yAscent = pfabl->yAscent; yDescent = pfabl->yDescent; + if (pRenderTarget) { + pRenderTarget->SetTextAntialiasMode(DWriteMapFontQuality(pfabl->extraFontFlag)); + } } int SurfaceImpl::LogPixelsY() { @@ -950,8 +972,6 @@ void SurfaceImpl::DrawTextCommon(PRectangle rc, Font &font_, XYPOSITION ybase, c IDWriteTextLayout *pTextLayout; HRESULT hr = pIDWriteFactory->CreateTextLayout(tbuf.buffer, tbuf.tlen, pTextFormat, rc.Width(), rc.Height(), &pTextLayout); - // Could be an option for SC_EFF_QUALITY_ANTIALIASED: - //pRenderTarget->SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE); if (SUCCEEDED(hr)) { D2D1_POINT_2F origin = {rc.left, ybase-yAscent}; pRenderTarget->DrawTextLayout(origin, pTextLayout, pBrush, D2D1_DRAW_TEXT_OPTIONS_NONE); -- cgit v1.2.3