DRAW dialect - bug avec text...
François8-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çois8-Mar-2011/21:28:05+1:00
Je viens de tester le code suivant sous windows

view 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çois9-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
coccinelle9-Mar-2011/8:36:17+1:00
Utilises la fonction size-text.
François9-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"
  ]]]
]
Didec9-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]
]
coccinelle9-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
  ]]
]
coccinelle9-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.


Powered by RebelBB and REBOL 2.7.8.4.2