Method to cut a string based on font and available width


#1

Hi all,

I would like to know if you have a method to return a cut position inside a (long) string given a width in pixel and a font.
I thought about making a simple iterative like :

for (i = 0; i < hugeText; i++)
{
   if (font.getStringWidth(hugeText.subtring(0, i)) > availableWidth) return i-1;
}

But I guess it’s clearly inefficient (if the string is huge, it’s O(N) intensive operations).

I don’t understand exactly how the font kerning and letter width work, but would it be possible to extract a letter width in a lookup table, or are they dependent on the previous and the next one ?
Else, I’ve thought about a dichotomic solution, but if the lookup solution works I think it’s easier to implement.
Else, should I add a method in Font for this, so I can copy and adapt getStringWidthFloat() method ?


#2

The kerning all depends on the pair of adjacent letters. Have you looked at the functions available in GlyphArrangement to see if any of those do what you need?


#3

As always, you’ve made useful method in GlyphArrangement, but they don’t exactly fit my needs.

In fact, these methods are terribly efficient for rendering a text, but don’t help me extract information I want.
I just want to know where to cut a long text I’ll render later on.
As I’m using a layout, I’ll have case like :

            // I want to render "My big house is marvelous in summer and wonderful in winter."
            // The renderer will probably render :
            //
            // \/ BoxLeft    \/ Top Left
            // previous line. My 
            // big house is 
            // marvelous in      |< BoxRight
            // summer and 
            // wonderful in
            // winter.
            //       /\ Bottom right

I have to cut 1 sentence in order to create 6 lines here.
The first one is "My ", etc…

I want to find out where to cut the big sentence in smaller “line” boxes.
If I try with the method I’ve posted earlier, I’ll make Juce compute up to length*length computations (because I can’t assume width(“My”) = width(“M”) + width(“y”), so I have to test width(“M”), then width(“My”) then … ).

The glyph arrangement won’t help in that case (they would be perfect if the left position of the first line was the first of the previous line).

I guess I can try the addLineOfText method, and then iterate other getGlyph().getRight().

Will I have any problem (previous computation become wrong) if I cut the string ?


#4

Yes, you could certainly use it to create a line of text and then look at the positions of the glyphs. That’d be pretty quick.


#5