From 156581717593572d060686ee0eb88676dfba868d Mon Sep 17 00:00:00 2001 From: Sampo Vuori Date: Tue, 25 Sep 2007 20:30:27 +0300 Subject: [PATCH 1/2] Loading of cairo library added. More functionality. --- extra/cairo/cairo.factor | 144 ++++++++++++++++++++++++++++++++++----- 1 file changed, 128 insertions(+), 16 deletions(-) diff --git a/extra/cairo/cairo.factor b/extra/cairo/cairo.factor index 8cf79da9b4..5c4907e5bb 100644 --- a/extra/cairo/cairo.factor +++ b/extra/cairo/cairo.factor @@ -1,6 +1,25 @@ -! Cairo binding +! Bindings for Cairo library +! Copyright (c) 2007 Sampo Vuori +! License: http://factorcode.org/license.txt + +! Unimplemented: +! - most of the font stuff +! - most of the matrix stuff +! - most of the query functions + + +USING: alien alien.syntax combinators system ; + IN: cairo -USING: alien alien.syntax ; + +: load-cairo-library ( -- ) + "cairo" { + { [ win32? ] [ "cairo.dll" ] } + { [ macosx? ] [ "libcairo.dylib" ] } + { [ unix? ] [ "libcairo.so.2" ] } + } cond "cdecl" add-library ; parsing + +load-cairo-library ! cairo_status_t C-ENUM: @@ -10,24 +29,43 @@ C-ENUM: CAIRO_STATUS_INVALID_POP_GROUP CAIRO_STATUS_NO_CURRENT_POINT CAIRO_STATUS_INVALID_MATRIX - CAIRO_STATUS_NO_TARGET_SURFACE + CAIRO_STATUS_INVALID_STATUS CAIRO_STATUS_NULL_POINTER CAIRO_STATUS_INVALID_STRING + CAIRO_STATUS_INVALID_PATH_DATA + CAIRO_STATUS_READ_ERROR + CAIRO_STATUS_WRITE_ERROR + CAIRO_STATUS_SURFACE_FINISHED + CAIRO_STATUS_SURFACE_TYPE_MISMATCH + CAIRO_STATUS_PATTERN_TYPE_MISMATCH + CAIRO_STATUS_INVALID_CONTENT + CAIRO_STATUS_INVALID_FORMAT + CAIRO_STATUS_INVALID_VISUAL + CAIRO_STATUS_FILE_NOT_FOUND + CAIRO_STATUS_INVALID_DASH + CAIRO_STATUS_INVALID_DSC_COMMENT + CAIRO_STATUS_INVALID_INDEX + CAIRO_STATUS_CLIP_NOT_REPRESENTABLE ; +! cairo_content_t +: CAIRO_CONTENT_COLOR HEX: 1000 ; +: CAIRO_CONTENT_ALPHA HEX: 2000 ; +: CAIRO_CONTENT_COLOR_ALPHA HEX: 3000 ; + ! cairo_operator_t C-ENUM: CAIRO_OPERATOR_CLEAR - CAIRO_OPERATOR_SRC - CAIRO_OPERATOR_DST + CAIRO_OPERATOR_SOURCE CAIRO_OPERATOR_OVER - CAIRO_OPERATOR_OVER_REVERSE CAIRO_OPERATOR_IN - CAIRO_OPERATOR_IN_REVERSE CAIRO_OPERATOR_OUT - CAIRO_OPERATOR_OUT_REVERSE CAIRO_OPERATOR_ATOP - CAIRO_OPERATOR_ATOP_REVERSE + CAIRO_OPERATOR_DEST + CAIRO_OPERATOR_DEST_OVER + CAIRO_OPERATOR_DEST_IN + CAIRO_OPERATOR_DEST_OUT + CAIRO_OPERATOR_DEST_ATOP CAIRO_OPERATOR_XOR CAIRO_OPERATOR_ADD CAIRO_OPERATOR_SATURATE @@ -116,6 +154,14 @@ C-STRUCT: cairo_t { "cairo_gstate_t*" "gstate" } { "uint" "status ! cairo_status_t" } ; +C-STRUCT: cairo_matrix_t + { "double" "xx" } + { "double" "yx" } + { "double" "xy" } + { "double" "yy" } + { "double" "x0" } + { "double" "y0" } ; + ! cairo_format_t C-ENUM: CAIRO_FORMAT_ARGB32 @@ -160,15 +206,24 @@ C-ENUM: : cairo_create ( cairo_surface_t -- cairo_t ) "cairo_t*" "cairo" "cairo_create" [ "void*" ] alien-invoke ; +: cairo_reference ( cairo_t -- cairo_t ) + "cairo_t*" "cairo" "cairo_reference" [ "cairo_t*" ] alien-invoke ; + : cairo_destroy ( cairo_t -- ) "void" "cairo" "cairo_destroy" [ "cairo_t*" ] alien-invoke ; +: cairo_save ( cairo_t -- ) + "void" "cairo" "cairo_save" [ "cairo_t*" ] alien-invoke ; + +: cairo_restore ( cairo_t -- ) + "void" "cairo" "cairo_restore" [ "cairo_t*" ] alien-invoke ; + : cairo_set_operator ( cairo_t cairo_operator_t -- ) "void" "cairo" "cairo_set_operator" [ "cairo_t*" "int" ] alien-invoke ; -: 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 ; - +: cairo_set_source ( cairo_t cairo_pattern_t -- ) + "void" "cairo" "cairo_set_source" [ "cairo_t*" "void*" ] alien-invoke ; + : cairo_set_source_rgb ( cairo_t red green blue -- ) "void" "cairo" "cairo_set_source_rgb" [ "cairo_t*" "double" "double" "double" ] alien-invoke ; @@ -181,6 +236,10 @@ C-ENUM: : cairo_set_tolerance ( cairo_t tolerance -- ) "void" "cairo" "cairo_set_tolerance" [ "cairo_t*" "double" ] alien-invoke ; +: 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 ; + + : cairo_set_antialias ( cairo_t cairo_antialias_t -- ) "void" "cairo" "cairo_set_antialias" [ "cairo_t*" "int" ] alien-invoke ; @@ -211,6 +270,14 @@ C-ENUM: : cairo_rotate ( cairo_t angle -- ) "void" "cairo" "cairo_rotate" [ "cairo_t*" "double" ] alien-invoke ; +: cairo_transform ( cairo_t cairo_matrix_t -- ) + "void" "cairo" "cairo_transform" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ; + +: cairo_set_matrix ( cairo_t cairo_matrix_t -- ) + "void" "cairo" "cairo_set_matrix" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ; + +: cairo_identity_matrix ( cairo_t -- ) + "void" "cairo" "cairo_identity_matrix" [ "cairo_t*" ] alien-invoke ; ! cairo path creating functions @@ -219,6 +286,9 @@ C-ENUM: : cairo_move_to ( cairo_t x y -- ) "void" "cairo" "cairo_move_to" [ "cairo_t*" "double" "double" ] alien-invoke ; + +: cairo_new_sub_path ( cairo_t -- ) + "void" "cairo" "cairo_new_sub_path" [ "cairo_t*" ] alien-invoke ; : cairo_line_to ( cairo_t x y -- ) "void" "cairo" "cairo_line_to" [ "cairo_t*" "double" "double" ] alien-invoke ; @@ -247,6 +317,29 @@ C-ENUM: : cairo_close_path ( cairo_t -- ) "void" "cairo" "cairo_close_path" [ "cairo_t*" ] alien-invoke ; +! Surface manipulation + +: cairo_surface_create_similar ( cairo_surface_t cairo_content_t width height -- cairo_surface_t ) + "cairo_surface_t*" "cairo" "cairo_surface_create_similar" [ "cairo_surface_t*" "uint" "int" "int" ] alien-invoke ; + +: cairo_surface_reference ( cairo_surface_t -- cairo_surface_t ) + "cairo_surface_t*" "cairo" "cairo_surface_reference" [ "cairo_surface_t*" ] alien-invoke ; + +: cairo_surface_finish ( cairo_surface_t -- ) + "void" "cairo" "cairo_surface_finish" [ "cairo_surface_t*" ] alien-invoke ; + +: cairo_surface_destroy ( cairo_surface_t -- ) + "void" "cairo" "cairo_surface_destroy" [ "cairo_surface_t*" ] alien-invoke ; + +: cairo_surface_get_reference_count ( cairo_surface_t -- count ) + "uint" "cairo" "cairo_surface_get_reference_count" [ "cairo_surface_t*" ] alien-invoke ; + +: cairo_surface_status ( cairo_surface_t -- cairo_status_t ) + "uint" "cairo" "cairo_surface_status" [ "cairo_surface_t*" ] alien-invoke ; + +: cairo_surface_flush ( cairo_surface_t -- ) + "void" "cairo" "cairo_surface_flush" [ "cairo_surface_t*" ] alien-invoke ; + ! painting functions : cairo_paint ( cairo_t -- ) "void" "cairo" "cairo_paint" [ "cairo_t*" ] alien-invoke ; @@ -302,8 +395,6 @@ C-ENUM: : cairo_clip_preserve ( cairo_t -- ) "void" "cairo" "cairo_clip_preserve" [ "cairo_t*" ] alien-invoke ; -: cairo_set_source ( cairo_t cairo_pattern_t -- ) - "void" "cairo" "cairo_set_source" [ "cairo_t*" "void*" ] alien-invoke ; : cairo_pattern_create_linear ( x0 y0 x1 y1 -- cairo_pattern_t ) "void*" "cairo" "cairo_pattern_create_linear" [ "double" "double" "double" "double" ] alien-invoke ; @@ -326,5 +417,26 @@ C-ENUM: : cairo_set_font_size ( cairo_t scale -- ) "void" "cairo" "cairo_set_font_size" [ "cairo_t*" "double" ] alien-invoke ; -: cairo_identity_matrix ( cairo_t -- ) - "void" "cairo" "cairo_identity_matrix" [ "cairo_t*" ] alien-invoke ; +: cairo_set_font_matrix ( cairo_t cairo_matrix_t -- ) + "void" "cairo" "cairo_set_font_matrix" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ; + +: cairo_get_font_matrix ( cairo_t cairo_matrix_t -- ) + "void" "cairo" "cairo_get_font_matrix" [ "cairo_t*" "cairo_matrix_t*" ] alien-invoke ; + + + +! Cairo pdf + +: cairo_pdf_surface_create ( filename width height -- surface ) + "void*" "cairo" "cairo_pdf_surface_create" [ "char*" "double" "double" ] alien-invoke ; + +! Missing: + +! cairo_public cairo_surface_t * +! cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, +! void *closure, +! double width_in_points, +! double height_in_points); + +: cairo_pdf_surface_set_size ( surface width height -- ) + "void" "cairo" "cairo_pdf_surface_set_size" [ "void*" "double" "double" ] alien-invoke ; From 3a3eeb282447ce37b890c936da98be86bae11c28 Mon Sep 17 00:00:00 2001 From: Sampo Vuori Date: Tue, 25 Sep 2007 22:06:28 +0300 Subject: [PATCH 2/2] Added a new cairo demo --- extra/cairo-demo/cairo-demo.factor | 72 ++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 extra/cairo-demo/cairo-demo.factor diff --git a/extra/cairo-demo/cairo-demo.factor b/extra/cairo-demo/cairo-demo.factor new file mode 100644 index 0000000000..9d7af090a7 --- /dev/null +++ b/extra/cairo-demo/cairo-demo.factor @@ -0,0 +1,72 @@ +! Cairo "Hello World" demo +! Copyright (c) 2007 Sampo Vuori +! License: http://factorcode.org/license.txt +! +! This example is an adaptation of the following cairo sample code: +! http://cairographics.org/samples/text/ + + +USING: cairo math math.constants byte-arrays kernel ui ui.render + ui.gadgets opengl.gl ; + +IN: cairo-demo + + +: make-image-array ( -- array ) + 384 256 4 * * ; + +: convert-array-to-surface ( array -- cairo_surface_t ) + CAIRO_FORMAT_ARGB32 384 256 over 4 * + cairo_image_surface_create_for_data ; + + +TUPLE: cairo-gadget image-array cairo-t ; + +M: cairo-gadget draw-gadget* ( gadget -- ) + 0 0 glRasterPos2i + 1.0 -1.0 glPixelZoom + >r 384 256 GL_RGBA GL_UNSIGNED_BYTE r> + cairo-gadget-image-array glDrawPixels ; + +: create-surface ( gadget -- cairo_surface_t ) + make-image-array dup >r swap set-cairo-gadget-image-array r> convert-array-to-surface ; + +: init-cairo ( gadget -- cairo_t ) + create-surface cairo_create ; + +M: cairo-gadget pref-dim* drop { 384 256 0 } ; + +: draw-hello-world ( gadget -- ) + cairo-gadget-cairo-t + dup "Sans" CAIRO_FONT_SLANT_NORMAL CAIRO_FONT_WEIGHT_BOLD cairo_select_font_face + dup 90.0 cairo_set_font_size + dup 10.0 135.0 cairo_move_to + dup "Hello" cairo_show_text + dup 70.0 165.0 cairo_move_to + dup "World" cairo_text_path + dup 0.5 0.5 1 cairo_set_source_rgb + dup cairo_fill_preserve + dup 0 0 0 cairo_set_source_rgb + dup 2.56 cairo_set_line_width + dup cairo_stroke + dup 1 0.2 0.2 0.6 cairo_set_source_rgba + dup 10.0 135.0 5.12 0 pi 2 * cairo_arc + dup cairo_close_path + dup 70.0 165.0 5.12 0 pi 2 * cairo_arc + cairo_fill ; + +M: cairo-gadget graft* ( gadget -- ) + dup dup init-cairo swap set-cairo-gadget-cairo-t draw-hello-world ; + +M: cairo-gadget ungraft* ( gadget -- ) + cairo-gadget-cairo-t cairo_destroy ; + +: ( -- gadget ) + cairo-gadget construct-gadget ; + +: run ( -- ) + [ + "Hello World from Factor!" open-window + ] with-ui ; + +MAIN: run