From c64de056fbd9f7f060b17ffacb56755cbfe6dd47 Mon Sep 17 00:00:00 2001 From: Matthew Willis Date: Sat, 24 May 2008 12:06:59 -0700 Subject: [PATCH] First crack at pango. Try "cairo.pango.gadgets" run --- extra/cairo/pango/gadgets/gadgets.factor | 20 +++ extra/cairo/pango/pango.factor | 175 +++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 extra/cairo/pango/gadgets/gadgets.factor create mode 100644 extra/cairo/pango/pango.factor diff --git a/extra/cairo/pango/gadgets/gadgets.factor b/extra/cairo/pango/gadgets/gadgets.factor new file mode 100644 index 0000000000..780881e872 --- /dev/null +++ b/extra/cairo/pango/gadgets/gadgets.factor @@ -0,0 +1,20 @@ +USING: cairo.pango cairo cairo.ffi cairo.gadgets +alien.c-types kernel math ; +IN: cairo.pango.gadgets + +: (pango-gadget) ( setup show -- gadget ) + [ drop layout-size ] + [ compose [ with-pango ] curry ] 2bi ; + +: ( quot -- gadget ) + [ cr layout pango_cairo_show_layout ] (pango-gadget) ; + +USING: prettyprint sequences ui.gadgets.panes ; +: hello-pango ( -- ) + 50 [ 6 + ] map [ + "Sans Bold " swap unparse append + [ layout-font "Hello, Pango!" layout-text ] curry + gadget. + ] each ; + +MAIN: hello-pango diff --git a/extra/cairo/pango/pango.factor b/extra/cairo/pango/pango.factor new file mode 100644 index 0000000000..789044f6e1 --- /dev/null +++ b/extra/cairo/pango/pango.factor @@ -0,0 +1,175 @@ +! Copyright (C) 2008 Matthew Willis. +! See http://factorcode.org/license.txt for BSD license. +! +! pangocairo bindings, from pango/pangocairo.h + +USING: cairo.ffi alien.c-types math +alien.syntax system combinators alien ; +IN: cairo.pango + +<< "pangocairo" { +! { [ os winnt? ] [ "libpangocairo-1.dll" ] } +! { [ os macosx? ] [ "libpangocairo.dylib" ] } + { [ os unix? ] [ "libpangocairo-1.0.so" ] } +} cond "cdecl" add-library >> + +LIBRARY: pangocairo + +TYPEDEF: void* PangoCairoFont +TYPEDEF: void* PangoCairoFontMap +TYPEDEF: void* PangoFontMap + +FUNCTION: PangoFontMap* +pango_cairo_font_map_new ( ) ; + +FUNCTION: PangoFontMap* +pango_cairo_font_map_new_for_font_type ( cairo_font_type_t fonttype ) ; + +FUNCTION: PangoFontMap* +pango_cairo_font_map_get_default ( ) ; + +FUNCTION: cairo_font_type_t +pango_cairo_font_map_get_font_type ( PangoCairoFontMap* fontmap ) ; + +FUNCTION: void +pango_cairo_font_map_set_resolution ( PangoCairoFontMap* fontmap, double dpi ) ; + +FUNCTION: double +pango_cairo_font_map_get_resolution ( PangoCairoFontMap* fontmap ) ; + +FUNCTION: PangoContext* +pango_cairo_font_map_create_context ( PangoCairoFontMap* fontmap ) ; + +FUNCTION: cairo_scaled_font_t* +pango_cairo_font_get_scaled_font ( PangoCairoFont* font ) ; + +! Update a Pango context for the current state of a cairo context +FUNCTION: void +pango_cairo_update_context ( cairo_t* cr, PangoContext* context ) ; + +FUNCTION: void +pango_cairo_context_set_font_options ( PangoContext* context, cairo_font_options_t* options ) ; + +FUNCTION: cairo_font_options_t* +pango_cairo_context_get_font_options ( PangoContext* context ) ; + +FUNCTION: void +pango_cairo_context_set_resolution ( PangoContext* context, double dpi ) ; + +FUNCTION: double +pango_cairo_context_get_resolution ( PangoContext* context ) ; + +! Convenience +FUNCTION: PangoLayout* +pango_cairo_create_layout ( cairo_t* cr ) ; + +FUNCTION: void +pango_cairo_update_layout ( cairo_t* cr, PangoLayout* layout ) ; + +! Rendering +FUNCTION: void +pango_cairo_show_glyph_string ( cairo_t* cr, PangoFont* font, PangoGlyphString* glyphs ) ; + +FUNCTION: void +pango_cairo_show_layout_line ( cairo_t* cr, PangoLayoutLine* line ) ; + +FUNCTION: void +pango_cairo_show_layout ( cairo_t* cr, PangoLayout* layout ) ; + +FUNCTION: void +pango_cairo_show_error_underline ( cairo_t* cr, double x, double y, double width, double height ) ; + +! Rendering to a path +FUNCTION: void +pango_cairo_glyph_string_path ( cairo_t* cr, PangoFont* font, PangoGlyphString* glyphs ) ; + +FUNCTION: void +pango_cairo_layout_line_path ( cairo_t* cr, PangoLayoutLine* line ) ; + +FUNCTION: void +pango_cairo_layout_path ( cairo_t* cr, PangoLayout* layout ) ; + +FUNCTION: void +pango_cairo_error_underline_path ( cairo_t* cr, double x, double y, double width, double height ) ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Helpful functions from other parts of pango +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: PANGO_SCALE 1024 ; + +FUNCTION: void +pango_layout_set_text ( PangoLayout* layout, char* text, int length ) ; + +FUNCTION: char* +pango_layout_get_text ( PangoLayout* layout ) ; + +FUNCTION: void +pango_layout_get_size ( PangoLayout* layout, int* width, int* height ) ; + +TYPEDEF: void* PangoFontDescription + +FUNCTION: PangoFontDescription* +pango_font_description_from_string ( char* str ) ; + +FUNCTION: char* +pango_font_description_to_string ( PangoFontDescription* desc ) ; + +FUNCTION: char* +pango_font_description_to_filename ( PangoFontDescription* desc ) ; + +FUNCTION: void +pango_layout_set_font_description ( PangoLayout* layout, PangoFontDescription* desc ) ; + +FUNCTION: PangoFontDescription* +pango_layout_get_font_description ( PangoLayout* layout ) ; + +FUNCTION: void +pango_layout_get_pixel_size ( PangoLayout* layout, int* width, int* height ) ; + +FUNCTION: void +pango_font_description_free ( PangoFontDescription* desc ) ; + +TYPEDEF: void* gpointer + +FUNCTION: void +g_object_unref ( gpointer object ) ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! Higher level words and combinators +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +USING: destructors accessors namespaces kernel cairo ; + +TUPLE: pango-layout alien ; +C: pango-layout +M: pango-layout dispose ( alien -- ) alien>> g_object_unref ; + +: layout ( -- pango-layout ) pango-layout get ; + +: (with-pango) ( layout quot -- ) + >r alien>> pango-layout r> with-variable ; inline + +: with-pango ( quot -- ) + cr pango_cairo_create_layout swap + [ (with-pango) ] curry with-disposal ; inline + +: pango-layout-get-pixel-size ( layout -- width height ) + 0 0 [ pango_layout_get_pixel_size ] 2keep + [ *int ] bi@ ; + +: dummy-pango ( quot -- ) + >r CAIRO_FORMAT_ARGB32 0 0 cairo_image_surface_create + r> [ with-pango ] curry with-cairo-from-surface ; inline + +: layout-size ( quot -- width height ) + [ layout pango-layout-get-pixel-size ] compose dummy-pango ; inline + +: layout-font ( str -- ) + pango_font_description_from_string + dup zero? [ "pango: not a valid font." throw ] when + layout over pango_layout_set_font_description + pango_font_description_free ; + +: layout-text ( str -- ) + layout swap -1 pango_layout_set_text ;