Font::getStringWidthFloat() with newLine(s)


#1

Font::getStringWidthFloat() doesn’t account for newLines in the String…

I came up with a quick mod… I’m sure you can improve on it…

 float Font::getStringWidthFloat (const String& text) const
 {
     String szLongestString = text;

     if (text.contains (newLine))
         {
         StringArray szArray;
    
         szArray.addLines (text);
    
         szLongestString = String();
    
         for (int i = 0; i < szArray.size(); ++i)
             {
             String szLine = szArray.getReference (i);
        
             if (szLine.length() > szLongestString.length())
                 szLongestString = szLine;
             }
         }

     float w = getTypeface()->getStringWidth (szLongestString);

     if (font->kerning != 0)
         w += font->kerning * szLongestString.length();

     return w * font->height * font->horizontalScale;
 }

Rail


Font::getStringWidth on non-message thread
#2

I’m not really sure if this is the right thing to do when there’s a newline in the string… What’s the context in which you’re having a problem with it?

Normally for non-trivial strings you’d want to measure it properly with something like GlyphArrangement or TextLayout rather that hitting these low-level functions. If we’ve used getTextWidth() internally in a place where we should have used something else, then we should change the calling code rather than this function.


#3

My use case is to draw a rounded rectangle background for a Label which is showing info about the loaded sample in my VI when the mouse is over an instrument on The Stage:

 void CStageComponent::paint (Graphics& g)
 {
     if (m_bShowingInfo)
         {
         g.setColour (Colours::black);
    
         g.setOpacity (0.75f);
    
         const Font f = m_InfoFont.getFont();
    
         g.fillRoundedRectangle (14.0f, (float) getHeight() - 55.0f, f.getStringWidthFloat (m_InfoDisplay.getText()) + 30.0f, 50.0f, 4.0f);
         }
 }

I’d expect getStringWidthFloat() to account for the new lines or change the API docs to let us know that it doesn’t. I can’t think of any use case where the length should not account for the newLine?

Cheers,

Rail