On Wed, Oct 1, 2008 at 5:47 PM, Alan Macleod <[EMAIL PROTECTED]> wrote:
>
> I tried some similar things to get the highlighted text in a temp face but
> could not get it to work...
My code so far (stolen from your original code submission):
rebol []
pad: 20x30
set-highlight: func [
"Sets the highlight boxes in the given text face"
face [object!]
strings [block!] "Block of one or multiple string pairs describing
the highlight start and end points"
/no-show
/local access
] [
if all [
access: get in face 'access
in access 'set-face*
] [
access/set-highlight* face strings
]
if not no-show [show face]
face
]
get-highlight: func [face [object!]] [
; unimplemented
]
window: layout [
style hl-text text with [
pane: make block! []
hl: none
; a single highlight face
hl-face: make face [
color: 255.0.0
edge: none
para: make para [origin: 0 margin: 0]
effect: [gradient 0x1 255.128.0 255.0.0] ; just to make it look
a little cooler
]
; the pane which stores all highlight faces
hl-pane: make face [color: none pane: make block! []]
; the position in pane for the highlight pane as used by set-highlight*
hl-pane-block: none
make-hl-face: func [face str pos sz] [
append face/hl-pane-block make face/hl-face [offset: pos - 2
size: sz text: str]
]
split-lines: make block! []
access: make access [
set-highlight*: func [face [object!] strings [block!] /local pos
end-pos split-lines str sz done] [
face/hl: strings
clear face/hl-pane-block
; create highlight boxes
foreach [start end] face/hl [
; paint a box for each highlight by finding the position on
where to paint it using caret-to-offset to get the position.
; is the highlight split over multiple lines?
; the end-pos can't be used here, we need to do the split
thing before calculating positions
str: copy/part start end
sz: size-text make face/hl-face [size: 2000x50 text: str]
pos: caret-to-offset face start
end-pos: caret-to-offset face end
either pos/y <> end-pos/y [ ; multiple lines
; ---------- The code in this block is not working
correctly ------------
; paint one box per line for multiple line highlights
; that means that each line must paint right from start or
beginning of line to either the end of highlight or end of line
; generate split-lines list of all indexes required for
painting the lines
clear split-lines
line-pos: start
; we should be able to use the line list, but something is
not right here.
; the line list is not set, but it would be manipulated by
something, so we should figure out what that is
until [
; calculate start of line or none
sol:
; calculate end of line or none
eol:
case [
; start of line to end of line
all [sol eol] [repend split-lines [sol eol] false]
; start of text to end of line
all [none? sol eol] [repend split-lines [start eol] false]
; start of line to end of text
all [sol none? eol] [repend split-lines [sol end] true]
]
]
foreach [start end] split-lines [
str: copy/part start end
sz: size-text make face/hl-face [size: 2000x50 text: str]
pos: caret-to-offset face start
make-hl-face face str pos sz
]
][
make-hl-face face str pos probe sz
]
]
show face
]
]
append init [
; prepare the highlight face to have the right font
hl-face/font: make font [offset: 0x0 color: white]
unless all [block? pane none? pane] [pane: make block! []]
; position the hl-pane
hl-pane/color: none
hl-pane/size: size ; perhaps size optimize it later
hl-pane/offset: offset
append pane hl-pane
; prepare hl-pane-block
hl-pane-block: get in last pane 'pane
]
]
bx: box red 0x0
panel: panel [
tt: hl-text 500 font-size 12 {Here is a simple example
how to use DRAW dialect
for into alpha channel of the image. I think with the function make-alpha
(bellow in the example) you can draw almost any kind of transparent shape
though it is not the fastest method....IMO the possibility to use DRAW pens
for alpha channel should be done at Rebol's native level}
t: text 400 {Here is a simple example how to use DRAW
dialect for e-alpha (bellow in the example) you can draw almost any kind of
transparent shape though it is not the fastest method....IMO the possiinto
alpha channel of the image. I think with the function make-alpha (bellow in
the example) you can draw almost any kind of transparent shape though it is
not the fastest method....IMO the possibility to use DRAW pens for alpha
channel should be done at Rebol's native level}
text 500 {can draw almost any kind of transparent shape
though it is not the fastest method....IMO the possibility to use DRAW pens
for alpha channel should be done at Rebol's naHere is a simple example how
to use DRAW dialect for into alpha channel of the image. I think with the
function make-alpha (bellow in the example) you can draw almost any kind of
transparent shape though it is not the fastest method....IMO the possibility
to use DRAW pens for alpha channel should be done at Rebol's native level}]
button "Highlight" [foreach face panel/pane [if face/style = 'text [
system/view/focal-face: face
system/view/highlight-start: find face/text "into alpha
channel of the image"
system/view/highlight-end: find/tail face/text "into alpha
channel of the image"
show face
]]]
button "Paint" [foreach face panel/pane [if face/style = 'text [
keyword: "transparent"
xy: caret-to-offset face find face/text keyword
bx/offset: face/offset + pad + xy
bx/size: as-pair (5.9 * length? keyword) 15
show face
]]]
button "Box highlight" [
set-highlight tt reduce [
; one start and end highlight component per line
find tt/text "IMO" skip find tt/text "IMO" 10
find tt/text "native" skip find tt/text "native" 4
]
]
]
view window
--
Regards,
Henrik Mikael Kristensen
--
To unsubscribe from the list, just send an email to
lists at rebol.com with unsubscribe as the subject.