diff options
Diffstat (limited to 'win32/PlatWin.cxx')
| -rw-r--r-- | win32/PlatWin.cxx | 77 | 
1 files changed, 39 insertions, 38 deletions
| diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 8a198eb4b..6304d2e5e 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -321,14 +321,14 @@ static void SetLogFont(LOGFONTA &lf, const char *faceName, int characterSet, flo   * 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, float size, int weight, bool italic, int extraFontFlag) { +static int HashFont(const FontParameters &fp) {  	return -		static_cast<int>(size) ^ -		(characterSet << 10) ^ -		((extraFontFlag & SC_EFF_QUALITY_MASK) << 9) ^ -		((weight/100) << 12) ^ -		(italic ? 0x20000000 : 0) ^ -		faceName[0]; +		static_cast<int>(fp.size) ^ +		(fp.characterSet << 10) ^ +		((fp.extraFontFlag & SC_EFF_QUALITY_MASK) << 9) ^ +		((fp.weight/100) << 12) ^ +		(fp.italic ? 0x20000000 : 0) ^ +		fp.faceName[0];  }  class FontCached : Font { @@ -337,33 +337,33 @@ class FontCached : Font {  	float size;  	LOGFONTA lf;  	int hash; -	FontCached(const char *faceName_, int characterSet_, float size_, int weight_, bool italic_, int extraFontFlag_); +	FontCached(const FontParameters &fp);  	~FontCached() {} -	bool SameAs(const char *faceName_, int characterSet_, float size_, int weight_, bool italic_, int extraFontFlag_); +	bool SameAs(const FontParameters &fp);  	virtual void Release();  	static FontCached *first;  public: -	static FontID FindOrCreate(const char *faceName_, int characterSet_, float size_, int weight_, bool italic_, int extraFontFlag_); +	static FontID FindOrCreate(const FontParameters &fp);  	static void ReleaseId(FontID fid_);  };  FontCached *FontCached::first = 0; -FontCached::FontCached(const char *faceName_, int characterSet_, float size_, int weight_, bool italic_, int extraFontFlag_) : +FontCached::FontCached(const FontParameters &fp) :  	next(0), usage(0), size(1.0), hash(0) { -	SetLogFont(lf, faceName_, characterSet_, size_, weight_, italic_, extraFontFlag_); -	hash = HashFont(faceName_, characterSet_, size_, weight_, italic_, extraFontFlag_); +	SetLogFont(lf, fp.faceName, fp.characterSet, fp.size, fp.weight, fp.italic, fp.extraFontFlag); +	hash = HashFont(fp);  	fid = 0;  	if (pIDWriteFactory) {  		IDWriteTextFormat *pTextFormat;  		const int faceSize = 200;  		WCHAR wszFace[faceSize]; -		UTF16FromUTF8(faceName_, strlen(faceName_)+1, wszFace, faceSize); -		FLOAT fHeight = size_; -		DWRITE_FONT_STYLE style = italic_ ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL; +		UTF16FromUTF8(fp.faceName, strlen(fp.faceName)+1, wszFace, faceSize); +		FLOAT fHeight = fp.size; +		DWRITE_FONT_STYLE style = fp.italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL;  		HRESULT hr = pIDWriteFactory->CreateTextFormat(wszFace, NULL, -			static_cast<DWRITE_FONT_WEIGHT>(weight_), +			static_cast<DWRITE_FONT_WEIGHT>(fp.weight),  			style,  			DWRITE_FONT_STRETCH_NORMAL, fHeight, L"en-us", &pTextFormat);  		if (SUCCEEDED(hr)) { @@ -385,20 +385,20 @@ FontCached::FontCached(const char *faceName_, int characterSet_, float size_, in  				}  				pTextLayout->Release();  			} -			fid = reinterpret_cast<void *>(new FormatAndMetrics(pTextFormat, extraFontFlag_, yAscent, yDescent)); +			fid = reinterpret_cast<void *>(new FormatAndMetrics(pTextFormat, fp.extraFontFlag, yAscent, yDescent));  		}  	}  	usage = 1;  } -bool FontCached::SameAs(const char *faceName_, int characterSet_, float size_, int weight_, bool italic_, int extraFontFlag_) { +bool FontCached::SameAs(const FontParameters &fp) {  	return -		(size == size_) && -		(lf.lfWeight == weight_) && -		(lf.lfItalic == static_cast<BYTE>(italic_ ? 1 : 0)) && -		(lf.lfCharSet == characterSet_) && -		(lf.lfQuality == Win32MapFontQuality(extraFontFlag_)) && -		0 == strcmp(lf.lfFaceName,faceName_); +		(size == fp.size) && +		(lf.lfWeight == fp.weight) && +		(lf.lfItalic == static_cast<BYTE>(fp.italic ? 1 : 0)) && +		(lf.lfCharSet == fp.characterSet) && +		(lf.lfQuality == Win32MapFontQuality(fp.extraFontFlag)) && +		0 == strcmp(lf.lfFaceName,fp.faceName);  }  void FontCached::Release() { @@ -406,19 +406,19 @@ void FontCached::Release() {  	fid = 0;  } -FontID FontCached::FindOrCreate(const char *faceName_, int characterSet_, float size_, int weight_, bool italic_, int extraFontFlag_) { +FontID FontCached::FindOrCreate(const FontParameters &fp) {  	FontID ret = 0;  	::EnterCriticalSection(&crPlatformLock); -	int hashFind = HashFont(faceName_, characterSet_, size_, weight_, italic_, extraFontFlag_); +	int hashFind = HashFont(fp);  	for (FontCached *cur=first; cur; cur=cur->next) {  		if ((cur->hash == hashFind) && -			cur->SameAs(faceName_, characterSet_, size_, weight_, italic_, extraFontFlag_)) { +			cur->SameAs(fp)) {  			cur->usage++;  			ret = cur->fid;  		}  	}  	if (ret == 0) { -		FontCached *fc = new FontCached(faceName_, characterSet_, size_, weight_, italic_, extraFontFlag_); +		FontCached *fc = new FontCached(fp);  		if (fc) {  			fc->next = first;  			first = fc; @@ -457,11 +457,10 @@ Font::~Font() {  #define FONTS_CACHED -void Font::Create(const char *faceName, int characterSet, float size, -	int weight, bool italic, int extraFontFlag) { +void Font::Create(const FontParameters &fp) {  	Release(); -	if (faceName) -		fid = FontCached::FindOrCreate(faceName, characterSet, size, weight, italic, extraFontFlag); +	if (fp.faceName) +		fid = FontCached::FindOrCreate(fp);  }  void Font::Release() { @@ -1203,7 +1202,7 @@ void SurfaceImpl::SetDBCSMode(int codePage_) {  	win9xACPSame = !IsNT() && ((unsigned int)codePage == ::GetACP());  } -Surface *Surface::Allocate() { +Surface *Surface::Allocate(int /* technology */) {  	return new SurfaceImpl;  } @@ -1514,6 +1513,7 @@ ListBox::~ListBox() {  class ListBoxX : public ListBox {  	int lineHeight;  	FontID fontCopy; +	int technology;  	RGBAImageSet images;  	LineToItem lti;  	HWND lb; @@ -1555,7 +1555,7 @@ class ListBoxX : public ListBox {  	static const Point ImageInset;	// Padding around image  public: -	ListBoxX() : lineHeight(10), fontCopy(0), lb(0), unicodeMode(false), +	ListBoxX() : lineHeight(10), fontCopy(0), technology(0), lb(0), unicodeMode(false),  		desiredVisibleRows(5), maxItemCharacters(0), aveCharWidth(8),  		parent(NULL), ctrlID(0), doubleClickAction(NULL), doubleClickActionData(NULL),  		widestItem(NULL), maxCharWidth(1), resizeHit(0) { @@ -1567,7 +1567,7 @@ public:  		}  	}  	virtual void SetFont(Font &font); -	virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_); +	virtual void Create(Window &parent, int ctrlID, Point location_, int lineHeight_, bool unicodeMode_, int technology_);  	virtual void SetAverageCharWidth(int width);  	virtual void SetVisibleRows(int rows);  	virtual int GetVisibleRows() const; @@ -1602,12 +1602,13 @@ ListBox *ListBox::Allocate() {  	return lb;  } -void ListBoxX::Create(Window &parent_, int ctrlID_, Point location_, int lineHeight_, bool unicodeMode_) { +void ListBoxX::Create(Window &parent_, int ctrlID_, Point location_, int lineHeight_, bool unicodeMode_, int technology_) {  	parent = &parent_;  	ctrlID = ctrlID_;  	location = location_;  	lineHeight = lineHeight_;  	unicodeMode = unicodeMode_; +	technology = technology_;  	HWND hwndParent = reinterpret_cast<HWND>(parent->GetID());  	HINSTANCE hinstanceParent = GetWindowInstance(hwndParent);  	// Window created as popup so not clipped within parent client area @@ -1800,7 +1801,7 @@ void ListBoxX::Draw(DRAWITEMSTRUCT *pDrawItem) {  		// Draw the image, if any  		RGBAImage *pimage = images.Get(pixId);  		if (pimage) { -			Surface *surfaceItem = Surface::Allocate(); +			Surface *surfaceItem = Surface::Allocate(technology);  			if (surfaceItem) {  				if (pD2DFactory) {  					D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties( | 
