Virtual Testbed
Ship dynamics simulator for extreme conditions
font.hh
1 #ifndef VTESTBED_FONT_FONT_HH
2 #define VTESTBED_FONT_FONT_HH
3 
4 #include <string>
5 
6 #include <fontconfig/fontconfig.h>
7 
8 namespace vtb {
9 
11  namespace font {
12 
13  static_assert(alignof(char) == alignof(FcChar8), "bad alignment");
14  static_assert(sizeof(char) == sizeof(FcChar8), "bad size");
15 
16  class Init {
17  public:
18  inline Init() { ::FcInit(); }
19  inline ~Init() { ::FcFini(); } // memory leaks here
20  };
21 
22  class Configuration {
23 
24  private:
25  FcConfig* _config = nullptr;
26 
27  public:
28  inline Configuration() { _config = ::FcInitLoadConfigAndFonts(); }
29  inline ~Configuration() { ::FcConfigDestroy(_config); }
30  inline operator FcConfig*() { return _config; }
31 
32  };
33 
34  class Pattern {
35 
36  private:
37  FcPattern* _pattern = nullptr;
38 
39  public:
40 
41  inline explicit
42  Pattern(FcPattern* p): _pattern(p) {}
43 
44  inline explicit
45  Pattern(const char* font_name):
46  _pattern(
47  ::FcNameParse(reinterpret_cast<const FcChar8*>(font_name))
48  ) {}
49 
50  inline explicit
51  Pattern(std::string font_name):
52  Pattern(font_name.data()) {}
53 
54  inline
55  Pattern(Pattern&& rhs):
56  _pattern(rhs._pattern) {
57  rhs._pattern = nullptr;
58  }
59 
60  inline
61  ~Pattern() { ::FcPatternDestroy(_pattern); }
62 
63  inline
64  operator FcPattern*() { return _pattern; }
65 
66  inline
67  operator FcPattern*() const { return _pattern; }
68 
69  };
70 
71  class Fonts {
72 
73  private:
74  Init _init;
75  Configuration _configuration;
76 
77  public:
78 
80  file_name(const Pattern& pattern);
81 
82  inline std::string
83  file_name(const Pattern& pattern, std::string default_file_name) {
84  const auto& name = this->file_name(pattern);
85  return !name.empty() ? name : default_file_name;
86  }
87 
88  };
89 
90  }
91 
92 }
93 
94 #endif // vim:filetype=cpp
Main namespace.
Definition: convert.hh:9