Add a bunch of Rasterizer functions;

This commit is contained in:
bjorn 2018-01-22 18:49:45 -08:00
parent 3cce5fd991
commit b549688c44
3 changed files with 84 additions and 0 deletions

View File

@ -1,5 +1,63 @@
#include "api.h"
#include "data/rasterizer.h"
int l_lovrRasterizerGetHeight(lua_State* L) {
Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer);
lua_pushinteger(L, rasterizer->height);
return 1;
}
int l_lovrRasterizerGetAdvance(lua_State* L) {
Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer);
lua_pushinteger(L, rasterizer->advance);
return 1;
}
int l_lovrRasterizerGetAscent(lua_State* L) {
Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer);
lua_pushinteger(L, rasterizer->ascent);
return 1;
}
int l_lovrRasterizerGetDescent(lua_State* L) {
Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer);
lua_pushinteger(L, rasterizer->descent);
return 1;
}
int l_lovrRasterizerGetLineHeight(lua_State* L) {
Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer);
lua_pushinteger(L, rasterizer->height * 1.25f);
return 1;
}
int l_lovrRasterizerGetGlyphCount(lua_State* L) {
Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer);
lua_pushinteger(L, rasterizer->glyphCount);
return 1;
}
int l_lovrRasterizerHasGlyphs(lua_State* L) {
Rasterizer* rasterizer = luax_checktype(L, 1, Rasterizer);
bool hasGlyphs = true;
for (int i = 2; i <= lua_gettop(L); i++) {
if (lua_type(L, i) == LUA_TSTRING) {
hasGlyphs &= lovrRasterizerHasGlyphs(rasterizer, lua_tostring(L, i));
} else {
hasGlyphs &= lovrRasterizerHasGlyph(rasterizer, luaL_checkinteger(L, i));
}
}
lua_pushboolean(L, hasGlyphs);
return 1;
}
const luaL_Reg lovrRasterizer[] = {
{ "getHeight", l_lovrRasterizerGetHeight },
{ "getAdvance", l_lovrRasterizerGetAdvance },
{ "getAscent", l_lovrRasterizerGetAscent },
{ "getDescent", l_lovrRasterizerGetDescent },
{ "getLineHeight", l_lovrRasterizerGetLineHeight },
{ "getGlyphCount", l_lovrRasterizerGetGlyphCount },
{ "hasGlyphs", l_lovrRasterizerHasGlyphs },
{ NULL, NULL }
};

View File

@ -81,9 +81,11 @@ Rasterizer* lovrRasterizerCreate(Blob* blob, int size) {
rasterizer->ftHandle = face;
rasterizer->blob = blob;
rasterizer->size = size;
rasterizer->glyphCount = face->num_glyphs;
FT_Size_Metrics metrics = face->size->metrics;
rasterizer->height = metrics.height >> 6;
rasterizer->advance = metrics.max_advance >> 6;
rasterizer->ascent = metrics.ascender >> 6;
rasterizer->descent = metrics.descender >> 6;
@ -99,6 +101,25 @@ void lovrRasterizerDestroy(const Ref* ref) {
free(rasterizer);
}
bool lovrRasterizerHasGlyph(Rasterizer* rasterizer, uint32_t character) {
FT_Face face = rasterizer->ftHandle;
return FT_Get_Char_Index(face, character) != 0;
}
bool lovrRasterizerHasGlyphs(Rasterizer* rasterizer, const char* str) {
int len = strlen(str);
const char* end = str + len;
unsigned int codepoint;
size_t bytes;
bool hasGlyphs = true;
while ((bytes = utf8_decode(str, end, &codepoint)) > 0) {
hasGlyphs &= lovrRasterizerHasGlyph(rasterizer, codepoint);
str += bytes;
}
return hasGlyphs;
}
void lovrRasterizerLoadGlyph(Rasterizer* rasterizer, uint32_t character, Glyph* glyph) {
FT_Face face = rasterizer->ftHandle;
FT_Error err = FT_Err_Ok;

View File

@ -2,6 +2,7 @@
#include "lib/map/map.h"
#include "util.h"
#include <stdint.h>
#include <stdbool.h>
#pragma once
@ -12,7 +13,9 @@ typedef struct {
void* ftHandle;
Blob* blob;
int size;
int glyphCount;
int height;
int advance;
int ascent;
int descent;
} Rasterizer;
@ -34,5 +37,7 @@ typedef map_t(Glyph) map_glyph_t;
Rasterizer* lovrRasterizerCreate(Blob* blob, int size);
void lovrRasterizerDestroy(const Ref* ref);
bool lovrRasterizerHasGlyph(Rasterizer* fontData, uint32_t character);
bool lovrRasterizerHasGlyphs(Rasterizer* fontData, const char* str);
void lovrRasterizerLoadGlyph(Rasterizer* fontData, uint32_t character, Glyph* glyph);
int lovrRasterizerGetKerning(Rasterizer* fontData, uint32_t left, uint32_t right);