mirror of
				https://github.com/chibicitiberiu/rainmeter-studio.git
				synced 2024-02-24 04:33:31 +00:00 
			
		
		
		
	Gfx: Move DWrite helpers to Util
This commit is contained in:
		@@ -18,6 +18,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "TextFormatD2D.h"
 | 
					#include "TextFormatD2D.h"
 | 
				
			||||||
#include "CanvasD2D.h"
 | 
					#include "CanvasD2D.h"
 | 
				
			||||||
 | 
					#include "Util/DWriteHelpers.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Gfx {
 | 
					namespace Gfx {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -103,9 +104,9 @@ void TextFormatD2D::SetProperties(
 | 
				
			|||||||
	DWRITE_FONT_WEIGHT dwFontWeight;
 | 
						DWRITE_FONT_WEIGHT dwFontWeight;
 | 
				
			||||||
	DWRITE_FONT_STYLE dwFontStyle;
 | 
						DWRITE_FONT_STYLE dwFontStyle;
 | 
				
			||||||
	DWRITE_FONT_STRETCH dwFontStretch;
 | 
						DWRITE_FONT_STRETCH dwFontStretch;
 | 
				
			||||||
	if (GetDWPropertiesFromGDIProperties(
 | 
						if (Util::GetDWritePropertiesFromGDIProperties(
 | 
				
			||||||
		fontFamily, bold, italic, dwFontWeight, dwFontStyle, dwFontStretch, dwFamilyName,
 | 
							CanvasD2D::c_DWFactory, fontFamily, bold, italic, dwFontWeight, dwFontStyle, dwFontStretch,
 | 
				
			||||||
		_countof(dwFamilyName)))
 | 
							dwFamilyName, _countof(dwFamilyName)))
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		hr = CanvasD2D::c_DWFactory->CreateTextFormat(
 | 
							hr = CanvasD2D::c_DWFactory->CreateTextFormat(
 | 
				
			||||||
			dwFamilyName,
 | 
								dwFamilyName,
 | 
				
			||||||
@@ -190,101 +191,4 @@ void TextFormatD2D::SetVerticalAlignment(VerticalAlignment alignment)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool TextFormatD2D::GetDWPropertiesFromGDIProperties(
 | 
					 | 
				
			||||||
	const WCHAR* gdiFamilyName, const bool gdiBold, const bool gdiItalic,
 | 
					 | 
				
			||||||
	DWRITE_FONT_WEIGHT& dwFontWeight, DWRITE_FONT_STYLE& dwFontStyle,
 | 
					 | 
				
			||||||
	DWRITE_FONT_STRETCH& dwFontStretch, WCHAR* dwFamilyName, UINT dwFamilyNameSize)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	bool result = false;
 | 
					 | 
				
			||||||
	IDWriteFont* dwFont = CreateDWFontFromGDIFamilyName(gdiFamilyName);
 | 
					 | 
				
			||||||
	if (dwFont)
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		if (GetFamilyNameFromDWFont(dwFont, dwFamilyName, dwFamilyNameSize))
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			dwFontWeight = dwFont->GetWeight();
 | 
					 | 
				
			||||||
			if (gdiBold)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				if (dwFontWeight == DWRITE_FONT_WEIGHT_NORMAL)
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					dwFontWeight = DWRITE_FONT_WEIGHT_BOLD;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				else if (dwFontWeight < DWRITE_FONT_WEIGHT_ULTRA_BOLD)
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					// If 'gdiFamilyName' was e.g. 'Segoe UI Light', |dwFontWeight| wil be equal to
 | 
					 | 
				
			||||||
					// DWRITE_FONT_WEIGHT_LIGHT. If |gdiBold| is true in that case, we need to
 | 
					 | 
				
			||||||
					// increase the weight a little more for similar results with GDI+.
 | 
					 | 
				
			||||||
					// TODO: Is +100 enough?
 | 
					 | 
				
			||||||
					dwFontWeight = (DWRITE_FONT_WEIGHT)(dwFontWeight + 100);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			dwFontStyle = dwFont->GetStyle();
 | 
					 | 
				
			||||||
			if (gdiItalic && dwFontStyle == DWRITE_FONT_STYLE_NORMAL)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				dwFontStyle = DWRITE_FONT_STYLE_ITALIC;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			dwFontStretch = dwFont->GetStretch();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			result = true;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dwFont->Release();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return result;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
IDWriteFont* TextFormatD2D::CreateDWFontFromGDIFamilyName(const WCHAR* fontFamily)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	IDWriteGdiInterop* dwGdiInterop;
 | 
					 | 
				
			||||||
	HRESULT hr = CanvasD2D::c_DWFactory->GetGdiInterop(&dwGdiInterop);
 | 
					 | 
				
			||||||
	if (SUCCEEDED(hr))
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		LOGFONT lf = {};
 | 
					 | 
				
			||||||
		wcscpy_s(lf.lfFaceName, fontFamily);
 | 
					 | 
				
			||||||
		lf.lfHeight = -12;
 | 
					 | 
				
			||||||
		lf.lfWeight = FW_DONTCARE;
 | 
					 | 
				
			||||||
		lf.lfCharSet = DEFAULT_CHARSET;
 | 
					 | 
				
			||||||
		lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
 | 
					 | 
				
			||||||
		lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
 | 
					 | 
				
			||||||
		lf.lfQuality = ANTIALIASED_QUALITY;
 | 
					 | 
				
			||||||
		lf.lfPitchAndFamily = VARIABLE_PITCH;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		IDWriteFont* dwFont;
 | 
					 | 
				
			||||||
		hr = dwGdiInterop->CreateFontFromLOGFONT(&lf, &dwFont);
 | 
					 | 
				
			||||||
		if (SUCCEEDED(hr))
 | 
					 | 
				
			||||||
		{
 | 
					 | 
				
			||||||
			return dwFont;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		dwGdiInterop->Release();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nullptr;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool TextFormatD2D::GetFamilyNameFromDWFont(IDWriteFont* font, WCHAR* buffer, const UINT bufferSize)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	IDWriteFontFamily* dwFontFamily;
 | 
					 | 
				
			||||||
	HRESULT hr = font->GetFontFamily(&dwFontFamily);
 | 
					 | 
				
			||||||
	return SUCCEEDED(hr) ? GetFamilyNameFromDWFontFamily(dwFontFamily, buffer, bufferSize) : false;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool TextFormatD2D::GetFamilyNameFromDWFontFamily(IDWriteFontFamily* fontFamily, WCHAR* buffer, const UINT bufferSize)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	bool result = false;
 | 
					 | 
				
			||||||
	IDWriteLocalizedStrings* dwFamilyNames;
 | 
					 | 
				
			||||||
	HRESULT hr = fontFamily->GetFamilyNames(&dwFamilyNames);
 | 
					 | 
				
			||||||
	if (SUCCEEDED(hr))
 | 
					 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		// TODO: Determine the best index?
 | 
					 | 
				
			||||||
		hr = dwFamilyNames->GetString(0, buffer, bufferSize);
 | 
					 | 
				
			||||||
		result = SUCCEEDED(hr);
 | 
					 | 
				
			||||||
		dwFamilyNames->Release();
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return result;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}  // namespace Gfx
 | 
					}  // namespace Gfx
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,22 +55,6 @@ private:
 | 
				
			|||||||
	// changes.
 | 
						// changes.
 | 
				
			||||||
	void CreateLayout(const WCHAR* str, UINT strLen, float maxW, float maxH);
 | 
						void CreateLayout(const WCHAR* str, UINT strLen, float maxW, float maxH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Maps the GDI family name and italic/bold flags to the DirectWrite family name, weight, style,
 | 
					 | 
				
			||||||
	// and stretch.
 | 
					 | 
				
			||||||
	static bool GetDWPropertiesFromGDIProperties(
 | 
					 | 
				
			||||||
		const WCHAR* gdiFamilyName, const bool gdiBold, const bool gdiItalic,
 | 
					 | 
				
			||||||
		DWRITE_FONT_WEIGHT& dwFontWeight, DWRITE_FONT_STYLE& dwFontStyle,
 | 
					 | 
				
			||||||
		DWRITE_FONT_STRETCH& dwFontStretch, WCHAR* dwFamilyName, UINT dwFamilyNameSize);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Creates a IDWriteFont using the GDI family name instead of the DirectWrite family name. For
 | 
					 | 
				
			||||||
	// example, 'Segoe UI' and 'Segoe UI Semibold' are separate family names with GDI whereas
 | 
					 | 
				
			||||||
	// DirectWrite uses the family name 'Segoe UI' for both and differentiates them by the font
 | 
					 | 
				
			||||||
	// style.
 | 
					 | 
				
			||||||
	static IDWriteFont* CreateDWFontFromGDIFamilyName(const WCHAR* fontFamily);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	static bool GetFamilyNameFromDWFont(IDWriteFont* font, WCHAR* buffer, UINT bufferSize);
 | 
					 | 
				
			||||||
	static bool GetFamilyNameFromDWFontFamily(IDWriteFontFamily* fontFamily, WCHAR* buffer, UINT bufferSize);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	IDWriteTextFormat* m_TextFormat;
 | 
						IDWriteTextFormat* m_TextFormat;
 | 
				
			||||||
	IDWriteTextLayout* m_TextLayout;
 | 
						IDWriteTextLayout* m_TextLayout;
 | 
				
			||||||
	IDWriteInlineObject* m_InlineEllipsis;
 | 
						IDWriteInlineObject* m_InlineEllipsis;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user