Merge
commit
2fa8c6f3da
|
|
@ -195,7 +195,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
|
|||
cur_y += mFontFreetype->getDescenderHeight();
|
||||
break;
|
||||
case VCENTER:
|
||||
cur_y -= ((mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight())/2.f);
|
||||
cur_y -= (mFontFreetype->getAscenderHeight() - mFontFreetype->getDescenderHeight()) / 2.f;
|
||||
break;
|
||||
case BASELINE:
|
||||
// Baseline, do nothing.
|
||||
|
|
@ -221,7 +221,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
|
|||
cur_render_y = cur_y;
|
||||
cur_render_x = cur_x;
|
||||
|
||||
F32 start_x = cur_x;
|
||||
F32 start_x = llround(cur_x);
|
||||
|
||||
const LLFontBitmapCache* font_bitmap_cache = mFontFreetype->getFontBitmapCache();
|
||||
|
||||
|
|
@ -301,8 +301,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
|
|||
// Must do this to cur_x, not just to cur_render_x, otherwise you
|
||||
// will squish sub-pixel kerned characters too close together.
|
||||
// For example, "CCCCC" looks bad.
|
||||
cur_x = (F32)llfloor(cur_x + 0.5f);
|
||||
//cur_y = (F32)llfloor(cur_y + 0.5f);
|
||||
cur_x = (F32)llround(cur_x);
|
||||
//cur_y = (F32)llround(cur_y);
|
||||
|
||||
cur_render_x = cur_x;
|
||||
cur_render_y = cur_y;
|
||||
|
|
@ -461,7 +461,7 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
|
|||
cur_x += mFontFreetype->getXKerning(wch, next_char);
|
||||
}
|
||||
// Round after kerning.
|
||||
cur_x = (F32)llfloor(cur_x + 0.5f);
|
||||
cur_x = (F32)llround(cur_x);
|
||||
}
|
||||
|
||||
// add in extra pixels for last character's width past its xadvance
|
||||
|
|
@ -548,7 +548,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
|
|||
}
|
||||
|
||||
// Round after kerning.
|
||||
cur_x = (F32)llfloor(cur_x + 0.5f);
|
||||
cur_x = llround(cur_x);
|
||||
drawn_x = cur_x;
|
||||
}
|
||||
|
||||
|
|
@ -660,7 +660,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
|
|||
}
|
||||
|
||||
// Round after kerning.
|
||||
cur_x = (F32)llfloor(cur_x + 0.5f);
|
||||
cur_x = llround(cur_x);
|
||||
}
|
||||
|
||||
return llmin(max_chars, pos - begin_offset);
|
||||
|
|
|
|||
|
|
@ -39,22 +39,23 @@ LLFastTimer::DeclareTimer FTM_UI_STRING("UI String");
|
|||
|
||||
|
||||
LLUIString::LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args)
|
||||
: mOrig(instring),
|
||||
mArgs(args)
|
||||
: mOrig(instring),
|
||||
mArgs(args)
|
||||
{
|
||||
format();
|
||||
dirty();
|
||||
}
|
||||
|
||||
void LLUIString::assign(const std::string& s)
|
||||
{
|
||||
mOrig = s;
|
||||
format();
|
||||
dirty();
|
||||
}
|
||||
|
||||
void LLUIString::setArgList(const LLStringUtil::format_map_t& args)
|
||||
|
||||
{
|
||||
mArgs = args;
|
||||
format();
|
||||
dirty();
|
||||
}
|
||||
|
||||
void LLUIString::setArgs(const LLSD& sd)
|
||||
|
|
@ -68,40 +69,40 @@ void LLUIString::setArgs(const LLSD& sd)
|
|||
{
|
||||
setArg(sd_it->first, sd_it->second.asString());
|
||||
}
|
||||
format();
|
||||
dirty();
|
||||
}
|
||||
|
||||
void LLUIString::setArg(const std::string& key, const std::string& replacement)
|
||||
{
|
||||
mArgs[key] = replacement;
|
||||
format();
|
||||
dirty();
|
||||
}
|
||||
|
||||
void LLUIString::truncate(S32 maxchars)
|
||||
{
|
||||
if (mWResult.size() > (size_t)maxchars)
|
||||
if (getUpdatedWResult().size() > (size_t)maxchars)
|
||||
{
|
||||
LLWStringUtil::truncate(mWResult, maxchars);
|
||||
mResult = wstring_to_utf8str(mWResult);
|
||||
LLWStringUtil::truncate(getUpdatedWResult(), maxchars);
|
||||
mResult = wstring_to_utf8str(getUpdatedWResult());
|
||||
}
|
||||
}
|
||||
|
||||
void LLUIString::erase(S32 charidx, S32 len)
|
||||
{
|
||||
mWResult.erase(charidx, len);
|
||||
mResult = wstring_to_utf8str(mWResult);
|
||||
getUpdatedWResult().erase(charidx, len);
|
||||
mResult = wstring_to_utf8str(getUpdatedWResult());
|
||||
}
|
||||
|
||||
void LLUIString::insert(S32 charidx, const LLWString& wchars)
|
||||
{
|
||||
mWResult.insert(charidx, wchars);
|
||||
mResult = wstring_to_utf8str(mWResult);
|
||||
getUpdatedWResult().insert(charidx, wchars);
|
||||
mResult = wstring_to_utf8str(getUpdatedWResult());
|
||||
}
|
||||
|
||||
void LLUIString::replace(S32 charidx, llwchar wc)
|
||||
{
|
||||
mWResult[charidx] = wc;
|
||||
mResult = wstring_to_utf8str(mWResult);
|
||||
getUpdatedWResult()[charidx] = wc;
|
||||
mResult = wstring_to_utf8str(getUpdatedWResult());
|
||||
}
|
||||
|
||||
void LLUIString::clear()
|
||||
|
|
@ -112,8 +113,16 @@ void LLUIString::clear()
|
|||
mWResult.clear();
|
||||
}
|
||||
|
||||
void LLUIString::format()
|
||||
void LLUIString::dirty()
|
||||
{
|
||||
mNeedsResult = true;
|
||||
mNeedsWResult = true;
|
||||
}
|
||||
|
||||
void LLUIString::updateResult() const
|
||||
{
|
||||
mNeedsResult = false;
|
||||
|
||||
LLFastTimer timer(FTM_UI_STRING);
|
||||
|
||||
// optimize for empty strings (don't attempt string replacement)
|
||||
|
|
@ -129,5 +138,11 @@ void LLUIString::format()
|
|||
LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs();
|
||||
combined_args.insert(mArgs.begin(), mArgs.end());
|
||||
LLStringUtil::format(mResult, combined_args);
|
||||
mWResult = utf8str_to_wstring(mResult);
|
||||
}
|
||||
|
||||
void LLUIString::updateWResult() const
|
||||
{
|
||||
mNeedsWResult = false;
|
||||
|
||||
mWResult = utf8str_to_wstring(getUpdatedResult());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,19 +76,19 @@ public:
|
|||
void setArgs(const class LLSD& sd);
|
||||
void setArg(const std::string& key, const std::string& replacement);
|
||||
|
||||
const std::string& getString() const { return mResult; }
|
||||
operator std::string() const { return mResult; }
|
||||
const std::string& getString() const { return getUpdatedResult(); }
|
||||
operator std::string() const { return getUpdatedResult(); }
|
||||
|
||||
const LLWString& getWString() const { return mWResult; }
|
||||
operator LLWString() const { return mWResult; }
|
||||
const LLWString& getWString() const { return getUpdatedWResult(); }
|
||||
operator LLWString() const { return getUpdatedWResult(); }
|
||||
|
||||
bool empty() const { return mWResult.empty(); }
|
||||
S32 length() const { return mWResult.size(); }
|
||||
bool empty() const { return getUpdatedResult().empty(); }
|
||||
S32 length() const { return getUpdatedWResult().size(); }
|
||||
|
||||
void clear();
|
||||
void clearArgs() { mArgs.clear(); }
|
||||
|
||||
// These utuilty functions are included for text editing.
|
||||
// These utility functions are included for text editing.
|
||||
// They do not affect mOrig and do not perform argument substitution
|
||||
void truncate(S32 maxchars);
|
||||
void erase(S32 charidx, S32 len);
|
||||
|
|
@ -96,12 +96,24 @@ public:
|
|||
void replace(S32 charidx, llwchar wc);
|
||||
|
||||
private:
|
||||
void format();
|
||||
// something changed, requiring reformatting of strings
|
||||
void dirty();
|
||||
|
||||
std::string& getUpdatedResult() const { if (mNeedsResult) { updateResult(); } return mResult; }
|
||||
LLWString& getUpdatedWResult() const{ if (mNeedsWResult) { updateWResult(); } return mWResult; }
|
||||
|
||||
// do actual work of updating strings (non-inlined)
|
||||
void updateResult() const;
|
||||
void updateWResult() const;
|
||||
|
||||
std::string mOrig;
|
||||
std::string mResult;
|
||||
LLWString mWResult; // for displaying
|
||||
mutable std::string mResult;
|
||||
mutable LLWString mWResult; // for displaying
|
||||
LLStringUtil::format_map_t mArgs;
|
||||
|
||||
// controls lazy evaluation
|
||||
mutable bool mNeedsResult;
|
||||
mutable bool mNeedsWResult;
|
||||
};
|
||||
|
||||
#endif // LL_LLUISTRING_H
|
||||
|
|
|
|||
Loading…
Reference in New Issue