122 lines
3.9 KiB
Racket
122 lines
3.9 KiB
Racket
#lang racket/base
|
|
|
|
(require ffi/unsafe)
|
|
|
|
; don't use the complete lib. It will crash.
|
|
(define libhb (ffi-lib "../3rdparty/libharfbuzz-subset"))
|
|
|
|
(define-cpointer-type _hb_face_t)
|
|
(define-cpointer-type _hb_font_t)
|
|
|
|
(define-cstruct _hb_glyph_info_t
|
|
([codepoint _uint32] ;_hb_codepoint_t=_uint32_t
|
|
[mask _uint32] ; priv. var.
|
|
[cluster _uint32]
|
|
[var1 _uint32] ; priv. var.
|
|
[var2 _uint32] ; priv. var.
|
|
))
|
|
|
|
(define-cstruct _hb_glyph_position_t
|
|
([x_advance _int32] ;_hb_position_t=_int32_t
|
|
[y_advance _int32]
|
|
[x_offset _int32]
|
|
[y_offset _int32]
|
|
[var _int32] ; priv. var.
|
|
))
|
|
|
|
|
|
;hb_buffer_t *
|
|
;hb_buffer_create (void);
|
|
(define hb-buffer-create-raw
|
|
(get-ffi-obj "hb_buffer_create" libhb
|
|
(_fun -> _pointer)))
|
|
|
|
;void
|
|
;hb_buffer_add_utf8 (hb_buffer_t *buffer,
|
|
; const char *text,
|
|
; int text_length,
|
|
; unsigned int item_offset,
|
|
; int item_length);
|
|
(define hb-buffer-add-utf8-raw
|
|
(get-ffi-obj "hb_buffer_add_utf8" libhb
|
|
(_fun _pointer _string/utf-8 _int _uint _int -> _void)))
|
|
|
|
; not implemented for now. maybe implemented in the future.
|
|
; // If you know the direction, script, and language
|
|
; hb_buffer_set_direction(buf, HB_DIRECTION_LTR)
|
|
; hb_buffer_set_script(buf, HB_SCRIPT_LATIN);
|
|
; hb_buffer_set_language(buf, hb_language_from_string("en", -1));
|
|
|
|
;hb_blob_t *
|
|
;hb_blob_create_from_file (const char *file_name);
|
|
(define hb-blob-create-from-file-raw
|
|
(get-ffi-obj "hb_blob_create_from_file" libhb
|
|
(_fun _string/utf-8 -> _pointer)))
|
|
|
|
;hb_face_t *
|
|
;hb_face_create (hb_blob_t *blob,
|
|
; unsigned int index);
|
|
(define hb-face-create-raw
|
|
(get-ffi-obj "hb_face_create" libhb
|
|
(_fun _pointer _uint -> _hb_face_t)))
|
|
; hb_font_t *
|
|
; hb_font_create (hb_face_t *face);
|
|
(define hb-font-create-raw
|
|
(get-ffi-obj "hb_font_create" libhb
|
|
(_fun _hb_face_t -> _hb_font_t)))
|
|
;void
|
|
;hb_shape (hb_font_t *font,
|
|
; hb_buffer_t *buffer,
|
|
; const hb_feature_t *features,
|
|
; unsigned int num_features);
|
|
(define hb-shape-raw
|
|
(get-ffi-obj "hb_shape" libhb
|
|
(_fun _hb_font_t _pointer _pointer _uint -> _void)))
|
|
;void
|
|
;hb_buffer_guess_segment_properties (hb_buffer_t *buffer)
|
|
(define hb-buffer-guess-segment-properties-raw
|
|
(get-ffi-obj "hb_buffer_guess_segment_properties" libhb
|
|
(_fun _pointer -> _void)))
|
|
|
|
(define hb-buffer-get-glyph-infos-raw
|
|
(get-ffi-obj "hb_buffer_get_glyph_infos" libhb
|
|
(_fun
|
|
[buf : _pointer]
|
|
[glyph-length : (_ptr o _uint)]
|
|
-> [glyph-info : _pointer]
|
|
-> (values glyph-info glyph-length))))
|
|
|
|
(define hb-buffer-get-glyph-positions-raw
|
|
(get-ffi-obj "hb_buffer_get_glyph_positions" libhb
|
|
(_fun
|
|
[buf : _pointer]
|
|
[glyph-length : (_ptr o _uint)]
|
|
-> [glyph-position : _pointer]
|
|
-> (values glyph-position glyph-length))))
|
|
(define hb-buffer-has-positions-raw
|
|
(get-ffi-obj "hb_buffer_has_positions" libhb
|
|
(_fun [buf : _pointer] -> _bool)))
|
|
|
|
(define (create-hb-buffer) (hb-buffer-create-raw))
|
|
|
|
|
|
; test area
|
|
(define buf (create-hb-buffer))
|
|
(hb-buffer-add-utf8-raw buf "123abc" -1 0 -1)
|
|
(define font-path "/usr/share/fonts/truetype/freefont/FreeSansBold.ttf")
|
|
(define blob (hb-blob-create-from-file-raw font-path))
|
|
(define NULL (cast 0 _int64 _pointer))
|
|
(define face (hb-face-create-raw blob 0))
|
|
(define font (hb-font-create-raw face))
|
|
(hb-buffer-guess-segment-properties-raw buf)
|
|
(hb-shape-raw font buf NULL 0)
|
|
(define-values (glyph-info glyph-length) (hb-buffer-get-glyph-infos-raw buf))
|
|
(define-values (glyph-pos glyph-length2) (hb-buffer-get-glyph-positions-raw buf))
|
|
|
|
(printf "has pos ?: ~a" (hb-buffer-has-positions-raw buf))
|
|
|
|
|
|
(for ([i glyph-length])
|
|
(displayln (hb_glyph_info_t-cluster (ptr-ref glyph-info _hb_glyph_info_t i))))
|
|
(for ([i glyph-length2])
|
|
(displayln (hb_glyph_position_t-x_advance (ptr-ref glyph-pos _hb_glyph_position_t i))))
|