I want to render some text using my custom ttf font stored in a c++ header file. This is my code:
#include <cairo-ft.h>
#include <cairo.h>
#include <fmt/core.h>
#include <fontconfig/fcfreetype.h>
#include <fontconfig/fontconfig.h>
#include <ft2build.h>
#include <pango/pango.h>
#include <pango/pangocairo.h>
#include <pango/pangofc-fontmap.h>
#include <pango/pangoft2.h>
#include "RubikMonoOne-Regular.h"
#include FT_FREETYPE_H
FT_Library ft;
FT_Face face;
FcPattern* pat;
FcFontSet* set;
int main(int argc, char* argv[]) {
FT_Init_FreeType(&ft);
FT_New_Memory_Face(ft, RubikMonoOne_Regular_ttf, RubikMonoOne_Regular_ttf_len, 0, &face);
cairo_font_face_t* ct = cairo_ft_font_face_create_for_ft_face(face, 0);
FcConfigAppFontAddFile(nullptr, (const FcChar8*)":/non-existent");
set = FcConfigGetFonts(nullptr, FcSetApplication);
pat = FcFreeTypeQueryFace(face, (const FcChar8*)":RubikMonoOne-Regular.ttf", 0, nullptr);
FT_New_Memory_Face(ft, RubikMonoOne_Regular_ttf, RubikMonoOne_Regular_ttf_len, 0, &face);
FT_Reference_Face(face);
FcPatternAddFTFace(pat, FC_FT_FACE, face);
FcFontSetAdd(set, pat);
PangoFontMap* fm = pango_cairo_font_map_new_for_font_type(CAIRO_FONT_TYPE_FT);
PangoFontFamily** families;
int n_families;
pango_font_map_list_families(fm, &families, &n_families);
for (int i = 0; i < n_families; i++) {
PangoFontFamily* family = families[i];
const char* family_name = pango_font_family_get_name(family);
fmt::print("Family: {}\n", family_name);
}
cairo_t* cr = cairo_create(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1920, 1080));
PangoContext* context = pango_font_map_create_context(fm);
PangoLayout* layout = pango_layout_new(context);
PangoFontDescription* desc = pango_font_description_from_string("Rubik Mono One Regular 50");
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_paint(cr);
pango_layout_set_font_description(layout, desc);
pango_layout_set_text(layout, "ABCDE", -1);
cairo_set_source_rgb(cr, 0, 0, 0);
pango_cairo_show_layout(cr, layout);
cairo_surface_write_to_png(cairo_get_target(cr), "hello.png");
return 0;
}
This code cannot load fonts from memory. pangocairo always loads fonts through file names. Is there any way to make pango cairo render use the FT_Face stored in PangoFont to render text?