LuaEngine/Font.cpp
Kiritow 7b098c50ed LuaEngine v0.5.1
Add api docs.
More support of loading resources from memory.
Minor fix.
2020-06-29 20:38:23 +08:00

155 lines
3.7 KiB
C++

#include "include.h"
/*
class Font
constructor(filename: string, size: int)
constructor(data: string, size: int, flag: int) flag is not used currently.
renderText(str: string, r: int, g: int, b: int, a: int): Surface
renderText(rnd: Renderer, str: string, r: int, g: int, b: int, a: int): Texture
*/
int font_close(lua_State* L)
{
auto font = lua_checkpointer<TTF_Font>(L, 1, "LuaEngineFont");
TTF_CloseFont(font);
return 0;
}
int font_rendertext(lua_State* L)
{
auto font = lua_checkpointer<TTF_Font>(L, 1, "LuaEngineFont");
const char* str;
SDL_Color color;
if (lua_isstring(L, 2))
{
str = luaL_checkstring(L, 2);
color.r = luaL_checkinteger(L, 3);
color.g = luaL_checkinteger(L, 4);
color.b = luaL_checkinteger(L, 5);
color.a = luaL_checkinteger(L, 6);
SDL_Surface* surf = TTF_RenderText_Blended(font, str, color);
if (!surf)
{
return TTFError(L, TTF_RenderText_Blended);
}
put_surface(L, surf);
return 1;
}
else
{
auto rnd = lua_checkpointer<SDL_Renderer>(L, 2, "LuaEngineRenderer");
str = luaL_checkstring(L, 3);
color.r = luaL_checkinteger(L, 4);
color.g = luaL_checkinteger(L, 5);
color.b = luaL_checkinteger(L, 6);
color.a = luaL_checkinteger(L, 7);
SDL_Surface* surf = TTF_RenderText_Blended(font, str, color);
if (!surf)
{
return TTFError(L, TTF_RenderText_Blended);
}
SDL_Texture* text = SDL_CreateTextureFromSurface(rnd, surf);
SDL_FreeSurface(surf);
if (!text)
{
return SDLError(L, SDL_CreateTextureFromSurface);
}
put_texture(L, text);
return 1;
}
}
int font_renderutf8(lua_State* L)
{
auto font = lua_checkpointer<TTF_Font>(L, 1, "LuaEngineFont");
const char* str;
SDL_Color color;
if (lua_isstring(L, 2))
{
str = luaL_checkstring(L, 2);
color.r = luaL_checkinteger(L, 3);
color.g = luaL_checkinteger(L, 4);
color.b = luaL_checkinteger(L, 5);
color.a = luaL_checkinteger(L, 6);
SDL_Surface* surf = TTF_RenderUTF8_Blended(font, str, color);
if (!surf)
{
return TTFError(L, TTF_RenderUTF8_Blended);
}
put_surface(L, surf);
return 1;
}
else
{
auto rnd = lua_checkpointer<SDL_Renderer>(L, 2, "LuaEngineRenderer");
str = luaL_checkstring(L, 3);
color.r = luaL_checkinteger(L, 4);
color.g = luaL_checkinteger(L, 5);
color.b = luaL_checkinteger(L, 6);
color.a = luaL_checkinteger(L, 7);
SDL_Surface* surf = TTF_RenderUTF8_Blended(font, str, color);
if (!surf)
{
return TTFError(L, TTF_RenderUTF8_Blended);
}
SDL_Texture* text = SDL_CreateTextureFromSurface(rnd, surf);
SDL_FreeSurface(surf);
if (!text)
{
return SDLError(L, SDL_CreateTextureFromSurface);
}
put_texture(L, text);
return 1;
}
}
int font_new(lua_State* L)
{
TTF_Font* font;
if (lua_gettop(L) >= 3)
{
size_t datalen;
const char* data = luaL_checklstring(L, 1, &datalen);
int fontsize = luaL_checkinteger(L, 2);
int flag = luaL_checkinteger(L, 3);
SDL_RWops* src = SDL_RWFromConstMem(data, datalen);
font = TTF_OpenFontRW(src, 0, fontsize);
SDL_RWclose(src);
if (!font)
{
return TTFError(L, TTF_OpenFontRW);
}
}
else
{
const char* filename = luaL_checkstring(L, 1);
int fontsize = luaL_checkinteger(L, 2);
font = TTF_OpenFont(filename, fontsize);
if (!font)
{
return TTFError(L, TTF_OpenFont);
}
}
lua_newpointer(L, font);
if (luaL_newmetatable(L, "LuaEngineFont"))
{
lua_setfield_function(L, "__gc", font_close);
lua_newtable(L);
lua_setfield_function(L, "renderText", font_rendertext);
lua_setfield_function(L, "renderUTF8", font_renderutf8);
lua_setfield(L, -2, "__index");
}
lua_setmetatable(L, -2);
return 1;
}
void InitFont(lua_State* L)
{
lua_getglobal(L, "package");
lua_getfield(L, -1, "loaded");
lua_pushcfunction(L, font_new);
lua_setfield(L, -2, "Font");
lua_pop(L, 2);
}