15 #include "freetypeFace.h" 19 #include "config_pnmtext.h" 21 FT_Library FreetypeFace::_ft_library;
22 bool FreetypeFace::_ft_initialized =
false;
23 bool FreetypeFace::_ft_ok =
false;
33 FreetypeFace() : _lock(
"FreetypeFace::_lock") {
40 if (!_ft_initialized) {
41 initialize_ft_library();
68 FT_Face FreetypeFace::
69 acquire_face(
int char_size,
int dpi,
int pixel_width,
int pixel_height) {
72 if (pixel_height != 0) {
73 if (pixel_height != _pixel_height || pixel_width != _pixel_width) {
76 _pixel_height = pixel_height;
77 _pixel_width = pixel_width;
78 FT_Set_Pixel_Sizes(_face, _pixel_width, _pixel_height);
81 if (char_size != _char_size || dpi != _dpi) {
82 _char_size = char_size;
86 if (_char_size != 0) {
87 FT_Set_Char_Size(_face, _char_size, _char_size, _dpi, _dpi);
103 release_face(FT_Face face) {
104 nassertv(_face == face);
114 set_face(FT_Face face) {
126 _name = _face->family_name;
127 if (_face->style_name != NULL) {
129 _name += _face->style_name;
133 <<
"Loaded font " << _name <<
"\n";
135 if (pnmtext_cat.is_debug()) {
137 << _name <<
" has " << _face->num_charmaps <<
" charmaps:\n";
138 for (
int i = 0; i < _face->num_charmaps; i++) {
139 pnmtext_cat.debug(
false) <<
" " << (
void *)_face->charmaps[i];
141 pnmtext_cat.debug(
false) <<
"\n";
143 <<
"default charmap is " << (
void *)_face->charmap <<
"\n";
145 if (_face->charmap == NULL) {
148 if (_face->num_charmaps == 0) {
149 pnmtext_cat.warning()
150 << _name <<
" has no charmaps available.\n";
152 pnmtext_cat.warning()
153 << _name <<
" has no default Unicode charmap.\n";
154 if (_face->num_charmaps > 1) {
155 pnmtext_cat.warning()
156 <<
"Arbitrarily choosing first of " 157 << _face->num_charmaps <<
" charmaps.\n";
159 FT_Set_Charmap(_face, _face->charmaps[0]);
171 initialize_ft_library() {
172 if (!_ft_initialized) {
173 int error = FT_Init_FreeType(&_ft_library);
174 _ft_initialized =
true;
177 <<
"Unable to initialize FreeType; dynamic fonts will not load.\n";
184 #endif // HAVE_FREETYPE A lightweight C++ object whose constructor calls acquire() and whose destructor calls release() on a ...
TypeHandle is the identifier used to differentiate C++ class types.