Hi,
I'm trying to figure out how to implement code to retrieve a list of font families using the Pango libraries. The key function definition is:
I've found some C code, which is shown below. The tricky�� bit is the ***. I've managed to get this working in VisualWorks (code also below), but can't figure out how to do this using the Pharo FFI.��
I've managed to get the basic Pango functionality going, but I can't figure out how to use ExternalAddress to do this. Running on a MacMini M1.��
Any pointers (:)) appreciated!
Thanks,
Stew
C Version
----------------
��#include <glib.h>
#include <pango/pangocairo.h>
static void
list_fonts ()
{
�� �� int i;
�� �� PangoFontFamily ** families;
�� �� int n_families;
�� �� PangoFontMap * fontmap;
�� �� fontmap = pango_cairo_font_map_get_default();
�� �� pango_font_map_list_families (fontmap, & families, & n_families);
�� �� printf ("There are %d families\n", n_families);
�� �� for (i = 0; i < n_families; i++) {
�� �� �� �� PangoFontFamily * family = families[i];
�� �� �� �� const char * family_name;
�� �� �� �� family_name = pango_font_family_get_name (family);
�� �� �� �� printf ("Family %d: %s\n", i, family_name);
�� �� }
�� �� g_free (families);
}
int main (int argc, char ** argv)
{
�� �� list_fonts ();
�� �� return 0;
}
=================================
VisualWorks Version
---------------------------
availableFamilyNames
"
Transcript clear.
(FontFamily availableFamilyNames asSortedCollection: [: a : b | a < b]) do: [: each | Transcript cr; show: each].
NamedFontSelector open
"
"08/09/20 SIM. Modified to work on 64bit.
Clues obtained from:
XSurface class >>displaySurface:
DisplaySurface>>cairoVisual
PDFSurface class>>versions"
| listPointer sizePointer ffPointers result |
ObjectMemory is64Bit��
�� ifTrue:
�� �� [listPointer := CIntegerType unsignedLongLong gcMalloc.
�� �� sizePointer := listPointer sizeof gcCopyToHeap]
ifFalse:
�� ��[listPointer := 0 gcCopyToHeap.
�� ��sizePointer := 0 gcCopyToHeap].
LibPango default
pango_font_map_list_families: LibPango default pango_cairo_font_map_get_default
with: listPointer
with: sizePointer.
ffPointers := ��
(ObjectMemory is64Bit
�� ��ifTrue: [CIntegerType unsignedLongLong]
�� ��ifFalse: [ CIntegerType unsignedInt])
�� �� �� �� newPointerToAddress: listPointer contents.
result := OrderedCollection new: sizePointer contents.
sizePointer contents timesRepeat:
�� �� ��[result
�� �� �� �� ��add: (LibPango default pango_font_family_get_name: ffPointers contents) utf8.
�� �� �� ffPointers += 1].
LibPango default g_free: listPointer contents.
^result