TEXTOUT_P : width ?
10-02-2015, 08:41 AM (This post was last modified: 10-02-2015 08:41 AM by primer.)
Post: #1
 primer Member Posts: 135 Joined: Sep 2015
TEXTOUT_P : width ?
Hello,
I would like to know the width of a rendered text with TEXTOUT_P.
is there a way to evaluate it ?
Also by taking into account that TEXTOUT_P does use font size from home setting if not specified. (user guide page 588)

I'm looking for something similar than TTF_SizeText from SDL, for the ones who knows.

Thank you,
Regards.

primer
10-02-2015, 09:17 AM
Post: #2
 xset Junior Member Posts: 46 Joined: Sep 2015
RE: TEXTOUT_P : width ?
No such function. We need to implement it ourselves.
It needed for text editor and formula editor (to edit and print formula in natural notation), since HP does not provide such functions. I also missing natural notation in notes, so custom editor is must-have. We can't expect these features in next firmware update (i expect maximum Search-Replace in editor).

So the rescue of drowning are business of drowning themselves!
10-02-2015, 12:51 PM
Post: #3
 komame Member Posts: 50 Joined: Aug 2015
RE: TEXTOUT_P : width ?
I think it can be done. I have an idea but I don't know if it will be fast enough.

Piotr Kowalewski
Radioactive Wastes - game for HP Prime
10-03-2015, 08:56 AM (This post was last modified: 10-03-2015 09:02 AM by komame.)
Post: #4
 komame Member Posts: 50 Joined: Aug 2015
RE: TEXTOUT_P : width ?
I created a function that calculates the width (in pixels) of the text, but it is not very useful, because it is very slow.
However, I believe that it is possible to optimize and significantly speed up. I have some ideas.

