static int l_font_draw_tooltip(lua_State *L) { THFont* pFont = luaT_testuserdata<THFont>(L); THRenderTarget* pCanvas = luaT_testuserdata<THRenderTarget>(L, 2); size_t iMsgLen; const char* sMsg = luaT_checkstring(L, 3, &iMsgLen); int iX = static_cast<int>(luaL_checkinteger(L, 4)); int iY = static_cast<int>(luaL_checkinteger(L, 5)); int iScreenWidth = pCanvas->getWidth(); int iW = 200; // (for now) hardcoded width of tooltips uint32_t iBlack = pCanvas->mapColour(0x00, 0x00, 0x00); uint32_t iWhite = pCanvas->mapColour(0xFF, 0xFF, 0xFF); THFontDrawArea oArea = pFont->drawTextWrapped(nullptr, sMsg, iMsgLen, iX + 2, iY + 1, iW - 4, INT_MAX, 0); int iLastX = iX + oArea.iWidth + 3; int iFirstY = iY - (oArea.iEndY - iY) - 1; int iXOffset = iLastX > iScreenWidth ? iScreenWidth - iLastX : 0; int iYOffset = iFirstY < 0 ? -iFirstY : 0; pCanvas->fillRect(iBlack, iX + iXOffset, iFirstY + iYOffset, oArea.iWidth + 3, oArea.iEndY - iY + 2); pCanvas->fillRect(iWhite, iX + iXOffset + 1, iFirstY + 1 + iYOffset, oArea.iWidth + 1, oArea.iEndY - iY); pFont->drawTextWrapped(pCanvas, sMsg, iMsgLen, iX + 2 + iXOffset, iFirstY + 1 + iYOffset, iW - 4); lua_pushinteger(L, oArea.iEndY); return 1; }
static int l_font_draw_wrapped(lua_State *L) { THFont* pFont = luaT_testuserdata<THFont>(L); THRenderTarget* pCanvas = nullptr; if(!lua_isnoneornil(L, 2)) { pCanvas = luaT_testuserdata<THRenderTarget>(L, 2); } size_t iMsgLen; const char* sMsg = luaT_checkstring(L, 3, &iMsgLen); int iX = static_cast<int>(luaL_checkinteger(L, 4)); int iY = static_cast<int>(luaL_checkinteger(L, 5)); int iW = static_cast<int>(luaL_checkinteger(L, 6)); eTHAlign eAlign = Align_Left; if(!lua_isnoneornil(L, 7)) { const char* sAlign = luaL_checkstring(L, 7); if(std::strcmp(sAlign, "right") == 0) eAlign = Align_Right; else if(std::strcmp(sAlign, "left") == 0) eAlign = Align_Left; else if(std::strcmp(sAlign, "center") == 0 || std::strcmp(sAlign, "centre") == 0 || std::strcmp(sAlign, "middle") == 0) { eAlign = Align_Center; } else return luaL_error(L, "Invalid alignment: \"%s\"", sAlign); } int iMaxRows = INT_MAX; if(!lua_isnoneornil(L, 8)) { iMaxRows = static_cast<int>(luaL_checkinteger(L, 8)); } int iSkipRows = 0; if(!lua_isnoneornil(L, 9)) { iSkipRows = static_cast<int>(luaL_checkinteger(L, 9)); } THFontDrawArea oDrawArea = pFont->drawTextWrapped(pCanvas, sMsg, iMsgLen, iX, iY, iW, iMaxRows, iSkipRows, eAlign); lua_pushinteger(L, oDrawArea.iEndY); lua_pushinteger(L, oDrawArea.iEndX); lua_pushinteger(L, oDrawArea.iNumRows); return 3; }
static int l_font_draw_wrapped(lua_State *L) { THFont* pFont = luaT_testuserdata<THFont>(L); THRenderTarget* pCanvas = NULL; if(!lua_isnoneornil(L, 2)) { pCanvas = luaT_testuserdata<THRenderTarget>(L, 2); } size_t iMsgLen; const char* sMsg = luaT_checkstring(L, 3, &iMsgLen); int iX = luaL_checkint(L, 4); int iY = luaL_checkint(L, 5); int iW = luaL_checkint(L, 6); eTHAlign eAlign = Align_Left; if(!lua_isnoneornil(L, 7)) { const char* sAlign = luaL_checkstring(L, 7); if(strcmp(sAlign, "right") == 0) eAlign = Align_Right; else if(strcmp(sAlign, "left") == 0) eAlign = Align_Left; else if(strcmp(sAlign, "center") == 0 || strcmp(sAlign, "centre") == 0 || strcmp(sAlign, "middle") == 0) { eAlign = Align_Center; } else return luaL_error(L, "Invalid alignment: \"%s\"", sAlign); } int iLastX; int iLastY = pFont->drawTextWrapped(pCanvas, sMsg, iMsgLen, iX, iY, iW, NULL, &iLastX, eAlign); lua_pushinteger(L, iLastY); lua_pushinteger(L, iLastX); return 2; }