int w_newRasterizer(lua_State *L) { if (lua_type(L, 1) == LUA_TNUMBER || lua_type(L, 2) == LUA_TNUMBER || lua_isnone(L, 1)) { // First or second argument is a number: call newTrueTypeRasterizer. return w_newTrueTypeRasterizer(L); } else if (lua_isnoneornil(L, 2)) { // Single argument of another type: call Font::newRasterizer. Rasterizer *t = nullptr; filesystem::FileData *d = filesystem::luax_getfiledata(L, 1); luax_catchexcept(L, [&]() { t = instance()->newRasterizer(d); }, [&](bool) { d->release(); } ); luax_pushtype(L, FONT_RASTERIZER_ID, t); t->release(); return 1; } else { // Otherwise call newBMFontRasterizer. return w_newBMFontRasterizer(L); } }
int w_newImageRasterizer(lua_State *L) { Rasterizer *t = nullptr; convimagedata(L, 1); image::ImageData *d = luax_checktype<image::ImageData>(L, 1, IMAGE_IMAGE_DATA_ID); std::string glyphs = luax_checkstring(L, 2); int extraspacing = (int) luaL_optnumber(L, 3, 0); luax_catchexcept(L, [&](){ t = instance()->newImageRasterizer(d, glyphs, extraspacing); }); luax_pushtype(L, FONT_RASTERIZER_ID, t); t->release(); return 1; }
int w_newTrueTypeRasterizer(lua_State *L) { Rasterizer *t = nullptr; TrueTypeRasterizer::Hinting hinting = TrueTypeRasterizer::HINTING_NORMAL; if (lua_type(L, 1) == LUA_TNUMBER || lua_isnone(L, 1)) { // First argument is a number: use the default TrueType font. int size = (int) luaL_optnumber(L, 1, 12); const char *hintstr = lua_isnoneornil(L, 2) ? nullptr : luaL_checkstring(L, 2); if (hintstr && !TrueTypeRasterizer::getConstant(hintstr, hinting)) return luaL_error(L, "Invalid TrueType font hinting mode: %s", hintstr); luax_catchexcept(L, [&](){ t = instance()->newTrueTypeRasterizer(size, hinting); }); } else { love::Data *d = nullptr; if (luax_istype(L, 1, DATA_ID)) d = luax_checkdata(L, 1); else d = filesystem::luax_getfiledata(L, 1); int size = (int) luaL_optnumber(L, 2, 12); const char *hintstr = lua_isnoneornil(L, 3) ? nullptr : luaL_checkstring(L, 3); if (hintstr && !TrueTypeRasterizer::getConstant(hintstr, hinting)) return luaL_error(L, "Invalid TrueType font hinting mode: %s", hintstr); luax_catchexcept(L, [&]() { t = instance()->newTrueTypeRasterizer(d, size, hinting); }, [&](bool) { d->release(); } ); } luax_pushtype(L, FONT_RASTERIZER_ID, t); t->release(); return 1; }
int w_newBMFontRasterizer(lua_State *L) { Rasterizer *t = nullptr; filesystem::FileData *d = filesystem::luax_getfiledata(L, 1); std::vector<image::ImageData *> images; if (lua_istable(L, 2)) { for (int i = 1; i <= (int) luax_objlen(L, 2); i++) { lua_rawgeti(L, 2, i); convimagedata(L, -1); image::ImageData *id = luax_checktype<image::ImageData>(L, -1, IMAGE_IMAGE_DATA_ID); images.push_back(id); id->retain(); lua_pop(L, 1); } } else { for (int i = 2; i <= lua_gettop(L); i++) { convimagedata(L, i); image::ImageData *id = luax_checktype<image::ImageData>(L, i, IMAGE_IMAGE_DATA_ID); images.push_back(id); id->retain(); } } luax_catchexcept(L, [&]() { t = instance()->newBMFontRasterizer(d, images); }, [&](bool) { d->release(); for (auto id : images) id->release(); } ); luax_pushtype(L, FONT_RASTERIZER_ID, t); t->release(); return 1; }