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:

 https://docs.gtk.org/Pango/method.FontMap.list_families.html

void
pango_font_map_list_families (
  PangoFontMap* fontmap,
  PangoFontFamily*** families,
  int* n_families
)

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

Reply via email to