2009-02-26 03:31:24 -05:00
|
|
|
! Copyright (C) 2008 Matthew Willis.
|
2009-02-27 00:30:02 -05:00
|
|
|
! Copyright (C) 2009 Slava Pestov.
|
2009-02-26 03:31:24 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-02-28 02:31:51 -05:00
|
|
|
USING: arrays sequences alien alien.c-types alien.destructors
|
2009-02-28 21:33:53 -05:00
|
|
|
alien.syntax math math.functions math.vectors destructors combinators
|
|
|
|
colors fonts accessors assocs namespaces kernel pango pango.fonts
|
|
|
|
pango.cairo cairo cairo.ffi glib unicode.data images cache init
|
2009-03-01 21:10:19 -05:00
|
|
|
math.rectangles fry memoize ;
|
2009-02-26 03:31:24 -05:00
|
|
|
IN: pango.layouts
|
|
|
|
|
2009-02-27 00:30:02 -05:00
|
|
|
LIBRARY: pango
|
|
|
|
|
|
|
|
FUNCTION: PangoLayout*
|
|
|
|
pango_layout_new ( PangoContext* context ) ;
|
|
|
|
|
|
|
|
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 ) ;
|
|
|
|
|
|
|
|
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 ) ;
|
|
|
|
|
2009-03-01 21:10:19 -05:00
|
|
|
FUNCTION: void
|
|
|
|
pango_layout_get_extents ( PangoLayout* layout, PangoRectangle* ink_rect, PangoRectangle* logical_rect ) ;
|
2009-02-27 00:30:02 -05:00
|
|
|
|
|
|
|
FUNCTION: void
|
2009-02-28 02:31:51 -05:00
|
|
|
pango_layout_get_pixel_extents ( PangoLayout* layout, PangoRectangle* ink_rect, PangoRectangle* logical_rect ) ;
|
|
|
|
|
|
|
|
FUNCTION: PangoLayoutLine*
|
|
|
|
pango_layout_get_line_readonly ( PangoLayout* layout, int line ) ;
|
|
|
|
|
|
|
|
FUNCTION: void
|
|
|
|
pango_layout_line_index_to_x ( PangoLayoutLine* line, int index_, gboolean trailing, int* x_pos ) ;
|
|
|
|
|
|
|
|
FUNCTION: gboolean
|
|
|
|
pango_layout_line_x_to_index ( PangoLayoutLine* line, int x_pos, int* index_, int* trailing ) ;
|
|
|
|
|
|
|
|
FUNCTION: PangoLayoutIter*
|
|
|
|
pango_layout_get_iter ( PangoLayout* layout ) ;
|
|
|
|
|
|
|
|
FUNCTION: int
|
|
|
|
pango_layout_iter_get_baseline ( PangoLayoutIter* iter ) ;
|
|
|
|
|
|
|
|
FUNCTION: void
|
|
|
|
pango_layout_iter_free ( PangoLayoutIter* iter ) ;
|
|
|
|
|
|
|
|
DESTRUCTOR: pango_layout_iter_free
|
2009-02-27 00:30:02 -05:00
|
|
|
|
2009-02-28 21:33:53 -05:00
|
|
|
TUPLE: layout font string layout metrics ink-rect logical-rect image disposed ;
|
|
|
|
|
2009-03-01 21:10:19 -05:00
|
|
|
SYMBOL: dpi
|
2009-02-26 03:31:24 -05:00
|
|
|
|
2009-03-01 21:10:19 -05:00
|
|
|
72 dpi set-global
|
2009-02-28 02:31:51 -05:00
|
|
|
|
2009-03-01 21:10:19 -05:00
|
|
|
: dummy-pango-context ( -- context )
|
|
|
|
\ dummy-pango-context [
|
|
|
|
pango_context_new
|
|
|
|
] initialize-alien ;
|
|
|
|
|
|
|
|
MEMO: (cache-font) ( font -- open-font )
|
|
|
|
[
|
|
|
|
pango_cairo_font_map_get_default
|
|
|
|
dup dpi get pango_cairo_font_map_set_resolution
|
|
|
|
dummy-pango-context
|
|
|
|
] dip
|
|
|
|
cache-font-description
|
|
|
|
pango_font_map_load_font ;
|
|
|
|
|
|
|
|
: cache-font ( font -- open-font )
|
|
|
|
strip-font-colors (cache-font) ;
|
|
|
|
|
2009-02-26 03:31:24 -05:00
|
|
|
: set-layout-font ( str layout -- )
|
2009-02-28 02:31:51 -05:00
|
|
|
swap pango_layout_set_font_description ;
|
2009-02-26 03:31:24 -05:00
|
|
|
|
|
|
|
: set-layout-text ( str layout -- )
|
2009-02-27 00:30:02 -05:00
|
|
|
#! Replace nulls with something else since Pango uses null-terminated
|
|
|
|
#! strings
|
2009-02-28 21:33:53 -05:00
|
|
|
swap
|
|
|
|
dup selection? [ string>> ] when
|
|
|
|
{ { 0 CHAR: zero-width-no-break-space } } substitute
|
2009-02-26 03:31:24 -05:00
|
|
|
-1 pango_layout_set_text ;
|
|
|
|
|
2009-02-28 02:31:51 -05:00
|
|
|
: <PangoLayout> ( text font -- layout )
|
|
|
|
dummy-cairo pango_cairo_create_layout |g_object_unref
|
|
|
|
[ set-layout-font ] keep
|
|
|
|
[ set-layout-text ] keep ;
|
|
|
|
|
2009-03-01 21:10:19 -05:00
|
|
|
: layout-extents ( layout -- ink-rect logical-rect )
|
|
|
|
"PangoRectangle" <c-object>
|
|
|
|
"PangoRectangle" <c-object>
|
|
|
|
[ pango_layout_get_extents ] 2keep
|
|
|
|
[ PangoRectangle>rect ] bi@ ;
|
|
|
|
|
|
|
|
: glyph-height ( font string -- y )
|
|
|
|
swap <PangoLayout> &g_object_unref layout-extents drop dim>> second ;
|
|
|
|
|
2009-03-01 23:10:20 -05:00
|
|
|
MEMO: missing-font-metrics ( font -- metrics )
|
|
|
|
#! Pango doesn't provide x-height and cap-height but Core Text does, so we
|
2009-03-01 21:10:19 -05:00
|
|
|
#! simulate them on Pango.
|
|
|
|
[
|
2009-03-01 23:10:20 -05:00
|
|
|
[ metrics new ] dip
|
2009-03-01 21:10:19 -05:00
|
|
|
(cache-font)
|
2009-03-01 23:10:20 -05:00
|
|
|
[ "x" glyph-height >>x-height ]
|
|
|
|
[ "Y" glyph-height >>cap-height ] bi
|
2009-03-01 21:10:19 -05:00
|
|
|
] with-destructors ;
|
|
|
|
|
|
|
|
: layout-baseline ( layout -- baseline )
|
|
|
|
pango_layout_get_iter &pango_layout_iter_free
|
|
|
|
pango_layout_iter_get_baseline
|
|
|
|
pango>float ;
|
|
|
|
|
2009-02-28 02:31:51 -05:00
|
|
|
: set-foreground ( cr font -- )
|
|
|
|
foreground>> set-source-color ;
|
|
|
|
|
|
|
|
: fill-background ( cr font dim -- )
|
|
|
|
[ background>> set-source-color ]
|
2009-02-28 21:33:53 -05:00
|
|
|
[ [ { 0 0 } ] dip <rect> fill-rect ] bi-curry* bi ;
|
|
|
|
|
|
|
|
: rect-translate-x ( rect x -- rect' )
|
|
|
|
'[ _ 0 2array v- ] change-loc ;
|
|
|
|
|
|
|
|
: first-line ( layout -- line )
|
|
|
|
0 pango_layout_get_line_readonly ;
|
|
|
|
|
|
|
|
: line-offset>x ( line n -- x )
|
|
|
|
f 0 <int> [ pango_layout_line_index_to_x ] keep
|
|
|
|
*int pango>float ;
|
|
|
|
|
|
|
|
: x>line-offset ( line x -- n )
|
|
|
|
float>pango 0 <int> 0 <int>
|
|
|
|
[ pango_layout_line_x_to_index drop ] 2keep
|
|
|
|
[ *int ] bi@ + ;
|
|
|
|
|
|
|
|
: selection-rect ( dim layout selection -- rect )
|
|
|
|
[ first-line ] [ [ start>> ] [ end>> ] bi ] bi*
|
|
|
|
[ line-offset>x ] bi-curry@ bi
|
|
|
|
[ drop nip 0 2array ] [ swap - swap second 2array ] 3bi <rect> ;
|
|
|
|
|
|
|
|
: fill-selection-background ( cr layout -- )
|
|
|
|
dup string>> selection? [
|
|
|
|
[ string>> color>> set-source-color ]
|
|
|
|
[
|
|
|
|
[ [ ink-rect>> dim>> ] [ layout>> ] [ string>> ] tri selection-rect ]
|
|
|
|
[ ink-rect>> loc>> first ] bi rect-translate-x
|
|
|
|
fill-rect
|
|
|
|
] 2bi
|
|
|
|
] [ 2drop ] if ;
|
2009-02-28 02:31:51 -05:00
|
|
|
|
|
|
|
: set-text-position ( cr loc -- )
|
|
|
|
first2 cairo_move_to ;
|
|
|
|
|
2009-03-01 21:10:19 -05:00
|
|
|
: layout-metrics ( layout -- metrics )
|
2009-03-01 23:10:20 -05:00
|
|
|
dup font>> missing-font-metrics clone
|
2009-03-01 21:10:19 -05:00
|
|
|
swap
|
|
|
|
[ layout>> layout-baseline >>ascent ]
|
|
|
|
[ logical-rect>> dim>> [ first >>width ] [ second >>height ] bi ] bi
|
2009-02-28 02:31:51 -05:00
|
|
|
dup [ height>> ] [ ascent>> ] bi - >>descent ;
|
|
|
|
|
2009-02-28 21:33:53 -05:00
|
|
|
: text-position ( layout -- loc )
|
|
|
|
[ logical-rect>> ] [ ink-rect>> ] bi [ loc>> ] bi@ v- ;
|
|
|
|
|
|
|
|
: draw-layout ( layout -- image )
|
2009-03-01 21:10:19 -05:00
|
|
|
dup ink-rect>> dim>> [ >fixnum ] map [
|
2009-02-28 21:33:53 -05:00
|
|
|
swap {
|
|
|
|
[ layout>> pango_cairo_update_layout ]
|
|
|
|
[ [ font>> ] [ ink-rect>> dim>> ] bi fill-background ]
|
|
|
|
[ fill-selection-background ]
|
|
|
|
[ text-position set-text-position ]
|
|
|
|
[ font>> set-foreground ]
|
|
|
|
[ layout>> pango_cairo_show_layout ]
|
|
|
|
} 2cleave
|
|
|
|
] make-bitmap-image ;
|
|
|
|
|
|
|
|
: <layout> ( font string -- line )
|
2009-02-26 03:31:24 -05:00
|
|
|
[
|
2009-02-28 21:33:53 -05:00
|
|
|
layout new
|
|
|
|
swap >>string
|
|
|
|
swap >>font
|
|
|
|
dup [ string>> ] [ font>> cache-font-description ] bi <PangoLayout> >>layout
|
|
|
|
dup layout>> layout-extents [ >>ink-rect ] [ >>logical-rect ] bi*
|
2009-03-01 21:10:19 -05:00
|
|
|
dup layout-metrics >>metrics
|
2009-02-28 21:33:53 -05:00
|
|
|
dup draw-layout >>image
|
2009-02-26 03:31:24 -05:00
|
|
|
] with-destructors ;
|
|
|
|
|
2009-02-28 02:31:51 -05:00
|
|
|
M: layout dispose* layout>> g_object_unref ;
|
|
|
|
|
|
|
|
SYMBOL: cached-layouts
|
|
|
|
|
|
|
|
: cached-layout ( font string -- layout )
|
|
|
|
cached-layouts get [ <layout> ] 2cache ;
|
|
|
|
|
|
|
|
: cached-line ( font string -- line )
|
2009-02-28 21:33:53 -05:00
|
|
|
cached-layout layout>> first-line ;
|
2009-02-28 02:31:51 -05:00
|
|
|
|
|
|
|
[ <cache-assoc> cached-layouts set-global ] "pango.layouts" add-init-hook
|