diff options
| -rw-r--r-- | win32/PlatWin.cxx | 36 | 
1 files changed, 32 insertions, 4 deletions
| diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx index 6f11c4ea0..f23f0a6e8 100644 --- a/win32/PlatWin.cxx +++ b/win32/PlatWin.cxx @@ -1062,7 +1062,7 @@ void SurfaceGDI::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION *  		int ui = 0;  		for (int i=0;i<len;) { -			if (::IsDBCSLeadByteEx(codePage, s[i])) { +			if (Platform::IsDBCSLeadByte(codePage, s[i])) {  				positions[i] = poses.buffer[ui];  				positions[i+1] = poses.buffer[ui];  				i += 2; @@ -1747,7 +1747,7 @@ void SurfaceD2D::MeasureWidths(Font &font_, const char *s, int len, XYPOSITION *  		// May be more than one byte per position  		int ui = 0;  		for (int i=0;i<len;) { -			if (::IsDBCSLeadByteEx(codePageText, s[i])) { +			if (Platform::IsDBCSLeadByte(codePageText, s[i])) {  				positions[i] = poses.buffer[ui];  				positions[i+1] = poses.buffer[ui];  				i += 2; @@ -3163,11 +3163,39 @@ long Platform::SendScintillaPointer(WindowID w, unsigned int msg, unsigned long  }  bool Platform::IsDBCSLeadByte(int codePage, char ch) { -	return ::IsDBCSLeadByteEx(codePage, ch) != 0; +	// Byte ranges found in Wikipedia articles with relevant search strings in each case +	unsigned char uch = static_cast<unsigned char>(ch); +	switch (codePage) { +	case 932: +		// Shift_jis +		return ((uch >= 0x81) && (uch <= 0x9F)) || +		       ((uch >= 0xE0) && (uch <= 0xEF)); +	case 936: +		// GBK +		return (uch >= 0x81) && (uch <= 0xFE); +	case 949: +		// Korean Wansung KS C-5601-1987 +		return (uch >= 0x81) && (uch <= 0xFE); +	case 950: +		// Big5 +		return (uch >= 0x81) && (uch <= 0xFE); +	case 1361: +		// Korean Johab KS C-5601-1992 +		return +		    ((uch >= 0x84) && (uch <= 0xD3)) || +		    ((uch >= 0xD8) && (uch <= 0xDE)) || +		    ((uch >= 0xE0) && (uch <= 0xF9)); +	} +	return false;  }  int Platform::DBCSCharLength(int codePage, const char *s) { -	return (::IsDBCSLeadByteEx(codePage, s[0]) != 0) ? 2 : 1; +	if (codePage == 932 || codePage == 936 || codePage == 949 || +	        codePage == 950 || codePage == 1361) { +		return Platform::IsDBCSLeadByte(codePage, s[0]) ? 2 : 1; +	} else { +		return 1; +	}  }  int Platform::DBCSCharMaxLength() { | 
