Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Bug sur TEXT_HEIGHT() | |
| | Auteur | Message |
---|
Oscaribout
Nombre de messages : 471 Date d'inscription : 29/12/2016
| Sujet: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 10:53 | |
| Bonjour, J'ai constaté que la fonction TEXT_HEIGHT() ne retournait pas les bonnes dimensions. Mais en dehors du bug, il restera un problème sur le positionement du corps du texte sans les jambages. - Code:
-
label fonte dim font$ , h% , tx$ , f$ , a%
picture 10:full_space 10 : 2d_target_is 10 : print_target_is 10 font_size 10,20 dlist 1 : font_names_load 1 : font_names_load 1 button 2 : caption 2,"Teste" : on_click 2,fonte end ' -------------------------- fonte: off_click 2 tx$ = "TpzZiLfjJ" : font$ = "Consolas" for a% = 1 to count(1) 2d_clear h% = text_height(tx$,10) ' écrire au dessus de 100, l'écriture se fait depuis le haut de la fonte font_name 10,font$ : print_locate 10,200-h% print tx$ ' --- 2ème --- font_name 10,font$ font$ = item_read$(1,a%) h% = text_height(tx$,10) print_locate 200,200-h% -1 print tx$ 2d_pen_color 255,0,0 2d_line 0,200,width(0),200 2d_line 0,200-h% , width(10),200-h% 2d_pen_color 0,255,0 2d_line 0,200-5,width(0),200-6 if scancode = 27 then terminate repeat : pause 100 : until scancode = 32 or scancode = 27 next a% return | |
| | | Oscaribout
Nombre de messages : 471 Date d'inscription : 29/12/2016
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 13:18 | |
| Je remets ici un code plus complet, en faisant une différence entre l'écriture en rapport au haut de caractère, et en bas du caractère. On voit que dans le corps hors jambage, place parfois selon le haut et pour d'autre depuis le bas. Je me demande si ce sujet n'aurait pas été mieux dans aide ou bavardage, mmais il y a pour moi un bug. Je vais revoir ceci en faisant une sub, qui recherche les pixels qui trouvent la hauteur des lettres sans jambage. - Code:
-
dim font$ , h% , tx$ , f$ , a%
picture 10:full_space 10 : 2d_target_is 10 : print_target_is 10 font_size 10,20 dlist 1 : font_names_load 1 : font_names_load 1 fonte() ' -------------------------- sub fonte() tx$ = "TpzZiLfjJ" : font$ = "Consolas" for a% = 1 to count(1) 2d_clear ' écrire au dessus de 100, l'écriture se fait depuis le haut de la fonte font_name 10,"Consolas" print_locate 20,80 : font_size 10,12 : print font$+string$(200," ") ' là on est encore en mémoire font_name 10,font$ : font_size 10,20 h% = text_height(tx$,10) ' haut à gauche ----- print_locate 10,200-h% : print tx$ ' bas à gauche -----copie mais en listant depuis le bas de la fonte print_locate 10,300 : print tx$ ' --- 2ème --- font_size 10,12 :font_name 10,"Consolas" font$ = item_read$(1,a%) : print_locate 300,80 : print font$+string$(200," ") font_name 10,font$ : font_size 10,20 : h% = text_height(tx$,10) print_locate 300,200-h% : print tx$ print_locate 300,300 : print tx$ 2d_pen_color 255,0,0 2d_line 0,200,width(0),200 2d_line 0,200-h% , width(10),200-h% 2d_line 0,300,width(0),300 2d_line 0,300+h%,width(0),300+h% 2d_pen_color 0,255,0 2d_line 0,200-5,width(0),200-6 2d_line 0,300+h%-5,width(0),300+h%-5 if scancode = 27 then terminate repeat : pause 100 : until scancode = 32 or scancode = 27 next a% end_sub | |
| | | Jean Claude
Nombre de messages : 5950 Age : 69 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 13:35 | |
| - Oscaribout a écrit:
- J'ai constaté que la fonction TEXT_HEIGHT() ne retournait pas les bonnes dimensions.
J'ai essayé tes 2 codes, mais c'est trop compliqué. Vu ce que tu dis (dans la citation), je pense qu'un code plus simple pourrait dire si oui ou non il y a un problème. - Citation :
- Mais en dehors du bug, il restera un problème sur le positionement du corps du texte sans les jambages.
Je pense qu'il faut d'abord voir s'il y a réellement un Bug avec TEXT_HEIGHT() A+ | |
| | | Oscaribout
Nombre de messages : 471 Date d'inscription : 29/12/2016
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 14:30 | |
| Le code ne fait que comparer dans la liste des polices la police précédente par rapport à la fonte actuellement lue, et selon deux méthodes. Il est difficile de faire plus simple, et comme toi, j'ai pas trop le temps. voici une simple image pour voir qu'il y a des problèmes de correspondance. Cela dit, je vois que text_height pour un picture ne peux pas être une référence. En faisant le parallèle par rapport au html, je ne sait pas comment ils procèdent. On peut aligner les lettres de corps différents, de styles différents et de "size" différent sur la même ligne. Mais il me semble que Html a une liste limitée de polices, et qu'en dehors de cette liste, ils adaptent la police la plus proche. Après avoir publié le code au dessus, je me suis rendu compte que c'est pas la hauteur qu'il faut tenir compte. Avec des fontes différentes des grosseurs différentes, on est obligé de faire ses propres calculs. On a pas de commande directe pour cela. Avec print_locate x,y et 'y' constant, rien n'est aligné. Donc la résolution de text_height() n'apportera rien. Il y a des polices qui s'écrivent (en testant le programme) bien en dehors du cadre du positionnement et de la hauteur. | |
| | | Jack Admin
Nombre de messages : 2386 Date d'inscription : 28/05/2007
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 14:40 | |
| _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | JL35
Nombre de messages : 7095 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 15:34 | |
| @Oscaribout, Sauf erreur, il me semble que ton problème serait d'aligner des polices de tailles différentes ou de types différents (la base des caractères) sur une même ligne. Or TEXT_HEIGHT donne la hauteur totale des caractères, ce qui est normal, mais rien ne permet de savoir où se trouve la ligne de base des caractères (base des majuscules et des caractères sans jambage), qui est quelque part à l'intérieur de cette valeur. Pour ça il faudrait une autre fonction, mais ça me parait bien compliqué à obtenir... Sur le PICTURE il n'y a a priori aucun problème de TEXT_HEIGHT (pour la hauteur totale des caractères). Un petit exemple (adapter f$, le fichier exemple quelconque à afficher): - Code:
-
LABEL Police,Pol1,Affiche DIM x%,y%,f$,a$,nl% f$ = "C:\TEXTES\Fetes.txt": ' <====== à adapter =========== HEIGHT 0,SCREEN_Y-30: WIDTH 0,360: BORDER_SMALL 0: FONT_BOLD 0: COLOR 0,180,255,255 EDIT 1: TOP 1,1: WIDTH 1,150: TEXT 1,"Arial": ON_CLICK 1,Police SPIN 2: LEFT 2,WIDTH(1): WIDTH 2,50: MIN 2,6: MAX 2,255: POSITION 2,12 BUTTON 3: LEFT 3,LEFT(2)+WIDTH(2)+5: WIDTH 3,40: CAPTION 3,"OK": ON_CLICK 3,Affiche ALPHA 5: TOP 5,0: LEFT 5,LEFT(3)+45: FONT_SIZE 5,14 COLOR 5,255,255,0: FONT_COLOR 5,164,0,0 PICTURE 15: TOP 15,25: WIDTH 15,25: HEIGHT 15,HEIGHT(0)-60: COLOR 15,255,255,128 PICTURE 16: TOP 16,TOP(15): LEFT 16,WIDTH(15): HEIGHT 16,HEIGHT(15): WIDTH 16,WIDTH(0)-50 2D_TARGET_IS 15 FOR y% = 0 TO HEIGHT(15) STEP 10 2D_LINE 15,y%,25,y% NEXT y% FOR y% = 0 TO HEIGHT(15) STEP 100 2D_LINE 5,y%,25,y% NEXT y% LIST 20: HIDE 20: TOP 20,TOP(1)+25: WIDTH 20,200: HEIGHT 20,HEIGHT(15) FONT_NAMES_LOAD 20: ON_CLICK 20,Pol1 GOSUB Affiche END ' ---------------------- Police: SHOW 20 RETURN Pol1: TEXT 1,ITEM_INDEX$(20) HIDE 20 GOSUB Affiche RETURN ' ----------------------- Affiche: 2D_TARGET_IS 16: CLS PRINT_TARGET_IS 16: FONT_NAME 16,TEXT$(1): FONT_SIZE 16,POSITION(2) CAPTION 5," HL = "+STR$(TEXT_HEIGHT("Abc_ïxyz",16))+" " y% = 0: nl% = 0 FILE_OPEN_READ 1,f$ WHILE FILE_EOF(1) = 0 FILE_READLN 1,a$ IF TRIM$(a$) <> "" nl% = nl%+1 PRINT_LOCATE 5,y%: PRINT STR$(nl%)+"_ "+a$ y% = y%+TEXT_HEIGHT(a$,16) END_IF END_WHILE FILE_CLOSE 1 RETURN ' ------------------------ Si on multiplie le numéro de ligne par la hauteur de ligne on obtient bien la bonne valeur dans tous les cas. | |
| | | Oscaribout
Nombre de messages : 471 Date d'inscription : 29/12/2016
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 16:52 | |
| Effectivement, j'avais aussi constaté un bug sur LIST.
@JL35 Tu as tout à fait raison. Je me suis rappelé après coup que dans un vieux programme il y a quelques années qu'il avait fallu que je fasse une liste des réglages pour adapter l'alignement des fontes. Je ne me souviens plus où est ce programme, mais j'avais procédé ce cette façon: (pas le temps de refaire l'essai) j'avais testé sur la lettre "E" pour testé pixel par pixel le début de la lettre (E étant plus haut que j par exemple). Pour le Haut j'avais pris "T, etc...
Je me sauve! | |
| | | JL35
Nombre de messages : 7095 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 17:37 | |
| Malheureusement, expérience faite, il n'y a pas un rapport constant entre la hauteur totale d'une police (Text_Height) et la position de la base par rapport à cette hauteur, ça varie en fonction des polices utilisées... Il me semble difficile d'aligner des textes avec des polices différentes et/ou des tailles différentes sur une même ligne... On peut le faire au pif pour un cas précis, mais ça paraît compliqué, voire impossible, d'automatiser la chose par programme.
Pour une police donnée il doit y avoir un rapport constant entre sa hauteur totale et la position de la base des caractères, quelle que soit sa taille, mais il faut le mesurer au coup par coup.
Tiens Oscaribout, je te mets un petit programme dans 'Vos sources...' qui calcule la hauteur de la ligne de base pour une police donnée d'une taille donnée, d'où le facteur à appliquer au Text_Height | |
| | | Oscaribout
Nombre de messages : 471 Date d'inscription : 29/12/2016
| Sujet: Re: Bug sur TEXT_HEIGHT() Sam 3 Fév 2018 - 20:06 | |
| - JL35 a écrit:
- Pour une police donnée il doit y avoir un rapport constant entre sa hauteur totale et la position de la base des caractères, quelle que soit sa taille, mais il faut le mesurer au coup par coup.
J'ai retrouvé le programme que j'avais fait à l'époque (2015) Je ne le mets pas en entier, déjà ce serait hors propos, mais à chaque fois que je le lance, Windows me le ferme sans raison aussitôt! Là Windows devient de plus en plus inquiétant. Mais j'ai extrait une partie du code qui met en tableau les dimensions des fontes demandées. Pour l'alignement selon les données, cela fonctionnait parfaitement. (Sauf des fois en largeur de ce que je m'en souvient), avec certaines fontes, il y avait un petit problème. De la sub j'ai pas tout mis, il aurait fallu que j'en rajoute de trop. - Code:
-
dim choix_item_liste$(10) dim fonte%(200,255) , font% , police$(10) : font%=1
police$(1)="Arial|15|g|i|s|b}0,0,0|255,255,255" picture 2 : full_space 2 : color 2,197,242,237 : 2d_target_is 2:print_target_is 2 image 4 list 10 : left 10,100 mettre_attribut(police$(1)) format_fonte(1)
end ' ============================================================================ sub format_fonte(font%)
2d_fill_on : 2d_fill_color 255,255,255 : 2d_pen_color 255,255,255 font_underline_off 2 : ' sinon si souligné, cela remonte le caractère. 2d_rectangle 0,0,600,100 : 2d_image_copy 4,0,0,100,100 : font_color 2,0,0,0
dim_local a%,y,d%,c%,larg% , b% ' ....... recherche du haut ....... normalement c'est 1 2d_image_paste 4, 0,0 :2d_fill_color 255,253,255 : 2d_pen_color 255,253,255 : print_locate 0,0 :print " " ' ........................................... for a% = 1 to 80 : c% = color_pixel_green(2,10,a%) : if c% <> 253 then y=a%:exit_for next a% : fonte%(font%,3)=y :' on a le bas du caractère
' ........................................... ' on recherche la largeur du caractère 151, qui a la largeur maxi 2d_image_paste 4,0,0 : print_locate 0,0 : print string$(1,chr$(151)) for d% = 60 to 1 step -1 : c% = color_pixel_green(2,d%,10) : if c%=253 then exit_for next d% : larg% = d% : fonte%(font%,2)=larg%
' ........................................... for a% = 32 to 255 :' caractère par caractère 2d_image_paste 4,0,0 : print_locate 0,0 : print string$(1,chr$(a%)) :' pause 1 for d% = larg% to 1 step -1 : c% = color_pixel_green(2,d%,10) : if c%=253 then exit_for next d% : fonte%(font%,a%) = d% +1 next a%
' ........................................... 2d_image_paste 4,0,0 print_locate 0,0:print "Lg" :' L c'est sur cette ligne sans jambage qu'on aligne les caractères for a% = y to 1 step -1 : c%= color_pixel_green(2,5,a%) : if c%=0 then exit_for next a% : fonte%(font%,1)= a% : fonte%(font%,1)= a% 2d_pen_color 0,255,0 : 2d_line 0,y,100,y :' pour voir si c'est correct message "hauteur retenu:" + str$(a%) rem fonte%(font%,"1") "1" est le nb retenu pour la hauteur du jambage inférieur. rem il y a d'autre relevés mais hors sujet ici end_sub ' ==========================================================
sub mettre_attribut(a$) dim_local v,b$,c% , key$ c%=1 repeat v = instr(a$,"|") if v > 0 select c% case 1 : font_name 2,left$(a$,v-1) case 2 : font_size 2,val(left$(a$,v-1)) case 3 : b$=left$(a$,v-1):if b$="G" then font_bold 2 : else : font_bold_off 2 case 4 : b$=left$(a$,v-1):if b$="I" then font_italic 2 : else : font_italic_off 2 case 5 : b$=left$(a$,v-1):if b$="S" then font_underline 2 : else : font_underline_off 2 case 6 : b$=left$(a$,v-1):if b$="B" then font_strike 2 : else : font_strike_off 2 end_select a$ = right_pos$(a$,v+1) end_if c%=c%+1 until c% = 7 end_sub
| |
| | | Contenu sponsorisé
| Sujet: Re: Bug sur TEXT_HEIGHT() | |
| |
| | | | Bug sur TEXT_HEIGHT() | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |