Added beginnings of cairo bindings
parent
1f08ee4c6f
commit
05bea5a1b5
|
@ -29,3 +29,5 @@ library, but is useful enough to ship with the Factor distribution.
|
||||||
- contrib/dlists.factor -- double-linked-lists (Mackenzie Straight)
|
- contrib/dlists.factor -- double-linked-lists (Mackenzie Straight)
|
||||||
|
|
||||||
- contrib/xml.factor -- XML parser and writer (Daniel Ehrenberg)
|
- contrib/xml.factor -- XML parser and writer (Daniel Ehrenberg)
|
||||||
|
|
||||||
|
- contrib/cairo/ -- cairo bindings (Sampo Vuori)
|
||||||
|
|
|
@ -0,0 +1,229 @@
|
||||||
|
! Cairo stuff
|
||||||
|
!
|
||||||
|
! 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)
|
||||||
|
!
|
||||||
|
|
||||||
|
IN: cairo
|
||||||
|
USING: hashtables ;
|
||||||
|
USE: compiler
|
||||||
|
USE: alien
|
||||||
|
USE: errors
|
||||||
|
USE: kernel
|
||||||
|
USE: lists
|
||||||
|
USE: math
|
||||||
|
USE: namespaces
|
||||||
|
USE: sdl
|
||||||
|
USE: sdl-event
|
||||||
|
USE: sdl-gfx
|
||||||
|
USE: sdl-video
|
||||||
|
USE: vectors
|
||||||
|
USE: prettyprint
|
||||||
|
USE: stdio
|
||||||
|
USE: test
|
||||||
|
USE: syntax
|
||||||
|
USE: sequences
|
||||||
|
|
||||||
|
! cairo_status_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_STATUS_SUCCESS
|
||||||
|
ENUM: CAIRO_STATUS_NO_MEMORY
|
||||||
|
ENUM: CAIRO_STATUS_INVALID_RESTORE
|
||||||
|
ENUM: CAIRO_STATUS_INVALID_POP_GROUP
|
||||||
|
ENUM: CAIRO_STATUS_NO_CURRENT_POINT
|
||||||
|
ENUM: CAIRO_STATUS_INVALID_MATRIX
|
||||||
|
ENUM: CAIRO_STATUS_NO_TARGET_SURFACE
|
||||||
|
ENUM: CAIRO_STATUS_NULL_POINTER
|
||||||
|
ENUM: CAIRO_STATUS_INVALID_STRING
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
! cairo_operator_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_OPERATOR_CLEAR
|
||||||
|
ENUM: CAIRO_OPERATOR_SRC
|
||||||
|
ENUM: CAIRO_OPERATOR_DST
|
||||||
|
ENUM: CAIRO_OPERATOR_OVER
|
||||||
|
ENUM: CAIRO_OPERATOR_OVER_REVERSE
|
||||||
|
ENUM: CAIRO_OPERATOR_IN
|
||||||
|
ENUM: CAIRO_OPERATOR_IN_REVERSE
|
||||||
|
ENUM: CAIRO_OPERATOR_OUT
|
||||||
|
ENUM: CAIRO_OPERATOR_OUT_REVERSE
|
||||||
|
ENUM: CAIRO_OPERATOR_ATOP
|
||||||
|
ENUM: CAIRO_OPERATOR_ATOP_REVERSE
|
||||||
|
ENUM: CAIRO_OPERATOR_XOR
|
||||||
|
ENUM: CAIRO_OPERATOR_ADD
|
||||||
|
ENUM: CAIRO_OPERATOR_SATURATE
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
! cairo_line_cap_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_LINE_CAP_BUTT
|
||||||
|
ENUM: CAIRO_LINE_CAP_ROUND
|
||||||
|
ENUM: CAIRO_LINE_CAP_SQUARE
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
! cair_line_join_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_LINE_JOIN_MITER
|
||||||
|
ENUM: CAIRO_LINE_JOIN_ROUND
|
||||||
|
ENUM: CAIRO_LINE_JOIN_BEVEL
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
! cairo_fill_rule_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_FILL_RULE_WINDING
|
||||||
|
ENUM: CAIRO_FILL_RULE_EVEN_ODD
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
! cairo_font_slant_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_FONT_SLANT_NORMAL
|
||||||
|
ENUM: CAIRO_FONT_SLANT_ITALIC
|
||||||
|
ENUM: CAIRO_FONT_SLANT_OBLIQUE
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
! cairo_font_weight_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_FONT_WEIGHT_NORMAL
|
||||||
|
ENUM: CAIRO_FONT_WEIGHT_BOLD
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
BEGIN-STRUCT: cairo_font_t
|
||||||
|
FIELD: int refcount
|
||||||
|
FIELD: uint scale
|
||||||
|
FIELD: void* backend ! cairo_font_backend*
|
||||||
|
END-STRUCT
|
||||||
|
|
||||||
|
BEGIN-STRUCT: cairo_rectangle_t
|
||||||
|
FIELD: short x
|
||||||
|
FIELD: short y
|
||||||
|
FIELD: ushort width
|
||||||
|
FIELD: ushort height
|
||||||
|
END-STRUCT
|
||||||
|
|
||||||
|
BEGIN-STRUCT: cairo_clip_rec_t
|
||||||
|
FIELD: cairo_rectangle_t rect
|
||||||
|
FIELD: void* region
|
||||||
|
FIELD: void* surface
|
||||||
|
END-STRUCT
|
||||||
|
|
||||||
|
BEGIN-STRUCT: cairo_matrix_t
|
||||||
|
FIELD: void* m
|
||||||
|
END-STRUCT
|
||||||
|
|
||||||
|
BEGIN-STRUCT: cairo_gstate_t
|
||||||
|
FIELD: uint operator ! cairo_operator_t
|
||||||
|
FIELD: double tolerance
|
||||||
|
FIELD: double line_width
|
||||||
|
FIELD: uint line_cap ! cairo_line_cap_t
|
||||||
|
FIELD: uint line_join ! cairo_line_join_t
|
||||||
|
FIELD: double miter_limit
|
||||||
|
FIELD: uint fill_rule ! cairo_fill_rule_t
|
||||||
|
FIELD: void* dash ! double*
|
||||||
|
FIELD: int num_dashes
|
||||||
|
FIELD: double dash_offset
|
||||||
|
FIELD: char* font_family
|
||||||
|
FIELD: uint font_slant ! cairo_font_slant_t
|
||||||
|
FIELD: uint font_weight ! cairo_font_weight_t
|
||||||
|
FIELD: void* font ! cairo_font_t*
|
||||||
|
FIELD: void* surface ! cairo_surface_t*
|
||||||
|
FIELD: void* pattern ! cairo_pattern_t*
|
||||||
|
FIELD: double alpha
|
||||||
|
FIELD: cairo_clip_rec_t clip
|
||||||
|
FIELD: double pixels_per_inch
|
||||||
|
FIELD: cairo_matrix_t font_matrix
|
||||||
|
FIELD: cairo_matrix_t ctm
|
||||||
|
FIELD: cairo_matrix_t ctm_inverse
|
||||||
|
FIELD: void* path ! cairo_path_t
|
||||||
|
FIELD: void* pen_regular ! cairo_pen_t
|
||||||
|
FIELD: void* next ! cairo_gstate*
|
||||||
|
END-STRUCT
|
||||||
|
|
||||||
|
BEGIN-STRUCT: cairo_t
|
||||||
|
FIELD: uint ref_count
|
||||||
|
FIELD: cairo_gstate_t* gstate
|
||||||
|
FIELD: uint status ! cairo_status_t
|
||||||
|
END-STRUCT
|
||||||
|
|
||||||
|
! cairo_format_t
|
||||||
|
BEGIN-ENUM: 0
|
||||||
|
ENUM: CAIRO_FORMAT_ARGB32
|
||||||
|
ENUM: CAIRO_FORMAT_RGB24
|
||||||
|
ENUM: CAIRO_FORMAT_A8
|
||||||
|
ENUM: CAIRO_FORMAT_A1
|
||||||
|
END-ENUM
|
||||||
|
|
||||||
|
: cairo_create ( cairo_surface_t -- cairo_t )
|
||||||
|
"cairo_t*" "cairo" "cairo_create" [ "void*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_destroy ( cairo_t -- )
|
||||||
|
"void" "cairo" "cairo_destroy" [ "cairo_t*" ] ; compiled
|
||||||
|
|
||||||
|
: cairo_image_surface_create_for_data ( data format width height stride -- cairo_surface_t)
|
||||||
|
"void*" "cairo" "cairo_image_surface_create_for_data" [ "void*" "uint" "int" "int" "int" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_set_source_rgb ( cairo_t r g b -- )
|
||||||
|
"void" "cairo" "cairo_set_source_rgb" [ "cairo_t*" "double" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_move_to ( cairo_t x y -- )
|
||||||
|
"void" "cairo" "cairo_move_to" [ "cairo_t*" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_line_to ( cairo_t x y -- )
|
||||||
|
"void" "cairo" "cairo_line_to" [ "cairo_t*" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_stroke ( cairo_t -- )
|
||||||
|
"void" "cairo" "cairo_stroke" [ "cairo_t*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_fill ( cairo_t -- )
|
||||||
|
"void" "cairo" "cairo_fill" [ "cairo_t*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_fill_preserve ( cairo_t -- )
|
||||||
|
"void" "cairo" "cairo_fill_preserve" [ "cairo_t*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_rectangle ( cairo_t x y width height -- )
|
||||||
|
"void" "cairo" "cairo_rectangle" [ "cairo_t*" "double" "double" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_set_source ( cairo_t cairo_pattern_t -- )
|
||||||
|
"void" "cairo" "cairo_set_source" [ "cairo_t*" "void*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_pattern_create_linear ( x0 y0 x1 y1 -- cairo_pattern_t )
|
||||||
|
"void*" "cairo" "cairo_pattern_create_linear" [ "double" "double" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_pattern_create_radial ( cx0 cy0 radius0 cx1 cy1 radius1 -- cairo_pattern_t )
|
||||||
|
"void*" "cairo" "cairo_pattern_create_radial" [ "double" "double" "double" "double" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_set_source ( cairo_t pattern -- )
|
||||||
|
"void" "cairo" "cairo_set_source" [ "cairo_t*" "void*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_pattern_add_color_stop_rgba ( pattern offset red green blue alpha -- status )
|
||||||
|
"uint" "cairo" "cairo_pattern_add_color_stop_rgba" [ "void*" "double" "double" "double" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_show_text ( cairo_t msg_utf8 -- )
|
||||||
|
"void" "cairo" "cairo_show_text" [ "cairo_t*" "char*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_text_path ( cairo_t msg_utf8 -- )
|
||||||
|
"void" "cairo" "cairo_text_path" [ "cairo_t*" "char*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_select_font_face ( cairo_t family font_slant font_weight -- )
|
||||||
|
"void" "cairo" "cairo_select_font_face" [ "cairo_t*" "char*" "uint" "uint" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_set_font_size ( cairo_t scale -- )
|
||||||
|
"void" "cairo" "cairo_set_font_size" [ "cairo_t*" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_rotate ( cairo_t angle -- )
|
||||||
|
"void" "cairo" "cairo_rotate" [ "cairo_t*" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_translate ( cairo_t x y -- )
|
||||||
|
"void" "cairo" "cairo_translate" [ "cairo_t*" "double" "double" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_identity_matrix ( cairo_t -- )
|
||||||
|
"void" "cairo" "cairo_identity_matrix" [ "cairo_t*" ] alien-invoke ; compiled
|
||||||
|
|
||||||
|
: cairo_set_line_width ( cairo_t width -- )
|
||||||
|
"void" "cairo" "cairo_set_line_width" [ "cairo_t*" "double" ] alien-invoke ; compiled
|
|
@ -0,0 +1,43 @@
|
||||||
|
! SDL backend for cairo
|
||||||
|
!
|
||||||
|
! 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)
|
||||||
|
!
|
||||||
|
|
||||||
|
IN: cairo-sdl
|
||||||
|
USING: hashtables ;
|
||||||
|
USE: compiler
|
||||||
|
USE: alien
|
||||||
|
USE: errors
|
||||||
|
USE: kernel
|
||||||
|
USE: lists
|
||||||
|
USE: math
|
||||||
|
USE: namespaces
|
||||||
|
USE: sdl
|
||||||
|
USE: sdl-event
|
||||||
|
USE: sdl-gfx
|
||||||
|
USE: sdl-video
|
||||||
|
USE: vectors
|
||||||
|
USE: prettyprint
|
||||||
|
USE: stdio
|
||||||
|
USE: test
|
||||||
|
USE: syntax
|
||||||
|
USE: sequences
|
||||||
|
USE: cairo
|
||||||
|
|
||||||
|
SYMBOL: cr
|
||||||
|
|
||||||
|
: set-up-cairo ( -- )
|
||||||
|
surface get surface-pixels ! get pointer to pixel data
|
||||||
|
CAIRO_FORMAT_ARGB32 ! only in argb32-mode both SDL and cairo agree on the pixel format
|
||||||
|
surface get [ surface-w ] keep ! get surface width, keep it
|
||||||
|
surface-h over 4 * ! get surface height (keep it) and calculate stride from the width
|
||||||
|
cairo_image_surface_create_for_data
|
||||||
|
cairo_create
|
||||||
|
cr set ;
|
|
@ -0,0 +1,60 @@
|
||||||
|
! A simple 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:
|
||||||
|
!
|
||||||
|
! "cairo.factor" run-file
|
||||||
|
! "cairo_sdl.factor" run-file
|
||||||
|
! "cairo_simple.factor" run-file
|
||||||
|
|
||||||
|
IN: cairo-simple
|
||||||
|
USE: cairo
|
||||||
|
USE: cairo-sdl
|
||||||
|
USE: compiler
|
||||||
|
USE: errors
|
||||||
|
USE: kernel
|
||||||
|
USE: namespaces
|
||||||
|
USE: sdl
|
||||||
|
USE: sdl-event
|
||||||
|
USE: sdl-gfx
|
||||||
|
USE: sdl-video
|
||||||
|
|
||||||
|
: redraw ( -- )
|
||||||
|
cr get
|
||||||
|
[ cairo_identity_matrix ] keep
|
||||||
|
[ 0.0 0.1 0.8 cairo_set_source_rgb ] keep ! set blue color
|
||||||
|
[ 130.0 90.0 60.0 60.0 cairo_rectangle ] keep ! draw a rectangle
|
||||||
|
cairo_fill ; ! and fill it
|
||||||
|
|
||||||
|
|
||||||
|
: event-loop ( event -- )
|
||||||
|
[ redraw ] with-surface
|
||||||
|
dup SDL_PollEvent
|
||||||
|
[
|
||||||
|
dup event-type SDL_QUIT = [
|
||||||
|
drop
|
||||||
|
] [
|
||||||
|
event-loop
|
||||||
|
] if
|
||||||
|
] [
|
||||||
|
event-loop
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
: cairo-sdl-test ( -- )
|
||||||
|
320 240 32 SDL_HWSURFACE [
|
||||||
|
set-up-cairo
|
||||||
|
<event> event-loop
|
||||||
|
cr get cairo_destroy
|
||||||
|
SDL_Quit
|
||||||
|
] with-screen ;
|
||||||
|
|
||||||
|
cairo-sdl-test
|
|
@ -0,0 +1,103 @@
|
||||||
|
! 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:
|
||||||
|
!
|
||||||
|
! "cairo.factor" run-file
|
||||||
|
! "cairo_sdl.factor" run-file
|
||||||
|
! "cairo_text.factor" run-file
|
||||||
|
|
||||||
|
IN: cairo-text
|
||||||
|
SYMBOL: angle
|
||||||
|
|
||||||
|
USING: cairo cairo-sdl compiler errors kernel namespaces sdl sdl-event sdl-gfx sdl-video lists math sequences ;
|
||||||
|
|
||||||
|
: 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> event-loop
|
||||||
|
SDL_Quit
|
||||||
|
] with-screen ;
|
||||||
|
|
||||||
|
cairo-sdl-test
|
Loading…
Reference in New Issue