How to determine the height of a Text (TextExtent te_Height ?) ?

8 posts / 0 new
Last post
zzd10h
zzd10h's picture
Offline
Last seen: 4 years 11 months ago
Joined: 2012-08-24 20:56
How to determine the height of a Text (TextExtent te_Height ?) ?
Hi, I just wonder if the te_Height returned by TextExtent() is really the size in pixels of a text displayed on a RastPort ? Considering I have a window of 132 pixels height with a Text whose TextExtent.te_Height is 128. If I move my text to y = 130, it should be vertically centered, no ? In the following test, I try to vertically center a text of 128 pixels height in a 132 pixels height window (window height returned by window->Height and by SysMon). I use a Topaz.font with ta_YSize of 128 (but the same problem occurs with all fonts) the text height is returned by texteDimension.te_Height from TextExtent structure
  1. struct TextExtent texteDimension ;
  2. TextExtent(window->RPort,bufferHeure, strlen(bufferHeure),&texteDimension);
IMAGE(http://www.indiego.rocks/file/download/8882a292f0cda5f10c2325e1804c3602) So if TextExtent.te_Height is not really the height of a displayed text, is it a way to find the height of a displayed font ? Thank you by advance Guillaume
thomas
thomas's picture
Offline
Last seen: 7 hours 3 min ago
Joined: 2011-05-16 14:23
Re: How to determine the height of a Text (TextExtent te...
I am sure that te_Height holds the right value, You just did not Move() to the right place. The y coordinate of the text points to the base line of the font, not to the bottom of it. The base line is the bottom of letters like a, b or c while letters like q or g draw below the base line! RastPort->TxBaseline holds the offset of the base line you have to add to the y coordinate to get from the top to the base line. IMHO TextExtent is a bit overkill. In most cases RastPort->TxHeight should be sufficient. This is a small code snippet which centers a piece of text in a given window:
  1. len = strlen(text);
  2. text_w = TextLength(rp, text, len);
  3. text_h = rp->TxHeight;
  4. Move(rp, (win_w - text_w) / 2, (win_h - text_h) / 2 + rp->TxBaseline);
  5. Text (rp, text, len);
zzd10h
zzd10h's picture
Offline
Last seen: 4 years 11 months ago
Joined: 2012-08-24 20:56
Re: How to determine the height of a Text (TextExtent te...
Thank you Thomas, you are (again) right, I didn't thought about Baseline. As I want only to use numeric and "/" ":", by shifting your calculation by Move(rp, (win_w - text_w) / 2, (win_h - text_h) / 2 + rp->TxBaseline + ( (text_h - rp->TxBaseline) /2) ) ; it works well now with Topaz.font :) In the 2 following picture, the BaseLine is represented by the horizontal blue line IMAGE(http://www.indiego.rocks/file/download/d0dbeaf2897d5e1057a2a3640b23d004) But not for all fonts, Nimbus Sans L Bold.font and Ledsitex St.font for example have to use the Baseline to be centered (even if 'q' letter is displayed below this baseline) For them, I have to use your method untouched Move(rp, (win_w - text_w) / 2, (win_h - text_h) / 2 + rp->TxBaseline); IMAGE(http://www.indiego.rocks/file/download/bb6a9e40a3bcd710a5e14d7cde759598)
thomas
thomas's picture
Offline
Last seen: 7 hours 3 min ago
Joined: 2011-05-16 14:23
Re: How to determine the height of a Text (TextExtent te...
(win_h - text_h) / 2 + rp->TxBaseline + ( (text_h - rp->TxBaseline) /2)
Did you ever have maths at school? This is the same as (win_h - rp->TxBaseline) / 2 + rp->TxBaseline, i.e. using the base line instead of the height.
In the 2 following picture, the BaseLine is represented by the horizontal blue line
Either your first hardcopy is wrong or the font you are using is faulty. Here is a small program which properly plots the base line for a given font into a window: http://thomas-rapp.homepage.t-online.de/examples/baseline.c Example: IMAGE(http://thomas-rapp.homepage.t-online.de/download/Baseline.png)
zzd10h
zzd10h's picture
Offline
Last seen: 4 years 11 months ago
Joined: 2012-08-24 20:56
Re: How to determine the height of a Text (TextExtent te...
Regarding your nice comment about my school years, as I stated in my reply, I simply added something in bold to your expression to make it works for Topaz.font. For others fonts, i used yours unmodified, So true, i didn't simplified the operation to be more clear. My font should not be faulty, it's Topaz, but I volontary shifted the font to the bottom because I don't care about characters with descenders and I want that displayed chars are centered. Therefore the baseline is not respected. But thx for your sample. I will take a look tomorrow.
zzd10h
zzd10h's picture
Offline
Last seen: 4 years 11 months ago
Joined: 2012-08-24 20:56
Re: How to determine the height of a Text (TextExtent te...
Launching your baseline.c with 1) struct TextAttr attr = {"topaz.font",64}; IMAGE(http://www.indiego.rocks/file/download/b46cdfbffb14c5b5bab2223d538f5bfd) 2) struct TextAttr attr = {"Nimbus Sans L Bold.font",64}; IMAGE(http://www.indiego.rocks/file/download/049fa66910526c64372ebd8207ce76cd) Same problem than my screenshots for Topaz.font. As I want to use only numbers chararcters and I want that there are centered, I will have to shift to bottom the Topaz Text(). BUT strangely, for Nimbus font , the numbers seems well centered even if displayed on the baseline.
thomas
thomas's picture
Offline
Last seen: 7 hours 3 min ago
Joined: 2011-05-16 14:23
Re: How to determine the height of a Text (TextExtent te...
Maybe the Nimbus font contains letters with signs above the top, for example Spanish or Czech. (French accents are only printed above lower-case letters AFAIK).
zzd10h
zzd10h's picture
Offline
Last seen: 4 years 11 months ago
Joined: 2012-08-24 20:56
Re: How to determine the height of a Text (TextExtent te...
Maybe, thank you.
Log in or register to post comments