require my-colorize.fs require fs-fonts/font-clb8x8.fs : big-xy postpone clb8x8-string-xy ; immediate 4 constant big-w require fs-fonts/font-clr5x8.fs : thin-xy postpone clr5x8-string-xy ; immediate 3 constant thin-w require fs-fonts/font-clr6x6.fs : med-xy postpone clr6x6-string-xy ; immediate 3 constant med-w \ optimized for 67x24 \ presentation german, code english \ copy a string to a new memory location : string-realloc ( addr u -- addr u ) dup >r dup chars allocate throw dup >r swap cmove r> r> ; \ output centered text on line : center. ( addr u y -- ) over cols - 2/ negate swap at-xy type ; \ calculate where to start drawing a centered string \ with characters of the given width : to-center ( addr u cw -- addr u x ) over * cols - 2/ negate ; : center-xy ( y addr u w -- x y addr u ) to-center >r rot r> swap 2swap ; \ draw a centered string with the big font : big-center. ( addr u y -- ) -rot big-w center-xy big-xy ; \ draw a centered string with the medium font : med-center. ( addr u y -- ) -rot med-w center-xy med-xy ; \ draw a bullet : bullet ( -- ) fg a> attr! cr ." ▣ " fg a> attr! ; \ draw the space under the bullet : bullet-space ( -- ) ." " ; \ enable bold : ( -- ) attr @ bold - ( look at ansi.fs ) attr! ; \ template stuff \ insert the slide background : insert-background ( -- ) bg red >fg a> attr! page 0 5 at-xy cols 0 ?do ." ▂" loop ; \ insert the title : insert-title ( addr u -- ) fg a> attr! 1 1 2swap dup big-w * cols > if thin-xy else big-xy endif ; \ position the cursor to insert contents : insert-contents ( -- ) fg a> attr! 0 7 at-xy ; \ wait for the next slide : next-slide ( -- ) key ; \ insert a bullet prompt, return entered text : prompt ( addr1 u1 - addr2 u2 ) bullet pad dup 84 fg a> attr! accept ; \ import the deferred version of the compressor require lzw-deferred.fs \ positions of the various "graphical" elements 11 constant begin-table-y 0 value table-y 13 constant input-y 18 constant output-y 35 constant put-x 25 constant recipient-size 4 constant entries-x 15 constant codes-x 24 constant end-table-x 0 value input-x 0 value output-x 0 value old-x \ this is the presentation version of the deferred words : pnext-code ( -- code ) (next-code) dup drop \ show the code under the table, wait 1s ; latestxt is next-code : pdictionary-add ( addr len code -- ) \ add a new code at the bottom of the table >r 2dup entries-x table-y at-xy type codes-x table-y at-xy ." ▎" r@ . table-y 1+ to table-y r> (dictionary-add) ; latestxt is dictionary-add : pdictionary-contains ( addr len -- contains? ) \ highlight word if found 2dup (dictionary-contains) >r r@ if dup 1 = if entries-x begin-table-y at-xy key drop entries-x begin-table-y at-xy ." ASCII" 2drop else 2dup (dictionary-get) 255 - begin-table-y + entries-x swap 2dup at-xy 2over key drop at-xy type endif else dup >r entries-x table-y at-xy key drop entries-x table-y at-xy r> 17 + spaces endif r> ; latestxt is dictionary-contains : pdictionary-get ( addr len -- code ) \ highlight the word and the code 2dup (dictionary-get) dup >r key drop 255 <= if 2drop entries-x begin-table-y at-xy codes-x begin-table-y at-xy ." ▎" r@ key drop entries-x begin-table-y at-xy ." ASCII" codes-x begin-table-y at-xy ." " else 2dup r@ 255 - begin-table-y + >r r@ entries-x swap at-xy codes-x r> at-xy ." ▎" r@ key drop r@ 255 - begin-table-y + >r r@ entries-x swap at-xy type codes-x r> at-xy ." ▎" r@ . endif r> ; latestxt is dictionary-get : draw-recipient ( x y -- ) 2dup at-xy ." ┃" 2dup swap recipient-size + 1+ swap at-xy ." ┃" 1+ at-xy ." ┗" recipient-size 0 ?do ." ━" loop ." ┛" ; : pdictionary-init ( addr u -- addr u ) \ init stuff, draw ascii part of table begin-table-y to table-y put-x to input-x put-x to output-x put-x to old-x entries-x table-y at-xy ." ASCII" table-y 1+ to table-y put-x 2 - input-y draw-recipient put-x 2 - output-y draw-recipient entries-x 1- begin-table-y 1- at-xy ." ┏" end-table-x entries-x ?do ." ━" loop ." ┓" rows begin-table-y ?do entries-x 1- i at-xy ." ┃" end-table-x i at-xy ." ┃" loop key drop (dictionary-init) ; latestxt is dictionary-init : pdictionary-destroy (dictionary-destroy) ; latestxt is dictionary-destroy : pcurrent-char ( len addr wlen -- len addr nwlen len<=nwlen ) \ highlight rot 2dup 2>r -rot 2r> >= if input-x input-y at-xy ." ▣" else 2dup chars + c@ input-x dup input-y at-xy swap emit 1+ to input-x endif (current-char) key drop ; latestxt is current-char : pdismiss-old-chars ( len addr wlen -- nlen naddr 1 ) \ gray out old chars old-x input-y at-xy dup 0 ?do ." ░" loop dup old-x + to old-x (dismiss-old-chars) key drop ; latestxt is dismiss-old-chars : pcode-out ( code -- ) \ output the code dup 255 < if output-x dup output-y at-xy swap emit 1+ to output-x else output-x dup output-y at-xy swap 3 + to output-x endif ; latestxt is code-out \ this is where the fun should begin : first-slide insert-background fg a> attr! s" LZW-Kompression" 7 big-center. s" in Forth" 12 med-center. attr! s" Mihai Ghete" 16 center. s" Florian Kimmel" 17 center. s" Jakob Petsovits" 18 center. next-slide ; : info-slide insert-background s" Was ist LZW?" insert-title insert-contents 0 6 at-xy bullet ." LZW = Liv-Zempel-Welch" cr bullet ." Komprimiert Strings" cr bullet ." ... mit Hilfe einer " cr next-slide ; : example-slide insert-background s" Wie funktioniert LZW?" insert-title insert-contents ; : example-loop begin example-slide s" Zu komprimierendes Wort: " prompt dup 0<> while string-realloc 2dup lzw-compress key drop drop free repeat ; : features-slide insert-background s" Sprach-Features" insert-title insert-contents bullet cr bullet-space ." LZW-Tabelle verwendet eine Wordlist zum Einfügen / Suchen" cr bullet cr bullet-space ." - " ." hat Farben!" cr bullet-space ." - Die Schritte des Kompressionsalgorithmus können neu definiert werden" cr bullet-space ." (z.B. für die Präsentation)." cr next-slide ; : words-slide insert-background s" Code" insert-title insert-contents bullet cr bullet-space ." lzw-compress" cr bullet-space ." current-char" cr bullet-space ." dismiss-old-chars" cr bullet cr bullet-space ." dictionary-init" cr bullet-space ." dictionary-add" cr bullet-space ." dictionary-get" cr ; \ see a word on a slide : fancy-see ( addr u -- ) insert-background 2dup insert-title insert-contents find-name dup 0= if ." Wort nicht gefunden!" drop else name-see endif next-slide ; : words-loop begin words-slide s" Wort: " prompt -trailing dup 0<> while fancy-see repeat ; : last-slide insert-background insert-contents fg a> attr! s" Ende" 7 big-center. s" Noch Fragen?" 12 med-center. next-slide ; : bye attr! page bye ; first-slide info-slide example-loop words-loop features-slide last-slide bye