lovr/src/api/l_graphics_font.c

147 lines
4.3 KiB
C

#include "api.h"
#include "graphics/font.h"
#include "data/rasterizer.h"
#include "util.h"
#include <lua.h>
#include <lauxlib.h>
static int l_lovrFontGetWidth(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
size_t length;
const char* string = luaL_checklstring(L, 2, &length);
float wrap = luax_optfloat(L, 3, 0.f);
float width;
float lastLineWidth;
float height;
uint32_t lineCount;
uint32_t glyphCount;
lovrFontMeasure(font, string, length, wrap, &width, &lastLineWidth, &height, &lineCount, &glyphCount);
lua_pushnumber(L, width);
lua_pushnumber(L, lineCount + 1);
lua_pushnumber(L, lastLineWidth);
return 3;
}
static int l_lovrFontGetHeight(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lua_pushnumber(L, lovrFontGetHeight(font));
return 1;
}
static int l_lovrFontGetAscent(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lua_pushnumber(L, lovrFontGetAscent(font));
return 1;
}
static int l_lovrFontGetDescent(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lua_pushnumber(L, lovrFontGetDescent(font));
return 1;
}
static int l_lovrFontGetBaseline(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lua_pushnumber(L, lovrFontGetBaseline(font));
return 1;
}
static int l_lovrFontGetLineHeight(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lua_pushnumber(L, lovrFontGetLineHeight(font));
return 1;
}
static int l_lovrFontSetLineHeight(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
float lineHeight = luax_checkfloat(L, 2);
lovrFontSetLineHeight(font, lineHeight);
return 0;
}
static int l_lovrFontIsFlipEnabled(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lua_pushboolean(L, lovrFontIsFlipEnabled(font));
return 1;
}
static int l_lovrFontSetFlipEnabled(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lovrFontSetFlipEnabled(font, lua_toboolean(L, 2));
return 0;
}
static int l_lovrFontGetPixelDensity(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
lua_pushnumber(L, lovrFontGetPixelDensity(font));
return 1;
}
static int l_lovrFontSetPixelDensity(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
if (lua_isnoneornil(L, 2)) {
lovrFontSetPixelDensity(font, lovrRasterizerGetHeight(lovrFontGetRasterizer(font)));
} else {
float pixelDensity = luax_optfloat(L, 2, -1.f);
lovrFontSetPixelDensity(font, pixelDensity);
}
return 0;
}
static int l_lovrFontGetRasterizer(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
luax_pushtype(L, Rasterizer, lovrFontGetRasterizer(font));
return 1;
}
static int l_lovrFontHasGlyphs(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
Rasterizer* rasterizer = lovrFontGetRasterizer(font);
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;
}
static int l_lovrFontGetFilter(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
TextureFilter filter = lovrFontGetFilter(font);
luax_pushenum(L, FilterMode, filter.mode);
lua_pushnumber(L, filter.anisotropy);
return 2;
}
static int l_lovrFontSetFilter(lua_State* L) {
Font* font = luax_checktype(L, 1, Font);
FilterMode mode = luax_checkenum(L, 2, FilterMode, NULL);
float anisotropy = luax_optfloat(L, 3, 1.f);
TextureFilter filter = { .mode = mode, .anisotropy = anisotropy };
lovrFontSetFilter(font, filter);
return 0;
}
const luaL_Reg lovrFont[] = {
{ "getWidth", l_lovrFontGetWidth },
{ "getHeight", l_lovrFontGetHeight },
{ "getAscent", l_lovrFontGetAscent },
{ "getDescent", l_lovrFontGetDescent },
{ "getBaseline", l_lovrFontGetBaseline },
{ "getLineHeight", l_lovrFontGetLineHeight },
{ "setLineHeight", l_lovrFontSetLineHeight },
{ "isFlipEnabled", l_lovrFontIsFlipEnabled },
{ "setFlipEnabled", l_lovrFontSetFlipEnabled },
{ "getPixelDensity", l_lovrFontGetPixelDensity },
{ "setPixelDensity", l_lovrFontSetPixelDensity },
{ "getRasterizer", l_lovrFontGetRasterizer},
{ "hasGlyphs", l_lovrFontHasGlyphs },
{ "getFilter", l_lovrFontGetFilter },
{ "setFilter", l_lovrFontSetFilter },
{ NULL, NULL }
};