Huge renderer update (WIP). Still plenty to do, especially pertaining to UI.
-Nametag bubble visbility is oddly inconsistent. May vanish with future planned UI merges... -VBOs are PAINFULLY slow on ATI hardware. This repos self-compiled davep/shining-fixes branch, so I'll leave the ball in LL's court for now regarding that.
This commit is contained in:
@@ -73,126 +73,99 @@ public:
|
||||
enum StyleFlags
|
||||
{
|
||||
// text style to render. May be combined (these are bit flags)
|
||||
NORMAL = 0,
|
||||
BOLD = 1,
|
||||
ITALIC = 2,
|
||||
UNDERLINE = 4,
|
||||
DROP_SHADOW = 8,
|
||||
DROP_SHADOW_SOFT = 16
|
||||
// text style to render. May be combined (these are bit flags)
|
||||
NORMAL = 0x00,
|
||||
BOLD = 0x01,
|
||||
ITALIC = 0x02,
|
||||
UNDERLINE = 0x04,
|
||||
};
|
||||
|
||||
enum ShadowType
|
||||
{
|
||||
NO_SHADOW,
|
||||
DROP_SHADOW,
|
||||
DROP_SHADOW_SOFT
|
||||
};
|
||||
|
||||
// Takes a string with potentially several flags, i.e. "NORMAL|BOLD|ITALIC"
|
||||
static U8 getStyleFromString(const std::string &style);
|
||||
|
||||
LLFontGL();
|
||||
LLFontGL(const LLFontGL &source);
|
||||
~LLFontGL();
|
||||
|
||||
void init(); // Internal init, or reinitialization
|
||||
void reset(); // Reset a font after GL cleanup. ONLY works on an already loaded font.
|
||||
|
||||
LLFontGL &operator=(const LLFontGL &source);
|
||||
|
||||
static BOOL initDefaultFonts(F32 screen_dpi, F32 x_scale, F32 y_scale,
|
||||
const std::string& app_dir,
|
||||
const std::vector<std::string>& xui_paths,
|
||||
bool create_gl_textures = true);
|
||||
|
||||
static void destroyDefaultFonts();
|
||||
static void destroyAllGL();
|
||||
void destroyGL();
|
||||
|
||||
/* virtual*/ BOOL loadFace(const std::string& filename,
|
||||
const F32 point_size, const F32 vert_dpi, const F32 horz_dpi,
|
||||
const S32 components, BOOL is_fallback);
|
||||
/* virtual*/ BOOL loadFace(const std::string& filename, const F32 point_size, const F32 vert_dpi, const F32 horz_dpi, const S32 components, BOOL is_fallback);
|
||||
|
||||
S32 render(const LLWString &text, S32 begin_offset,
|
||||
const LLRect& rect,
|
||||
const LLColor4 &color,
|
||||
HAlign halign = LEFT, VAlign valign = BASELINE,
|
||||
U8 style = NORMAL, ShadowType shadow = NO_SHADOW,
|
||||
S32 max_chars = S32_MAX,
|
||||
F32* right_x=NULL,
|
||||
BOOL use_embedded = FALSE,
|
||||
BOOL use_ellipses = FALSE) const;
|
||||
|
||||
S32 render(const LLWString &text, S32 begin_offset,
|
||||
F32 x, F32 y,
|
||||
const LLColor4 &color,
|
||||
HAlign halign = LEFT, VAlign valign = BASELINE,
|
||||
U8 style = NORMAL, ShadowType shadow = NO_SHADOW,
|
||||
S32 max_chars = S32_MAX, S32 max_pixels = S32_MAX,
|
||||
F32* right_x=NULL,
|
||||
BOOL use_embedded = FALSE,
|
||||
BOOL use_ellipses = FALSE) const;
|
||||
|
||||
S32 render(const LLWString &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color) const;
|
||||
|
||||
S32 renderUTF8(const std::string &text, const S32 begin_offset,
|
||||
S32 x, S32 y,
|
||||
const LLColor4 &color) const
|
||||
{
|
||||
return renderUTF8(text, begin_offset, (F32)x, (F32)y, color,
|
||||
LEFT, BASELINE, NORMAL,
|
||||
S32_MAX, S32_MAX, NULL, FALSE);
|
||||
}
|
||||
|
||||
S32 renderUTF8(const std::string &text, const S32 begin_offset,
|
||||
S32 x, S32 y,
|
||||
const LLColor4 &color,
|
||||
HAlign halign, VAlign valign, U8 style = NORMAL) const
|
||||
{
|
||||
return renderUTF8(text, begin_offset, (F32)x, (F32)y, color,
|
||||
halign, valign, style,
|
||||
S32_MAX, S32_MAX, NULL, FALSE);
|
||||
}
|
||||
|
||||
// renderUTF8 does a conversion, so is slower!
|
||||
S32 renderUTF8(const std::string &text,
|
||||
S32 begin_offset,
|
||||
F32 x, F32 y,
|
||||
const LLColor4 &color,
|
||||
HAlign halign,
|
||||
VAlign valign,
|
||||
U8 style,
|
||||
S32 max_chars,
|
||||
S32 max_pixels,
|
||||
F32* right_x,
|
||||
BOOL use_ellipses) const;
|
||||
|
||||
S32 render(const LLWString &text, const S32 begin_offset,
|
||||
F32 x, F32 y,
|
||||
const LLColor4 &color) const
|
||||
{
|
||||
return render(text, begin_offset, x, y, color,
|
||||
LEFT, BASELINE, NORMAL,
|
||||
S32_MAX, S32_MAX, NULL, FALSE, FALSE);
|
||||
}
|
||||
|
||||
|
||||
S32 render(const LLWString &text,
|
||||
S32 begin_offset,
|
||||
F32 x, F32 y,
|
||||
const LLColor4 &color,
|
||||
HAlign halign = LEFT,
|
||||
VAlign valign = BASELINE,
|
||||
U8 style = NORMAL,
|
||||
S32 max_chars = S32_MAX,
|
||||
S32 max_pixels = S32_MAX,
|
||||
F32* right_x=NULL,
|
||||
BOOL use_embedded = FALSE,
|
||||
BOOL use_ellipses = FALSE) const;
|
||||
S32 renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses) const;
|
||||
S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color) const;
|
||||
S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const;
|
||||
|
||||
// font metrics - override for LLFont that returns units of virtual pixels
|
||||
/*virtual*/ F32 getLineHeight() const { return (F32)llround(mLineHeight / sScaleY); }
|
||||
/*virtual*/ F32 getAscenderHeight() const { return (F32)llround(mAscender / sScaleY); }
|
||||
/*virtual*/ F32 getDescenderHeight() const { return (F32)llround(mDescender / sScaleY); }
|
||||
|
||||
virtual S32 getWidth(const std::string& utf8text) const;
|
||||
virtual S32 getWidth(const llwchar* wchars) const;
|
||||
virtual S32 getWidth(const std::string& utf8text, const S32 offset, const S32 max_chars ) const;
|
||||
virtual S32 getWidth(const llwchar* wchars, const S32 offset, const S32 max_chars, BOOL use_embedded = FALSE) const;
|
||||
S32 getWidth(const std::string& utf8text) const;
|
||||
S32 getWidth(const llwchar* wchars) const;
|
||||
S32 getWidth(const std::string& utf8text, const S32 offset, const S32 max_chars ) const;
|
||||
S32 getWidth(const llwchar* wchars, const S32 offset, const S32 max_chars, BOOL use_embedded = FALSE) const;
|
||||
|
||||
virtual F32 getWidthF32(const std::string& utf8text) const;
|
||||
virtual F32 getWidthF32(const llwchar* wchars) const;
|
||||
virtual F32 getWidthF32(const std::string& text, const S32 offset, const S32 max_chars ) const;
|
||||
virtual F32 getWidthF32(const llwchar* wchars, const S32 offset, const S32 max_chars, BOOL use_embedded = FALSE ) const;
|
||||
F32 getWidthF32(const std::string& utf8text) const;
|
||||
F32 getWidthF32(const llwchar* wchars) const;
|
||||
F32 getWidthF32(const std::string& text, const S32 offset, const S32 max_chars ) const;
|
||||
F32 getWidthF32(const llwchar* wchars, const S32 offset, const S32 max_chars, BOOL use_embedded = FALSE ) const;
|
||||
|
||||
// The following are called often, frequently with large buffers, so do not use a string interface
|
||||
|
||||
// Returns the max number of complete characters from text (up to max_chars) that can be drawn in max_pixels
|
||||
virtual S32 maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars = S32_MAX,
|
||||
BOOL end_on_word_boundary = FALSE, const BOOL use_embedded = FALSE,
|
||||
F32* drawn_pixels = NULL) const;
|
||||
typedef enum e_word_wrap_style
|
||||
{
|
||||
ONLY_WORD_BOUNDARIES,
|
||||
WORD_BOUNDARY_IF_POSSIBLE,
|
||||
ANYWHERE
|
||||
} EWordWrapStyle ;
|
||||
S32 maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_chars = S32_MAX, EWordWrapStyle end_on_word_boundary = ANYWHERE,
|
||||
const BOOL use_embedded = FALSE, F32* drawn_pixels = NULL) const;
|
||||
|
||||
// Returns the index of the first complete characters from text that can be drawn in max_pixels
|
||||
// given that the character at start_pos should be the last character (or as close to last as possible).
|
||||
virtual S32 firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_len, S32 start_pos=S32_MAX, S32 max_chars = S32_MAX) const;
|
||||
S32 firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_len, S32 start_pos=S32_MAX, S32 max_chars = S32_MAX) const;
|
||||
|
||||
// Returns the index of the character closest to pixel position x (ignoring text to the right of max_pixels and max_chars)
|
||||
virtual S32 charFromPixelOffset(const llwchar* wchars, const S32 char_offset,
|
||||
F32 x, F32 max_pixels=F32_MAX, S32 max_chars = S32_MAX,
|
||||
BOOL round = TRUE, BOOL use_embedded = FALSE) const;
|
||||
S32 charFromPixelOffset(const llwchar* wchars, const S32 char_offset, F32 x, F32 max_pixels=F32_MAX, S32 max_chars = S32_MAX, BOOL round = TRUE, BOOL use_embedded = FALSE) const;
|
||||
|
||||
const LLFontDescriptor &getFontDesc() const { return mFontDesc; }
|
||||
void setFontDesc(const LLFontDescriptor& font_desc) { mFontDesc = font_desc; }
|
||||
|
||||
LLTexture *getTexture() const;
|
||||
|
||||
@@ -200,6 +173,15 @@ public:
|
||||
void addEmbeddedChar( llwchar wc, LLTexture* image, const LLWString& label) const;
|
||||
void removeEmbeddedChar( llwchar wc ) const;
|
||||
|
||||
// Load sans-serif, sans-serif-small, etc.
|
||||
// Slow, requires multiple seconds to load fonts.
|
||||
static bool loadDefaultFonts();
|
||||
static void destroyDefaultFonts();
|
||||
static void destroyAllGL();
|
||||
|
||||
// Takes a string with potentially several flags, i.e. "NORMAL|BOLD|ITALIC"
|
||||
static U8 getStyleFromString(const std::string &style);
|
||||
static std::string getStringFromStyle(U8 style);
|
||||
static std::string nameFromFont(const LLFontGL* fontp);
|
||||
|
||||
static std::string nameFromHAlign(LLFontGL::HAlign align);
|
||||
@@ -220,16 +202,7 @@ protected:
|
||||
const embedded_data_t* getEmbeddedCharData(const llwchar wch) const;
|
||||
F32 getEmbeddedCharAdvance(const embedded_data_t* ext_data) const;
|
||||
void clearEmbeddedChars();
|
||||
void renderQuad(const LLRectf& screen_rect, const LLRectf& uv_rect, F32 slant_amt) const;
|
||||
void drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4& color, U8 style, F32 drop_shadow_fade) const;
|
||||
|
||||
public:
|
||||
static F32 sVertDPI;
|
||||
static F32 sHorizDPI;
|
||||
static F32 sScaleX;
|
||||
static F32 sScaleY;
|
||||
static BOOL sDisplayFont ;
|
||||
static std::string sAppDir; // For loading fonts
|
||||
|
||||
static LLFontGL* getFontMonospace();
|
||||
static LLFontGL* getFontSansSerifSmall();
|
||||
@@ -240,11 +213,25 @@ public:
|
||||
static LLFontGL* getFontExtChar();
|
||||
static LLFontGL* getFont(const LLFontDescriptor& desc);
|
||||
|
||||
static std::string getFontPathLocal();
|
||||
static std::string getFontPathSystem();
|
||||
|
||||
static LLCoordFont sCurOrigin;
|
||||
static std::vector<LLCoordFont> sOriginStack;
|
||||
|
||||
static LLColor4 sShadowColor;
|
||||
|
||||
static F32 sVertDPI;
|
||||
static F32 sHorizDPI;
|
||||
static F32 sScaleX;
|
||||
static F32 sScaleY;
|
||||
static BOOL sDisplayFont ;
|
||||
static std::string sAppDir; // For loading fonts
|
||||
friend class LLTextBillboard;
|
||||
friend class LLHUDText;
|
||||
|
||||
LLFontGL(const LLFontGL &source);
|
||||
LLFontGL &operator=(const LLFontGL &source);
|
||||
protected:
|
||||
/*virtual*/ BOOL addChar(const llwchar wch) const;
|
||||
|
||||
@@ -254,18 +241,12 @@ protected:
|
||||
|
||||
LLFontDescriptor mFontDesc;
|
||||
|
||||
void renderQuad(const LLRectf& screen_rect, const LLRectf& uv_rect, F32 slant_amt) const;
|
||||
void drawGlyph(const LLRectf& screen_rect, const LLRectf& uv_rect, const LLColor4& color, U8 style, ShadowType shadow, F32 drop_shadow_fade) const;
|
||||
|
||||
// Registry holds all instantiated fonts.
|
||||
static LLFontRegistry* sFontRegistry;
|
||||
|
||||
public:
|
||||
static std::string getFontPathLocal();
|
||||
static std::string getFontPathSystem();
|
||||
|
||||
static LLCoordFont sCurOrigin;
|
||||
static std::vector<LLCoordFont> sOriginStack;
|
||||
|
||||
const LLFontDescriptor &getFontDesc() const { return mFontDesc; }
|
||||
void setFontDesc(const LLFontDescriptor& font_desc) { mFontDesc = font_desc; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user