mirror of https://github.com/bjornbytes/lovr.git
Add a bunch of Rasterizer functions;
This commit is contained in:
parent
3cce5fd991
commit
b549688c44
|
@ -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 }
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue