meow-7.2.2
James Cook 2009-12-09 18:27:38 -08:00
commit 2fa8c6f3da
3 changed files with 62 additions and 35 deletions

View File

@ -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);

View File

@ -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());
}

View File

@ -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