aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Graphics/Font.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/Graphics/Font.h')
-rw-r--r--src/libjin/Graphics/Font.h103
1 files changed, 62 insertions, 41 deletions
diff --git a/src/libjin/Graphics/Font.h b/src/libjin/Graphics/Font.h
index 10fd242..2bd51a5 100644
--- a/src/libjin/Graphics/Font.h
+++ b/src/libjin/Graphics/Font.h
@@ -1,79 +1,100 @@
#ifndef __LIBJIN_FONT_H
#define __LIBJIN_FONT_H
-#include "../modules.h"
+#include "../jin_configuration.h"
#if LIBJIN_MODULES_RENDER
#include <vector>
#include <map>
#include "drawable.h"
-#include "../3rdparty/stb/stb_truetype.h"
+#include "FontData.h"
#include "../math/quad.h"
namespace jin
{
namespace graphics
{
- /**
- * original from love2d font and graphics modules
- * the basic idea is storing glyphs in several mipmap
- * http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
- */
-
+
struct GlyphVertex
{
- float x, y; // screen coordinates
- float u, v; // texture coordinates
+ int x, y; // screen coordinates
+ float u, v; // texture uv
};
- /* track when to change texutre binded in render array */
- /* casue switch texture is expensive */
- /* std::vector<GlyphVertex> list */
struct GlyphArrayDrawInfo
{
- GLuint texture;
- int startvertex;
- int vertexcount;
+ GLuint texture; // atlas
+ unsigned int start; // glyph vertex indecies
+ unsigned int count; // glyph vertex count
};
- /* glyph texture */
struct Glyph
{
- GLuint texture; // texture where this glyph rendered
- int spacing; // spacing of glyph
- GlyphVertex vertices[4]; // quad of glyph render region
+ GLuint atlas;
+ /* normalized coordinates */
+ struct Bbox
+ {
+ float x, y;
+ float width, height;
+ } bbox;
+ /* glyph size in pixel */
+ unsigned int width, height;
+ };
+
+ struct Page
+ {
+ std::vector<GlyphArrayDrawInfo> glyphinfolist;
+ std::vector<GlyphVertex> glyphvertices;
+ int width, height;
};
class Font
{
- public:
- static Font* createFont(const char* file);
- static Font* createFont(const char* data, size_t size);
+ public:
+ typedef unsigned int Codepoint;
+
+ static Font* createFont(FontData* fontData, unsigned int fontSzie);
+ static void destroyFont(Font* font);
- void print(const char* text, int x, int y);
+ Page* typeset(const char* text, int lineheight, int spacing);
+ void print(const char* text, int x, int y, int lineheight, int spacing = 0);
+ void print(const Page* page, int x, int y);
+ //Bitmap* bake(const char* text);
+#if defined(font_debug)
+ void drawAtlas();
+#endif
+ ~Font();
private:
- /* font atlas levels */
static const int TEXTURE_SIZE_LEVELS_COUNT = 7;
static const int TEXTURE_SIZE_LEVEL_MAX = TEXTURE_SIZE_LEVELS_COUNT - 1;
static const int TEXTURE_WIDTHS[TEXTURE_SIZE_LEVELS_COUNT];
static const int TEXTURE_HEIGHTS[TEXTURE_SIZE_LEVELS_COUNT];
- static const int SPACES_PER_TAB = 4;
-
- /* create a new mipmap to render glyph and push it on textures */
- bool createTexture();
- /* create a glyph for a unicode and return it */
- Glyph* addGlyph(unsigned int character);
- /* find glyph by unicode */
- Glyph* findGlyph(unsigned int character);
-
- /* list of textures where glyphs rendered, always operate the last one */
- /* map character to its render area */
- std::vector<GLuint> textures;
- std::map<unsigned int, Glyph*> glyphs;
- /* mipmap size level */
- int textureLevel;
- int textureWidth;
+
+ Font(FontData* font, Codepoint fontSize);
+
+ void estimateSize();
+ GLuint createAtlas();
+ Glyph* bakeGlyph(Codepoint character);
+ Glyph* findGlyph(Codepoint character);
+
+ int getCharWidth(int c);
+ int getCharHeight(int c);
+ int getTextWidth(const char* text, int spacing = 0);
+ int getTextHeight(const char* text, int lineheight);
+ void getTextBox(const char* text, int* w, int* h, int lineheight, int spacing = 0);
+
+ int textureWidth;
int textureHeight;
+ std::vector<GLuint> atlases;
+ /* map unicode codepoint to glyph */
+ std::map<Codepoint, Glyph*> glyphs;
+ FontData* font;
+ const unsigned int fontsize;
+ int baseline;
+ int descent;
+
+ /* cursor helped render to texture */
+ math::Vector2<float> cursor;
};