int LuaFonts::SetTextColor(lua_State* L) { CglFont* font = tofont(L, 1); const int args = lua_gettop(L); // number of arguments if (args < 2) { luaL_error(L, "Incorrect arguments to font:SetTextColor([\"textColor\"])"); } float4* color = NULL; if (lua_istable(L, 2)) { color = new float4; const int count = ParseFloatArray(L, 2, *color, 4); if (count < 3) { luaL_error(L, "Incorrect arguments to font:SetTextColor([\"textColor\"])"); } if (count == 3) { color->w = 1.0f; } } else if (args >= 4) { color = new float4; color->x = lua_tonumber(L, 2); color->y = lua_tonumber(L, 3); color->z = lua_tonumber(L, 4); color->w = luaL_optfloat(L, 5, 1.0f); } else if (!lua_isnil(L, 2)) { luaL_error(L, "Incorrect arguments to font:SetTextColor([\"textColor\"])"); } font->SetTextColor(color); delete color; return 0; }
int LuaFonts::End(lua_State* L) { CheckDrawingEnabled(L, __FUNCTION__); CglFont* font = tofont(L, 1); font->End(); return 0; }
int LuaFonts::GetTextWidth(lua_State* L) { CglFont* font = tofont(L, 1); const string text(luaL_checkstring(L, 2),lua_strlen(L, 2)); const float width = font->GetTextWidth(text); lua_pushnumber(L, width); return 1; }
int LuaFonts::meta_index(lua_State* L) { //! first check if there is a function luaL_getmetatable(L, "Font"); lua_pushvalue(L, 2); lua_rawget(L, -2); if (!lua_isnil(L, -1)) { return 1; } lua_pop(L, 1); //! couldn't find a function, so check properties CglFont* font = tofont(L, 1); if (lua_israwstring(L, 2)) { const string key = lua_tostring(L, 2); if (key == "size") { lua_pushnumber(L, font->GetSize()); return 1; //} else if (key == "outlinecolor") { //} else if (key == "textcolor") { } else if (key == "path") { const std::string& filepath = font->GetFilePath(); lua_pushlstring(L, filepath.c_str(), filepath.length()); return 1; } else if (key == "height" || key == "lineheight") { lua_pushnumber(L, font->GetLineHeight()); return 1; } else if (key == "descender") { lua_pushnumber(L, font->GetDescender()); return 1; } else if (key == "outlinewidth") { lua_pushnumber(L, font->GetOutlineWidth()); return 1; } else if (key == "outlineweight") { lua_pushnumber(L, font->GetOutlineWeight()); return 1; } else if (key == "family") { const std::string& family = font->GetFamily(); lua_pushlstring(L, family.c_str(), family.length()); return 1; } else if (key == "style") { const std::string& style = font->GetStyle(); lua_pushlstring(L, style.c_str(), style.length()); return 1; } else if (key == "texturewidth") { lua_pushnumber(L, font->GetTexWidth()); return 1; } else if (key == "textureheight") { lua_pushnumber(L, font->GetTexHeight()); return 1; } } return 0; }
int LuaFonts::BindTexture(lua_State* L) { CheckDrawingEnabled(L, __FUNCTION__); CglFont* font = tofont(L, 1); glBindTexture(GL_TEXTURE_2D, font->GetTexture()); glEnable(GL_TEXTURE_2D); return 0; }
int LuaFonts::GetTextHeight(lua_State* L) { CglFont* font = tofont(L, 1); const string text(luaL_checkstring(L, 2),lua_strlen(L, 2)); float descender; int lines; const float height = font->GetTextHeight(text,&descender,&lines); lua_pushnumber(L, height); lua_pushnumber(L, descender); lua_pushnumber(L, lines); return 3; }
int LuaFonts::SetAutoOutlineColor(lua_State* L) { CglFont* font = tofont(L, 1); const int args = lua_gettop(L); // number of arguments if (args < 2 || !lua_isboolean(L, 2)) { luaL_error(L, "Incorrect arguments to font:SetAutoOutlineColor(enable)"); } bool enable = lua_toboolean(L, 2); font->SetAutoOutlineColor(enable); return 0; }
int LuaFonts::WrapText(lua_State* L) { CglFont* font = tofont(L, 1); string text(luaL_checkstring(L, 2),lua_strlen(L, 2)); const float maxWidth = luaL_checkfloat(L, 3); const float maxHeight = luaL_optfloat(L, 4, 1e9); const float size = luaL_optfloat(L, 5, font->GetSize()); const int lines = font->WrapInPlace(text,size,maxWidth,maxHeight); lua_pushsstring(L, text); lua_pushnumber(L, lines); return 2; }
int LuaFonts::GetTextWidth(lua_State* L) { CglFont* font = tofont(L, 1); const int args = lua_gettop(L); // number of arguments if ((args < 2) || !lua_isstring(L, 2)) { luaL_error(L, "Incorrect arguments to font:GetTextWidth(\"text\")"); } const string text(lua_tostring(L, 2),lua_strlen(L, 2)); const float width = font->GetTextWidth(text); lua_pushnumber(L, width); return 1; }
int LuaFonts::Print(lua_State* L) { CheckDrawingEnabled(L, __FUNCTION__); const int args = lua_gettop(L); // number of arguments if ((args < 4) || !lua_isstring(L, 2) || !lua_isnumber(L, 3) || !lua_isnumber(L, 4)) { luaL_error(L, "Incorrect arguments to font:Print(msg, x, y [,size [,\"options\"] ]"); } CglFont* font = tofont(L, 1); const string text(lua_tostring(L, 2),lua_strlen(L, 2)); const float x = lua_tonumber(L, 3); const float y = lua_tonumber(L, 4); const float size = luaL_optfloat(L, 5, font->GetSize()); int options = FONT_NEAREST; if ((args >= 6) && lua_isstring(L, 6)) { const char* c = lua_tostring(L, 6); while (*c != 0) { switch (*c) { case 'c': { options |= FONT_CENTER; break; } case 'r': { options |= FONT_RIGHT; break; } case 'a': { options |= FONT_ASCENDER; break; } case 't': { options |= FONT_TOP; break; } case 'v': { options |= FONT_VCENTER; break; } case 'x': { options |= FONT_BASELINE; break; } case 'b': { options |= FONT_BOTTOM; break; } case 'd': { options |= FONT_DESCENDER; break; } case 's': { options |= FONT_SHADOW; break; } case 'o': case 'O': { options |= FONT_OUTLINE; break; } case 'n': { options ^= FONT_NEAREST; break; } } c++; } } font->glPrint(x, y, size, options, text); return 0; }
int LuaFonts::GetTextHeight(lua_State* L) { CglFont* font = tofont(L, 1); const int args = lua_gettop(L); // number of arguments if ((args < 2) || !lua_isstring(L, 2)) { luaL_error(L, "Incorrect arguments to font:GetTextHeight(\"text\")"); } const string text(lua_tostring(L, 2),lua_strlen(L, 2)); float descender; int lines; const float height = font->GetTextHeight(text,&descender,&lines); lua_pushnumber(L, height); lua_pushnumber(L, descender); lua_pushnumber(L, lines); return 3; }
int LuaFonts::WrapText(lua_State* L) { CglFont* font = tofont(L, 1); const int args = lua_gettop(L); // number of arguments if ((args < 3) || !lua_isstring(L, 2) || !lua_isnumber(L, 3)) { luaL_error(L, "Incorrect arguments to font:WrapText(\"text\", maxWidth, [maxHeight], [size])"); } string text(lua_tostring(L, 2),lua_strlen(L, 2)); const float maxWidth = lua_tonumber(L, 3); const float maxHeight = luaL_optfloat(L, 4, 1e9); const float size = luaL_optfloat(L, 5, font->GetSize()); const int lines = font->WrapInPlace(text,size,maxWidth,maxHeight); lua_pushlstring(L, text.c_str(), text.length()); lua_pushnumber(L, lines); return 2; }