factor/contrib/cairo/cairo_text.factor

103 lines
2.1 KiB
Factor

! A bit more complex cairo example
!
! To run this code, bootstrap Factor like so:
!
! ./f boot.image.le32
! -libraries:sdl:name=libSDL.so
! -libraries:sdl-gfx:name=libSDL_gfx
! -libraries:cairo:name=libcairo
!
! (But all on one line)
!
! Then, start Factor as usual (./f factor.image) and enter these
! at the listener:
!
! "/contrib/cairo/load.factor" run-resource
! "cairo_text.factor" run-file
IN: cairo-text
SYMBOL: angle
USING: cairo cairo-sdl compiler errors kernel namespaces sdl lists math sequences alien ;
: draw-rect ( angle -- )
cr get
[ cairo_identity_matrix ] keep
[ 160.0 120.0 cairo_translate ] keep
[ swap cairo_rotate ] keep
[ 0.0 50.0 cairo_translate ] keep
[ -10.0 -10.0 20.0 20.0 cairo_rectangle ] keep
cairo_fill ;
: clear-surface ( -- )
cr get
[ cairo_identity_matrix ] keep
[ 0.0 0.0 0.0 cairo_set_source_rgb ] keep
[ 0.0 0.0 320.0 240.0 cairo_rectangle ] keep
cairo_fill ;
: draw-fan ( -- )
10 [
cr get over
10 / dup dup
cairo_set_source_rgb
3 / angle get +
draw-rect
] each ;
: draw-cairo-text ( -- )
cr get
[ cairo_identity_matrix ] keep
[ 160 80.0 cairo_translate ] keep
[ angle get sin 3 / cairo_rotate ] keep
[ -60.0 25.0 cairo_translate ] keep
[ 0.0 0.5 1.0 cairo_set_source_rgb ] keep
[ "serif" CAIRO_FONT_SLANT_NORMAL CAIRO_FONT_WEIGHT_BOLD cairo_select_font_face ] keep
[ 45.0 cairo_set_font_size ] keep
[ "Cairo" cairo_text_path ] keep
[ cairo_fill_preserve ] keep
[ 0.0 0.4 0.8 cairo_set_source_rgb ] keep
[ 2.0 cairo_set_line_width ] keep
cairo_stroke ;
: draw-factor-text ( -- )
cr get
[ cairo_identity_matrix ] keep
[ 85.0 140.0 cairo_translate ] keep
"Factor" cairo_show_text ;
: redraw ( -- )
clear-surface
draw-fan
draw-cairo-text
draw-factor-text
;
: event-loop ( event -- )
angle [ 0.1 + ] change
[ redraw ] with-surface
dup SDL_PollEvent
[
dup event-type SDL_QUIT = [
drop
] [
event-loop
] if
] [
event-loop
] if ;
: cairo-sdl-test ( -- )
0 angle set
320 240 32 SDL_HWSURFACE [
set-up-cairo
"event" <c-object> event-loop
SDL_Quit
] with-screen ;
cairo-sdl-test