Code:
TEXT_P_W(); EXPORT TEXT_WIDTH() BEGIN local width;   PRINT();  width:=TEXT_P_W("ABC abc 123",1);  PRINT(width);  width:=TEXT_P_W("ABC abc 123",3);  PRINT(width);  width:=TEXT_P_W("ABC abc 123",7);  PRINT(width); END; TEXT_P_W(t,s) BEGIN  local x,y;  DIMGROB(G9,320,40);  TEXTOUT_P(t,G9,0,0,s);  FOR x FROM 319 DOWNTO 0 DO   FOR y FROM 0 TO 39 DO    IF(GETPIX_P(G9,x,y)≠#FFFFFF) THEN     RETURN x;    END;   END;  END; END;

function TEXT_P_W(t,s), where:
t - the text to calculate width
s - font size

Piotr Kowalewski
Radioactive Wastes - game for HP Prime
10-03-2015, 05:42 PM
Post: #5
 eried Senior Member Posts: 739 Joined: Dec 2013
RE: TEXTOUT_P : width ?
(10-03-2015 08:56 AM)komame Wrote:  I created a function that calculates the width (in pixels) of the text, but it is not very useful, because it is very slow.
However, I believe that it is possible to optimize and significantly speed up. I have some ideas.

Code:
TEXT_P_W(); EXPORT TEXT_WIDTH() BEGIN local width;   PRINT();  width:=TEXT_P_W("ABC abc 123",1);  PRINT(width);  width:=TEXT_P_W("ABC abc 123",3);  PRINT(width);  width:=TEXT_P_W("ABC abc 123",7);  PRINT(width); END; TEXT_P_W(t,s) BEGIN  local x,y;  DIMGROB(G9,320,40);  TEXTOUT_P(t,G9,0,0,s);  FOR x FROM 319 DOWNTO 0 DO   FOR y FROM 0 TO 39 DO    IF(GETPIX_P(G9,x,y)≠#FFFFFF) THEN     RETURN x;    END;   END;  END; END;

function TEXT_P_W(t,s), where:
t - the text to calculate width
s - font size

Having fixed fonts maybe is faster just having an array with the known char widths per font size

My website: erwin.ried.cl
10-03-2015, 07:45 PM
Post: #6
 komame Member Posts: 50 Joined: Aug 2015
RE: TEXTOUT_P : width ?
This is the fastest way I found to calculacte the width and height of the text.

The following functions should take less than 2ms.

Width:
Code:
TEXTW_P(t,s) BEGIN  local x,a=0,b=511,m;  DIMGROB_P(G9,512,1);  TEXTOUT_P(t,G9,0,0,s,0,511,0);  FOR x FROM 1 TO 10 DO    IP((a+b)/2)▶m;    IFTE(GETPIX_P(G9,m,0)=#FFFFFFh,m▶b,m▶a);  END;  RETURN m; END;

Height:
Code:
TEXTH_P(t,s) BEGIN  local x,a=0,b=31,m;  DIMGROB_P(G9,1,32);  TEXTOUT_P(t,G9,0,0,s,0,1,0);  FOR x FROM 1 TO 6 DO    IP((a+b)/2)▶m;    IFTE(GETPIX_P(G9,0,m)=#FFFFFFh,m▶b,m▶a);  END;  RETURN m; END;

as before:
t - text for check the width or height
s - font size (0 = default from Home settings)

During the performance tests when I created this solution I think I detected a bug (very little) in the function TEXTOUT_P, but I will write about this in a separate thread.

Piotr Kowalewski
Radioactive Wastes - game for HP Prime
10-04-2015, 04:21 PM
Post: #7
 komame Member Posts: 50 Joined: Aug 2015
RE: TEXTOUT_P : width ?
After minor changes I managed to get a little faster version.
The time required for the calculation is ~1.5ms for width and ~0.9ms for height.

Width v2:
Code:
TEXT_P_W(t,s) BEGIN  local x,a,b=511,m=255;  DIMGROB_P(G9,512,1);  TEXTOUT_P(t,G9,0,0,s,0,511,0);  FOR x FROM 1 TO 9 DO   IFTE(GETPIX_P(G9,m,0)=#FFFFFFh,m▶b,m▶a);   IP((a+b)/2)▶m;  END;  RETURN m; END;

Height v2:
Code:
TEXT_P_H(t,s) BEGIN  local x,a=0,b=31,m=15;  DIMGROB_P(G9,1,32);  TEXTOUT_P(t,G9,0,0,s,0,1,0);  FOR x FROM 1 TO 5 DO    IFTE(GETPIX_P(G9,0,m)=#FFFFFFh,m▶b,m▶a);    IP((a+b)/2)▶m;  END;  RETURN m; END;

Piotr Kowalewski
Radioactive Wastes - game for HP Prime
10-05-2015, 03:04 PM
Post: #8
 primer Member Posts: 135 Joined: Sep 2015
RE: TEXTOUT_P : width ?
Thank you very much komame, it's really appreciated.
I was afraid about performance, but that's OK.

best regards,

primer
10-12-2015, 11:58 AM (This post was last modified: 10-12-2015 12:00 PM by Tyann.)
Post: #9
 Tyann Member Posts: 213 Joined: Oct 2014
RE: TEXTOUT_P : width ?
Bonjour
Ces deux fonctions sont très utiles, bravo et merci
Si je peut me permettre une suggestion.
Ici vous utilisez G9, et cela peut engendrer un conflit, si
le programmeur n'y pense pas.
Il est possible de mettre en paramètres la variable Gx à utiliser
ainsi le programmeur qui utilisera vos fonctions choisira lui même.

Qu'en pensez-vous ?

Hello
These two functions are very useful, congratulations and thank you
If I may make a suggestion .
Here you use G9, and this may create a conflict if
the programmer does not think .
You can set parameters to use the variable Gx
and the programmer who will use your duties will choose itself.

What do you think ?

Code:
 EXPORT TEXTW_P(t,g,s) BEGIN  LOCAL x,a,b:=511,m;  DIMGROB(g,512,1);  TEXTOUT_P(t,g,0,0,s,0,511,0);  FOR x FROM 1 TO 10 DO   m:=IP((a+b)/2);   IFTE(GETPIX_P(g,m,0)==#FFFFFFh,m▶b,m▶a);  END;  m; END;

Sorry for my english
10-14-2015, 10:02 PM
Post: #10
 hpfx Junior Member Posts: 28 Joined: Jan 2015
RE: TEXTOUT_P : width ?
(10-12-2015 11:58 AM)Tyann Wrote:  What do you think ?
I think it could be a builtin command.
and as a bonus, you even don't need to choose a graphic var.
 « Next Oldest | Next Newest »

User(s) browsing this thread: 1 Guest(s)