"DrawTextA": Width of TTF Text In Pixels?

Started by
2 comments, last by JeZ-l-Lee 10 years, 5 months ago

Hi,

I'm designing a 2D game engine using DirectX 9.0c.

I am currently working on the graphics core.

Before using "DrawTextA", how would I get the size of TTF text width in pixels?

(I need to know it for horizontal positioning on the screen)

Thanks!

JeZ+Lee

Here is my source code:


//-------------------------------------------------------------------------------------------------------------------------------
void Visuals::DrawTextOntoScreenBuffer(const char *textToDisplay, LPD3DXFONT Font, int posX, int posY,
                                       int XJustification, int textRed, int textGreen, int textBlue,
                                       int outlineRed, int outlineGreen, int outlineBlue)
{
RECT rect;

// Horizonal positioning would go here...
//#define JustifyLeft             0
//#define JustifyCenter           1
//#define JustifyRight            2
//#define JustifyCenterOnPoint    3

    for (int screenY = -2; screenY < 3; screenY++)
    {
        for (int screenX = -2; screenX < 3; screenX++)
        {
            SetRect( &rect, posX+screenX, posY+screenY, 0, 0 );
            if (screenY != 0 && screenX != 0)
            Font[0].DrawTextA( NULL, textToDisplay, -1, &rect, DT_NOCLIP, D3DCOLOR_RGBA(outlineRed, outlineGreen, outlineBlue, 255) );
        }
    }

    SetRect( &rect, posX, posY, 0, 0 );
    Font[0].DrawTextA( NULL, textToDisplay, -1, &rect, DT_NOCLIP, D3DCOLOR_RGBA(textRed, textGreen, textBlue, 255) );
}

//-------------------------------------------------------------------------------------------------------------------------------

JeZxLee
Fallen Angel Software
www.FallenAngelSoftware.com

Advertisement

You can use the GetTextExtentXXX function family, e.g. http://msdn.microsoft.com/en-us/library/dd144938%28v=vs.85%29.aspx.

To get the pixels from the logical units: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145042%28v=vs.85%29.aspx

Before using "DrawTextA", how would I get the size of TTF text width in pixels?

(I need to know it for horizontal positioning on the screen)

Hi,

not sure if I understand you correctly - you want to be able to get the text size before you draw it using DrawTextA? And DrawTextA is a method of the ID3DXFont interface?

If yes, then the answer is very simple - the function allows you to calculate the size of the text without drawing it.

You need to use the flag DT_CALCRECT in the format parameter and then the function will not draw the text, but will modify the rectangle you passed - the new rectangle will contain size of the text. See the documentation for more details ID3DXFont::DrawText.

Btw, the D3DXFont interface is quite slow, if you are drawing a lot of text, you'll probably want to use another system for text rendering (maybe your own...). But if you want to stick with D3DXFont for a while, you at least should properly use the first argument - the ID3DXSprite pointer. Again, read the documentation for more details. (You create one D3DXSprite object and pass it to every DrawText call.)

You can use the GetTextExtentXXX function family, e.g. http://msdn.microsoft.com/en-us/library/dd144938%28v=vs.85%29.aspx.

To get the pixels from the logical units: http://msdn.microsoft.com/en-us/library/windows/desktop/dd145042%28v=vs.85%29.aspx

That doesn't have to correspond to the real rendering. It's not sure that D3DXFont draws the text with 100 % accuracy related to these theoretical measurements provided by GDI. By asking the D3DXFont interface you know that you really get the right numbers, because it knows how it's going to render the text ;)

Hi,

Thank you!

I got it working...

JeZ+Lee

Here is the source:


//-------------------------------------------------------------------------------------------------------------------------------
void Visuals::DrawTextOntoScreenBuffer(const char *textToDisplay, LPD3DXFONT Font, int posX, int posY,
                                       int XJustification, int textRed, int textGreen, int textBlue,
                                       int outlineRed, int outlineGreen, int outlineBlue)
{
RECT rect, textSize;

    Font[0].DrawTextA( NULL, textToDisplay, -1, &textSize, DT_CALCRECT, D3DCOLOR_RGBA(textRed, textGreen, textBlue, 255) );

    if (XJustification == JustifyLeft)
    {
        // Do nothing...
    }
    else if (XJustification == JustifyCenter)
    {
        posX = (800 / 2) - (textSize.right / 2) - 3;
    }
    else if (XJustification == JustifyRight)
    {
        posX = (800 - posX) - textSize.right - 3;
    }
    else if (XJustification == JustifyCenterOnPoint)
    {
        posX = posX - (textSize.right / 2) - 3;
    }

    for (int screenY = -2; screenY < 3; screenY++)
    {
        for (int screenX = -2; screenX < 3; screenX++)
        {
            SetRect( &rect, posX+screenX, posY+screenY, 0, 0 );
            if (screenY != 0 && screenX != 0)
            Font[0].DrawTextA( NULL, textToDisplay, -1, &rect, DT_NOCLIP, D3DCOLOR_RGBA(outlineRed, outlineGreen, outlineBlue, 255) );
        }
    }

    SetRect( &rect, posX, posY, 0, 0 );
    Font[0].DrawTextA( NULL, textToDisplay, -1, &rect, DT_NOCLIP, D3DCOLOR_RGBA(textRed, textGreen, textBlue, 255) );
}

//-------------------------------------------------------------------------------------------------------------------------------

JeZxLee
Fallen Angel Software
www.FallenAngelSoftware.com

This topic is closed to new replies.

Advertisement