2017-01-30 02:37:56 +00:00
|
|
|
#include "loaders/font.h"
|
|
|
|
#include "util.h"
|
|
|
|
#include <ft2build.h>
|
|
|
|
#include FT_FREETYPE_H
|
|
|
|
#include FT_GLYPH_H
|
|
|
|
|
|
|
|
static FT_Library ft = NULL;
|
|
|
|
|
|
|
|
FontData* lovrFontDataCreate(void* data, int size) {
|
|
|
|
if (!ft && FT_Init_FreeType(&ft)) {
|
|
|
|
error("Error initializing FreeType");
|
|
|
|
}
|
|
|
|
|
|
|
|
FontData* fontData = malloc(sizeof(FontData));
|
2017-02-03 23:16:30 +00:00
|
|
|
if (FT_New_Memory_Face(ft, data, size, 0, (FT_Face*)&fontData->rasterizer)) {
|
2017-01-30 02:37:56 +00:00
|
|
|
error("Error loading font");
|
|
|
|
}
|
|
|
|
|
2017-02-03 23:16:30 +00:00
|
|
|
if (FT_Set_Pixel_Sizes(fontData->rasterizer, 0, 64)) {
|
2017-01-30 02:37:56 +00:00
|
|
|
error("Problem setting font size");
|
|
|
|
}
|
|
|
|
|
|
|
|
return fontData;
|
|
|
|
}
|
|
|
|
|
2017-02-05 06:21:41 +00:00
|
|
|
void lovrFontDataLoadGlyph(FontData* fontData, uint32_t character, Glyph* glyph) {
|
2017-02-03 23:16:30 +00:00
|
|
|
FT_Face face = fontData->rasterizer;
|
|
|
|
FT_Error err = FT_Err_Ok;
|
|
|
|
FT_Glyph ftGlyph;
|
|
|
|
FT_Bitmap ftBitmap;
|
|
|
|
FT_BitmapGlyph ftBitmapGlyph;
|
2017-01-30 02:37:56 +00:00
|
|
|
|
2017-02-03 23:16:30 +00:00
|
|
|
err |= FT_Load_Glyph(face, FT_Get_Char_Index(face, character), FT_LOAD_DEFAULT);
|
|
|
|
err |= FT_Get_Glyph(face->glyph, &ftGlyph);
|
|
|
|
err |= FT_Glyph_To_Bitmap(&ftGlyph, FT_RENDER_MODE_NORMAL, 0, 1);
|
|
|
|
|
|
|
|
if (err) {
|
|
|
|
error("Error loading glyph\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
ftBitmapGlyph = (FT_BitmapGlyph) ftGlyph;
|
|
|
|
ftBitmap = ftBitmapGlyph->bitmap;
|
|
|
|
|
|
|
|
FT_Glyph_Metrics* metrics = &face->glyph->metrics;
|
2017-02-05 06:21:41 +00:00
|
|
|
glyph->x = 0;
|
|
|
|
glyph->y = 0;
|
|
|
|
glyph->ox = metrics->horiBearingX >> 6;
|
|
|
|
glyph->oy = metrics->horiBearingY >> 6;
|
|
|
|
glyph->w = metrics->width >> 6;
|
|
|
|
glyph->h = metrics->height >> 6;
|
|
|
|
glyph->advance = metrics->horiAdvance >> 6;
|
|
|
|
glyph->data = malloc(2 * glyph->w * glyph->h);
|
2017-02-03 23:16:30 +00:00
|
|
|
|
|
|
|
int i = 0;
|
|
|
|
uint8_t* row = ftBitmap.buffer;
|
2017-02-05 06:21:41 +00:00
|
|
|
for (int y = 0; y < glyph->h; y++) {
|
|
|
|
for (int x = 0; x < glyph->w; x++) {
|
|
|
|
glyph->data[i++] = 0xff;
|
|
|
|
glyph->data[i++] = row[x];
|
2017-02-03 23:16:30 +00:00
|
|
|
}
|
|
|
|
row += ftBitmap.pitch;
|
|
|
|
}
|
|
|
|
|
|
|
|
FT_Done_Glyph(ftGlyph);
|
2017-01-30 02:37:56 +00:00
|
|
|
}
|