diff options
Diffstat (limited to 'Source/Graphics/text.h')
-rw-r--r-- | Source/Graphics/text.h | 99 |
1 files changed, 52 insertions, 47 deletions
diff --git a/Source/Graphics/text.h b/Source/Graphics/text.h index 3ab96e95..68a048d6 100644 --- a/Source/Graphics/text.h +++ b/Source/Graphics/text.h @@ -35,63 +35,68 @@ #include <vector> -struct TextCanvasTextureImpl; +struct TextCanvasTextureImpl; class vec2; class Graphics; struct CanvasTextStyle { - enum Alignment {LEFT = 1,CENTER = 2,RIGHT = 3}; - static inline const char* GetAlignmentString( Alignment a ) - { - switch(a) - { - case LEFT: return "LEFT"; - case CENTER: return "CENTER"; - case RIGHT: return "RIGHT"; - default: return "(unknown alignment)"; + enum Alignment { LEFT = 1, + CENTER = 2, + RIGHT = 3 }; + static inline const char* GetAlignmentString(Alignment a) { + switch (a) { + case LEFT: + return "LEFT"; + case CENTER: + return "CENTER"; + case RIGHT: + return "RIGHT"; + default: + return "(unknown alignment)"; } } int font_face_id; Alignment alignment; - CanvasTextStyle(): - font_face_id(-1), - alignment(LEFT) - {} + CanvasTextStyle() : font_face_id(-1), + alignment(LEFT) {} }; struct TextMetrics { - int advance[2]; // cursor position in points (64/pixel) - int bounds[4]; // bounding box of text in points (64/pixel) + int advance[2]; // cursor position in points (64/pixel) + int bounds[4]; // bounding box of text in points (64/pixel) float ascenderRatio; }; // A texture on which text can be rendered class TextCanvasTexture { -public: + public: void Create(int width, int height); void ClearTextCanvas(); void UploadTextCanvasToTexture(); - void AddText( const char *str, int length, const CanvasTextStyle& style, uint32_t char_output_limit ); - void AddTextMultiline( const char *str, int length, const CanvasTextStyle& style, uint32_t char_limit ); - void DebugDrawBillboard(const vec3 &pos, float scale, int lifespan); + void AddText(const char* str, int length, const CanvasTextStyle& style, uint32_t char_output_limit); + void AddTextMultiline(const char* str, int length, const CanvasTextStyle& style, uint32_t char_limit); + void DebugDrawBillboard(const vec3& pos, float scale, int lifespan); void RemoveDebugDrawBillboard(); void Reset(); // (0,0) is the top-left corner of the text canvas // The pen position is at the bottom-left corner of the text - void SetPenPosition(const vec2 &point); + void SetPenPosition(const vec2& point); void SetPenColor(int r, int g, int b, int a); void SetPenRotation(float degrees); - static void GetLetterPosXY(const char* str, const CanvasTextStyle &style, int letter, int coords[2]); + static void GetLetterPosXY(const char* str, const CanvasTextStyle& style, int letter, int coords[2]); int GetCursorPos(const char* str, const CanvasTextStyle& style, const int coords[2], uint32_t char_limit); TextCanvasTexture(); ~TextCanvasTexture(); TextCanvasTexture(const TextCanvasTexture& other); TextureRef GetTexture() const; - void GetTextMetricsInfo( const char *str, int length, const CanvasTextStyle& style, TextMetrics &metrics, uint32_t char_limit ); -private: - enum TextModeFlags {TMF_METRICS = 1, TMF_DRAW = 2, TMF_AUTO_NEWLINE = 4}; - void RenderText( const char *str, int length, const CanvasTextStyle& style, TextMetrics &metrics, uint32_t mode, uint32_t char_limit ); - TextCanvasTextureImpl *impl_; + void GetTextMetricsInfo(const char* str, int length, const CanvasTextStyle& style, TextMetrics& metrics, uint32_t char_limit); + + private: + enum TextModeFlags { TMF_METRICS = 1, + TMF_DRAW = 2, + TMF_AUTO_NEWLINE = 4 }; + void RenderText(const char* str, int length, const CanvasTextStyle& style, TextMetrics& metrics, uint32_t mode, uint32_t char_limit); + TextCanvasTextureImpl* impl_; int debug_draw_billboard_id; }; @@ -108,7 +113,7 @@ struct CharacterInfo { // A texture containing a list of common latin characters, including ascii class TextAtlas { -public: + public: void Create(const char* path, int pixel_height, FontRenderer* font_renderer, int flags); void Dispose(); TextAtlas(); @@ -119,8 +124,8 @@ public: int atlas_dims[2]; std::vector<CharacterInfo> alphabet; static bool Pack(unsigned char* pixels, int atlas_dims[2], - int font_face_id, int lowercase_font_face_id, - FontRenderer* font_renderer, std::vector<CharacterInfo>& alphabet); + int font_face_id, int lowercase_font_face_id, + FontRenderer* font_renderer, std::vector<CharacterInfo>& alphabet); int tex; int pixel_height; }; @@ -131,22 +136,21 @@ struct CachedTextAtlas { int pixel_height; int flags; TextAtlas atlas; - }; struct CachedTextAtlases { static const int kMaxAtlases = 32; int num_atlases; CachedTextAtlas cached[kMaxAtlases]; - CachedTextAtlases():num_atlases(0) {} + CachedTextAtlases() : num_atlases(0) {} }; class TextAtlasRenderer { -public: + public: void Init(); void Dispose(); void AddText(TextAtlas* text_atlas, const char* text, int pos[2], FontRenderer* font_renderer, uint32_t char_output_limit); - TextMetrics GetMetrics( TextAtlas* text_atlas, const char* text, FontRenderer* font_renderer, uint32_t char_output_limit); + TextMetrics GetMetrics(TextAtlas* text_atlas, const char* text, FontRenderer* font_renderer, uint32_t char_output_limit); void Draw(TextAtlas* atlas, Graphics* graphics, char flags, const vec4& color); enum TextFlags { kTextShadow = 1 @@ -157,10 +161,11 @@ public: static const int kFloatsPerVert = 4; static const int kMaxCharacters = 1024; unsigned indices[kMaxCharacters * 6]; - float verts[kMaxCharacters * 4 * kFloatsPerVert]; //2v2t + float verts[kMaxCharacters * 4 * kFloatsPerVert]; // 2v2t VBORingContainer vert_vbo; VBORingContainer index_vbo; -private: + + private: int shader_id; int shader_attrib_vert_coord; int shader_attrib_tex_coord; @@ -180,15 +185,15 @@ enum { }; struct ASTextContext { - FontRenderer* font_renderer; - Graphics* graphics; - CachedTextAtlases atlases; - TextAtlasRenderer text_atlas_renderer; - bool text_atlas_renderer_setup; - ASTextContext():text_atlas_renderer_setup(false){} - - void ASDrawTextAtlas(const std::string &path, int pixel_height, int flags, const std::string &txt, int x, int y, vec4 color); - void ASDrawTextAtlas2(const std::string &path, int pixel_height, int flags, const std::string &txt, int x, int y, vec4 color, uint32_t char_limit); - TextMetrics ASGetTextAtlasMetrics(const std::string &path, int pixel_height, int flags, const std::string &txt ); - TextMetrics ASGetTextAtlasMetrics2(const std::string &path, int pixel_height, int flags, const std::string &txt, uint32_t char_limit ); + FontRenderer* font_renderer; + Graphics* graphics; + CachedTextAtlases atlases; + TextAtlasRenderer text_atlas_renderer; + bool text_atlas_renderer_setup; + ASTextContext() : text_atlas_renderer_setup(false) {} + + void ASDrawTextAtlas(const std::string& path, int pixel_height, int flags, const std::string& txt, int x, int y, vec4 color); + void ASDrawTextAtlas2(const std::string& path, int pixel_height, int flags, const std::string& txt, int x, int y, vec4 color, uint32_t char_limit); + TextMetrics ASGetTextAtlasMetrics(const std::string& path, int pixel_height, int flags, const std::string& txt); + TextMetrics ASGetTextAtlasMetrics2(const std::string& path, int pixel_height, int flags, const std::string& txt, uint32_t char_limit); }; |