DRAW dialect - bug avec text... | |
François | 8-Mar-2011/21:16:54+1:00 |
Bonjour, Quand j'essaye le code suivant: view layout [ box snow 100x100 effect [ draw [ pen red fill-pen red box 10x30 80x50 pen black text 10x10 "Red Box:" ] ] ] Le texte n'apparaît pas... En fait, l'exécution du dialect est interrompu dès que le 'text est atteint. POur s'en convaincre, essayez view layout [ box snow 100x100 effect [ draw [ text 10x10 "Red Box:" pen red fill-pen red box 10x30 80x50 pen black ] ] ] Je suis sous linux... Est-ce un bug connu et déjà remonté à Carl? Merci | |
François | 8-Mar-2011/21:28:05+1:00 |
Je viens de tester le code suivant sous windowsview layout [ box black 100x100 effect [ draw [ pen red line 30x30 50x20 70x70 40x50 pen blue box 20x20 80x80 fill-pen 0.100.0 box 20x60 40x80 pen white text 8x25 "Example" fill-pen gold flood 2x2 ] ] ] Sous windows, c'est OK... mais sous linux, le texte n'apparait pas :( | |
François | 9-Mar-2011/7:30:54+1:00 |
Sur Altme, Cyphre m'a gentillement donné la solution... Sous linux, il faut définir au préalable l'objet font ainsi:axis-font: make face/font [ name: "/usr/share/fonts/truetype/cour.ttf" size: 12 ] J'ai encore une question concernant la gestion du texte sous DRAW: comment puis-je récupérer la largeur et la hauteur d'un texte (avant son affichage) afin, par exemple, de faire les calculs nécessaires pour le centrer par rapport à un point donné. D'avance merci pour votre aide! François | |
coccinelle | 9-Mar-2011/8:36:17+1:00 |
Utilises la fonction size-text. | |
François | 9-Mar-2011/9:29:15+1:00 |
Bonjour Marco Merci pour l'astuce. Mais comment puis-utiliser size-text dans le contexte du dialecte draw? xy: ??? ; <-- doit être calulé dynamiquement pour aligner le texte sur le point 100x100 par exemple l: layout [ b: box ivory [effect [ draw [ pen black text xy "Du texte aligné sur 100x100" ]]] ] | |
Didec | 9-Mar-2011/10:18:34+1:00 |
Hélas, tu ne peux pas vraiment. Je m'explique. Il y a 2 formes de texte dans R2 : - le moteur de texte utilisé par View pour les faces. - le moteur AGG utilisé par Draw dans un bloc Effect. La fonction 'size-text permet de calculer les dimensions occupés par le texte avec le premier moteur (View). Cela fonctionne bien et m'a déjà permis, comme à d'autres, de faire du rendu rich text dans des faces view. Mais le moteur AGG Draw est différent et il doit y avoir un écart entre la taille d'un texte sous View et sous Draw. De plus sous Linux, la gestion AGG des polices est partielle à la différence de Windows. Je n'ai pas fait de tests pour calculer le pourcentage d'écart, mais quelques tests de superposition de textes View/Draw à différentes taille et avec différentes polices devrait permettre d'en avoir une idée. Ci-dessous un petit script permettant de visualiser les résultats de 'size-text et 'caret-to-offset qui peut servir de base : rebol [ title: "Test 'size-text and 'offset-to-caret functions" author "DideC" ] ; initial text to render txt: "Some text !" ; initial font object font1: make face/font [size: 20 align: 'left valign: 'top offset: 0x0] ; face used as a model to calculate offsets and text size, with all edge, margin, etc set to 0 ;ff: make face [font: font1 size: 1000x1000 para: make face/para [origin: 0x0 margin: 0x0] edge: make face/edge [size: 0x0]] ff: make face [font: font1 size: 1000x1000 para: edge: none] ; show the 'size-text result as a red box, and all the 'offset-to-caret values as green ticks show-size-text: has [f sz ofs orig] [ ; we size the text in the box using the text and the font used in the draw block sz: size-text f: make ff [font: get box-draw1/font text: txt] orig: box-draw1/text ; starting offset of the text ; change the red box size to reflect the size-text result change at box-draw2 4 reduce [orig orig + sz] prin ["TEXT:" txt newline " SIZE-TEXT:" sz newline " CHAR/OFFSETS: "] ; draw a green ticks for each caracter offset in the text clear at box-draw3 3 forall txt [ ofs: caret-to-offset f txt append box-draw3 reduce ['polygon orig + ofs orig + ofs + 0x2 orig + ofs + 2x0] prin rejoin [next mold txt/1 "=" ofs " "] ] ofs: caret-to-offset f tail txt append box-draw3 reduce ['polygon orig + ofs orig + ofs + 0x2 orig + ofs + 2x0] prin rejoin ["tail=" ofs] print "" ; newline show b ] view layout [ h3 "In red: the 'size-text box, green ticks are 'offset-to-caret results" ; The face where we show the result b: box 650x200 black effect [draw [pen white font font1 text 0x0 txt] draw [pen red box 1x1 5x5] draw [pen green]] ; the draws blocks are modified a lot so we make some shortcuts do [box-draw1: b/effect/2 box-draw2: b/effect/4 box-draw3: b/effect/6] across ; to change the text label "Text to show:" field with [text: txt] [show-size-text] pad 10 ; to change the font size label "Font size:" rotary 40 "20" "30" "40" "50" "60" "10" [ set in get box-draw1/font 'size to-integer face/text show-size-text ] pad 10 ; to change the font name label "Font name:" rotary "font-sans-serif" "font-serif" "font-fixed" [ set in get box-draw1/font 'name get to-word face/text show-size-text ] return ; first rendering do [show-size-text] ] | |
coccinelle | 9-Mar-2011/11:49:44+1:00 |
Une ébauche de solution. wrk-face: make face [ edge: make edge [] font: make font [] para: make para [] ] drw-text: "Du texte gras 24dpi centré sur 250x150" wrk-face/font/size: 24 wrk-face/font/style: 'bold wrk-face/text: drw-text wrk-face/size: 1024x1024 wrk-size: size-text wrk-face drw-offset: 250x150 - (wrk-size / 2) ; Centre le text drw-font: wrk-face/font view layout [ box 500x300 ivory effect [ draw [ pen navy circle 250x150 20 pen black font drw-font text drw-text drw-offset ]] ] | |
coccinelle | 9-Mar-2011/11:58:50+1:00 |
J'ajouterai : 1) ne pas oublier d'initialiser wrk/face/size à une très grande dimension car size-text ne l'agrandit pas même si c'est nécessaire. 2) size-text tient compte de font et de para alors que draw ne le fait pas. Il te faut chercher un peu pour trouver comment obtenir le même résultat dans les deux cas. | |
Login required to Post. |