Example #1
0
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;
}
Example #2
0
static int l_font_get_size(lua_State *L)
{
    THFont* pFont = luaT_testuserdata<THFont>(L);
    size_t iMsgLen;
    const char* sMsg = luaT_checkstring(L, 2, &iMsgLen);

    int iWidth, iHeight;
    pFont->getTextSize(sMsg, iMsgLen, &iWidth, &iHeight);

    lua_pushinteger(L, iWidth);
    lua_pushinteger(L, iHeight);
    return 2;
}
Example #3
0
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;
}
Example #4
0
static int l_font_draw(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));
    eTHAlign eAlign = Align_Center;
    if(!lua_isnoneornil(L, 8))
    {
        const char* sAlign = luaL_checkstring(L, 8);
        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);
    }

    THFontDrawArea oDrawArea = pFont->getTextSize(sMsg, iMsgLen);
    if(!lua_isnoneornil(L, 7))
    {
        int iW = static_cast<int>(luaL_checkinteger(L, 6));
        int iH = static_cast<int>(luaL_checkinteger(L, 7));
        if(iW > oDrawArea.iEndX && eAlign != Align_Left)
            iX += (iW - oDrawArea.iEndX) / ((eAlign == Align_Center) ? 2 : 1);
        if(iH > oDrawArea.iEndY)
            iY += (iH - oDrawArea.iEndY) / 2;
    }
    if(pCanvas != nullptr)
    {
        pFont->drawText(pCanvas, sMsg, iMsgLen, iX, iY);
    }
    lua_pushinteger(L, iY + oDrawArea.iEndY);
    lua_pushinteger(L, iX + oDrawArea.iEndX);

    return 2;
}
Example #5
0
static int l_font_draw(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);
    eTHAlign eAlign = Align_Center;
    if(!lua_isnoneornil(L, 8))
    {
        const char* sAlign = luaL_checkstring(L, 8);
        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 iWidth, iHeight;
    pFont->getTextSize(sMsg, iMsgLen, &iWidth, &iHeight);
    if(!lua_isnoneornil(L, 7))
    {
        int iW = luaL_checkint(L, 6);
        int iH = luaL_checkint(L, 7);
        if(iW > iWidth && eAlign != Align_Left)
            iX += (iW - iWidth) / ((eAlign == Align_Center) ? 2 : 1);
        if(iH > iHeight)
            iY += (iH - iHeight) / 2;
    }
    if(pCanvas != NULL)
    {
        pFont->drawText(pCanvas, sMsg, iMsgLen, iX, iY);
    }
    lua_pushinteger(L, iY + iHeight);
    lua_pushinteger(L, iX + iWidth);

    return 2;
}
Example #6
0
static int l_font_get_size(lua_State *L)
{
    THFont* pFont = luaT_testuserdata<THFont>(L);
    size_t iMsgLen;
    const char* sMsg = luaT_checkstring(L, 2, &iMsgLen);

    int iMaxWidth = INT_MAX;
    if(!lua_isnoneornil(L, 3))
        iMaxWidth = static_cast<int>(luaL_checkinteger(L, 3));

    THFontDrawArea oDrawArea = pFont->getTextSize(sMsg, iMsgLen, iMaxWidth);

    lua_pushinteger(L, oDrawArea.iEndX);
    lua_pushinteger(L, oDrawArea.iEndY);
    lua_pushinteger(L, oDrawArea.iNumRows);

    return 3;
}
Example #7
0
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;
}