diff options
| -rw-r--r-- | indra/llrender/llfontgl.cpp | 24 | ||||
| -rw-r--r-- | indra/llui/lllineeditor.cpp | 6 | 
2 files changed, 25 insertions, 5 deletions
| diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 1de1d6ded4..b6a6b448ee 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -601,14 +601,20 @@ S32	LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_  	{  		llwchar wch = wchars[i]; -		F32 char_width = mFontFreetype->getXAdvance(wch); +		const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch); + +		// last character uses character width, since the whole character needs to be visible +		// other characters just use advance +		F32 width = (i == start)  +			? (F32)(fgi->mWidth + fgi->mXBearing)  	// use actual width for last character +			: fgi->mXAdvance;						// use advance for all other characters										 -		if( scaled_max_pixels < (total_width + char_width) ) +		if( scaled_max_pixels < (total_width + width) )  		{  			break;  		} -		total_width += char_width; +		total_width += width;  		drawable_chars++;  		if( max_chars >= 0 && drawable_chars >= max_chars ) @@ -626,7 +632,17 @@ S32	LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_  		total_width = llround(total_width);  	} -	return start_pos - drawable_chars; +	if (drawable_chars == 0) +	{ +		return start_pos; // just draw last character +	} +	else +	{ +		// if only 1 character is drawable, we want to return start_pos as the first character to draw +		// if 2 are drawable, return start_pos and character before start_pos, etc. +		return start_pos + 1 - drawable_chars; +	} +	  }  S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 target_x, F32 max_pixels, S32 max_chars, BOOL round) const diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index eb2b4f7705..3e277f47b5 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -422,12 +422,16 @@ void LLLineEditor::setCursor( S32 pos )  	S32 old_cursor_pos = getCursor();  	mCursorPos = llclamp( pos, 0, mText.length()); +	// position of end of next character after cursor  	S32 pixels_after_scroll = findPixelNearestPos();  	if( pixels_after_scroll > mTextRightEdge )  	{  		S32 width_chars_to_left = mGLFont->getWidth(mText.getWString().c_str(), 0, mScrollHPos);  		S32 last_visible_char = mGLFont->maxDrawableChars(mText.getWString().c_str(), llmax(0.f, (F32)(mTextRightEdge - mTextLeftEdge + width_chars_to_left)));  -		S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mTextRightEdge - mTextLeftEdge), mText.length(), getCursor()); +		// character immediately to left of cursor should be last one visible (SCROLL_INCREMENT_ADD will scroll in more characters) +		// or first character if cursor is at beginning +		S32 new_last_visible_char = llmax(0, getCursor() - 1); +		S32 min_scroll = mGLFont->firstDrawableChar(mText.getWString().c_str(), (F32)(mTextRightEdge - mTextLeftEdge), mText.length(), new_last_visible_char);  		if (old_cursor_pos == last_visible_char)  		{  			mScrollHPos = llmin(mText.length(), llmax(min_scroll, mScrollHPos + SCROLL_INCREMENT_ADD)); | 
