Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


"DrawTextA": Width of TTF Text In Pixels?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 JeZ-l-Lee   Members   -  Reputation: 131

Like
0Likes
Like

Posted 04 November 2013 - 06:52 AM

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

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



Sponsor:

#2 cdoubleplusgood   Members   -  Reputation: 844

Like
1Likes
Like

Posted 04 November 2013 - 07:13 AM

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



#3 Tom KQT   Members   -  Reputation: 1612

Like
2Likes
Like

Posted 04 November 2013 - 07:29 AM

 

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, 04 November 2013 - 07:36 AM.


#4 JeZ-l-Lee   Members   -  Reputation: 131

Like
0Likes
Like

Posted 04 November 2013 - 08:02 AM

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

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





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS