diff options
| -rw-r--r-- | gtk/PlatGTK.cxx | 18 | 
1 files changed, 15 insertions, 3 deletions
| diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index c37ff56ca..bfd5166c5 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -1169,13 +1169,18 @@ void SurfaceImpl::DrawTextBase(PRectangle rc, Font &font_, int ybase, const char  		bool draw8bit = true;  		if (et != singleByte) {  			GdkWChar wctext[maxLengthTextRun]; +			if (len >= maxLengthTextRun)  +				len = maxLengthTextRun-1;  			int wclen;  			if (et == UTF8) {  				wclen = UCS2FromUTF8(s, len,  					reinterpret_cast<wchar_t *>(wctext), maxLengthTextRun - 1);  			} else {	// dbcs, so convert using current locale +				char sMeasure[maxLengthTextRun]; +				memcpy(sMeasure, s, len); +				sMeasure[len] = '\0';  				wclen = gdk_mbstowcs( -					wctext, s, maxLengthTextRun - 1); +					wctext, sMeasure, maxLengthTextRun - 1);  			}  			if (wclen > 0) {  				draw8bit = false; @@ -1326,13 +1331,18 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positi  		bool measure8bit = true;  		if (et != singleByte) {  			GdkWChar wctext[maxLengthTextRun]; +			if (len >= maxLengthTextRun)  +				len = maxLengthTextRun-1;  			int wclen;  			if (et == UTF8) {  				wclen = UCS2FromUTF8(s, len,  					reinterpret_cast<wchar_t *>(wctext), maxLengthTextRun - 1);  			} else {	// dbcsMode, so convert using current locale +				char sDraw[maxLengthTextRun]; +				memcpy(sDraw, s, len); +				sDraw[len] = '\0';  				wclen = gdk_mbstowcs( -					wctext, s, maxLengthTextRun - 1); +					wctext, sDraw, maxLengthTextRun - 1);  			}  			if (wclen > 0) {  				measure8bit = false; @@ -1342,11 +1352,13 @@ void SurfaceImpl::MeasureWidths(Font &font_, const char *s, int len, int *positi  				for (int iU = 0; iU < wclen; iU++) {  					int width = gdk_char_width_wc(gf, wctext[iU]);  					totalWidth += width; -					size_t lenChar; +					int lenChar;  					if (et == UTF8) {  						lenChar = UTF8Len(s[i]);  					} else {  						lenChar = mblen(s+i, MB_CUR_MAX); +						if (lenChar < 0) +							lenChar = 1;  					}  					while (lenChar--) {  						positions[i++] = totalWidth; | 
