Sign in to follow this  
JeZ-l-Lee

"DrawTextA": Width of TTF Text In Pixels?

Recommended Posts

JeZ-l-Lee    135

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) );
}

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

Share this post


Link to post
Share on other sites
Tom KQT    1704

 

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 ;)

Edited by Tom KQT

Share this post


Link to post
Share on other sites
JeZ-l-Lee    135

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) );
}

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this