diff options
Diffstat (limited to 'win32/PlatWin.cxx')
| -rw-r--r-- | win32/PlatWin.cxx | 57 | 
1 files changed, 41 insertions, 16 deletions
| diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index fefd523a1..1305b3f66 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -22,6 +22,7 @@  #include "PlatformRes.h"  #include "UniConversion.h"  #include "XPM.h" +#include "FontQuality.h"  #ifndef IDC_HAND  #define IDC_HAND MAKEINTRESOURCE(32649) @@ -179,13 +180,35 @@ void Palette::Allocate(Window &) {  	}  } -static void SetLogFont(LOGFONTA &lf, const char *faceName, int characterSet, int size, bool bold, bool italic) { +#ifndef CLEARTYPE_QUALITY +#define CLEARTYPE_QUALITY 5 +#endif + +static BYTE Win32MapFontQuality(int extraFontFlag) { +	switch (extraFontFlag & SC_EFF_QUALITY_MASK) { + +		case SC_EFF_QUALITY_NON_ANTIALIASED: +			return NONANTIALIASED_QUALITY; + +		case SC_EFF_QUALITY_ANTIALIASED: +			return ANTIALIASED_QUALITY; + +		case SC_EFF_QUALITY_LCD_OPTIMIZED: +			return CLEARTYPE_QUALITY; + +		default: +			return SC_EFF_QUALITY_DEFAULT; +	} +} + +static void SetLogFont(LOGFONTA &lf, const char *faceName, int characterSet, int size, bool bold, bool italic, int extraFontFlag) {  	memset(&lf, 0, sizeof(lf));  	// The negative is to allow for leading  	lf.lfHeight = -(abs(size));  	lf.lfWeight = bold ? FW_BOLD : FW_NORMAL;  	lf.lfItalic = static_cast<BYTE>(italic ? 1 : 0);  	lf.lfCharSet = static_cast<BYTE>(characterSet); +	lf.lfQuality = Win32MapFontQuality(extraFontFlag);  	strncpy(lf.lfFaceName, faceName, sizeof(lf.lfFaceName));  } @@ -194,10 +217,11 @@ static void SetLogFont(LOGFONTA &lf, const char *faceName, int characterSet, int   * If one font is the same as another, its hash will be the same, but if the hash is the   * same then they may still be different.   */ -static int HashFont(const char *faceName, int characterSet, int size, bool bold, bool italic) { +static int HashFont(const char *faceName, int characterSet, int size, bool bold, bool italic, int extraFontFlag) {  	return  		size ^  		(characterSet << 10) ^ +		((extraFontFlag & SC_EFF_QUALITY_MASK) << 9) ^  		(bold ? 0x10000000 : 0) ^  		(italic ? 0x20000000 : 0) ^  		faceName[0]; @@ -208,33 +232,34 @@ class FontCached : Font {  	int usage;  	LOGFONTA lf;  	int hash; -	FontCached(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_); +	FontCached(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_, int extraFontFlag_);  	~FontCached() {} -	bool SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_); +	bool SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_, int extraFontFlag_);  	virtual void Release();  	static FontCached *first;  public: -	static FontID FindOrCreate(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_); +	static FontID FindOrCreate(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_, int extraFontFlag_);  	static void ReleaseId(FontID fid_);  };  FontCached *FontCached::first = 0; -FontCached::FontCached(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) : +FontCached::FontCached(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_, int extraFontFlag_) :  	next(0), usage(0), hash(0) { -	SetLogFont(lf, faceName_, characterSet_, size_, bold_, italic_); -	hash = HashFont(faceName_, characterSet_, size_, bold_, italic_); +	SetLogFont(lf, faceName_, characterSet_, size_, bold_, italic_, extraFontFlag_); +	hash = HashFont(faceName_, characterSet_, size_, bold_, italic_, extraFontFlag_);  	fid = ::CreateFontIndirectA(&lf);  	usage = 1;  } -bool FontCached::SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) { +bool FontCached::SameAs(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_, int extraFontFlag_) {  	return  		(lf.lfHeight == -(abs(size_))) &&  		(lf.lfWeight == (bold_ ? FW_BOLD : FW_NORMAL)) &&  		(lf.lfItalic == static_cast<BYTE>(italic_ ? 1 : 0)) &&  		(lf.lfCharSet == characterSet_) && +		(lf.lfQuality == Win32MapFontQuality(extraFontFlag_)) &&  		0 == strcmp(lf.lfFaceName,faceName_);  } @@ -244,19 +269,19 @@ void FontCached::Release() {  	fid = 0;  } -FontID FontCached::FindOrCreate(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_) { +FontID FontCached::FindOrCreate(const char *faceName_, int characterSet_, int size_, bool bold_, bool italic_, int extraFontFlag_) {  	FontID ret = 0;  	::EnterCriticalSection(&crPlatformLock); -	int hashFind = HashFont(faceName_, characterSet_, size_, bold_, italic_); +	int hashFind = HashFont(faceName_, characterSet_, size_, bold_, italic_, extraFontFlag_);  	for (FontCached *cur=first; cur; cur=cur->next) {  		if ((cur->hash == hashFind) && -			cur->SameAs(faceName_, characterSet_, size_, bold_, italic_)) { +			cur->SameAs(faceName_, characterSet_, size_, bold_, italic_, extraFontFlag_)) {  			cur->usage++;  			ret = cur->fid;  		}  	}  	if (ret == 0) { -		FontCached *fc = new FontCached(faceName_, characterSet_, size_, bold_, italic_); +		FontCached *fc = new FontCached(faceName_, characterSet_, size_, bold_, italic_, extraFontFlag_);  		if (fc) {  			fc->next = first;  			first = fc; @@ -296,14 +321,14 @@ Font::~Font() {  #define FONTS_CACHED  void Font::Create(const char *faceName, int characterSet, int size, -	bool bold, bool italic, bool) { +	bool bold, bool italic, int extraFontFlag) {  	Release();  #ifndef FONTS_CACHED  	LOGFONT lf; -	SetLogFont(lf, faceName, characterSet, size, bold, italic); +	SetLogFont(lf, faceName, characterSet, size, bold, italic, extraFontFlag);  	fid = ::CreateFontIndirect(&lf);  #else -	fid = FontCached::FindOrCreate(faceName, characterSet, size, bold, italic); +	fid = FontCached::FindOrCreate(faceName, characterSet, size, bold, italic, extraFontFlag);  #endif  } | 
